⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 directorynumber.cpp

📁 利用AVAYA AES的TASPI开发的一套软电话系统,仅供参考,ACTIVEX形式的.
💻 CPP
📖 第 1 页 / 共 4 页
字号:
					{
//						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 + -