4b4bc71a0be25d1c14b4bf0f036b8b53ff4127bf
[tpg/acess2.git] / Usermode / Libraries / libaxwin4.so_src / ipc_acessipcpipe.cpp
1 /*
2  * AxWin4 Interface Library
3  * - By John Hodge (thePowersGang)
4  *
5  * ipc_acessipcpipe.c
6  * - Acess2 /Devices/ipcpipe/ IPC Channel
7  */
8 #include "include/common.hpp"
9 #include "include/CIPCChannel_AcessIPCPipe.hpp"
10 #include <system_error>
11 #include <cerrno>
12
13 namespace AxWin {
14
15 CIPCChannel_AcessIPCPipe::CIPCChannel_AcessIPCPipe(const char *Path)
16 {
17         m_fd = _SysOpen(Path, OPENFLAG_READ|OPENFLAG_WRITE);
18         if( m_fd == -1 ) {
19                 throw ::std::system_error(errno, ::std::system_category());
20         }
21 }
22
23 CIPCChannel_AcessIPCPipe::~CIPCChannel_AcessIPCPipe()
24 {
25 }
26
27 int CIPCChannel_AcessIPCPipe::FillSelect(fd_set& fds)
28 {
29         FD_SET(m_fd, &fds);
30         return m_fd+1;
31 }
32
33 bool CIPCChannel_AcessIPCPipe::HandleSelect(const fd_set& fds)
34 {
35         if( FD_ISSET(m_fd, &fds) )
36         {
37                 ::std::vector<uint8_t>  rxbuf(4096);
38                 size_t len = _SysRead(m_fd, rxbuf.data(), rxbuf.capacity());
39                 if( len == (size_t)-1 )
40                         throw ::std::system_error(errno, ::std::system_category());
41                 rxbuf.resize(len);
42                 _SysDebug("CClient_AcessIPCPipe::HandleReceive - Rx %i/%i bytes", len, rxbuf.capacity());
43                 _SysDebugHex("CClient_AcessIPCPipe::HandleReceive", rxbuf.data(), len);
44                 
45                 CDeserialiser   msg(rxbuf);
46                 ::AxWin::RecvMessage( msg );
47         }
48         return true;
49 }
50
51 void CIPCChannel_AcessIPCPipe::Send(CSerialiser& message)
52 {
53         const ::std::vector<uint8_t>& serialised = message.Compact();
54         if(serialised.size() > 0x1000 ) {
55                 throw ::std::length_error("CIPCChannel_AcessIPCPipe::Send");
56         }
57         _SysDebug("CIPCChannel_AcessIPCPipe::Send(%i bytes)", serialised.size());
58         //_SysDebugHex("CIPCChannel_AcessIPCPipe::Send",     serialised.data(), serialised.size());
59         
60         size_t rv = _SysWrite(m_fd, serialised.data(), serialised.size());
61         if( rv != serialised.size() ) {
62                 throw ::std::system_error(errno, ::std::system_category());
63         }
64 }
65
66
67 };      // namespace AxWin
68

UCC git Repository :: git.ucc.asn.au