Commit 76b9754ff180d948249bf71b4ee3800d806d3d19

Authored by Perry Werneck
1 parent 3ef7dede
Exists in master

Debugging python extension.

src/include/py3270.h
@@ -147,6 +147,10 @@ @@ -147,6 +147,10 @@
147 DLL_PRIVATE PyObject * py3270_session_find(PyObject *self, PyObject *args); 147 DLL_PRIVATE PyObject * py3270_session_find(PyObject *self, PyObject *args);
148 DLL_PRIVATE PyObject * py3270_session_count(PyObject *self, PyObject *args); 148 DLL_PRIVATE PyObject * py3270_session_count(PyObject *self, PyObject *args);
149 149
  150 + DLL_PRIVATE PyObject * py3270_session_pfkey(PyObject *self, PyObject *args);
  151 + DLL_PRIVATE PyObject * py3270_session_pakey(PyObject *self, PyObject *args);
  152 + DLL_PRIVATE PyObject * py3270_session_set_cursor_position(PyObject *self, PyObject *args);
  153 +
150 // Action object 154 // Action object
151 DLL_PRIVATE PyObject * py3270_action_new_from_session(PyObject *session, void *action); 155 DLL_PRIVATE PyObject * py3270_action_new_from_session(PyObject *session, void *action);
152 DLL_PRIVATE void py3270_action_dealloc(PyObject * self); 156 DLL_PRIVATE void py3270_action_dealloc(PyObject * self);
src/session/actions.cc
@@ -25,105 +25,81 @@ @@ -25,105 +25,81 @@
25 * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) 25 * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
26 * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) 26 * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
27 * 27 *
28 - * Referências:  
29 - *  
30 - * <https://docs.python.org/2/extending/newtypes.html>  
31 - * <https://docs.python.org/2.7/extending/extending.html#a-simple-example>  
32 - *  
33 */ 28 */
34 29
35 #include <py3270.h> 30 #include <py3270.h>
36 31
37 /*---[ Implement ]----------------------------------------------------------------------------------*/ 32 /*---[ Implement ]----------------------------------------------------------------------------------*/
38 33
39 -/*  
40 - PyObject * terminal_pfkey(PyObject *self, PyObject *args) {  
41 -  
42 - int rc, key;  
43 -  
44 - if (!PyArg_ParseTuple(args, "i", &key)) {  
45 - PyErr_SetString(terminalError, strerror(EINVAL));  
46 - return NULL;  
47 - }  
48 -  
49 - try {  
50 -  
51 - rc = ((pw3270_TerminalObject *) self)->session->pfkey(key);  
52 -  
53 - } catch(std::exception &e) {  
54 -  
55 - PyErr_SetString(terminalError, e.what());  
56 - return NULL;  
57 - }  
58 -  
59 - return PyLong_FromLong(rc); 34 +PyObject * py3270_session_pfkey(PyObject *self, PyObject *args) {
60 35
61 - } 36 + return py3270_session_call(self, [args](TN3270::Host &host){
62 37
63 - PyObject * terminal_pakey(PyObject *self, PyObject *args) { 38 + unsigned int keycode;
64 39
65 - int rc, key; 40 + if (!PyArg_ParseTuple(args, "I", &keycode))
  41 + return (PyObject *) NULL;
66 42
67 - if (!PyArg_ParseTuple(args, "i", &key)) {  
68 - PyErr_SetString(terminalError, strerror(EINVAL));  
69 - return NULL;  
70 - } 43 + host.pfkey((unsigned short) keycode);
71 44
72 - try { 45 + return PyLong_FromLong(0);
73 46
74 - rc = ((pw3270_TerminalObject *) self)->session->pakey(key); 47 + });
75 48
76 - } catch(std::exception &e) { 49 +}
77 50
78 - PyErr_SetString(terminalError, e.what());  
79 - return NULL;  
80 - } 51 +PyObject * py3270_session_pakey(PyObject *self, PyObject *args) {
81 52
82 - return PyLong_FromLong(rc); 53 + return py3270_session_call(self, [args](TN3270::Host &host){
83 54
84 - } 55 + unsigned int keycode;
85 56
86 - PyObject * terminal_enter(PyObject *self, PyObject *args) { 57 + if (!PyArg_ParseTuple(args, "I", &keycode))
  58 + return (PyObject *) NULL;
87 59
88 - int rc; 60 + host.pakey((unsigned short) keycode);
89 61
90 - try { 62 + return PyLong_FromLong(0);
91 63
92 - rc = ((pw3270_TerminalObject *) self)->session->enter(); 64 + });
93 65
94 - } catch(std::exception &e) { 66 +}
95 67
96 - PyErr_SetString(terminalError, e.what());  
97 - return NULL;  
98 - } 68 +PyObject * py3270_session_set_cursor_position(PyObject *self, PyObject *args) {
99 69
100 - return PyLong_FromLong(rc); 70 + return py3270_session_call(self, [args](TN3270::Host &host){
101 71
  72 + switch(PyTuple_Size(args)) {
  73 + case 1: // Only Address
  74 + {
  75 + int baddr;
102 76
103 - } 77 + if(!PyArg_ParseTuple(args, "i", &baddr))
  78 + return (PyObject *) NULL;
104 79
105 - PyObject * terminal_action(PyObject *self, PyObject *args) { 80 + host.setCursor(baddr);
  81 + }
  82 + break;
106 83
107 - int rc;  
108 - const char *name; 84 + case 2: // Row, col
  85 + {
  86 + unsigned int row, col;
109 87
110 - if (!PyArg_ParseTuple(args, "s", &name)) {  
111 - PyErr_SetString(terminalError, strerror(EINVAL));  
112 - return NULL;  
113 - } 88 + if (!PyArg_ParseTuple(args, "II", &row, &col))
  89 + return (PyObject *) NULL;
114 90
115 - try { 91 + host.setCursor(row,col);
116 92
117 - rc = ((pw3270_TerminalObject *) self)->session->action(name); 93 + }
  94 + break;
118 95
119 - } catch(std::exception &e) { 96 + default:
  97 + throw std::system_error(EINVAL, std::system_category());
120 98
121 - PyErr_SetString(terminalError, e.what());  
122 - return NULL;  
123 - } 99 + }
124 100
125 - return PyLong_FromLong(rc); 101 + return PyLong_FromLong(0);
126 102
  103 + });
127 104
128 - }  
129 -*/ 105 +}
src/session/attributes.cc
@@ -115,7 +115,7 @@ int py3270_session_setter(PyObject *self, PyObject *value, void *name) { @@ -115,7 +115,7 @@ int py3270_session_setter(PyObject *self, PyObject *value, void *name) {
115 115
116 } catch( ... ) { 116 } catch( ... ) {
117 117
118 - PyErr_SetString(PyExc_RuntimeError, "Unexpected error setting timeout"); 118 + PyErr_SetString(PyExc_RuntimeError, "Unexpected error setting attribute");
119 return -1; 119 return -1;
120 120
121 } 121 }
src/session/init.cc
@@ -18,16 +18,14 @@ @@ -18,16 +18,14 @@
18 * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin 18 * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin
19 * St, Fifth Floor, Boston, MA 02110-1301 USA 19 * St, Fifth Floor, Boston, MA 02110-1301 USA
20 * 20 *
21 - * Este programa está nomeado como py3270.cc e possui - linhas de código. 21 + * Este programa está nomeado como - e possui - linhas de código.
22 * 22 *
23 * Contatos: 23 * Contatos:
24 * 24 *
25 * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) 25 * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
26 * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) 26 * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
27 * 27 *
28 - * Implementa métodos básicos inicio/final do objeto python  
29 - *  
30 - * Referências: 28 + * Referênces:
31 * 29 *
32 * <https://docs.python.org/2/extending/newtypes.html> 30 * <https://docs.python.org/2/extending/newtypes.html>
33 * <https://docs.python.org/2.7/extending/extending.html#a-simple-example> 31 * <https://docs.python.org/2.7/extending/extending.html#a-simple-example>
@@ -93,10 +91,9 @@ void py3270_session_type_init(PyTypeObject *type) { @@ -93,10 +91,9 @@ void py3270_session_type_init(PyTypeObject *type) {
93 91
94 } 92 }
95 93
  94 + // Copy lib3270's actions
