Commit 5ace6ea00a4c44a8415d669b5aa2873998a9bff2
1 parent
46b42c15
Exists in
master
and in
3 other branches
Implementing IPC commom methods for windows.
Showing
3 changed files
with
54 additions
and
5 deletions
Show diff stats
src/lib3270++/private.h
| ... | ... | @@ -241,8 +241,9 @@ |
| 241 | 241 | }; |
| 242 | 242 | |
| 243 | 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 | 247 | uint8_t * block; |
| 247 | 248 | } in; |
| 248 | 249 | |
| ... | ... | @@ -256,9 +257,12 @@ |
| 256 | 257 | Type type; |
| 257 | 258 | }; |
| 258 | 259 | |
| 259 | - /// @brief Create DataBlock | |
| 260 | + /// @brief Store value on data block. | |
| 260 | 261 | DataBlock * pushBlock(const void *ptr, size_t len); |
| 261 | 262 | |
| 263 | + /// @brief Get next argument. | |
| 264 | + DataBlock * getNextBlock() const; | |
| 265 | + | |
| 262 | 266 | #else |
| 263 | 267 | struct { |
| 264 | 268 | DBusMessage * in; |
| ... | ... | @@ -290,7 +294,6 @@ |
| 290 | 294 | Request & call(); |
| 291 | 295 | |
| 292 | 296 | // Push values |
| 293 | - | |
| 294 | 297 | Request & push(const char *arg); |
| 295 | 298 | |
| 296 | 299 | // Pop values | ... | ... |
src/lib3270++/windows/request.cc
| ... | ... | @@ -91,7 +91,7 @@ |
| 91 | 91 | |
| 92 | 92 | } |
| 93 | 93 | |
| 94 | - /// @brief Create DataBlock | |
| 94 | + /// @brief Store value on data block. | |
| 95 | 95 | IPC::Request::DataBlock * IPC::Request::pushBlock(const void *ptr, size_t length) { |
| 96 | 96 | |
| 97 | 97 | if((out.used + length + sizeof(IPC::Request::DataBlock)) >= out.length) { |
| ... | ... | @@ -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 | 121 | IPC::Request & IPC::Request::push(const char *arg) { |
| 111 | 122 | pushBlock(arg, strlen(arg)+1)->type = IPC::Request::String; |
| 112 | 123 | return *this; |
| 113 | 124 | } |
| 114 | 125 | |
| 115 | 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 | 138 | return *this; |
| 118 | 139 | } |
| 119 | 140 | |
| 120 | 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 | 165 | return *this; |
| 122 | 166 | } |
| 123 | 167 | ... | ... |
src/lib3270++/windows/session.cc