Commit 7154cff7a5604ea7a8e2096361ee55fa038652e0

Authored by Perry Werneck
1 parent e77e567c

Implementing IPC calls.

src/include/lib3270++.h
... ... @@ -243,10 +243,10 @@
243 243 }
244 244  
245 245 /// @brief Set cursor address.
246   - virtual void setCursorPosition(unsigned short addr) = 0;
  246 + virtual TN3270::Session & setCursorPosition(unsigned short addr) = 0;
247 247  
248 248 /// @brief Set cursor position.
249   - virtual void setCursorPosition(unsigned short row, unsigned short col) = 0;
  249 + virtual TN3270::Session & setCursorPosition(unsigned short row, unsigned short col) = 0;
250 250  
251 251 virtual Session & push(int baddr, const std::string &text) = 0;
252 252 virtual Session & push(int row, int col, const std::string &text) = 0;
... ...
src/lib3270++/ipc/session.cc
... ... @@ -127,59 +127,169 @@
127 127  
128 128 /// @brief Set field at current position, jumps to next writable field.
129 129 TN3270::Session & IPC::Session::push(const char *text) {
130   - throw std::system_error(EINVAL, std::system_category());
  130 +
  131 + int rc;
  132 +
  133 + Request(*this,"setString")
  134 + .push(text)
  135 + .call()
  136 + .pop(rc);
  137 +
  138 + if(rc) {
  139 + throw std::system_error((int) rc, std::system_category());
  140 + }
  141 +
  142 + return *this;
  143 +
131 144 }
132 145  
133 146 TN3270::Session & IPC::Session::push(int baddr, const std::string &text) {
134 147  
  148 + int rc;
  149 +
  150 + Request(*this,"setStringAtAddress")
  151 + .push((uint32_t) baddr)
  152 + .push(text.c_str())
  153 + .call()
  154 + .pop(rc);
  155 +
  156 + if(rc) {
  157 + throw std::system_error((int) rc, std::system_category());
  158 + }
135 159  
136 160 return *this;
  161 +
137 162 }
138 163  
139 164 TN3270::Session & IPC::Session::push(int row, int col, const std::string &text) {
140 165  
  166 + int32_t rc;
  167 +
  168 + Request(*this,"setStringAt")
  169 + .push((uint32_t) row)
  170 + .push((uint32_t) col)
  171 + .push(text.c_str())
  172 + .call()
  173 + .pop(rc);
  174 +
  175 + if(rc) {
  176 + throw std::system_error((int) rc, std::system_category());
  177 + }
141 178  
142 179 return *this;
  180 +
143 181 }
144 182  
145 183 TN3270::Session & IPC::Session::push(const PFKey key) {
146 184  
  185 + int32_t rc;
  186 +
  187 + Request(*this,"pfkey")
  188 + .push((uint32_t) key)
  189 + .call()
  190 + .pop(rc);
  191 +
  192 + if(rc) {
  193 + throw std::system_error((int) rc, std::system_category());
  194 + }
147 195  
148 196 return *this;
  197 +
149 198 }
150 199  
151 200 TN3270::Session & IPC::Session::push(const PAKey key) {
152 201  
  202 + int32_t rc;
  203 +
  204 + Request(*this,"pakey")
  205 + .push((uint32_t) key)
  206 + .call()
  207 + .pop(rc);
  208 +
  209 + if(rc) {
  210 + throw std::system_error((int) rc, std::system_category());
  211 + }
153 212  
154 213 return *this;
  214 +
155 215 }
156 216  
157 217 TN3270::Session & IPC::Session::push(const Action action) {
158 218  
  219 + const char * actions[] = {
  220 + "enter",
  221 + "erase",
  222 + "eraseeof",
  223 + "eraseeol",
  224 + "eraseinput"
  225 + };
  226 +
  227 + int32_t rc;
  228 +
  229 + if( ((size_t) action) > (sizeof(actions)/sizeof(actions[0]))) {
  230 + throw std::system_error(EINVAL, std::system_category());
  231 + }
  232 +
  233 + Request(*this,actions[(size_t) action])
  234 + .call()
  235 + .pop(rc);
  236 +
  237 + if(rc) {
  238 + throw std::system_error((int) rc, std::system_category());
  239 + }
  240 +
159 241 return *this;
  242 +
160 243 }
161 244  
162 245 TN3270::Session & IPC::Session::pop(int baddr, std::string &text) {
163 246  
  247 + Request(*this,"getFieldAtAddress")
  248 + .push((uint32_t) baddr)
  249 + .call()
  250 + .pop(text);
164 251  
165 252 return *this;
166 253 }
167 254  
168 255 TN3270::Session & IPC::Session::pop(int row, int col, std::string &text) {
169 256  
  257 + Request(*this,"getFieldAt")
  258 + .push((uint32_t) row)
  259 + .push((uint32_t) col)
  260 + .call()
  261 + .pop(text);
  262 +
170 263 return *this;
171 264 }
172 265  
173 266 TN3270::Session & IPC::Session::pop(std::string &text) {
174 267  
  268 + Request(*this,"getFieldAtCursor")
  269 + .call()
  270 + .pop(text);
  271 +
175 272 return *this;
  273 +
176 274 }
177 275  
178 276 /// @brief Set cursor address.
179 277 ///
180 278 /// @param addr Cursor address.
181   - void IPC::Session::setCursorPosition(unsigned short addr) {
  279 + TN3270::Session & IPC::Session::setCursorPosition(unsigned short addr) {
  280 +
  281 + int32_t rc;
182 282  
  283 + Request(*this,"setCursorAddress")
  284 + .push((uint32_t) addr)
  285 + .call()
  286 + .pop(rc);
  287 +
  288 + if(rc) {
  289 + throw std::system_error((int) rc, std::system_category());
  290 + }
  291 +
  292 + return *this;
183 293  
184 294 }
185 295  
... ... @@ -187,8 +297,21 @@
187 297 ///
188 298 /// @param row New cursor row.
189 299 /// @param col New cursor column.
190   - void IPC::Session::setCursorPosition(unsigned short row, unsigned short col) {
  300 + TN3270::Session & IPC::Session::setCursorPosition(unsigned short row, unsigned short col) {
191 301  
  302 + int32_t rc;
  303 +
  304 + Request(*this,"setCursorPosition")
  305 + .push((uint32_t) row)
  306 + .push((uint32_t) col)
  307 + .call()
  308 + .pop(rc);
  309 +
  310 + if(rc) {
  311 + throw std::system_error((int) rc, std::system_category());
  312 + }
  313 +
  314 + return *this;
192 315  
193 316 }
194 317  
... ...
src/lib3270++/local/session.cc
... ... @@ -344,24 +344,27 @@
344 344 /// @brief Set cursor address.
345 345 ///
346 346 /// @param addr Cursor address.
347   - void Local::Session::setCursorPosition(unsigned short addr) {
  347 + TN3270::Session & Local::Session::setCursorPosition(unsigned short addr) {
348 348  
349 349 if(lib3270_set_cursor_address(hSession,addr) < 0) {
350 350 throw std::system_error(errno, std::system_category());
351 351 }
352 352  
  353 + return *this;
353 354 }
354 355  
355 356 /// @brief Set cursor position.
356 357 ///
357 358 /// @param row New cursor row.
358 359 /// @param col New cursor column.
359   - void Local::Session::setCursorPosition(unsigned short row, unsigned short col) {
  360 + TN3270::Session & Local::Session::setCursorPosition(unsigned short row, unsigned short col) {
360 361  
361 362 if(lib3270_set_cursor_position(hSession,row,col)) {
362 363 throw std::system_error(errno, std::system_category());
363 364 }
364 365  
  366 + return *this;
  367 +
365 368 }
366 369  
367 370 // Get properties.
... ...
src/lib3270++/private.h
... ... @@ -192,8 +192,8 @@
192 192  
193 193 ConnectionState getConnectionState() const override;
194 194  
195   - void setCursorPosition(unsigned short addr);
196   - void setCursorPosition(unsigned short row, unsigned short col);
  195 + TN3270::Session & setCursorPosition(unsigned short addr) override;
  196 + TN3270::Session & setCursorPosition(unsigned short row, unsigned short col) override;
197 197  
198 198 /// @brief Set field at current posicion, jumps to next writable field.
199 199 TN3270::Session & push(const char *text) override;
... ... @@ -353,8 +353,8 @@
353 353  
354 354 ConnectionState getConnectionState() const override;
355 355  
356   - void setCursorPosition(unsigned short addr);
357   - void setCursorPosition(unsigned short row, unsigned short col);
  356 + TN3270::Session & setCursorPosition(unsigned short addr) override;
  357 + TN3270::Session & setCursorPosition(unsigned short row, unsigned short col) override;
358 358  
359 359 /// @brief Set field at current posicion, jumps to next writable field.
360 360 TN3270::Session & push(const char *text) override;
... ...