Commit bb6f10045b547019d9849acc3a1c9b6993859abd
1 parent
0dc47c93
Exists in
master
and in
3 other branches
Working on IPC module for windows.
Showing
2 changed files
with
54 additions
and
25 deletions
Show diff stats
src/lib3270++/private.h
@@ -237,24 +237,25 @@ | @@ -237,24 +237,25 @@ | ||
237 | Uint64 = 't' | 237 | Uint64 = 't' |
238 | }; | 238 | }; |
239 | 239 | ||
240 | - #pragma pack(1) | 240 | + struct { |
241 | + size_t length; | ||
242 | + size_t used; | ||
243 | + uint8_t * block; | ||
244 | + } in; | ||
245 | + | ||
246 | + struct { | ||
247 | + size_t length; | ||
248 | + size_t used; | ||
249 | + uint8_t * block; | ||
250 | + } out; | ||
251 | + | ||
241 | struct DataBlock { | 252 | struct DataBlock { |
242 | Type type; | 253 | Type type; |
243 | }; | 254 | }; |
244 | - #pragma pack() | ||
245 | - | ||
246 | - std::vector<DataBlock *> input; | ||
247 | - | ||
248 | - std::vector<DataBlock *> output; | ||
249 | 255 | ||
250 | /// @brief Create DataBlock | 256 | /// @brief Create DataBlock |
251 | - static DataBlock * createDataBlock(const void *ptr, size_t len); | ||
252 | - | ||
253 | - /// @brief Descompacta argumentos recebidos. | ||
254 | - static void unpack(std::vector<DataBlock *> &args, const uint8_t * buffer, size_t szBuffer); | 257 | + DataBlock * pushBlock(const void *ptr, size_t len); |
255 | 258 | ||
256 | - /// @brief Compacta array de argumentos em um bloco de dados. | ||
257 | - static DWORD pack(std::vector<DataBlock *> &args, uint8_t * outBuffer, size_t szBuffer); | ||
258 | #else | 259 | #else |
259 | struct { | 260 | struct { |
260 | DBusMessage * in; | 261 | DBusMessage * in; |
src/lib3270++/windows/request.cc
@@ -44,35 +44,65 @@ | @@ -44,35 +44,65 @@ | ||
44 | 44 | ||
45 | namespace TN3270 { | 45 | namespace TN3270 { |
46 | 46 | ||
47 | + #define PIPE_BUFFER_LENGTH 8192 | ||
48 | + | ||
47 | IPC::Request::Request(const Session &session) { | 49 | IPC::Request::Request(const Session &session) { |
50 | + | ||
51 | + in.length = PIPE_BUFFER_LENGTH; | ||
52 | + in.used = 0; | ||
53 | + in.block = new uint8_t[in.length]; | ||
54 | + | ||
55 | + out.length = PIPE_BUFFER_LENGTH; | ||
56 | + out.used = 0; | ||
57 | + out.block = new uint8_t[in.length]; | ||
58 | + | ||
48 | } | 59 | } |
49 | 60 | ||
50 | IPC::Request::Request(const Session &session, const char *method) : Request(session) { | 61 | IPC::Request::Request(const Session &session, const char *method) : Request(session) { |
62 | + | ||
63 | + // Add name | ||
64 | + strcpy((char *) out.block, method); | ||
65 | + out.used += strlen((char *) method) + 1; | ||
66 | + | ||
67 | + // Add ID | ||
68 | + *((uint16_t *) (out.block + out.used)) = (uint16_t) 3; | ||
69 | + out.used += sizeof(uint16_t); | ||
70 | + | ||
51 | } | 71 | } |
52 | 72 | ||
53 | IPC::Request::Request(const Session &session, bool isSet, const char *property) : Request(session) { | 73 | IPC::Request::Request(const Session &session, bool isSet, const char *property) : Request(session) { |
74 | + | ||
75 | + // Add name | ||
76 | + strcpy((char *) out.block, property); | ||
77 | + out.used += strlen((char *) property) + 1; | ||
78 | + | ||
79 | + // Add ID (SetProperty = 2, getProperty = 1) | ||
80 | + *((uint16_t *) (out.block + out.used)) = (uint16_t) (isSet ? 2 : 1); | ||
81 | + out.used += sizeof(uint16_t); | ||
82 | + | ||
54 | } | 83 | } |
55 | 84 | ||
56 | IPC::Request::~Request() { | 85 | IPC::Request::~Request() { |
57 | 86 | ||
58 | - for(auto block : input) { | ||
59 | - delete[] ((uint8_t *) block); | ||
60 | - } | ||
61 | - | ||
62 | - for(auto block : output) { | ||
63 | - delete[] ((uint8_t *) block); | ||
64 | - } | 87 | + delete[] ((uint8_t *) in.block); |
88 | + delete[] ((uint8_t *) out.block); | ||
65 | 89 | ||
66 | } | 90 | } |
67 | 91 | ||
68 | /// @brief Create DataBlock | 92 | /// @brief Create DataBlock |
69 | - IPC::Request::DataBlock * IPC::Request::createDataBlock(const void *ptr, size_t length) { | 93 | + IPC::Request::DataBlock * IPC::Request::pushBlock(const void *ptr, size_t length) { |
70 | 94 | ||
71 | - IPC::Request::DataBlock * rc = (IPC::Request::DataBlock *) (new uint8_t[sizeof(IPC::Request::DataBlock)+length]); | ||
72 | - memset((void *) rc, 0, sizeof(IPC::Request::DataBlock)); | 95 | + if((out.used + length + sizeof(IPC::Request::DataBlock)) >= out.length) { |
96 | + throw std::runtime_error("Too big"); | ||
97 | + } | ||
98 | + | ||
99 | + IPC::Request::DataBlock * rc = (IPC::Request::DataBlock *) (out.block + out.used); | ||
73 | memcpy(((uint8_t *) (rc+1)), ((uint8_t *) ptr), length); | 100 | memcpy(((uint8_t *) (rc+1)), ((uint8_t *) ptr), length); |
74 | 101 | ||
102 | + out.used += (sizeof(IPC::Request::DataBlock) + length); | ||
103 | + | ||
75 | return rc; | 104 | return rc; |
105 | + | ||
76 | } | 106 | } |
77 | 107 | ||
78 | IPC::Request & IPC::Request::call() { | 108 | IPC::Request & IPC::Request::call() { |
@@ -80,9 +110,7 @@ | @@ -80,9 +110,7 @@ | ||
80 | } | 110 | } |
81 | 111 | ||
82 | IPC::Request & IPC::Request::push(const char *arg) { | 112 | IPC::Request & IPC::Request::push(const char *arg) { |
83 | - IPC::Request::DataBlock * block = createDataBlock(arg, strlen(arg)+1); | ||
84 | - block->type = IPC::Request::String; | ||
85 | - output.push_back(block); | 113 | + pushBlock(arg, strlen(arg)+1)->type = IPC::Request::String; |
86 | return *this; | 114 | return *this; |
87 | } | 115 | } |
88 | 116 |