source: chevmsgr/trunk/msgclnt.cpp@ 4

Last change on this file since 4 was 4, checked in by cheese, 9 years ago

자 이제 시작이야 (졸작을)

File size: 2.3 KB
Line 
1
2#include "msgclnt.h"
3#include "msg.hpp"
4
5#include <stdlib.h>
6
7// --------------------------------------------------------------
8
9typedef struct SWorkerArg
10{
11 cf::network::tcp * socket;
12 SCallback * callback;
13} SWorkerArg;
14
15int worker(void * arg)
16{
17 SWorkerArg * inst = (SWorkerArg *) arg;
18
19 bool isError = false;
20 Message::Parser parser;
21
22 while (true)
23 {
24 try
25 {
26 std::string message = inst->socket->receive().toString();
27 parser.parse(message);
28
29 isError = false;
30 }
31 catch (cf::exception & e)
32 {
33 LOG(e.stackTrace());
34
35 isError = true;
36 }
37
38 if (parser.type() == "result")
39 {
40 SResultResponse recv;
41
42 recv.result = parser.get<bool>("result");
43 recv.isError = isError;
44
45 inst->callback->result(recv);
46 }
47 else if (parser.type() == "chat")
48 {
49 SReceivedMessage recv;
50
51 recv.sessid = parser.get<std::string>("sess-id");
52 recv.sender = parser.get<std::string>("from");
53 recv.message = parser.get<std::string>("message");
54 recv.isError = isError;
55
56 inst->callback->message(recv);
57 }
58 }
59
60 free(arg);
61
62 return 0;
63}
64
65// --------------------------------------------------------------
66
67chev::chev()
68 : listener(worker)
69{
70}
71
72bool chev::connect(const std::string & host, const unsigned short port)
73{
74 try
75 {
76 socket.connect(host, port);
77
78 return true;
79 }
80 catch (cf::exception & e)
81 {
82 LOG(e.what());
83
84 return false;
85 }
86}
87
88bool chev::login(const std::string & id, const std::string & pw)
89{
90 try
91 {
92 request.setUserID(id);
93
94 socket.send(request.login(pw));
95
96 std::string response = socket.receive().toString();
97 Message::Parser parser;
98 parser.parse(response);
99
100 return parser.get<bool>("result");
101 }
102 catch (cf::exception & e)
103 {
104 LOG(e.what());
105
106 return false;
107 }
108}
109
110bool chev::runReceiver(const SCallback & cb)
111{
112 callback = cb;
113
114 SWorkerArg * arg = (SWorkerArg *)malloc(sizeof(SWorkerArg));
115 if (!arg)
116 return false;
117
118 arg->socket = &socket;
119 arg->callback = &callback;
120
121 listener.start(arg);
122
123 return true;
124}
125
126bool chev::sendMessage(const std::string & friendid, const std::string & sessid, const std::string & message)
127{
128 try
129 {
130 socket.send(request.chat(friendid, sessid, message));
131
132 std::string response = socket.receive().toString();
133 Message::Parser parser;
134 parser.parse(response);
135
136 return parser.get<bool>("result");
137 }
138 catch (cf::exception & e)
139 {
140 LOG(e.what());
141
142 return false;
143 }
144}
Note: See TracBrowser for help on using the repository browser.