Changeset 14 in chevmsgr for trunk/msgclnt.cpp


Ignore:
Timestamp:
08/30/15 21:31:39 (9 years ago)
Author:
cheese
Message:

테스트 코드 추가
UI 모양 작업
채팅되는 상태까지 확인

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/msgclnt.cpp

    r12 r14  
    66
    77#include <stdlib.h>
     8
     9#include "cf/codec.h"
    810
    911// --------------------------------------------------------------
     
    2123} SCallbackWorkerArg;
    2224
    23 static int messageQworekr(void * arg)
     25static int messageQworker(void * arg)
    2426{
    2527    SMessageQWorkerArg * inst = (SMessageQWorkerArg *)arg;
    2628
    2729    Protocol::Message message;
    28     cf::bin raw;
     30    cf::size_t size;
    2931
    3032    while (true)
     
    3234        try
    3335        {
    34             raw = inst->socket->receive();
     36            size = 0;
     37
     38            cf::bin raw = inst->socket->receive();
     39            size = raw.size();
     40
    3541            message.parse(raw.toString());
    3642        }
     
    4046
    4147            // closed
    42             if (raw.size() == 0)
     48            if (size == 0)
     49            {
     50                // dummy logout
     51                message.parse(Protocol::Request().logout());
     52                inst->messageQ->push(message);
    4353                break;
     54            }
    4455        }
    4556
     
    5263}
    5364
    54 static inline SConversation toCnversation(const Protocol::Message & message)
     65static inline SConversation toConversation(const Protocol::Message & message)
    5566{
    5667    SConversation c;
     68    std::string chat = message.get<std::string>(ProtocolType::MESSAGE);
     69
     70    if (chat.length() > 0)
     71        c.message = cf::codec::hex::getInstance()->decode(chat).toString();
    5772
    5873    c.sessid = message.get<std::string>(ProtocolType::SESSION_ID);
    59     c.message = message.get<std::string>(ProtocolType::MESSAGE);
    6074    c.sensitive = message.get<int>(ProtocolType::SENSITIVE);
    61     c.isError = message.get<bool>(ProtocolType::RESULT);
    6275
    6376    c.from = message.get<std::string>(ProtocolType::FROM);
     
    8497    while (true)
    8598    {
    86         message = inst->messageQ->pop(ProtocolType::CHAT, false);
     99        message = inst->messageQ->pop(ProtocolType::LISTEN, false);
    87100        if (message.type() != ProtocolType::NONE)
    88             inst->callback.onChat(toCnversation(message));
     101            inst->callback.onListen(toConversation(message));
    89102
    90103        message = inst->messageQ->pop(ProtocolType::OPEN_SESSION, false);
    91104        if (message.type() != ProtocolType::NONE)
    92105            inst->callback.onOpenSession(toOpenSession(message));
     106
     107        message = inst->messageQ->pop(ProtocolType::LOGOUT, false);
     108        if (message.type() != ProtocolType::NONE)
     109            break;
    93110    }
    94111
     
    109126Protocol::Message MessageQ::pop(const std::string & requestType, bool isWait)
    110127{
    111     while (isWait)
    112     {
    113         SYNCHRONIZED(mutex)
    114         {
    115             Protocol::Message message = messageQ.front();
    116 
    117             if (message.type() == requestType)
    118             {
    119                 messageQ.erase(messageQ.begin());
    120 
    121                 return message;
    122             }
    123         }
    124     }
     128    do
     129    {
     130        mutex.lock();
     131        if (messageQ.size() == 0)
     132        {
     133            mutex.unlock();
     134            continue;
     135        }
     136
     137        Protocol::Message message = messageQ.front();
     138
     139        if (message.type() == requestType)
     140        {
     141            messageQ.erase(messageQ.begin());
     142            mutex.unlock();
     143            return message;
     144        }
     145        mutex.unlock();
     146    } while (isWait);
    125147
    126148    return Protocol::Message(); // return dummy NONE
     
    130152
    131153chev::chev()
    132     : listener(messageQworekr),
     154    : listener(messageQworker),
    133155      caller(callbackWorker)
    134156{
     
    138160{
    139161    socket.close();
     162    listener.join();
     163    caller.join();
    140164}
    141165
     
    254278}
    255279
    256 std::string chev::getSessionID(std::vector<std::string> & idList)
    257 {
    258     try
    259     {
    260         idList.insert(idList.begin(), request.getUserID());
    261 
    262         if (idList.size() == 2)
    263             std::sort(idList.begin(), idList.end());
    264 
    265         std::string concat = joinStrings(idList);
     280std::string chev::getSessionID(const std::vector<std::string> & idList)
     281{
     282    try
     283    {
     284        std::vector<std::string> toList = idList;
     285        toList.insert(toList.begin(), request.getUserID());
     286
     287        std::string concat = joinStrings(toList);
    266288
    267289        if (sessionMap.find(concat) == sessionMap.end())
    268290        {
    269             socket.send(request.openSession(concat));
    270 
    271             Protocol::Message message = messageQ.pop(ProtocolType::SESSION_ID);
    272 
    273             if (!message.get<bool>(ProtocolType::RESULT))
    274                 THROW_EXCEPTION("failed to open session id");
     291            socket.send(request.openSession(toList));
     292
     293            Protocol::Message message = messageQ.pop(ProtocolType::OPEN_SESSION);
    275294
    276295            sessionMap[concat] = message.get<std::string>(ProtocolType::SESSION_ID);
     
    291310    try
    292311    {
    293         const SConversation & c = conversation;
    294 
    295         socket.send(request.chat(c.sessid, c.message, c.sensitive));
    296 
    297         return messageQ.pop(ProtocolType::CHAT).get<bool>(ProtocolType::RESULT);
     312        SConversation c = conversation;
     313
     314        if (c.message.length() > 0)
     315            c.message = cf::codec::hex::getInstance()->encode(c.message);
     316
     317        socket.send(request.tell(c.sessid, c.message, c.sensitive));
     318
     319        return messageQ.pop(ProtocolType::TELL).get<bool>(ProtocolType::RESULT);
    298320    }
    299321    catch (cf::exception & e)
Note: See TracChangeset for help on using the changeset viewer.