Commit 5ace6ea00a4c44a8415d669b5aa2873998a9bff2

Authored by Perry Werneck
1 parent 46b42c15

Implementing IPC commom methods for windows.

src/lib3270++/private.h
@@ -241,8 +241,9 @@ @@ -241,8 +241,9 @@
241 }; 241 };
242 242
243 struct { 243 struct {
244 - DWORD length;  
245 - DWORD used; 244 + DWORD length; ///< @brief Length of input buffer.
  245 + DWORD used; ///< @brief Length of used block.
  246 + DWORD current; ///< @brief Offset of the current argument.
246 uint8_t * block; 247 uint8_t * block;
247 } in; 248 } in;
248 249
@@ -256,9 +257,12 @@ @@ -256,9 +257,12 @@
256 Type type; 257 Type type;
257 }; 258 };
258 259
259 - /// @brief Create DataBlock 260 + /// @brief Store value on data block.
260 DataBlock * pushBlock(const void *ptr, size_t len); 261 DataBlock * pushBlock(const void *ptr, size_t len);
261 262
  263 + /// @brief Get next argument.
  264 + DataBlock * getNextBlock() const;
  265 +
262 #else 266 #else
263 struct { 267 struct {
264 DBusMessage * in; 268 DBusMessage * in;
@@ -290,7 +294,6 @@ @@ -290,7 +294,6 @@
290 Request & call(); 294 Request & call();
291 295
292 // Push values 296 // Push values
293 -  
294 Request & push(const char *arg); 297 Request & push(const char *arg);
295 298
296 // Pop values 299 // Pop values
src/lib3270++/windows/request.cc
@@ -91,7 +91,7 @@ @@ -91,7 +91,7 @@
91 91
92 } 92 }
93 93
94 - /// @brief Create DataBlock 94 + /// @brief Store value on data block.
95 IPC::Request::DataBlock * IPC::Request::pushBlock(const void *ptr, size_t length) { 95 IPC::Request::DataBlock * IPC::Request::pushBlock(const void *ptr, size_t length) {
96 96
97 if((out.used + length + sizeof(IPC::Request::DataBlock)) >= out.length) { 97 if((out.used + length + sizeof(IPC::Request::DataBlock)) >= out.length) {
@@ -107,17 +107,61 @@ @@ -107,17 +107,61 @@
107 107
108 } 108 }
109 109
  110 + /// @brief Get next argument.
  111 + IPC::Request::DataBlock * IPC::Request::getNextBlock() const {
  112 +
  113 + if((in.current + sizeof(IPC::Request::DataBlock)) >= in.used) {
  114 + throw std::runtime_error("Out of range");
  115 + }
  116 +
  117 + return (IPC::Request::DataBlock *) (in.block + in.current);
  118 +
  119 + }
  120 +
110 IPC::Request & IPC::Request::push(const char *arg) { 121 IPC::Request & IPC::Request::push(const char *arg) {
111 pushBlock(arg, strlen(arg)+1)->type = IPC::Request::String; 122 pushBlock(arg, strlen(arg)+1)->type = IPC::Request::String;
112 return *this; 123 return *this;
113 } 124 }
114 125
115 IPC::Request & IPC::Request::pop(std::string &value) { 126 IPC::Request & IPC::Request::pop(std::string &value) {
  127 + DataBlock * block = getNextBlock();
  128 +
  129 + if(block->type != IPC::Request::String)
  130 + throw std::runtime_error("Invalid format");
  131 +
  132 + const char *ptr = (const char *) (block+1);
  133 +
  134 + in.current += (strlen(ptr)+1+sizeof(DataBlock));
  135 +
  136 + value.assign(ptr);
116 137
117 return *this; 138 return *this;
118 } 139 }
119 140
120 IPC::Request & IPC::Request::Request::pop(int &value) { 141 IPC::Request & IPC::Request::Request::pop(int &value) {
  142 +
  143 + DataBlock * block = getNextBlock();
  144 +
  145 + switch(block->type) {
  146 + case IPC::Request::Int16:
  147 + value = * ((int16_t *) (block+1));
  148 + in.current += sizeof(int16_t) + sizeof(DataBlock);
  149 + break;
  150 +
  151 + case IPC::Request::Int32:
  152 + value = * ((int32_t *) (block+1));
  153 + in.current += sizeof(int32_t) + sizeof(DataBlock);
  154 + break;
  155 +
  156 + case IPC::Request::Int64:
  157 + value = * ((int64_t *) (block+1));
  158 + in.current += sizeof(int64_t) + sizeof(DataBlock);
  159 + break;
  160 +
  161 + default:
  162 + throw std::runtime_error("Invalid format");
  163 + }
  164 +
121 return *this; 165 return *this;
122 } 166 }
123 167
src/lib3270++/windows/session.cc
@@ -95,6 +95,8 @@ @@ -95,6 +95,8 @@
95 lib3270_trace_data(NULL,"Request block",(const char *) this->out.block, this->out.used); 95 lib3270_trace_data(NULL,"Request block",(const char *) this->out.block, this->out.used);
96 #endif // DEBUG 96 #endif // DEBUG
97 97
  98 + in.current = 0;
  99 +
98 if(!TransactNamedPipe( 100 if(!TransactNamedPipe(
99 this->hPipe, 101 this->hPipe,
100 this->out.block, 102 this->out.block,