TaoStatus TaoPhoneComponentAdaptor::getExtSpeakerNominalVolume(TaoMessage& rMsg) { int volume = 0; int groupType = atoi(rMsg.getArgList()); mpPhoneTask->taoGetNominalVolume(volume, groupType); if (volume > 10) volume = 10; if (volume < 0) volume = 0; char buff[MAXIMUM_INTEGER_STRING_LENGTH]; sprintf(buff, "%d", volume); rMsg.setMsgSubType(TaoMessage::RESPONSE_PHONECOMPONENT); rMsg.setArgCnt(1); rMsg.setArgList(buff); if (mpSvrTransport->postMessage(rMsg)) { return TAO_SUCCESS; } return TAO_FAILURE; }
TaoStatus TaoListenerManager::removeEventListener(TaoMessage& rMsg) { UtlString terminalName; TaoString str(rMsg.getArgList(), TAOMESSAGE_DELIMITER); terminalName = str[0]; if (terminalName.isNull() || 0 == terminalName.compareTo("0.0.0.0")) terminalName = "127.0.0.1"; // OsWriteLock lock(mListenerRWLock); if (mListenerCnt > 0) // check if listener exists. { for (int i = 0; i < mListenerCnt; i++) { if (mpListeners[i] && mpListeners[i]->mName.compareTo(terminalName) == 0) { mpListeners[i]->mRef--; if (mpListeners[i]->mRef <= 0) { osPrintf("*** TaoListenerManager::removeEventListener %s 0x%08x %d\n", terminalName.data(), (int)mpListeners[i], mpListeners[i]->mRef); if (mpListeners[i]->mpListenerPtr) { TaoEventListener* pListener = (TaoEventListener*) mpListeners[i]->mpListenerPtr; delete pListener; } delete mpListeners[i]; mpListeners[i] = 0; mListenerCnt--; // find and delete the TaoTransportAgent TaoObjHandle object; if (TAO_SUCCESS == mpAgents->findValue(terminalName.data(), object)) { if (object) { osPrintf("TaoListenerManager removeEventListener TaoTransportAgent = %d\n", (int)object); TaoTransportAgent *pAgent = (TaoTransportAgent *)object; delete pAgent; } } else osPrintf("TaoListenerManager removeEventListener Failure! did not find socket %s\n", terminalName.data()); if (TAO_SUCCESS == mpAgents->remove(terminalName.data())) { osPrintf(" **** TaoListenerManager removeEventListener socket removed %s ****\n", terminalName.data()); } else osPrintf("TaoListenerManager removeEventListener Failure! did not remove socket %s\n", terminalName.data()); } } } } return TAO_SUCCESS; }
TaoStatus TaoPhoneComponentAdaptor::getGroupComponents(TaoMessage& rMsg) { int size = atoi(rMsg.getArgList()); PsMsg msg(PsMsg::PHONEGROUP_GET_COMPONENTS, this, size, 0); mpPhoneTask->postMessage(msg); return TAO_SUCCESS; }
TaoStatus TaoPhoneComponentAdaptor::getDisplayColumns(TaoMessage& rMsg) { if (rMsg.getArgList()) { rMsg.setMsgSubType(TaoMessage::RESPONSE_PHONECOMPONENT); if (mpSvrTransport->postMessage(rMsg)) return TAO_SUCCESS; } return TAO_FAILURE; }
TaoStatus TaoPhoneComponentAdaptor::setButtonInfo(TaoMessage& rMsg) { if (rMsg.getArgList()) { mInfo = rMsg.getArgList(); int keyIndex = mpButtonTask->getButtonIndex(mInfo.data()); if (keyIndex >= 0) { mpButtonTask->postEvent(PsMsg::BUTTON_SET_INFO, this, keyIndex); } else rMsg.setObjHandle((TaoObjHandle)TAO_INVALID_ARGUMENT); rMsg.setMsgSubType(TaoMessage::RESPONSE_PHONECOMPONENT); if (mpSvrTransport->postMessage(rMsg)) return TAO_SUCCESS; } return TAO_FAILURE; }
TaoStatus TaoPhoneComponentAdaptor::getRingerInfo(TaoMessage& rMsg) { if (rMsg.getArgCnt()) { int index = atoi(rMsg.getArgList()); PsMsg msg(PsMsg::RINGER_GET_INFO, this, index, 0); mpPhoneTask->postMessage(msg); return TAO_SUCCESS; } return TAO_FAILURE; }
TaoStatus TaoPhoneComponentAdaptor::setRingerPattern(TaoMessage& rMsg) { int index = atoi(rMsg.getArgList()); PsMsg msg(PsMsg::RINGER_SET_PATTERN, this, index, 0); mpPhoneTask->postMessage(msg); rMsg.setMsgSubType(TaoMessage::RESPONSE_PHONECOMPONENT); if (mpSvrTransport->postMessage(rMsg)) return TAO_SUCCESS; return TAO_FAILURE; }
TaoStatus TaoPhoneComponentAdaptor::setRingerVolume(TaoMessage& rMsg) { int volume = atoi(rMsg.getArgList()); mpPhoneTask->taoSetVolume(volume, PtComponentGroup::RINGER); rMsg.setMsgSubType(TaoMessage::RESPONSE_PHONECOMPONENT); if (mpSvrTransport->postMessage(rMsg)) { return TAO_SUCCESS; } return TAO_FAILURE; }
TaoStatus TaoPhoneComponentAdaptor::setHookswState(TaoMessage& rMsg) { if (rMsg.getArgCnt()) { mHookswState = atoi(rMsg.getArgList()); PsMsg hookswMsg(PsMsg::HOOKSW_STATE, this, mHookswState, mHookswState); mpPhoneTask->postMessage(hookswMsg); rMsg.setMsgSubType(TaoMessage::RESPONSE_PHONECOMPONENT); if (mpSvrTransport->postMessage(rMsg)) return TAO_SUCCESS; } return TAO_FAILURE; }
TaoStatus TaoPhoneComponentAdaptor::setLampMode(TaoMessage& rMsg) { TaoString arg(rMsg.getArgList(), TAOMESSAGE_DELIMITER); UtlString buttonInfo = arg[0]; int mode = atoi(arg[1]); PsMsg msg(PsMsg::LAMP_SET_MODE, this, mode, 0); msg.setStringParam1(buttonInfo.data()); mpPhoneTask->postMessage(msg); rMsg.setMsgSubType(TaoMessage::RESPONSE_PHONECOMPONENT); if (mpSvrTransport->postMessage(rMsg)) return TAO_SUCCESS; return TAO_FAILURE; }
TaoStatus TaoPhoneComponentAdaptor::setMicGain(TaoMessage& rMsg) { if (rMsg.getArgCnt() != 2) return TAO_FAILURE; TaoString arg(rMsg.getArgList(), TAOMESSAGE_DELIMITER); int groupType = atoi(arg[0]); int gain = atoi(arg[1]); mpPhoneTask->taoSetMicGain(groupType, gain); rMsg.setMsgSubType(TaoMessage::RESPONSE_PHONECOMPONENT); if (mpSvrTransport->postMessage(rMsg)) return TAO_SUCCESS; return TAO_FAILURE; }
TaoStatus TaoPhoneComponentAdaptor::setRingerInfo(TaoMessage& rMsg) { TaoString arg(rMsg.getArgList(), TAOMESSAGE_DELIMITER); int index = atoi(arg[0]); UtlString info = arg[1]; if (info) { PsMsg msg(PsMsg::RINGER_SET_INFO, this, index, 0); msg.setStringParam1(info.data()); mpPhoneTask->postMessage(msg); rMsg.setMsgSubType(TaoMessage::RESPONSE_PHONECOMPONENT); if (mpSvrTransport->postMessage(rMsg)) return TAO_SUCCESS; } return TAO_FAILURE; }
TaoStatus TaoPhoneComponentAdaptor::getMicGain(TaoMessage& rMsg) { if (rMsg.getArgCnt() != 1) return TAO_FAILURE; UtlString arg = rMsg.getArgList(); int groupType = atoi(arg.data()); int gain = mpPhoneTask->taoGetMicGain(groupType); char buf[32]; sprintf(buf, "%d", gain); arg += TAOMESSAGE_DELIMITER + buf; rMsg.setArgCnt(2); rMsg.setArgList(arg); rMsg.setMsgSubType(TaoMessage::RESPONSE_PHONECOMPONENT); if (mpSvrTransport->postMessage(rMsg)) return TAO_SUCCESS; return TAO_FAILURE; }
TaoStatus TaoPhoneComponentAdaptor::setDisplayContrast(TaoMessage& rMsg) { int argCnt = rMsg.getArgCnt(); if (argCnt != 2) return TAO_FAILURE; #ifdef _VXWORKS TaoString arg(rMsg.getArgList(), TAOMESSAGE_DELIMITER); int level = atoi(arg[0]); if (!mLCDLow && !mLCDHigh) { int nominal; MpCodec_getLCDContrastRange(mLCDLow, mLCDHigh, nominal); mLCDOffset = mLCDLow - 1; } level += mLCDOffset; if (level < mLCDLow) level = mLCDLow; if (level > mLCDHigh) level = mLCDHigh; if (OS_SUCCESS == MpCodec_setLCDContrast(level)) { osPrintf("--- set LCD contrast level %d -> %d ---\n", mLCDContrast, level); mLCDContrast = level; rMsg.setMsgSubType(TaoMessage::RESPONSE_PHONECOMPONENT); if (mpSvrTransport->postMessage(rMsg)) { return TAO_SUCCESS; } } #endif return TAO_FAILURE; }
UtlBoolean TaoClientTask::receiveMsg(TaoMessage& rMsg) { TaoObjHandle appHandle = 0; appHandle = rMsg.getSocket(); // where the app pointer is stored if (appHandle) { OsProtectedEvent* pEvent; TaoObjHandle handle; UtlString argList; int data; pEvent = (OsProtectedEvent *)appHandle; handle = rMsg.getTaoObjHandle(); data = rMsg.getArgCnt(); argList = rMsg.getArgList(); pEvent->setIntData(data); data = rMsg.getCmd(); pEvent->setIntData2(data); pEvent->setStringData(argList); // If the event has already been signalled, clean up if(OS_ALREADY_SIGNALED == pEvent->signal(handle)) { OsProtectEventMgr* eventMgr = OsProtectEventMgr::getEventMgr(); eventMgr->release(pEvent); } return TRUE; } else { osPrintf("<<<< TaoClientTask::receiveMsg: no appHandle!! >>>>\n"); return FALSE; } }
UtlBoolean Listener::handleMessage(OsMsg& rMsg) { // React to telephony events if(rMsg.getMsgSubType()== TaoMessage::EVENT) { TaoMessage* taoMessage = (TaoMessage*)&rMsg; TaoEventId taoEventId = taoMessage->getTaoObjHandle(); UtlString argList(taoMessage->getArgList()); TaoString arg(argList, TAOMESSAGE_DELIMITER); #ifdef DEBUGGING dumpTaoMessageArgs(taoEventId, arg) ; #endif UtlBoolean localConnection = atoi(arg[TAO_OFFER_PARAM_LOCAL_CONNECTION]); UtlString callId = arg[TAO_OFFER_PARAM_CALLID] ; UtlString address = arg[TAO_OFFER_PARAM_ADDRESS] ; switch (taoEventId) { case PtEvent::CONNECTION_OFFERED: OsSysLog::add(FAC_MEDIASERVER_VXI, PRI_DEBUG, "Call arrived: callId %s address %s\n", callId.data(), address.data()); mpCallManager->acceptConnection(callId, address); mpCallManager->answerTerminalConnection(callId, address, "*"); break; case PtEvent::CONNECTION_ESTABLISHED: if (localConnection) { OsSysLog::add(FAC_MEDIASERVER_VXI, PRI_DEBUG, "Call connected: callId %s\n", callId.data()); CallObject* pThisCall = new CallObject(mpCallManager, callId, mPlayfile); // Create a player and start to play out the file if (pThisCall->playAudio() == OS_SUCCESS) { // Put it in a sorted list insertEntry(callId, pThisCall); } else { // Drop the call mpCallManager->drop(callId); OsSysLog::add(FAC_MEDIASERVER_VXI, PRI_WARNING, "Listener::handleMessage - drop callId %s due to failure of playing audio\n", callId.data()); delete pThisCall; } } break; case PtEvent::CONNECTION_DISCONNECTED: if (!localConnection) { OsSysLog::add(FAC_MEDIASERVER_VXI, PRI_DEBUG, "Call Dropped: %s\n", callId.data()); // Remove the call from the pool and clean up the call CallObject* pDroppedCall = removeEntry(callId); if (pDroppedCall) { pDroppedCall->cleanUp(); delete pDroppedCall; // Drop the call mpCallManager->drop(callId); } else { OsSysLog::add(FAC_MEDIASERVER_VXI, PRI_DEBUG, "Lisenter::handleMessage - no callId %s founded in the active call list\n", callId.data()); } } break; case PtEvent::CONNECTION_FAILED: OsSysLog::add(FAC_MEDIASERVER_VXI, PRI_WARNING, "Dropping call: %s\n", callId.data()); mpCallManager->drop(callId); break; } } return(TRUE); }
UtlBoolean DialogEventPublisher::handleMessage(OsMsg& rMsg) { SipDialog sipDialog; UtlString sipDialogContent; Url requestUrl; UtlString entity; UtlString* pEntity; char dialogId[10]; SipDialogEvent* pThisCall; Dialog* pDialog; UtlString localTag, remoteTag; Url localIdentity, remoteIdentity; Url localTarget, remoteTarget; UtlString identity, displayName; OsTime receivedTime; int numOldContents; HttpBody* oldContent[1]; int length; UtlString dialogEvent; // React to telephony events if(rMsg.getMsgSubType()== TaoMessage::EVENT) { TaoMessage* taoMessage = (TaoMessage*)&rMsg; int taoEventId = taoMessage->getTaoObjHandle(); UtlString argList(taoMessage->getArgList()); TaoString arg(argList, TAOMESSAGE_DELIMITER); #ifdef DEBUGGING dumpTaoMessageArgs(taoEventId, arg) ; #endif UtlBoolean localConnection = atoi(arg[TAO_OFFER_PARAM_LOCAL_CONNECTION]); UtlString callId = arg[TAO_OFFER_PARAM_CALLID] ; UtlString address = arg[TAO_OFFER_PARAM_ADDRESS] ; switch (taoEventId) { case PtEvent::CONNECTION_OFFERED: mpCallManager->getSipDialog(callId, address, sipDialog); #ifdef DEBUGGING sipDialog.toString(sipDialogContent); OsSysLog::add(FAC_SIP, PRI_DEBUG, "DialogEventPublisher:: sipDialog = %s", sipDialogContent.data()); #endif sipDialog.getRemoteRequestUri(entity); OsSysLog::add(FAC_SIP, PRI_DEBUG, "DialogEventPublisher:: Call arrived: callId %s address %s requestUrl %s", callId.data(), address.data(), entity.data()); if (entity.isNull()) { OsSysLog::add(FAC_SIP, PRI_WARNING, "DialogEventPublisher:: Call arrived: callId %s address %s without requestUrl", callId.data(), address.data()); break; } else { requestUrl = Url(entity); requestUrl.getIdentity(entity); } // Create a dialog event if has not been created yet pThisCall = (SipDialogEvent *) mCalls.findValue(&entity); if (pThisCall == NULL) { pEntity = new UtlString(entity); pThisCall = new SipDialogEvent(STATE, entity); mCalls.insertKeyAndValue(pEntity, pThisCall); OsSysLog::add(FAC_SIP, PRI_DEBUG, "DialogEventPublisher:: insert DialogEvent object %p to the list", pThisCall); } // Create the dialog element sipDialog.getLocalField(localIdentity); localIdentity.getFieldParameter("tag", localTag); sipDialog.getRemoteField(remoteIdentity); remoteIdentity.getFieldParameter("tag", remoteTag); sprintf(dialogId, "%ld", mDialogId); mDialogId++; pDialog = new Dialog(dialogId, callId, localTag, remoteTag, "recipient"); pDialog->setState(STATE_EARLY, NULL, NULL); localIdentity.getIdentity(identity); localIdentity.getDisplayName(displayName); pDialog->setLocalIdentity(identity, displayName); remoteIdentity.getIdentity(identity); remoteIdentity.getDisplayName(displayName); pDialog->setRemoteIdentity(identity, displayName); sipDialog.getLocalContact(localTarget); pDialog->setLocalTarget(localTarget.toString()); sipDialog.getRemoteContact(remoteTarget); pDialog->setRemoteTarget(remoteTarget.toString()); pDialog->setDuration(OsDateTime::getSecsSinceEpoch()); pThisCall->insertDialog(pDialog); // Insert it into the active call list pThisCall->buildBody(); // Send the content to the subscribe server if (!mpSipPublishContentMgr->publish(entity.data(), DIALOG_EVENT_TYPE, DIALOG_EVENT_TYPE, 1, (HttpBody**)&pThisCall, 1, numOldContents, oldContent)) { pThisCall->getBytes(&dialogEvent, &length); OsSysLog::add(FAC_SIP, PRI_ERR, "DialogEventPublisher:: Call arrived - DialogEvent %s\n was not successfully published to the subscribe server", dialogEvent.data()); } break; case PtEvent::CONNECTION_ESTABLISHED: if (localConnection) { mpCallManager->getSipDialog(callId, address, sipDialog); #ifdef DEBUGGING sipDialog.toString(sipDialogContent); OsSysLog::add(FAC_SIP, PRI_DEBUG, "DialogEventPublisher:: sipDialog = %s", sipDialogContent.data()); #endif sipDialog.getRemoteRequestUri(entity); OsSysLog::add(FAC_SIP, PRI_DEBUG, "Call connected: callId %s address %s with request %s", callId.data(), address.data(), entity.data()); if (entity.isNull()) { OsSysLog::add(FAC_SIP, PRI_WARNING, "DialogEventPublisher:: Call connected: callId %s address %s without requestUrl", callId.data(), address.data()); break; } else { requestUrl = Url(entity); requestUrl.getIdentity(entity); } pThisCall = (SipDialogEvent *) mCalls.findValue(&entity); if (pThisCall == NULL) { pEntity = new UtlString(entity); pThisCall = new SipDialogEvent(STATE, entity); // Insert it into the active call list mCalls.insertKeyAndValue(pEntity, pThisCall); } // Get the new callId because it might be changed sipDialog.getCallId(callId); pDialog = pThisCall->getDialog(callId); // Update the dialog content if exist if (pDialog) { sipDialog.getLocalField(localIdentity); localIdentity.getFieldParameter("tag", localTag); sipDialog.getRemoteField(remoteIdentity); remoteIdentity.getFieldParameter("tag", remoteTag); pDialog->setTags(localTag, remoteTag); sipDialog.getLocalContact(localTarget); pDialog->setLocalTarget(localTarget.toString()); sipDialog.getRemoteContact(remoteTarget); pDialog->setRemoteTarget(remoteTarget.toString()); pDialog->setState(STATE_CONFIRMED, NULL, NULL); } else { // Create a new dialog element sipDialog.getLocalField(localIdentity); localIdentity.getFieldParameter("tag", localTag); sipDialog.getRemoteField(remoteIdentity); remoteIdentity.getFieldParameter("tag", remoteTag); sprintf(dialogId, "%ld", mDialogId); mDialogId++; pDialog = new Dialog(dialogId, callId, localTag, remoteTag, "recipient"); pDialog->setState(STATE_CONFIRMED, NULL, NULL); localIdentity.getIdentity(identity); localIdentity.getDisplayName(displayName); pDialog->setLocalIdentity(identity, displayName); remoteIdentity.getIdentity(identity); remoteIdentity.getDisplayName(displayName); pDialog->setRemoteIdentity(identity, displayName); sipDialog.getLocalContact(localTarget); pDialog->setLocalTarget(localTarget.toString()); sipDialog.getRemoteContact(remoteTarget); pDialog->setRemoteTarget(remoteTarget.toString()); pDialog->setDuration(OsDateTime::getSecsSinceEpoch()); pThisCall->insertDialog(pDialog); } pThisCall->buildBody(); // Publish the content to the subscribe server if (!mpSipPublishContentMgr->publish(entity.data(), DIALOG_EVENT_TYPE, DIALOG_EVENT_TYPE, 1, (HttpBody**)&pThisCall, 1, numOldContents, oldContent)) { pThisCall->getBytes(&dialogEvent, &length); OsSysLog::add(FAC_SIP, PRI_ERR, "DialogEventPublisher:: Call connected - DialogEvent %s\n was not successfully published to the subscribe server", dialogEvent.data()); } } break; case PtEvent::CONNECTION_DISCONNECTED: if (!localConnection) { mpCallManager->getSipDialog(callId, address, sipDialog); #ifdef DEBUGGING sipDialog.toString(sipDialogContent); OsSysLog::add(FAC_SIP, PRI_DEBUG, "DialogEventPublisher:: sipDialog = %s", sipDialogContent.data()); #endif sipDialog.getLocalContact(requestUrl); requestUrl.getIdentity(entity); OsSysLog::add(FAC_SIP, PRI_DEBUG, "Call dropped: %s address %s with entity %s", callId.data(), address.data(), entity.data()); if (entity.isNull()) { OsSysLog::add(FAC_SIP, PRI_WARNING, "DialogEventPublisher:: Call dropped: callId %s address %s without requestUrl", callId.data(), address.data()); break; } // Get the new callId because it might be changed sipDialog.getCallId(callId); // Remove the call from the pool and clean up the call pThisCall = (SipDialogEvent *) mCalls.findValue(&entity); if (pThisCall) { pDialog = pThisCall->getDialog(callId); if (pDialog) { pDialog->setState(STATE_TERMINATED, NULL, NULL); pThisCall->buildBody(); // Publish the content to the subscribe server if (!mpSipPublishContentMgr->publish(entity.data(), DIALOG_EVENT_TYPE, DIALOG_EVENT_TYPE, 1, (HttpBody**)&pThisCall, 1, numOldContents, oldContent)) { pThisCall->getBytes(&dialogEvent, &length); OsSysLog::add(FAC_SIP, PRI_ERR, "DialogEventPublisher:: Call dropped - DialogEvent %s\n was not successfully published to the subscribe server", dialogEvent.data()); } // Remove the dialog from the dialog event package pDialog = pThisCall->removeDialog(pDialog); delete pDialog; } if (pThisCall->isEmpty()) { // Unpublisher the content from the subscribe server if (!mpSipPublishContentMgr->unpublish(entity.data(), DIALOG_EVENT_TYPE, DIALOG_EVENT_TYPE, 1, numOldContents, oldContent)) { pThisCall->getBytes(&dialogEvent, &length); OsSysLog::add(FAC_SIP, PRI_ERR, "DialogEventPublisher:: Call dropped - DialogEvent %s\n was not successfully unpublished to the subscribe server", dialogEvent.data()); } UtlContainable *foundValue; mCalls.removeKeyAndValue(pEntity, foundValue); if (foundValue) { OsSysLog::add(FAC_SIP, PRI_DEBUG, "DialogEventPublisher:: remove DialogEvent object %p from the list", pThisCall); pThisCall = (SipDialogEvent *) foundValue; delete pThisCall; delete pEntity; } } } else { OsSysLog::add(FAC_SIP, PRI_ERR, "DialogEventPublisher:: Call dropped - no entity %s founded in the active call list", entity.data()); } } break; case PtEvent::CONNECTION_FAILED: OsSysLog::add(FAC_SIP, PRI_WARNING, "Connection failed on call: %s", callId.data()); break; } } return(TRUE); }
TaoStatus TaoListenerManager::addCallListener(TaoMessage& rMsg) { TaoStatus ret = TAO_SUCCESS; UtlString terminalName; TaoString str(rMsg.getArgList(), TAOMESSAGE_DELIMITER); terminalName = str[0]; if (terminalName.isNull() || 0 == terminalName.compareTo("0.0.0.0")) { if (mListenerCnt <= 0) { terminalName = "127.0.0.1"; osPrintf("WARNING - TaoListenerManager::addCallListener: using invalid host, replaced with %s\n", terminalName.data()); } else { osPrintf("WARNING - TaoListenerManager::addCallListener: using invalid host %s, listener not added.\n", terminalName.data()); return TAO_FAILURE; } } mpCallMgr->addTaoListener(this); ret = addEventListener(terminalName.data(), TRUE); return ret; }