Changeset 6 in chevmsgr for trunk/msgclnt.cpp


Ignore:
Timestamp:
08/29/15 02:20:50 (9 years ago)
Author:
cheese
Message:

modify client interface and message protocol

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/msgclnt.cpp

    r5 r6  
    1010{
    1111    cf::network::tcp * socket;
    12     SCallback * callback;
     12    MessageQ * messageQ;
    1313} SWorkerArg;
    1414
     
    1717    SWorkerArg * inst = (SWorkerArg *) arg;
    1818
    19     bool isError = false;
    20     Message::Parser parser;
     19    Protocol::Message parser;
    2120    cf::bin raw;
    2221
     
    2726            raw = inst->socket->receive();
    2827            parser.parse(raw.toString());
    29 
    30             isError = false;
    3128        }
    3229        catch (cf::exception & e)
     
    3734            if (raw.size() == 0)
    3835                break;
    39 
    40             isError = true;
    41         }
    42 
    43         if (parser.type() == "result")
    44         {
    45             SResultResponse recv;
    46 
    47             recv.result  = parser.get<bool>("result");
    48             recv.isError = isError;
    49 
    50             inst->callback->result(recv);
    51         }
    52         else if (parser.type() == "chat")
    53         {
    54             SReceivedMessage recv;
    55 
    56             recv.sessid  = parser.get<std::string>("sess-id");
    57             recv.sender  = parser.get<std::string>("from");
    58             recv.message = parser.get<std::string>("message");
    59             recv.isError = isError;
    60 
    61             inst->callback->message(recv);
    62         }
    63     }
    64 
    65     free(arg);
     36        }
     37
     38        inst->messageQ->push(parser);
     39    }
     40
     41    free(inst);
    6642
    6743    return 0;
     44}
     45
     46// --------------------------------------------------------------
     47
     48void MessageQ::push(const Protocol::Message & parser)
     49{
     50    SYNCHRONIZED(mutex)
     51    {
     52        messageQ.push_back(parser);
     53    }
     54}
     55
     56Protocol::Message MessageQ::pop(const std::string & requestType)
     57{
     58    while (true)
     59    {
     60        SYNCHRONIZED(mutex)
     61        {
     62            Protocol::Message parser = messageQ.front();
     63
     64            if (parser.type() == requestType)
     65            {
     66                messageQ.erase(messageQ.begin());
     67
     68                return parser;
     69            }
     70        }
     71    }
    6872}
    6973
     
    7579}
    7680
     81chev::~chev()
     82{
     83    socket.close();
     84}
     85
     86const std::string & chev::getLastError() const
     87{
     88    return error;
     89}
     90
    7791bool chev::connect(const std::string & host, const unsigned short port)
    7892{
     
    8195        socket.connect(host, port);
    8296
     97        SWorkerArg * arg = (SWorkerArg *)malloc(sizeof(SWorkerArg));
     98        if (!arg)
     99            return false;
     100
     101        arg->socket = &socket;
     102        arg->messageQ = &messageQ;
     103
     104        listener.start(arg);
     105
    83106        return true;
    84107    }
     
    97120        socket.send(request.join(id, pw, sms));
    98121
    99         std::string response = socket.receive().toString();
    100         Message::Parser parser;
    101         parser.parse(response);
    102 
    103         return parser.get<bool>("result");
     122        return messageQ.pop(ProtocolType::JOIN).get<bool>(ProtocolType::RESULT);
    104123    }
    105124    catch (cf::exception & e)
     
    119138        socket.send(request.login(pw));
    120139
    121         std::string response = socket.receive().toString();
    122         Message::Parser parser;
    123         parser.parse(response);
    124 
    125         return parser.get<bool>("result");
     140        return messageQ.pop(ProtocolType::LOGIN).get<bool>(ProtocolType::RESULT);
    126141    }
    127142    catch (cf::exception & e)
     
    139154        socket.send(request.sms(phone));
    140155
    141         std::string response = socket.receive().toString();
    142         Message::Parser parser;
    143         parser.parse(response);
    144 
    145         return parser.get<bool>("result");
    146     }
    147     catch (cf::exception & e)
    148     {
    149         LOG(e.what());
    150 
    151         return false;
    152     }
    153 }
    154 
    155 bool chev::runReceiver(const SCallback & cb)
    156 {
    157     if (listener.isRunning())
    158         return true;
    159 
    160     callback = cb;
    161 
    162     SWorkerArg * arg = (SWorkerArg *)malloc(sizeof(SWorkerArg));
    163     if (!arg)
    164         return false;
    165 
    166     arg->socket = &socket;
    167     arg->callback = &callback;
    168 
    169     listener.start(arg);
    170 
    171     return true;
    172 }
    173 
    174 bool chev::sendMessage(const std::string & friendid, const std::string & sessid, const std::string & message)
    175 {
    176     try
    177     {
    178         socket.send(request.chat(friendid, sessid, message));
    179 
    180         std::string response = socket.receive().toString();
    181         Message::Parser parser;
    182         parser.parse(response);
    183 
    184         return parser.get<bool>("result");
    185     }
    186     catch (cf::exception & e)
    187     {
    188         LOG(e.what());
    189 
    190         return false;
    191     }
    192 }
     156        return messageQ.pop(ProtocolType::SMS).get<bool>(ProtocolType::RESULT);
     157    }
     158    catch (cf::exception & e)
     159    {
     160        LOG(e.what());
     161
     162        return false;
     163    }
     164}
     165
     166bool chev::addFriend(const std::string & id)
     167{
     168    try
     169    {
     170        socket.send(request.addFriend(id));
     171
     172        return messageQ.pop(ProtocolType::ADD_FRIEND).get<bool>(ProtocolType::RESULT);
     173    }
     174    catch (cf::exception & e)
     175    {
     176        LOG(e.what());
     177
     178        return false;
     179    }
     180}
     181
     182std::vector<SFriend> chev::getFriendList()
     183{
     184    try
     185    {
     186        socket.send(request.getFriendList());
     187    }
     188    catch (cf::exception & e)
     189    {
     190        LOG(e.what());
     191    }
     192    return std::vector<SFriend>();
     193}
     194
     195std::string chev::getSessionID(const std::vector<std::string> & idList)
     196{
     197    try
     198    {
     199        std::string concat = idList[0];
     200
     201        for (int iter = 1 ; iter < idList.size() ; iter++)
     202            concat += "," + idList[iter];
     203
     204        if (sessionMap.find(concat) == sessionMap.end())
     205        {
     206            socket.send(request.openSession(concat));
     207
     208            std::string response = socket.receive().toString();
     209            Protocol::Message parser;
     210            parser.parse(response);
     211
     212            if (!parser.get<bool>("result"))
     213                THROW_EXCEPTION("failed to open session id");
     214
     215            sessionMap[concat] = parser.get<std::string>("sess-id");
     216        }
     217
     218        return sessionMap[concat];
     219    }
     220    catch (cf::exception & e)
     221    {
     222        LOG(e.what());
     223
     224        return "";
     225    }
     226}
     227
     228bool chev::tell(const SConversation & conversation)
     229{
     230    try
     231    {
     232        const SConversation & c = conversation;
     233
     234        socket.send(request.chat(c.sessid, c.message, c.sensitive));
     235
     236        return messageQ.pop(ProtocolType::CHAT).get<bool>(ProtocolType::RESULT);
     237    }
     238    catch (cf::exception & e)
     239    {
     240        LOG(e.what());
     241
     242        return false;
     243    }
     244}
     245
     246SConversation chev::listen()
     247{
     248    SConversation c;
     249    Protocol::Message parser = messageQ.pop(ProtocolType::CHAT);
     250
     251    c.sessid    = parser.get<std::string>(ProtocolType::SESSION_ID);
     252    c.message   = parser.get<std::string>(ProtocolType::MESSAGE);
     253    c.sensitive = parser.get<int>(ProtocolType::SENSITIVE);
     254    c.isError   = parser.get<bool>(ProtocolType::RESULT);
     255
     256    c.from      = parser.get<std::string>(ProtocolType::FROM);
     257
     258    return c;
     259}
Note: See TracChangeset for help on using the changeset viewer.