Exemplo n.º 1
0
int TaoTransportAgent::run(void* runArg)
{
        UtlString remoteHostName;
        UtlString viaProtocol;
    UtlString fromIpAddress;

        while (mpSocket && mpSocket->isOk() && !isShuttingDown())
        {
                char          buffer[DEF_TAO_MAX_SOCKET_SIZE];
                unsigned long bytesRead;
                unsigned long cookie ;
                unsigned long length ;

                memset(buffer, 0, (DEF_TAO_MAX_SOCKET_SIZE * sizeof(char)));

                // Look for our next message, it should start with a '1234ABCD' marker
                bytesRead = mpSocket->read((char*) &cookie, sizeof(unsigned long)) ;
                while ((bytesRead > 0) && (cookie != 0x1234ABCD)) {
                        osPrintf("<<**>> Invalid data read from socket, trying to resynchronize...\n") ;
                        bytesRead = readUntilDone(mpSocket, (char*) &cookie, sizeof(unsigned long)) ;
                }
                // Okay, now read length
                if (bytesRead > 0) {
                        bytesRead = readUntilDone(mpSocket, (char*) &length, sizeof(unsigned long)) ;
                }
                // Finally read data
                if (bytesRead > 0) {
                        bytesRead = readUntilDone(mpSocket, buffer, length) ;

                        if (bytesRead != length) {
                                osPrintf("<<**>> TaoTransportAgent READ MISMATCH %lu != %lu\n", bytesRead, length) ;
                                bytesRead = 0 ;
                        }
                }

                if(bytesRead > 0)
                {
                        TaoMessage msg = TaoMessage(UtlString(buffer));
                        msg.setSocket((TaoObjHandle)this);      //stores pointer to this class

                        mpServer->postMessage(msg);
                }
                else if(bytesRead <= 0 || !mpSocket->isOk())
                {
                        // The socket has gone sour close down the client
                        mpSocket->getRemoteHostName(&remoteHostName);
                        osPrintf("Shutting down TaoTransportAgent: %s due to failed socket\n",
                                remoteHostName.data());
                        break;
                }
        }

#ifdef TEST_PRINT
        osPrintf("TaoTransportAgent: %s/%s exiting\r\n", remoteHostName.data(),
                viaName.data());
#endif
        return(0);
}
Exemplo n.º 2
0
UtlBoolean TaoListenerManager::handleMessage(OsMsg& eventMessage)
{
        int eventId = ((TaoListenerEventMessage&)eventMessage).getEventId();

        OsReadLock lock(mListenerRWLock);

        if (mListenerCnt > 0)
        {
                for (int i = 0; i < mListenerCnt; i++)
                {
                        if (!mpListeners[i] || mpListeners[i]->mpListenerPtr == 0)
                                continue;
                        TaoEventListener* pListener = (TaoEventListener*)mpListeners[i]->mpListenerPtr;

                        if (pListener && pListener->isEventEnabled((PtEvent::PtEventId &)eventId))
                        {
                                UtlString rTerminalName;
                                char buf[128];

                                if (TAO_SUCCESS == pListener->getTerminalName(buf, 127))
                                {
                                        TaoObjHandle hSocket;

                                        rTerminalName.append(buf);
                                        if (TAO_NOT_FOUND == mpAgents->findValue(rTerminalName.data(), hSocket))
                                        {
                                                // OsConnectionSocket* pConnectionSocket;
                                                // pConnectionSocket = new OsConnectionSocket(DEF_TAO_EVENT_PORT, rTerminalName.data());

                                                // mpConnectionSockets->insert((const char *)rTerminalName.data(), (TaoObjHandle)pConnectionSocket);
                                                // TaoTransportAgent *pAgent = new TaoTransportAgent(pConnectionSocket, this);
                                                // mpAgents->insert((const char *)rTerminalName.data(), (TaoObjHandle)pAgent);

                                                // hSocket = (TaoObjHandle) pAgent;
                        return TRUE;
                                        }

                                        int msgType = eventMessage.getMsgType();
                                        int msgSubType = eventMessage.getMsgSubType();
                                        PtEvent::PtEventId eventId = PtEvent::EVENT_INVALID;
                                        TaoMessage*     pMsg = NULL;
                                        UtlBoolean      bValidEvent = TRUE;

                                        switch(msgType)
                                        {

                                        case OsMsg::TAO_EVENT:
                                                pMsg = new TaoMessage((TaoListenerEventMessage&) eventMessage, hSocket);
                                                break;
                                        case OsMsg::TAO_MSG:
                                                pMsg = new TaoMessage((TaoMessage&)eventMessage);
                                                pMsg->setSocket(hSocket);
                                                break;
                                        case OsMsg::TAO_LISTENER_EVENT_MSG:
                                                {
                                                        TaoListenerEventMessage *pEventMsg = (TaoListenerEventMessage*) &eventMessage;

                                                        UtlString callId;
                                                        UtlString remoteAddress;
                                                        pEventMsg->getStringData1(callId);
                                                        pEventMsg->getStringData2(remoteAddress);

                                                        UtlString arg = callId + TAOMESSAGE_DELIMITER + remoteAddress;

                                                        char buf[MAXIMUM_INTEGER_STRING_LENGTH];

                                                        sprintf(buf, "%d", msgSubType); // actual event id
                                                        arg +=  TAOMESSAGE_DELIMITER + buf;

                                                        pMsg = new TaoMessage(TaoMessage::EVENT,
                                                                                                0,
                                                                                                0,
                                                                                                0,
                                                                                                hSocket,
                                                                                                3,
                                                                                                arg);
                                                }

                                                break;
                                        case OsMsg::PS_MSG:
                                                {
                                                        PsMsg msg = (PsMsg&)eventMessage;
                                                        int hookType = msg.getParam1();
                                                        int key = msg.getParam2();
                                                        UtlString param;
                                                        msg.getStringParam1(param);

                                                        switch(msgSubType)
                                                        {
                                                        case PsMsg::EXTSPEAKER_CONNECT:
                                                                eventId = PtEvent::PHONE_EXTSPEAKER_CONNECTED;
                                                                break;
                                                        case PsMsg::EXTSPEAKER_DISCONNECT:
                                                                eventId = PtEvent::PHONE_EXTSPEAKER_DISCONNECTED;
                                                                break;
                                                        case PsMsg::BUTTON_DOWN:
                                                                eventId = PtEvent::PHONE_BUTTON_DOWN;
                                                                break;
                                                        case PsMsg::BUTTON_UP:
                                                                eventId = PtEvent::PHONE_BUTTON_UP;
                                                                break;
                                                        case PsMsg::BUTTON_SET_INFO:
                                                                eventId = PtEvent::PHONE_BUTTON_INFO_CHANGED;
                                                                break;
                                                        case PsMsg::BUTTON_REPEAT:
                                                                eventId = PtEvent::PHONE_BUTTON_REPEAT;
                                                                break;
                                                        case PsMsg::HOOKSW_STATE:
                                                        case PsMsg::HOOKSW_SET_STATE:
                                                                if(hookType == PsHookswTask::OFF_HOOK)
                                                                {
                                                                        eventId = PtEvent::PHONE_HOOKSWITCH_OFFHOOK;
                                                                }
                                                                else if( hookType == PsHookswTask::ON_HOOK)
                                                                {
                                                                        eventId = PtEvent::PHONE_HOOKSWITCH_ONHOOK;
                                                                }
                                                                break;
                                                        case PsMsg::HANDSET_SET_VOLUME:
                                                                eventId = PtEvent::PHONE_HANDSET_VOLUME_CHANGED;
                                                                break;
                                                        case PsMsg::RINGER_SET_VOLUME:
                                                                eventId = PtEvent::PHONE_RINGER_VOLUME_CHANGED;
                                                                break;
                                                        case PsMsg::SPEAKER_SET_VOLUME:
                                                                eventId = PtEvent::PHONE_SPEAKER_VOLUME_CHANGED;
                                                                break;
                                                        default:
                                                                bValidEvent = FALSE;
                                                                break;
                                                        }

                     if (bValidEvent)
                                                        {
                                                            UtlString arg;
                                                            char buf[MAXIMUM_INTEGER_STRING_LENGTH];

                                                            sprintf(buf, "%d", hookType);
                                                            arg = buf + TAOMESSAGE_DELIMITER;

                                                            sprintf(buf, "%d", key);
                                                            arg += buf + TAOMESSAGE_DELIMITER;

                                                            arg += rTerminalName + TAOMESSAGE_DELIMITER + param;

                                                            pMsg = new TaoMessage(TaoMessage::EVENT,
                                                                                                    0,
                                                                                                    0,
                                                                                                    eventId,
                                                                                                    hSocket,
                                                                                                    4,
                                                                                            arg);
                     }
                                                }
                                                break;
                                        default:
                                                bValidEvent = FALSE;
                                                break;
                                        }

                                        if (bValidEvent)
                                        {
                                                pMsg->setMsgQueueHandle(mEventClient);
                                                if (mEventClient)
                                                        ((TaoListenerClientTask*) mEventClient)->postMessage((TaoMessage&)(*pMsg));
                                                else
                                                {
                                                        assert(FALSE);
                                                        mpSvrTransport->postMessage((TaoMessage&)(*pMsg));
                                                }
                                                delete pMsg;
                                        }
                                }
                                rTerminalName.remove(0);
                        }
                }
        }

        return(TRUE);
}