Changeset 14 in chevmsgr for trunk/msgclnt.cpp
- Timestamp:
- 08/30/15 21:31:39 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/msgclnt.cpp
r12 r14 6 6 7 7 #include <stdlib.h> 8 9 #include "cf/codec.h" 8 10 9 11 // -------------------------------------------------------------- … … 21 23 } SCallbackWorkerArg; 22 24 23 static int messageQwor ekr(void * arg)25 static int messageQworker(void * arg) 24 26 { 25 27 SMessageQWorkerArg * inst = (SMessageQWorkerArg *)arg; 26 28 27 29 Protocol::Message message; 28 cf:: bin raw;30 cf::size_t size; 29 31 30 32 while (true) … … 32 34 try 33 35 { 34 raw = inst->socket->receive(); 36 size = 0; 37 38 cf::bin raw = inst->socket->receive(); 39 size = raw.size(); 40 35 41 message.parse(raw.toString()); 36 42 } … … 40 46 41 47 // 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); 43 53 break; 54 } 44 55 } 45 56 … … 52 63 } 53 64 54 static inline SConversation toC nversation(const Protocol::Message & message)65 static inline SConversation toConversation(const Protocol::Message & message) 55 66 { 56 67 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(); 57 72 58 73 c.sessid = message.get<std::string>(ProtocolType::SESSION_ID); 59 c.message = message.get<std::string>(ProtocolType::MESSAGE);60 74 c.sensitive = message.get<int>(ProtocolType::SENSITIVE); 61 c.isError = message.get<bool>(ProtocolType::RESULT);62 75 63 76 c.from = message.get<std::string>(ProtocolType::FROM); … … 84 97 while (true) 85 98 { 86 message = inst->messageQ->pop(ProtocolType:: CHAT, false);99 message = inst->messageQ->pop(ProtocolType::LISTEN, false); 87 100 if (message.type() != ProtocolType::NONE) 88 inst->callback.on Chat(toCnversation(message));101 inst->callback.onListen(toConversation(message)); 89 102 90 103 message = inst->messageQ->pop(ProtocolType::OPEN_SESSION, false); 91 104 if (message.type() != ProtocolType::NONE) 92 105 inst->callback.onOpenSession(toOpenSession(message)); 106 107 message = inst->messageQ->pop(ProtocolType::LOGOUT, false); 108 if (message.type() != ProtocolType::NONE) 109 break; 93 110 } 94 111 … … 109 126 Protocol::Message MessageQ::pop(const std::string & requestType, bool isWait) 110 127 { 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); 125 147 126 148 return Protocol::Message(); // return dummy NONE … … 130 152 131 153 chev::chev() 132 : listener(messageQwor ekr),154 : listener(messageQworker), 133 155 caller(callbackWorker) 134 156 { … … 138 160 { 139 161 socket.close(); 162 listener.join(); 163 caller.join(); 140 164 } 141 165 … … 254 278 } 255 279 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); 280 std::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); 266 288 267 289 if (sessionMap.find(concat) == sessionMap.end()) 268 290 { 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); 275 294 276 295 sessionMap[concat] = message.get<std::string>(ProtocolType::SESSION_ID); … … 291 310 try 292 311 { 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); 298 320 } 299 321 catch (cf::exception & e)
Note:
See TracChangeset
for help on using the changeset viewer.