Ejemplo n.º 1
0
void MessageDispatch::registerSessionlessDispatchClient(uint32 accountId)
{
    // Verify not allready registred.
    AccountClientMap::iterator iter = mAccountClientMap.find(accountId);

    if (iter == mAccountClientMap.end())
    {
        DispatchClient* dispatchClient = new DispatchClient();
        dispatchClient->setAccountId(accountId);
        mAccountClientMap.insert(std::make_pair(accountId,dispatchClient));
    }
}
Ejemplo n.º 2
0
void MessageDispatch::handleSessionMessage(NetworkClient* client, Message* message)
{

    DispatchClient* dispatchClient = 0;
    bool deleteClient = false;

    //boost::recursive_mutex::scoped_lock lk(mSessionMutex);

    message->ResetIndex();

    // What kind of message is it?
    uint32 opcode;
    message->getUint32(opcode);

    // We want to intercept the opClusterClientConnect and opClusterClientDisconnect messages
    // so we can create account specific clients for use in async calls.
    if (opcode == opClusterClientConnect)
    {
        dispatchClient = new DispatchClient();
        dispatchClient->setAccountId(message->getAccountId());
        dispatchClient->setSession(client->getSession());

        mAccountClientMap.insert(std::make_pair(message->getAccountId(),dispatchClient));
    }
    else if (opcode == opClusterClientDisconnect)
    {
        // First find our DispatchClient.
        AccountClientMap::iterator iter = mAccountClientMap.find(message->getAccountId());

        if(iter != mAccountClientMap.end())
        {
            dispatchClient = (*iter).second;
            mAccountClientMap.erase(iter);

            DLOG(INFO) << "Destroying Dispatch Client for account " << message->getAccountId();

            // Mark it for deletion
            deleteClient = true;

        }
        else
        {
            LOG(INFO) << "Could not find DispatchClient for account " <<  message->getAccountId() << " to be deleted.";

            client->getSession()->DestroyIncomingMessage(message);
            //lk.unlock();

            return;
        }
    }
    else
    {
        AccountClientMap::iterator iter = mAccountClientMap.find(message->getAccountId());

        if(iter != mAccountClientMap.end())
        {
            dispatchClient = (*iter).second;
        }
        else
        {
            client->getSession()->DestroyIncomingMessage(message);

            //lk.unlock();
            return;
        }
        /*
        else
        {
          dispatchClient = new DispatchClient();
          dispatchClient->setAccountId(message->getAccountId());
          dispatchClient->setSession(client->getSession());
          mAccountClientMap.insert(message->getAccountId(), dispatchClient);
        }
        */
    }
    //lk.unlock();

    MessageCallbackMap::iterator iter = mMessageCallbackMap.find(opcode);

    if(iter != mMessageCallbackMap.end())
    {
        // Reset our message index to just after the opcode.
        message->setIndex(4);

        // Call our handler
        (*iter).second(message, dispatchClient);
    }
    else
    {
        LOG(INFO) <<  "Unhandled opcode in MessageDispatch - " << opcode ;
    }


    // Delete the client here if we got a disconnect.
    if(deleteClient)
    {
        // We will delete the client when we delete the player or reconnect again.
        //delete dispatchClient;
        dispatchClient = NULL;
    }

    // We need to destroy the incoming message for the session here
    // We want the application to decide whether the message is needed further or not.
    // This is mainly used in the ConnectionServer since routing messages need a longer life than normal
    message->setPendingDelete(true);
}