96 for(auto action : actions) { 95 for(auto action : actions) {
97 96
98 -// debug("Creating action %s",action->name);  
99 -  
100 py3270_session_attribute_init(&type->tp_getset[ix], (const LIB3270_PROPERTY *) action); 97 py3270_session_attribute_init(&type->tp_getset[ix], (const LIB3270_PROPERTY *) action);
101 98
102 type->tp_getset[ix].get = py3270_action_new_from_session; 99 type->tp_getset[ix].get = py3270_action_new_from_session;
@@ -105,12 +102,11 @@ void py3270_session_type_init(PyTypeObject *type) { @@ -105,12 +102,11 @@ void py3270_session_type_init(PyTypeObject *type) {
105 ix++; 102 ix++;
106 103
107 } 104 }
108 - }  
109 105
  106 + }
110 107
111 } 108 }
112 109
113 -  
114 int py3270_session_init(PyObject *self, PyObject *args, PyObject *kwds) { 110 int py3270_session_init(PyObject *self, PyObject *args, PyObject *kwds) {
115 111
116 pySession * session = (pySession *) self; 112 pySession * session = (pySession *) self;
@@ -127,25 +123,6 @@ int py3270_session_init(PyObject *self, PyObject *args, PyObject *kwds) { @@ -127,25 +123,6 @@ int py3270_session_init(PyObject *self, PyObject *args, PyObject *kwds) {
127 123
128 session->host = new TN3270::Host(id); 124 session->host = new TN3270::Host(id);
129 125
130 - /*  
131 - // Load lib3270's actions  
132 - {  
133 - auto actions = TN3270::getActions();  
134 -  
135 - for(auto action : actions) {  
136 -  
137 - pyAction * object = (pyAction *) _PyObject_New(&py3270_action_type);  
138 -  
139 - object->host = session->host;  
140 - object->action = action;  
141 -  
142 - PyObject_SetAttr(self, PyUnicode_FromString(action->name), (PyObject *) object);  
143 -  
144 - }  
145 -  
146 - }  
147 - */  
148 -  
149 return 0; 126 return 0;
150 127
151 } catch(const std::exception &e) { 128 } catch(const std::exception &e) {
@@ -184,81 +161,3 @@ void py3270_session_dealloc(PyObject * self) { @@ -184,81 +161,3 @@ void py3270_session_dealloc(PyObject * self) {
184 Py_TYPE(self)->tp_free(self); 161 Py_TYPE(self)->tp_free(self);
185 162
186 } 163 }
187 -  
188 - /*  
189 -  
190 - const char *id = "";  
191 -  
192 - if (!PyArg_ParseTuple(args, "s", &id))  
193 - id = "";  
194 -  
195 -  
196 - if(session) {  
197 -  
198 - try {  
199 -  
200 - session->host = new TN3270::Host(id);  
201 -  
202 - } catch(const exception &e) {  
203 -  
204 - PyErr_SetString(PyExc_RuntimeError, e.what());  
205 -  
206 - } catch( ... ) {  
207 -  
208 - PyErr_SetString(PyExc_RuntimeError, "Unexpected error in core module");  
209 -  
210 - }  
211 -  
212 - }  
213 -  
214 - type->tp_free(session);  
215 -  
216 - return NULL;  
217 -  
218 -}  
219 -  
220 -void py3270_session_dealloc(pySession * self) {  
221 -  
222 - if(self->host) {  
223 - delete self->host;  
224 - }  
225 -  
226 - Py_TYPE(self)->tp_free((PyObject *) self);  
227 -  
228 -}  
229 - */  
230 -  
231 -  
232 -/*  
233 -PyObject * terminal_new(PyTypeObject *type, PyObject *args, PyObject *kwds) {  
234 -  
235 - PW3270_NAMESPACE::session * session;  
236 - const char *id = "";  
237 -  
238 - if (!PyArg_ParseTuple(args, "s", &id)) {  
239 - id = "";  
240 - }  
241 -  
242 - trace("%s(%s)",__FUNCTION__,id);  
243 -  
244 - try {  
245 -  
246 - session = PW3270_NAMESPACE::session::create(id);  
247 -  
248 - } catch(std::exception &e) {  
249 -  
250 - trace("%s failed: %s",__FUNCTION__,e.what());  
251 - PyErr_SetString(terminalError, e.what());  
252 - return NULL;  
253 -  
254 - }  
255 -  
256 - pw3270_TerminalObject *self = (pw3270_TerminalObject *) type->tp_alloc(type, 0);  
257 -  
258 - self->session = session;  
259 -  
260 - return (PyObject *)self;  
261 -}  
262 -  
263 -  
264 -*/  
src/session/tools.cc
@@ -18,20 +18,13 @@ @@ -18,20 +18,13 @@
18 * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin 18 * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin
19 * St, Fifth Floor, Boston, MA 02110-1301 USA 19 * St, Fifth Floor, Boston, MA 02110-1301 USA
20 * 20 *
21 - * Este programa está nomeado como misc.cc e possui - linhas de código. 21 + * Este programa está nomeado como - e possui - linhas de código.
22 * 22 *
23 * Contatos: 23 * Contatos:
24 * 24 *
25 * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) 25 * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
26 * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) 26 * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
27 * 27 *
28 - * Implementa métodos básicos inicio/final do objeto python  
29 - *  
30 - * Referências:  
31 - *  
32 - * <https://docs.python.org/2/extending/newtypes.html>  
33 - * <https://docs.python.org/2.7/extending/extending.html#a-simple-example>  
34 - *  
35 */ 28 */
36 29
37 #include <py3270.h> 30 #include <py3270.h>
src/session/type.c
@@ -38,45 +38,80 @@ @@ -38,45 +38,80 @@
38 38
39 static PyMethodDef py3270_session_methods[] = { 39 static PyMethodDef py3270_session_methods[] = {
40 { 40 {
41 - "connect",  
42 - (PyCFunction) py3270_session_connect,  
43 - METH_VARARGS,  
44 - "" 41 + .ml_name = "connect",
  42 + .ml_meth = (PyCFunction) py3270_session_connect,
  43 + .ml_flags = METH_VARARGS,
  44 + .ml_doc = ""
45 }, 45 },
46 46
47 { 47 {
48 - "wait",  
49 - (PyCFunction) py3270_session_wait,  
50 - METH_VARARGS,  
51 - "" 48 + .ml_name = "wait",
  49 + .ml_meth = (PyCFunction) py3270_session_wait,
  50 + .ml_flags = METH_VARARGS,
  51 + .ml_doc = ""
52 }, 52 },
53 53
54 { 54 {
55 - "set",  
56 - (PyCFunction) py3270_session_set,  
57 - METH_VARARGS,  
58 - "" 55 + .ml_name = "set",
  56 + .ml_meth = (PyCFunction) py3270_session_set,
  57 + .ml_flags = METH_VARARGS,
  58 + .ml_doc = ""
59 }, 59 },
60 60
61 { 61 {
62 - "get",  
63 - (PyCFunction) py3270_session_get,  
64 - METH_VARARGS,  
65 - "" 62 + .ml_name = "get",
  63 + .ml_meth = (PyCFunction) py3270_session_get,
  64 + .ml_flags = METH_VARARGS,
  65 + .ml_doc = ""
66 }, 66 },
67 67
68 { 68 {
69 - "find",  
70 - (PyCFunction) py3270_session_find,  
71 - METH_VARARGS,  
72 - "" 69 + .ml_name = "find",
  70 + .ml_meth = (PyCFunction) py3270_session_find,
  71 + .ml_flags = METH_VARARGS,
  72 + .ml_doc = ""
73 }, 73 },
74 74
75 { 75 {
76 - "count",  
77 - (PyCFunction) py3270_session_count,  
78 - METH_VARARGS,  
79 - "" 76 + .ml_name = "count",
  77 + .ml_meth = (PyCFunction) py3270_session_count,
  78 + .ml_flags = METH_VARARGS,
  79 + .ml_doc = ""
  80 + },
  81 +
  82 + {
  83 + .ml_name = "setcursor",
  84 + .ml_meth = (PyCFunction) py3270_session_set_cursor_position,
  85 + .ml_flags = METH_VARARGS,
  86 + .ml_doc = ""
  87 + },
  88 +
  89 + {
  90 + .ml_name = "pf",
  91 + .ml_meth = (PyCFunction) py3270_session_pfkey,
  92 + .ml_flags = METH_VARARGS,
  93 + .ml_doc = ""
  94 + },
  95 +
  96 + {
  97 + .ml_name = "pa",
  98 + .ml_meth = (PyCFunction) py3270_session_pakey,
  99 + .ml_flags = METH_VARARGS,
  100 + .ml_doc = ""
  101 + },
  102 +
  103 + {
  104 + .ml_name = "pfkey",
  105 + .ml_meth = (PyCFunction) py3270_session_pfkey,
  106 + .ml_flags = METH_VARARGS,
  107 + .ml_doc = ""
  108 + },
  109 +
  110 + {
  111 + .ml_name = "pakey",
  112 + .ml_meth = (PyCFunction) py3270_session_pakey,
  113 + .ml_flags = METH_VARARGS,
  114 + .ml_doc = ""
80 }, 115 },
81 116
82 { 117 {
testprograms/sample.py
@@ -12,23 +12,18 @@ session.timeout = 10 @@ -12,23 +12,18 @@ session.timeout = 10
12 12
13 print("Using tn3270 version " + session.version + " revision " + session.revision) 13 print("Using tn3270 version " + session.version + " revision " + session.revision)
14 14
15 -print(session.timeout)  
16 -  
17 #print(session.cstate) 15 #print(session.cstate)
18 #print(session.width) 16 #print(session.width)
19 #print(session.connected) 17 #print(session.connected)
20 -print(session.url)  
21 -session.url = "http://www.google.com"  
22 -print(session.url)  
23 18
24 #print(session.reconnect) 19 #print(session.reconnect)
25 20
26 # 21 #
27 # Can reconnect? If yes do it! 22 # Can reconnect? If yes do it!
28 # 23 #
29 -#if session.reconnect.activatable:  
30 -# print("Reconnecting...")  
31 -# session.reconnect().wait(10) 24 +if session.reconnect.activatable:
  25 + print("Reconnecting...")
  26 + session.reconnect().wait(10)
32 27
33 #print(session.connected) 28 #print(session.connected)
34 #print(session.find('sisbb')) 29 #print(session.find('sisbb'))