📄 michellecti.cpp
字号:
wc.lpszMenuName = NULL;
wc.lpszClassName = _T("LUCENT_CTI_SYN_WND");
CMichelleCTI::m_hSynWnd=NULL;
if(RegisterClass(&wc))
CMichelleCTI::m_hSynWnd = CreateWindow(wc.lpszClassName, NULL,
WS_DISABLED, 0, 0, 0, 0, NULL, NULL, hInstance, NULL);
if (CMichelleCTI::m_hSynWnd)
{
CMichelleCTI::m_hPumpTrd=(HANDLE)_beginthreadex(NULL,0,(ALT_LPTHREAD_START_ROUTINE)PumpThread,
CMichelleCTI::m_hSynWnd,0,
&CMichelleCTI::m_dwPumpId);
if (CMichelleCTI::m_hPumpTrd)
ret=TRUE;
}
}
return ret;
}
void GlobalCleanup()
{
if (CMichelleCTI::m_hSynWnd)
{
DestroyWindow(CMichelleCTI::m_hSynWnd);
CMichelleCTI::m_hSynWnd=NULL;
}
if (CMichelleCTI::m_hPumpTrd && CMichelleCTI::m_dwPumpId)
{
PostThreadMessage(CMichelleCTI::m_dwPumpId,WM_QUIT,0,0);
while (WaitForSingleObject(CMichelleCTI::m_hPumpTrd,100)==WAIT_TIMEOUT)
{
MSG msg;
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
CloseHandle(CMichelleCTI::m_hPumpTrd );
}
return;
}
// change the bstring to ansi string
BOOL B2C(BSTR bStr,char* pBuf,int nBufLen)
{
BOOL ret=FALSE;
if (pBuf && nBufLen>0)
{
if (bStr)
{
int nLen=WideCharToMultiByte(CP_ACP,0,bStr,-1,NULL,0,NULL,NULL);
if (nLen<=nBufLen)
{
if (WideCharToMultiByte(CP_ACP,0,bStr,-1,pBuf,nBufLen,NULL,NULL)>0)
ret=TRUE;
}
}else
{// the BSTR is a null string
memset(pBuf,0,nBufLen);
ret=TRUE;
}
}
return ret;
}
/////////////////////////////////////////////////////////////////////////////
// CMichelleCTI
BOOL CMichelleCTI::DefaultHandler(long cstaEvent)
{
BOOL notFire=TRUE;
switch (cstaEvent)
{
case UM_APIFAILED:
case ACS_OPEN_STREAM_CONF:
case ACS_CLOSE_STREAM_CONF:
notFire=FALSE;
break;
}
while (!PostMessage(NULL,UM_CMDMSG,cstaEvent,0))
Sleep(100);
if (!notFire)
ReplyMessage(0l);
return notFire;
}
STDMETHODIMP CMichelleCTI::get_Initialized(BOOL *pVal)
{
// TODO: Add your implementation code here
*pVal=m_serverHandle!=0;
return S_OK;
}
STDMETHODIMP_(BOOL) CMichelleCTI::Initialize(PBXTYPES pbxtype, BSTR server, int port, BSTR name, BSTR pass)
{
// TODO: Add your implementation code here
BOOL bRet=FALSE;
if (B2C(server,m_serverId,sizeof(m_serverId))
&& B2C(name,m_loginId,sizeof (m_loginId))
&& B2C(pass,m_pwdId,sizeof (m_pwdId)))
{
AppName_t appName={0};
strcpy(appName,"Lucent cti dll");
Version_t version={0};
strcpy(version,"TS1-2");
InvokeIDType_t invokeType=APP_GEN_ID;
StreamType_t streamType=ST_CSTA;
Level_t level=ACS_LEVEL1; //This param is ignored
// set the private data version
ATTPrivateData_t OpenData;
strcpy(OpenData.vendor,"VERSION");
// strcpy(&OpenData.data[1],"AT&T Definity G3#6");
OpenData.data[0]=PRIVATE_DATA_ENCODING;
attMakeVersionString("6",&OpenData.data[1]);
OpenData.length=strlen(&OpenData.data[1])+2;
//error prepaired
m_lErrCode=0;
m_errType=ET_NOERROR;
RetCode_t ret;
char pTemp[300];
wsprintf(pTemp,"acsOpenStream: user:%s,pwd:%s",m_loginId,m_pwdId);
WriteLog(pTemp);
try
{
ret=acsOpenStream(&m_serverHandle,invokeType,m_invokeId,streamType,
&m_serverId,&m_loginId,&m_pwdId,&appName,level,&version,
5,//send queue size
5,//additional packet buffer
20,//receive queue size
5,//additional packet buffer
(PrivateData_t*)&OpenData/*private data*/);
}catch(...)
{
ret=LUCENT_UNKNOWN;
m_errType=ET_LUCENT;
m_ErrMsg="acsOpenStream failed by unknown error.";
}
if (ret<0)
{//ERROR
m_errType=ET_LUCENT;
m_lErrCode=ret;
m_ErrMsg="acsOpenStream return failed.";
}else
{//OK
m_lErrCode=ERR_INI;
//Regist the message process function
ret=acsSetESR(m_serverHandle,monitorStream,(unsigned long)this,TRUE);
if (ret>=0)
{
BOOL bQuit=FALSE;
//waiting for the acs confirmation's arrival
MSG msg;
while (GetMessage(&msg,NULL,0,0))
{
if (msg.message==UM_CMDMSG && msg.hwnd==NULL)
{
switch(msg.wParam)
{
case ACS_OPEN_STREAM_CONF:
bRet=TRUE;
bQuit=TRUE;
break;
case UM_APIFAILED:
if (m_lErrCode==ERR_INI)
{
m_errType=ET_LUCENT;
m_lErrCode=LUCENT_UNKNOWN;
m_ErrMsg="acsSetESR failed.";
}
bQuit=TRUE;
break;
default:
break;
}
if (bQuit)
break;
}
}
}else
{
m_errType=ET_LUCENT;
m_lErrCode=ret;
}
}
}else
{
m_errType=ET_USER;
m_lErrCode=LUCENT_INVALID_PARAM;
m_ErrMsg="Specified an error parameter.";
}
if (!bRet)
{
char tep[300]={0};
wsprintf((char*)&tep,"error:%s,code:%d.",m_ErrMsg.c_str(),m_lErrCode);
WriteLog((char*)&tep);
}
return bRet;
}
STDMETHODIMP_(void) CMichelleCTI::Uninitialize()
{
// TODO: Add your implementation code here
//IF {m_iDn} do
BOOL bRet=FALSE;
if (m_iDn) UnregisterDN(NULL);
// acsAbortStream(m_serverHandle,NULL);
WriteLog("acsCloseStream service.");
m_lErrCode=ERR_INI;
RetCode_t ret=acsCloseStream(m_serverHandle,m_invokeId,NULL);
if (ret==ACSPOSITIVE_ACK)
{
MSG msg;
while (GetMessage(&msg,NULL,0,0))
{
if (msg.message==UM_CMDMSG)
{
if (msg.wParam==UM_APIFAILED)
{
if (m_lErrCode!=ERR_INI)
{
m_errType=ET_LUCENT;
m_lErrCode=LUCENT_UNKNOWN;
m_ErrMsg="acsCloseStream unknown error.";
}
break;
}else if (msg.wParam==ACS_CLOSE_STREAM_CONF)
{
bRet=TRUE;
break;
}
}
}
}else
{
m_errType=ET_LUCENT;
m_lErrCode=ret;
m_ErrMsg="acsCloseStream return error.";
}
if (!bRet)
{
char tep[300]={0};
wsprintf((char*)&tep,"error:%s,code:%d.",m_ErrMsg.c_str(),m_lErrCode);
WriteLog((char*)&tep);
}
return;
}
STDMETHODIMP_(IDirectoryNumber*) CMichelleCTI::RegisterDN(BSTR dn, ADDRTYPES type, BSTR acdpos)
{
if (type==AT_DN || type==AT_Unknown)
{
CDirectoryNumber *pExtDN = NULL;
IDirectoryNumber *iExtDN = NULL;
HRESULT hRes = CreateClass(&pExtDN, &iExtDN);
if(SUCCEEDED(hRes))
{
m_iDn=iExtDN;
m_iDn->AddRef();
if (!pExtDN->Initialize(dn,m_serverHandle,m_invokeId+1))
{
m_iDn->Release();
m_iDn=NULL;
m_errType=ET_USER;
m_lErrCode=LUCNET_DNINI_ERR;
}
// iExtDN->Release();
iExtDN=NULL;
}else
{
m_errType=ET_COM;
m_lErrCode=hRes;
m_ErrMsg="Create a com instance failed.";
}
}else
{
m_errType=ET_USER;
m_lErrCode=LUCENT_ADDRESSTYPE_ERR;
m_ErrMsg="Sepcified an error parameter.";
}
if (m_iDn==NULL)
{
char tep[300]={0};
wsprintf((char*)tep,"error:%s,code:%d",m_ErrMsg.c_str(),m_lErrCode);
}
return m_iDn;
}
STDMETHODIMP_(void) CMichelleCTI::UnregisterDN(LPDN dn)
{
// TODO: Add your implementation code here
if (m_iDn)
{
CDirectoryNumber* pExtDn=I2C(m_iDn);
pExtDn->Uninitialize();
// long n=m_iDn->AddRef();
m_iDn->Release();
m_iDn=NULL;
}
}
STDMETHODIMP CMichelleCTI::get_ErrType(ERRORTYPES *pVal)
{
// TODO: Add your implementation code here
*pVal=m_errType;
return S_OK;
}
STDMETHODIMP CMichelleCTI::get_ErrCode(long *pVal)
{
// TODO: Add your implementation code here
*pVal=m_lErrCode;
return S_OK;
}
STDMETHODIMP CMichelleCTI::get_ErrMsg(BSTR *pVal)
{
// TODO: Add your implementation code here
*pVal=C2B(m_ErrMsg.c_str());
return S_OK;
}
STDMETHODIMP_(BOOL) CMichelleCTI::Init(BSTR server, int port)
{
ATLASSERT(FALSE);
return TRUE;
}
STDMETHODIMP_(void) CMichelleCTI::Login(BSTR AgentID)
{
ATLASSERT(FALSE);
return ;
}
STDMETHODIMP_(void) CMichelleCTI::ReportConfirm(BOOL confirm)
{
ATLASSERT(FALSE);
return ;
}
STDMETHODIMP_(void) CMichelleCTI::ReportResult(BSTR ReqID, BOOL result, BSTR reason)
{
ATLASSERT(FALSE);
return ;
}
STDMETHODIMP_(void) CMichelleCTI::ReportStatus(BSTR AgentID, AGENTSTATES AgentState)
{
ATLASSERT(FALSE);
return ;
}
STDMETHODIMP_(void) CMichelleCTI::Uninit()
{
ATLASSERT(FALSE);
return ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -