📄 directorynumber.cpp
字号:
{
// ValidateString(pKey,bufLen);
if (strlen(pKey)+strlen(pAppString)+3<=bufLen)
{
strcat(pAppString,"/k");
strcat(pAppString,pKey);
key=NULL;
if (pKey)
{
delete pKey;
pKey=NULL;
}
KVTYPES type;
if (SUCCEEDED(pkvpair->get_Type(&type)))
{
int nVal=0;
switch (type)
{
case KVT_String:
pkvpair->get_StringValue(&key);
if (GetAnsiFromBSTR(&pKey,key))
{
// ValidateString(pKey,bufLen);
if (strlen(pKey)+strlen(pAppString)+3<=bufLen)
{
strcat(pAppString,"/s");
strcat(pAppString,pKey);
}else
bReturn = FALSE;
}else
{
bReturn = FALSE;
}
if (pKey)
{
delete pKey;
pKey=NULL;
}
key=NULL;
break;
case KVT_Int:
pkvpair->get_IntValue(&nVal);
if (GetAnsiFromInt(&pKey,nVal))
{
if (strlen(pKey)+strlen(pAppString)+3<=bufLen)
{
strcat(pAppString,"/i");
strcat(pAppString,pKey);
}else
bReturn= FALSE;
}else
bReturn= FALSE;
if (pKey)
{
delete pKey;
pKey=NULL;
}
break;
default:
bReturn=FALSE;
}
}else//pkvpair->Type
{
bReturn =FALSE;
}
}else//LENGTH CHECK
{
bReturn =FALSE;
}
}else//GetAnsiFromBSTR
{
bReturn =FALSE;
}
if (pKey)
{
delete pKey;
pKey=NULL;
}
key=NULL;
}else//pkvpair->Key
{
bReturn = FALSE;
}
pkvpair->Release();
pkvpair=NULL;
}//while
}else//KVR_Successful==res
{
bReturn= FALSE;
}
}//if (pkvlist)
else
{
bReturn =TRUE;
}
if (!bReturn )
ZeroMemory(pAppString, strlen(pAppString));
return bReturn;
}
BOOL CDirectoryNumber::GetAnsiFromBSTR(char** dest, BSTR source)
{
BOOL ret=TRUE;
int nLength=WideCharToMultiByte(CP_ACP,0,source,-1,NULL,0,NULL,NULL);
if (nLength>0)
{
char* pTemp=new char[nLength];
if (pTemp)
{
if (WideCharToMultiByte(CP_ACP,0,source,-1,pTemp,nLength,NULL,NULL))
{
*dest=new char[nLength*2];
int nDestLen=0;
if (*dest)
{
for (UINT i=0;i<strlen(pTemp);i++)
{
if (pTemp[i]=='/')
{
(*dest)[nDestLen]='/';
nDestLen++;
}
(*dest)[nDestLen]=pTemp[i];
nDestLen++;
}
(*dest)[nDestLen]='\0';
}else
{
ret=FALSE;
}
}else
ret=FALSE;
delete pTemp;
pTemp=NULL;
}else
ret=FALSE;
}
return ret;
}
BOOL CDirectoryNumber::GetAnsiFromInt(char** dest, int source)
{
BOOL ret=TRUE;
*dest=new char[sizeof(int)];
if (*dest) _itoa(source,*dest,16);
else ret=FALSE;
return ret;
}
BOOL CDirectoryNumber::OnConsultDial()
{
BOOL ret=FALSE;
HWND hDlg = CreateDialog(CMichelleCTI::m_hInstance, MAKEINTRESOURCE(IDD_DIALINGDLG), NULL, DialingDlgProc);
ATLASSERT(hDlg);
RECT rcDlg, rcDesk;
GetWindowRect(GetDesktopWindow(), &rcDesk);
GetWindowRect(hDlg, &rcDlg);
int x = ((rcDesk.right - rcDesk.left) - (rcDlg.right - rcDlg.left)) / 2 + rcDesk.left;
int y = ((rcDesk.bottom - rcDesk.top) - (rcDlg.bottom - rcDlg.top)) / 2 + rcDesk.top;
SetWindowPos(hDlg, HWND_TOPMOST, x, y, 0, 0, SWP_SHOWWINDOW|SWP_NOSIZE);
MSG msg;
while (GetMessage(&msg,NULL,0,0))
{
if (IsDialogMessage(hDlg,&msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}else if (msg.hwnd==NULL)
{
if (msg.message==UM_CMDMSG)
{
if (msg.wParam==UM_APIFAILED)
{
ReconnectCall();
break;
}
else if (msg.wParam==CSTA_ESTABLISHED)
{//ok
ret=TRUE;
break;
}
}else if (msg.message==UM_CANCELDIAL)
{//click the cancel button
ReconnectCall();
break;
}
}
}
DestroyWindow(hDlg);
return ret;
}
BOOL CDirectoryNumber::OnCallDial()
{
BOOL ret=FALSE;
HWND hDlg = CreateDialog(CMichelleCTI::m_hInstance, MAKEINTRESOURCE(IDD_DIALINGDLG), NULL, DialingDlgProc);
ATLASSERT(hDlg);
RECT rcDlg, rcDesk;
GetWindowRect(GetDesktopWindow(), &rcDesk);
GetWindowRect(hDlg, &rcDlg);
int x = ((rcDesk.right - rcDesk.left) - (rcDlg.right - rcDlg.left)) / 2 + rcDesk.left;
int y = ((rcDesk.bottom - rcDesk.top) - (rcDlg.bottom - rcDlg.top)) / 2 + rcDesk.top;
SetWindowPos(hDlg, HWND_TOPMOST, x, y, 0, 0, SWP_SHOWWINDOW|SWP_NOSIZE);
MSG msg;
while (GetMessage(&msg,NULL,0,0))
{
if (IsDialogMessage(hDlg,&msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}else if (msg.hwnd==NULL)
{
if (msg.message==UM_CMDMSG)
{
if (msg.wParam==UM_APIFAILED)
{
ReleaseCall(NULL);
break;
}
else if (msg.wParam==CSTA_ESTABLISHED)
{//ok
ret=TRUE;
break;
}
}else if (msg.message==UM_CANCELDIAL)
{//click the cancel button
ReleaseCall(NULL);
break;
}
}
}
DestroyWindow(hDlg);
return ret;
}
STDMETHODIMP_(BOOL) CDirectoryNumber::AgentLogin(BSTR AgentID, BSTR AgentPassword, BSTR ACDQ, AGENTMODES mode)
{
// TODO: Add your implementation code here
BOOL bRet=FALSE;
BOOL bMonitored=FALSE;
AgentGroup_t backGroup={0};
WriteLog("Agent login service.");
if (strlen((char*)&m_agentGroup)>0)
memcpy((char*)backGroup,(char*)&m_agentGroup,sizeof(AgentGroup_t));
if (B2C(AgentID,(char*)&m_agentId,sizeof(AgentID_t))
&& B2C(AgentPassword,(char*)&m_agentPwd,sizeof(AgentPassword_t))
&&B2C(ACDQ,(char*)&m_agentGroup,sizeof(AgentGroup_t))
&&strlen((char*)&m_agentGroup)>0)
{
if (strcmp(m_agentGroup,backGroup)==0 && m_splitMonitorId!=0)
{//This acd group has been moniotred
bMonitored=TRUE;
}else// This split hasn't been monitored
if (m_splitMonitorId==0)
bMonitored=MonitorSplit(&m_agentGroup);
else
{// There is another split has been monitored
StopMonitor(m_splitMonitorId);
m_splitMonitorId=0;
bMonitored=MonitorSplit(&m_agentGroup);
}
if (bMonitored)
{
BOOL bSave=m_bIsCmdMsg;
m_bIsCmdMsg=TRUE;
RetCode_t retCode;
ATTWorkMode_t workMode;
switch (mode)
{
case AM_ManualIn:
workMode=WM_MANUAL_IN;
break;
case AM_AutoIn:
workMode=WM_AUTO_IN;
break;
case AM_AfterCallWork:
workMode=WM_AFTCAL_WK;
break;
case AM_AuxWork:
workMode=WM_AUX_WORK;
break;
default:
workMode=WM_AUX_WORK;
break;
}
ATTPrivateData_t privateData={0};
retCode=attV6SetAgentState(&privateData,
workMode,
0,//reason code not available
FALSE); //not pending
if (retCode==ACSPOSITIVE_ACK)
retCode=cstaSetAgentState(m_serverHandle,m_invokeId,&m_deviceId,
AM_LOG_IN,//angent mode
&m_agentId,//agent id
&m_agentGroup,//agent group
&m_agentPwd,//agent password
(PrivateData_t*)&privateData); //private data
//Do default process
if (retCode!=ACSPOSITIVE_ACK)
retCode=cstaSetAgentState(m_serverHandle,m_invokeId,&m_deviceId,
AM_LOG_IN,//angent mode
&m_agentId,//agent id
&m_agentGroup,//agent group
&m_agentPwd,//agent password
NULL); //private data
m_lErrCode=ERR_INI;
m_ErrMsg="";
if (retCode==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_lErrCode=LUCENT_AGENT_LOGIN_ERR;
m_ErrMsg="Agent login failed.";
}else
{
switch (m_lErrCode)
{
case GENERIC_UNSPECIFIED://The agent has logged in when you specified login
m_bLogged=FALSE;
m_lErrCode=ERR_INI;
bRet=TRUE;
break;
case GENERIC_OPERATION:// The agent has logged out when you specified logout
m_bLogged=TRUE;
m_lErrCode=ERR_INI;
bRet=TRUE;
break;
case INVALID_OBJECT_STATE: // The agent has logged in another split
m_bLogged=TRUE;
m_ErrMsg="This agent has logged in another split.";
bRet=FALSE;
break;
}
}
break;
}
else if (msg.wParam==CSTA_LOGGED_ON)
{
bRet=TRUE;
break;
}
}
}
}else
{
m_lErrCode=LUCENT_AGENT_LOGIN_ERR;
m_ErrMsg="Agent login return an error.";
}
m_bIsCmdMsg=bSave;
}
}else
{
m_ErrMsg="Specified an error parameter.";
m_lErrCode=LUCENT_INVALID_PARAM;
}
if (bRet)
{
m_bLogged=TRUE;
}else
{
char tep[300];
wsprintf((char*)&tep,"error:%s,code:%d.",m_ErrMsg.c_str(),m_lErrCode);
WriteLog((char*)&tep);
}
return bRet;
}
STDMETHODIMP_(BOOL) CDirectoryNumber::AgentLogout()
{
// TODO: Add your implementation code here
BOOL bRet=FALSE;
BOOL bSave=m_bIsCmdMsg;
m_bIsCmdMsg=TRUE;
WriteLog("Agent logout service.");
RetCode_t retCode=cstaSetAgentState(m_serverHandle,m_invokeId,&m_deviceId,
AM_LOG_OUT,//angent mode
&m_agentId,//agent id
&m_agentGroup,//agent group
&m_agentPwd,//agent password
NULL); //private data
m_lErrCode=ERR_INI;
m_ErrMsg="";
if (retCode==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_lErrCode=LUCENT_AGENT_LOGOUT_ERR;
m_ErrMsg="Agent logout failed.";
}else
{
switch (m_lErrCode)
{
case GENERIC_UNSPECIFIED://The agent has logged in when you specified login
m_bLogged=FALSE;
m_lErrCode=ERR_INI;
bRet=TRUE;
break;
case GENERIC_OPERATION:// The agent has logged out when you specified logout
m_bLogged=TRUE;
m_lErrCode=ERR_INI;
bRet=TRUE;
break;
case INVALID_OBJECT_STATE: // The agent has logged in another split
m_bLogged=TRUE;
bRet=FALSE;
break;
}
}
break;
}
else if (msg.wParam==CSTA_LOGGED_OFF)
{
bRet=TRUE;
break;
}
}
}
}else
{
m_lErrCode=LUCENT_AGENT_LOGOUT_ERR;
m_ErrMsg="agent logout return an error.";
}
m_bIsCmdMsg=bSave;
if (bRet)
{
m_bLogged=FALSE;
}else
{
char tep[300];
wsprintf((char*)&tep,"error:%s,code:%d.",m_ErrMsg.c_str(),m_lErrCode);
WriteLog((char*)&tep);
}
return bRet;
}
STDMETHODIMP_(BOOL) CDirectoryNumber::CompleteConference()
{
// TODO: Add your implementation code here
BOOL ret=FALSE;
BOOL bSave=m_bIsCmdMsg;
m_bIsCmdMsg=TRUE;
WriteLog("Conference call service.");
RetCode_t retCode=cstaConferenceCall(m_serverHandle,m_invokeId,
&m_holdConnId,&m_activeConnId,NULL);
m_lErrCode=ERR_INI;
m_ErrMsg="";
if (retCode==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_lErrCode=LUCENT_CONFERENCE_ERR;
m_ErrMsg="Conference call failed.";
}
ReconnectCall();
break;
}
else if (msg.wParam==CSTA_CONFERENCED)
{
ret=TRUE;
break;
}else if (msg.wParam==CSTA_CONNECTION_CLEARED)
{
m_lErrCode=LUCENT_CALL_RELEASED;
m_ErrMsg="The call was released by the other party.";
RetrieveCall(NULL);
break;
}
}
}
}else
{
m_lErrCode=retCode;
m_ErrMsg="conference return an error.";
}
m_bIsCmdMsg=bSave;
if (!ret)
{
char tep[300];
wsprintf((char*)&tep,"error:%s,code:%d.",m_ErrMsg.c_str(),m_lErrCode);
WriteLog((char*)&tep);
}
return ret;
}
STDMETHODIMP_(BOOL) CDirectoryNumber::CompleteTransfer()
{
// TODO: Add your implementation code here
BOOL ret=FALSE;
BOOL bSave=m_bIsCmdMsg;
m_bIsCmdMsg=TRUE;
WriteLog("Transfer call service.");
RetCode_t retCode=cstaTransferCall(m_serverHandle,m_invokeId,
&m_holdConnId,&m_activeConnId,NULL);
m_lErrCode=ERR_INI;
m_ErrMsg="";
if (retCode==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_lErrCode=LUCENT_TRANSFERCALL_ERR;
m_ErrMsg="Transfer call failed.";
}
ReconnectCall();
break;
}
else if (msg.wParam==CSTA_TRANSFERRED)
{
ret=TRUE;
break;
}else if (msg.wParam==CSTA_CONNECTION_CLEARED)
{
m_lErrCode=LUCENT_CALL_RELEASED;
m_ErrMsg="The call was released by the other party.";
RetrieveCall(NULL);
break;
}
}
}
}else
{
m_lErrCode=retCode;
m_ErrMsg="Transfer call return value";
}
m_bIsCmdMsg=bSave;
if (!ret)
{
char tep[300];
wsprintf((char*)&tep,"error:%s,code:%d.",m_ErrMsg.c_str(),m_lErrCode);
WriteLog((char*)&tep);
}
return ret;
}
STDMETHODIMP_(BOOL) CDirectoryNumber::HoldCall(BSTR connid)
{
// TODO: Add your implementation code here
BOOL ret=FALSE;
BOOL bSave=m_bIsCmdMsg;
m_bIsCmdMsg=TRUE;
WriteLog("Hold call service.");
RetCode_t retCode=cstaHoldCall(m_serverHandle,m_invokeId,
&m_activeConnId,TRUE,NULL);
m_lErrCode=ERR_INI;
m_ErrMsg="";
if (retCode==ACSPOSITIVE_ACK)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -