source: chevmsgr/trunk/msgclnt.cpp@ 5

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

클라이언트 메시지 추가 및 안정화

File size: 3.0 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 cf::bin raw;
22
23 while (true)
24 {
25 try
26 {
27 raw = inst->socket->receive();
28 parser.parse(raw.toString());
29
30 isError = false;
31 }
32 catch (cf::exception & e)
33 {
34 LOG(e.stackTrace());
35
36 // closed
37 if (raw.size() == 0)
38 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);
66
67 return 0;
68}
69
70// --------------------------------------------------------------
71
72chev::chev()
73 : listener(worker)
74{
75}
76
77bool chev::connect(const std::string & host, const unsigned short port)
78{
79 try
80 {
81 socket.connect(host, port);
82
83 return true;
84 }
85 catch (cf::exception & e)
86 {
87 LOG(e.what());
88
89 return false;
90 }
91}
92
93bool chev::join(const std::string & id, const std::string & pw, const std::string & sms)
94{
95 try
96 {
97 socket.send(request.join(id, pw, sms));
98
99 std::string response = socket.receive().toString();
100 Message::Parser parser;
101 parser.parse(response);
102
103 return parser.get<bool>("result");
104 }
105 catch (cf::exception & e)
106 {
107 LOG(e.what());
108
109 return false;
110 }
111}
112
113bool chev::login(const std::string & id, const std::string & pw)
114{
115 try
116 {
117 request.setUserID(id);
118
119 socket.send(request.login(pw));
120
121 std::string response = socket.receive().toString();
122 Message::Parser parser;
123 parser.parse(response);
124
125 return parser.get<bool>("result");
126 }
127 catch (cf::exception & e)
128 {
129 LOG(e.what());
130
131 return false;
132 }
133}
134
135bool chev::sms(const std::string & phone)
136{
137 try
138 {
139 socket.send(request.sms(phone));
140
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
155bool 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
174bool 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}
Note: See TracBrowser for help on using the repository browser.