Changeset 12 in chevmsgr for trunk/msgclnt.cpp


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

add dialogs

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/msgclnt.cpp

    r10 r12  
    99// --------------------------------------------------------------
    1010
    11 typedef struct SWorkerArg
     11typedef struct SMessageQWorkerArg
    1212{
    1313    cf::network::tcp * socket;
    1414    MessageQ * messageQ;
    15 } SWorkerArg;
    16 
    17 int worker(void * arg)
    18 {
    19     SWorkerArg * inst = (SWorkerArg *) arg;
    20 
    21     Protocol::Message parser;
     15} SMessageQWorkerArg;
     16
     17typedef struct SCallbackWorkerArg
     18{
     19    MessageQ * messageQ;
     20    SCallback callback;
     21} SCallbackWorkerArg;
     22
     23static int messageQworekr(void * arg)
     24{
     25    SMessageQWorkerArg * inst = (SMessageQWorkerArg *)arg;
     26
     27    Protocol::Message message;
    2228    cf::bin raw;
    2329
     
    2733        {
    2834            raw = inst->socket->receive();
    29             parser.parse(raw.toString());
     35            message.parse(raw.toString());
    3036        }
    3137        catch (cf::exception & e)
     
    3844        }
    3945
    40         inst->messageQ->push(parser);
     46        inst->messageQ->push(message);
    4147    }
    4248
     
    4652}
    4753
     54static inline SConversation toCnversation(const Protocol::Message & message)
     55{
     56    SConversation c;
     57
     58    c.sessid = message.get<std::string>(ProtocolType::SESSION_ID);
     59    c.message = message.get<std::string>(ProtocolType::MESSAGE);
     60    c.sensitive = message.get<int>(ProtocolType::SENSITIVE);
     61    c.isError = message.get<bool>(ProtocolType::RESULT);
     62
     63    c.from = message.get<std::string>(ProtocolType::FROM);
     64
     65    return c;
     66}
     67
     68static inline SOpenSession toOpenSession(const Protocol::Message & message)
     69{
     70    SOpenSession o;
     71
     72    o.sessid = message.get<std::string>(ProtocolType::SESSION_ID);
     73    o.idList = message.getList<std::string>(ProtocolType::ID_LIST);
     74
     75    return o;
     76}
     77
     78static int callbackWorker(void * arg)
     79{
     80    SCallbackWorkerArg * inst = (SCallbackWorkerArg *)arg;
     81
     82    Protocol::Message message;
     83
     84    while (true)
     85    {
     86        message = inst->messageQ->pop(ProtocolType::CHAT, false);
     87        if (message.type() != ProtocolType::NONE)
     88            inst->callback.onChat(toCnversation(message));
     89
     90        message = inst->messageQ->pop(ProtocolType::OPEN_SESSION, false);
     91        if (message.type() != ProtocolType::NONE)
     92            inst->callback.onOpenSession(toOpenSession(message));
     93    }
     94
     95    free(inst);
     96
     97    return 0;
     98}
     99
    48100// --------------------------------------------------------------
    49101
    50 void MessageQ::push(const Protocol::Message & parser)
     102void MessageQ::push(const Protocol::Message & message)
    51103{
    52104    mutex.lock();
    53     messageQ.push_back(parser);
     105    messageQ.push_back(message);
    54106    mutex.unlock();
    55107}
    56108
    57 Protocol::Message MessageQ::pop(const std::string & requestType)
    58 {
    59     while (true)
     109Protocol::Message MessageQ::pop(const std::string & requestType, bool isWait)
     110{
     111    while (isWait)
    60112    {
    61113        SYNCHRONIZED(mutex)
    62114        {
    63             Protocol::Message parser = messageQ.front();
    64 
    65             if (parser.type() == requestType)
     115            Protocol::Message message = messageQ.front();
     116
     117            if (message.type() == requestType)
    66118            {
    67119                messageQ.erase(messageQ.begin());
    68120
    69                 return parser;
     121                return message;
    70122            }
    71123        }
    72124    }
     125
     126    return Protocol::Message(); // return dummy NONE
    73127}
    74128
     
    76130
    77131chev::chev()
    78     : listener(worker)
     132    : listener(messageQworekr),
     133      caller(callbackWorker)
    79134{
    80135}
     
    96151        socket.connect(host, port);
    97152
    98         SWorkerArg * arg = (SWorkerArg *)malloc(sizeof(SWorkerArg));
     153        SMessageQWorkerArg * arg = (SMessageQWorkerArg *)malloc(sizeof(SMessageQWorkerArg));
    99154        if (!arg)
    100155            return false;
     
    203258    try
    204259    {
     260        idList.insert(idList.begin(), request.getUserID());
     261
    205262        if (idList.size() == 2)
    206263            std::sort(idList.begin(), idList.end());
    207264
    208         std::string concat = idList[0];
    209 
    210         for (int iter = 1; iter < idList.size(); iter++)
    211             concat += DELIMITER + idList[iter];
     265        std::string concat = joinStrings(idList);
    212266
    213267        if (sessionMap.find(concat) == sessionMap.end())
     
    251305}
    252306
    253 SConversation chev::listen()
    254 {
    255     SConversation c;
    256     Protocol::Message message = messageQ.pop(ProtocolType::CHAT);
    257 
    258     c.sessid    = message.get<std::string>(ProtocolType::SESSION_ID);
    259     c.message   = message.get<std::string>(ProtocolType::MESSAGE);
    260     c.sensitive = message.get<int>(ProtocolType::SENSITIVE);
    261     c.isError   = message.get<bool>(ProtocolType::RESULT);
    262 
    263     c.from      = message.get<std::string>(ProtocolType::FROM);
    264 
    265     return c;
    266 }
     307bool chev::listen(const SCallback & callback)
     308{
     309    SCallbackWorkerArg * arg = (SCallbackWorkerArg *)malloc(sizeof(SCallbackWorkerArg));
     310    if (!arg)
     311        return false;
     312
     313    arg->messageQ = &messageQ;
     314    arg->callback = callback;
     315
     316    caller.start(arg);
     317
     318    return true;
     319}
Note: See TracChangeset for help on using the changeset viewer.