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

📄 michellecti.cpp

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