]> git.stg.codes - stg.git/blob - stglibs/sgcp.lib/proto.cpp
96b6285b05e2de64e76e84bc3cf77ef889e9b46e
[stg.git] / stglibs / sgcp.lib / proto.cpp
1 #include "stg/sgcp_proto.h"
2
3 #include "stg/sgcp_transport.h"
4
5 #include <cstring>
6 #include <cerrno>
7
8 using STG::SGCP::Proto;
9
10 Proto::Error::Error(const std::string& message)
11     : runtime_error(message)
12 {}
13
14 Proto::Error::Error()
15     : runtime_error(strerror(errno))
16 {}
17
18 Proto::Proto(TransportType transport, const std::string& key)
19     : m_transport(TransportProto::create(transport, key))
20 {
21 }
22
23 Proto::~Proto()
24 {
25     delete m_transport;
26 }
27
28 void Proto::connect(const std::string& address, uint16_t port)
29 {
30     try {
31         m_transport->connect(address, port);
32     } catch (const TransportProto::Error& ex) {
33         throw Error(ex.what());
34     }
35 }
36
37 void Proto::writeAllBuf(const void* buf, size_t size)
38 {
39     const char* pos = static_cast<const char*>(buf);
40     while (size > 0) {
41         ssize_t res = m_transport->write(pos, size);
42         if (res < 0)
43             throw Error();
44         if (res == 0)
45             return;
46         size -= res;
47         pos += res;
48     }
49 }
50
51 void Proto::readAllBuf(void* buf, size_t size)
52 {
53     char* pos = static_cast<char*>(buf);
54     while (size > 0) {
55         ssize_t res = m_transport->read(pos, size);
56         if (res < 0)
57             throw Error();
58         if (res == 0)
59             return;
60         size -= res;
61         pos += res;
62     }
63 }