Changeset 6 in chevmsgr for trunk/msgclnt.cpp
- Timestamp:
- 08/29/15 02:20:50 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/msgclnt.cpp
r5 r6 10 10 { 11 11 cf::network::tcp * socket; 12 SCallback * callback;12 MessageQ * messageQ; 13 13 } SWorkerArg; 14 14 … … 17 17 SWorkerArg * inst = (SWorkerArg *) arg; 18 18 19 bool isError = false; 20 Message::Parser parser; 19 Protocol::Message parser; 21 20 cf::bin raw; 22 21 … … 27 26 raw = inst->socket->receive(); 28 27 parser.parse(raw.toString()); 29 30 isError = false;31 28 } 32 29 catch (cf::exception & e) … … 37 34 if (raw.size() == 0) 38 35 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); 66 42 67 43 return 0; 44 } 45 46 // -------------------------------------------------------------- 47 48 void MessageQ::push(const Protocol::Message & parser) 49 { 50 SYNCHRONIZED(mutex) 51 { 52 messageQ.push_back(parser); 53 } 54 } 55 56 Protocol::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 } 68 72 } 69 73 … … 75 79 } 76 80 81 chev::~chev() 82 { 83 socket.close(); 84 } 85 86 const std::string & chev::getLastError() const 87 { 88 return error; 89 } 90 77 91 bool chev::connect(const std::string & host, const unsigned short port) 78 92 { … … 81 95 socket.connect(host, port); 82 96 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 83 106 return true; 84 107 } … … 97 120 socket.send(request.join(id, pw, sms)); 98 121 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); 104 123 } 105 124 catch (cf::exception & e) … … 119 138 socket.send(request.login(pw)); 120 139 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); 126 141 } 127 142 catch (cf::exception & e) … … 139 154 socket.send(request.sms(phone)); 140 155 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 166 bool 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 182 std::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 195 std::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 228 bool 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 246 SConversation 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.