template<> inline JUINT32 JList<JPER_RECORD>::CopyObject(JList<JPER_RECORD>& rDst, JList<JPER_RECORD>& rSrc) { JPER_RECORD* pDstData = JNULL; JListItem<JPER_RECORD>* pDstItem = JNULL; JUINT32 uiLen = 0; JPER_RECORD* pSrcData = JNULL; JListItem<JPER_RECORD>* pSrcItem = JNULL; JListItem<JPER_RECORD>* prevDstItem = JNULL; rDst.m_pHead = JNULL; rDst.m_pTail = JNULL; JLogAutoPtr clsLogAutoPtr(JSingleton<JLog>::instance(), JLOG_MOD_LIST, "JList::CopyObject"); JListIterator<JPER_RECORD> clsListIter(rSrc); for (clsListIter.First(); clsListIter.Done(); clsListIter.Next()) { pSrcItem = clsListIter.Item(); pDstData = JNULL; pSrcData = pSrcItem->GetData(); uiLen = pSrcItem->GetDataLength(); if (uiLen) { //alloc memory for the dst data pDstData = reinterpret_cast<JPER_RECORD*>(JSingleton<JStaticMemory>::instance()->Alloc(uiLen+1)); if (pDstData) { SafeMemset(reinterpret_cast<JCHAR*>(pDstData), 0, uiLen+1); SafeMemcpy(reinterpret_cast<JCHAR*>(pDstData), reinterpret_cast<JCHAR*>(pSrcData), uiLen, uiLen+1); } else { JSingleton<JLog>::instance2() << set(JLOG_MOD_LIST, JLOG_ERROR_LEVEL) << "JList::CopyObject memory alloc failure\n"; return JFAILURE; } } //construct the dst item pDstItem = new JListItem<JPER_RECORD>(pDstData); pDstItem->SetDataLength(uiLen); rDst.InsertItem(pDstItem, prevDstItem); prevDstItem = pDstItem; } return JSUCCESS; }
JUINT32 JPhoneAgent::GetContactRsp(JPjSipUaContactList* pPjSipUaContactList) { JUINT32 uiRet = JFAILURE; JEvent* pEvent = JNULL; JSOCKADDR_IN stAddr; JEVT_TYPE pType = JEVT_NONE; JPjSipUaContactList* pPjSipUaContactListBody = JNULL; JUINT32 uiInterval = 0; JUINT32 uiIdx = 0; JCHAR pBuf[JCOMM_MSG_BUF_LEN] = {0}; JCommEngine* pCommEngine = JNULL; JListItem<JEvent>* pListItem = JNULL; JLogAutoPtr clsLogAutoPtr(JSingleton<JLog>::instance(), JLOG_MOD_PHONE_AGENT, "JPhoneAgent::GetContactRsp"); if (!pPjSipUaContactList) { return JFAILURE; } else { pPjSipUaContactList->Clear(); } while(1) { if (!uiInterval) { uiInterval = JPHONE_AGENT_SELECT_TIME; } else { uiInterval = JPHONE_AGENT_SELECT_TIME2; } pCommEngine = m_pAgentThread->GetCommEngineGroup().HasMessage(uiInterval); if (pCommEngine && pCommEngine == m_pAgentThread->GetNotifyCommEngine()) { uiRet = pCommEngine->RecvMessage(pBuf, JCOMM_MSG_BUF_LEN, &stAddr); if (uiRet == 1 && SafeStrcmp(pBuf, "1") ==0) { pListItem = m_pAgentThread->DeQueueEvent(); if (pListItem) { pEvent = pListItem->GetData(); if (pEvent) { pType = pEvent->GetEventType(); pPjSipUaContactListBody = dynamic_cast<JPjSipUaContactList*>(pEvent->GetBody()); //check the response and save the data if (pType == JEVT_SIPUA_GET_CONTACT_LIST_RSP && pPjSipUaContactListBody) { for (uiIdx=0; uiIdx<JPJSIP_MAX_NUMBER; uiIdx++) { if(!pPjSipUaContactListBody->GetContactNumber(uiIdx).GetLength()) { break; } pPjSipUaContactList->SetContactNumber(uiIdx, pPjSipUaContactListBody->GetContactNumber(uiIdx)); } } } delete pListItem; } } } else { break; } } return JSUCCESS; }
JUINT32 JPhoneAgent::GetLogCfgRsp(JLogCfg* pLogCfg) { JUINT32 uiRet = JFAILURE; JEvent* pEvent = JNULL; JSOCKADDR_IN stAddr; JEVT_TYPE pType = JEVT_NONE; JLogCfg* pLogCfgBody = JNULL; JUINT32 uiInterval = 0; JCHAR pBuf[JCOMM_MSG_BUF_LEN] = {0}; JCommEngine* pCommEngine = JNULL; JListItem<JEvent>* pListItem = JNULL; JLogAutoPtr clsLogAutoPtr(JSingleton<JLog>::instance(), JLOG_MOD_PHONE_AGENT, "JPhoneAgent::GetLogCfgRsp"); if (!pLogCfg) { return JFAILURE; } else { pLogCfg->Clear(); } while(1) { if (!uiInterval) { uiInterval = JPHONE_AGENT_SELECT_TIME; } else { uiInterval = JPHONE_AGENT_SELECT_TIME2; } pCommEngine = m_pAgentThread->GetCommEngineGroup().HasMessage(uiInterval); if (pCommEngine && pCommEngine == m_pAgentThread->GetNotifyCommEngine()) { uiRet = pCommEngine->RecvMessage(pBuf, JCOMM_MSG_BUF_LEN, &stAddr); if (uiRet == 1 && SafeStrcmp(pBuf, "1") ==0) { pListItem = m_pAgentThread->DeQueueEvent(); if (pListItem) { pEvent = pListItem->GetData(); if (pEvent) { pType = pEvent->GetEventType(); pLogCfgBody = dynamic_cast<JLogCfg*>(pEvent->GetBody()); //check the response and save the data if (pType == JEVT_LOG_GET_CFG_RSP && pLogCfgBody) { pLogCfg->SetLogAddress(pLogCfgBody->GetLogAddress()); pLogCfg->SetLogPort(pLogCfgBody->GetLogPort()); pLogCfg->SetOutputFile(pLogCfgBody->GetOutputFile()); pLogCfg->SetOutputRemote(pLogCfgBody->GetOutputRemote()); } } delete pListItem; } } } else { break; } } return JSUCCESS; }
JUINT32 JPhoneAgent::GetDaemonCfgRsp(JDaemonCfg* pDaemonCfg) { JUINT32 uiRet = JFAILURE; JEvent* pEvent = JNULL; JSOCKADDR_IN stAddr; JEVT_TYPE pType = JEVT_NONE; JDaemonCfg* pDaemonCfgBody = JNULL; JUINT32 uiInterval = 0; JCHAR pBuf[JCOMM_MSG_BUF_LEN] = {0}; JCommEngine* pCommEngine = JNULL; JListItem<JEvent>* pListItem = JNULL; JLogAutoPtr clsLogAutoPtr(JSingleton<JLog>::instance(), JLOG_MOD_PHONE_AGENT, "JPhoneAgent::GetDaemonCfgRsp"); if (!pDaemonCfg) { return JFAILURE; } else { pDaemonCfg->Clear(); } while(1) { //first select time is 500ms, the second is 100ms, because normally the response //be received in the 500ms after request be sent, so it will make it more likely to //receive response at the first select loop. if (!uiInterval) { uiInterval = JPHONE_AGENT_SELECT_TIME; } else { uiInterval = JPHONE_AGENT_SELECT_TIME2; } //if response event be received, first a notify message "1" be received //the get event for the thread queue, because it's through queue read/write //while communication happens between two threads of one process. pCommEngine = m_pAgentThread->GetCommEngineGroup().HasMessage(uiInterval); if (pCommEngine && pCommEngine == m_pAgentThread->GetNotifyCommEngine()) { uiRet = pCommEngine->RecvMessage(pBuf, JCOMM_MSG_BUF_LEN, &stAddr); if (uiRet == 1 && SafeStrcmp(pBuf, "1") ==0) { pListItem = m_pAgentThread->DeQueueEvent(); if (pListItem) { pEvent = pListItem->GetData(); if (pEvent) { pType = pEvent->GetEventType(); pDaemonCfgBody = dynamic_cast<JDaemonCfg*>(pEvent->GetBody()); //check the response and save the data if (pType == JEVT_DAEMON_GET_CFG_RSP && pDaemonCfgBody) { pDaemonCfg->SetSaveMethod(pDaemonCfgBody->GetSaveMethod()); } } delete pListItem; } } } else { break; } } return JSUCCESS; }
JUINT32 JModuleThread::Run() { JUINT32 uiRet = JFAILURE; JUINT32 uiIdx = 0; JListItem<JEvent>* pListItem = JNULL; JEvent* pEvent = JNULL; JSOCKADDR_IN stAddr; JCommEngine* pCommEngine = JNULL; JCHAR pBuf[JCOMM_MSG_BUF_LEN] = {0}; JLogAutoPtr clsLogAutoPtr(JSingleton<JLog>::instance(), JLOG_MOD_THREAD, "JModuleThread::Run"); uiRet = Init(); if (!uiRet) { JSingleton<JLog>::instance2() << set(JLOG_MOD_THREAD, JLOG_ERROR_LEVEL) << "JModuleThread::Run Init return failure\n"; return JFAILURE; } do{ pCommEngine = m_commEngineGroup.HasMessage(JCOMM_SELECT_INDEFINITE); if (pCommEngine && pCommEngine == m_pNotifyCommEngine) //for thread notify CommEngine { uiRet = pCommEngine->RecvMessage(pBuf, JCOMM_MSG_BUF_LEN, &stAddr); if (uiRet == 1 && SafeStrcmp(pBuf, "1") ==0) { while(1) { uiIdx = GetRunModuleSeq(); if (uiIdx<m_modDataUsed) { m_Lock.Acquire(); pListItem = m_modData[uiIdx].hQueue.DeQueue(); if (pListItem) { pEvent = pListItem->GetData(); if (pEvent) { m_modData[uiIdx].pModule->EventProcFunc(pEvent); } delete pListItem; } m_Lock.Release(); } else { break; } IncModuleSeq(uiIdx); } } else //JEvent recv, and route also must be added here. { } } else //other thread JCommEngine { } }while(1); return JSUCCESS; }
JUINT32 JPhoneAgent::GetStatusRsp(JPjSipUaCallStatus* pPjSipUaCallStatus) { JUINT32 uiRet = JFAILURE; JEvent* pEvent = JNULL; JSOCKADDR_IN stAddr; JEVT_TYPE pType = JEVT_NONE; JPjSipUaCallStatus* pPjSipUaCallStatusBody = JNULL; JUINT32 uiInterval = 0; JCHAR pBuf[JCOMM_MSG_BUF_LEN] = {0}; JCommEngine* pCommEngine = JNULL; JListItem<JEvent>* pListItem = JNULL; JLogAutoPtr clsLogAutoPtr(JSingleton<JLog>::instance(), JLOG_MOD_PHONE_AGENT, "JPhoneAgent::GetStatusRsp"); if (!pPjSipUaCallStatus) { return JFAILURE; } else { pPjSipUaCallStatus->Clear(); } while(1) { if (!uiInterval) { uiInterval = JPHONE_AGENT_SELECT_TIME; } else { uiInterval = JPHONE_AGENT_SELECT_TIME2; } pCommEngine = m_pAgentThread->GetCommEngineGroup().HasMessage(uiInterval); if (pCommEngine && pCommEngine == m_pAgentThread->GetNotifyCommEngine()) { uiRet = pCommEngine->RecvMessage(pBuf, JCOMM_MSG_BUF_LEN, &stAddr); if (uiRet == 1 && SafeStrcmp(pBuf, "1") ==0) { pListItem = m_pAgentThread->DeQueueEvent(); if (pListItem) { pEvent = pListItem->GetData(); if (pEvent) { pType = pEvent->GetEventType(); pPjSipUaCallStatusBody = dynamic_cast<JPjSipUaCallStatus*>(pEvent->GetBody()); if (pType == JEVT_SIPUA_GET_CALL_STATUS_RSP && pPjSipUaCallStatusBody) { pPjSipUaCallStatus->SetNumber(pPjSipUaCallStatusBody->GetNumber()); pPjSipUaCallStatus->SetStatus(pPjSipUaCallStatusBody->GetStatus()); } } delete pListItem; } } } else { break; } } return JSUCCESS; }