Commit 3ef7dede0bcb424c33e755742ad77503aa9539e0
1 parent
d9638802
Exists in
master
Adding "set attribute" methods.
Showing
10 changed files
with
195 additions
and
51 deletions
Show diff stats
py3270.cbp
... | ... | @@ -60,6 +60,7 @@ |
60 | 60 | <Unit filename="src/session/attributes.cc" /> |
61 | 61 | <Unit filename="src/session/get.cc" /> |
62 | 62 | <Unit filename="src/session/init.cc" /> |
63 | + <Unit filename="src/session/misc.cc" /> | |
63 | 64 | <Unit filename="src/session/network.cc" /> |
64 | 65 | <Unit filename="src/session/set.cc" /> |
65 | 66 | <Unit filename="src/session/tools.cc" /> | ... | ... |
src/include/py3270.h
... | ... | @@ -116,6 +116,8 @@ |
116 | 116 | DLL_PRIVATE PyTypeObject py3270_session_type; |
117 | 117 | DLL_PRIVATE PyTypeObject py3270_action_type; |
118 | 118 | |
119 | + DLL_PRIVATE const PyGetSetDef py3270_session_attributes[]; | |
120 | + | |
119 | 121 | DLL_PRIVATE PyObject * py3270_get_module_version(PyObject *self, PyObject *args); |
120 | 122 | DLL_PRIVATE PyObject * py3270_get_module_revision(PyObject *self, PyObject *args); |
121 | 123 | |
... | ... | @@ -133,12 +135,17 @@ |
133 | 135 | DLL_PRIVATE PyObject * py3270_session_getter(PyObject *self, void *name); |
134 | 136 | DLL_PRIVATE int py3270_session_setter(PyObject *self, PyObject *value, void *name); |
135 | 137 | |
138 | + DLL_PRIVATE PyObject * py3270_session_get_timeout(PyObject *self, void *dunno); | |
139 | + DLL_PRIVATE int py3270_session_set_timeout(PyObject *self, PyObject *value, void *dunno); | |
140 | + | |
136 | 141 | DLL_PRIVATE PyObject * py3270_session_connect(PyObject *self, PyObject *args); |
137 | 142 | |
138 | 143 | DLL_PRIVATE PyObject * py3270_session_get(PyObject *self, PyObject *args); |
139 | 144 | DLL_PRIVATE PyObject * py3270_session_set(PyObject *self, PyObject *args); |
140 | 145 | DLL_PRIVATE PyObject * py3270_session_str(PyObject *self); |
141 | 146 | DLL_PRIVATE PyObject * py3270_session_wait(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); | |
142 | 149 | |
143 | 150 | // Action object |
144 | 151 | DLL_PRIVATE PyObject * py3270_action_new_from_session(PyObject *session, void *action); | ... | ... |
src/session/attributes.cc
... | ... | @@ -87,6 +87,39 @@ PyObject * py3270_session_getter(PyObject *self, void *name) { |
87 | 87 | |
88 | 88 | int py3270_session_setter(PyObject *self, PyObject *value, void *name) { |
89 | 89 | |
90 | + try { | |
91 | + | |
92 | + auto attribute = ((pySession * ) self)->host->getAttribute((const char *) name); | |
93 | + | |
94 | + if(PyLong_Check(value)) { | |
95 | + | |
96 | + // Is a long, use PyLong_AsUnsignedLong | |
97 | + attribute = (int) PyLong_AsUnsignedLong(value); | |
98 | + | |
99 | + } else if(PyBool_Check(value)) { | |
100 | + | |
101 | + // Is a boolean, use PyLong_AsUnsignedLong != 0 | |
102 | + attribute = (bool) (PyLong_AsUnsignedLong(value) != 0); | |
103 | + | |
104 | + } else if(PyUnicode_Check(value)) { | |
105 | + | |
106 | + // Is a unicode string | |
107 | + attribute = (const char *) PyUnicode_AsUTF8AndSize(value,NULL); | |
108 | + | |
109 | + } | |
110 | + | |
111 | + } catch(const exception &e) { | |
112 | + | |
113 | + PyErr_SetString(PyExc_RuntimeError, e.what()); | |
114 | + return -1; | |
115 | + | |
116 | + } catch( ... ) { | |
117 | + | |
118 | + PyErr_SetString(PyExc_RuntimeError, "Unexpected error setting timeout"); | |
119 | + return -1; | |
120 | + | |
121 | + } | |
122 | + | |
90 | 123 | return 0; |
91 | 124 | } |
92 | 125 | ... | ... |
src/session/get.cc
src/session/init.cc
... | ... | @@ -63,14 +63,25 @@ void py3270_session_type_init(PyTypeObject *type) { |
63 | 63 | auto actions = TN3270::getActions(); |
64 | 64 | size_t ix = 0; |
65 | 65 | |
66 | + // Compute block size | |
66 | 67 | size_t szData = sizeof(struct PyGetSetDef) * (attributes.size() + actions.size() + 1); |
67 | 68 | |
69 | + for(size_t i = 0; py3270_session_attributes[i].name; i++) { | |
70 | + szData += sizeof(struct PyGetSetDef); | |
71 | + } | |
72 | + | |
73 | + // Allocate and clean | |
68 | 74 | type->tp_getset = (struct PyGetSetDef *) malloc(szData); |
69 | 75 | memset(type->tp_getset,0,szData); |
70 | 76 | |
71 | - for(auto attribute : attributes) { | |
77 | + // Copy internal attributes | |
78 | + for(size_t i = 0; py3270_session_attributes[i].name; i++) { | |
79 | + type->tp_getset[ix] = py3270_session_attributes[i]; | |
80 | + ix++; | |
81 | + } | |
72 | 82 | |
73 | -// debug("Creating attribute %s",attribute->name); | |
83 | + // Copy lib3270's attributes | |
84 | + for(auto attribute : attributes) { | |
74 | 85 | |
75 | 86 | py3270_session_attribute_init(&type->tp_getset[ix], (const LIB3270_PROPERTY *) attribute); |
76 | 87 | ... | ... |
... | ... | @@ -0,0 +1,67 @@ |
1 | +/* | |
2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | |
5 | + * | |
6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | |
7 | + * | |
8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
10 | + * Free Software Foundation. | |
11 | + * | |
12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
15 | + * obter mais detalhes. | |
16 | + * | |
17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | |
19 | + * St, Fifth Floor, Boston, MA 02110-1301 USA | |
20 | + * | |
21 | + * Este programa está nomeado como set.cc e possui - linhas de código. | |
22 | + * | |
23 | + * Contatos | |
24 | + * | |
25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
26 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
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 | + */ | |
34 | + | |
35 | + #include <py3270.h> | |
36 | + | |
37 | +/*---[ Implement ]----------------------------------------------------------------------------------*/ | |
38 | + | |
39 | + PyObject * py3270_session_find(PyObject *self, PyObject *args) { | |
40 | + | |
41 | + return py3270_session_call(self, [self, args](TN3270::Host &host){ | |
42 | + | |
43 | + const char *text; | |
44 | + | |
45 | + if(!PyArg_ParseTuple(args, "s", &text)) | |
46 | + throw std::system_error(EINVAL, std::system_category()); | |
47 | + | |
48 | + return PyLong_FromLong(host.find(text)); | |
49 | + | |
50 | + }); | |
51 | + | |
52 | + } | |
53 | + | |
54 | + PyObject * py3270_session_count(PyObject *self, PyObject *args) { | |
55 | + | |
56 | + return py3270_session_call(self, [self, args](TN3270::Host &host){ | |
57 | + | |
58 | + const char *text; | |
59 | + | |
60 | + if(!PyArg_ParseTuple(args, "s", &text)) | |
61 | + throw std::system_error(EINVAL, std::system_category()); | |
62 | + | |
63 | + return PyLong_FromLong(host.count(text)); | |
64 | + | |
65 | + }); | |
66 | + | |
67 | + } | ... | ... |
src/session/set.cc
... | ... | @@ -89,53 +89,35 @@ |
89 | 89 | |
90 | 90 | } |
91 | 91 | |
92 | - | |
93 | -/* | |
94 | - PyObject * terminal_set_string_at(PyObject *self, PyObject *args) { | |
95 | - | |
96 | - int row, col, rc; | |
97 | - const char *text; | |
98 | - | |
99 | - if (!PyArg_ParseTuple(args, "iis", &row, &col, &text)) { | |
100 | - PyErr_SetString(terminalError, strerror(EINVAL)); | |
101 | - return NULL; | |
102 | - } | |
92 | + int py3270_session_set_timeout(PyObject *self, PyObject *value, void *dunno) { | |
103 | 93 | |
104 | 94 | try { |
105 | 95 | |
106 | - rc = ((pw3270_TerminalObject *) self)->session->set_string_at(row,col,text); | |
107 | - | |
108 | - } catch(std::exception &e) { | |
96 | + auto host = ((pySession * ) self)->host; | |
109 | 97 | |
110 | - PyErr_SetString(terminalError, e.what()); | |
111 | - return NULL; | |
112 | - } | |
98 | + if(PyLong_Check(value)) { | |
113 | 99 | |
114 | - return PyLong_FromLong(rc); | |
100 | + host->setTimeout( (time_t) PyLong_AsUnsignedLong(value)); | |
115 | 101 | |
116 | - } | |
102 | + } else { | |
117 | 103 | |
118 | - PyObject * terminal_set_cursor_at(PyObject *self, PyObject *args) { | |
104 | + throw std::system_error(EINVAL, std::system_category()); | |
119 | 105 | |
120 | - int row, col, rc; | |
106 | + } | |
121 | 107 | |
122 | - if (!PyArg_ParseTuple(args, "ii", &row, &col)) { | |
123 | - PyErr_SetString(terminalError, strerror(EINVAL)); | |
124 | - return NULL; | |
125 | - } | |
108 | + } catch(const exception &e) { | |
126 | 109 | |
127 | - try { | |
110 | + PyErr_SetString(PyExc_RuntimeError, e.what()); | |
111 | + return -1; | |
128 | 112 | |
129 | - rc = ((pw3270_TerminalObject *) self)->session->set_cursor_position(row,col); | |
113 | + } catch( ... ) { | |
130 | 114 | |
131 | - } catch(std::exception &e) { | |
115 | + PyErr_SetString(PyExc_RuntimeError, "Unexpected error setting timeout"); | |
116 | + return -1; | |
132 | 117 | |
133 | - PyErr_SetString(terminalError, e.what()); | |
134 | - return NULL; | |
135 | 118 | } |
136 | 119 | |
137 | - return PyLong_FromLong(rc); | |
120 | + return 0; | |
138 | 121 | |
139 | 122 | } |
140 | 123 | |
141 | -*/ | ... | ... |
src/session/type.c
... | ... | @@ -66,10 +66,39 @@ static PyMethodDef py3270_session_methods[] = { |
66 | 66 | }, |
67 | 67 | |
68 | 68 | { |
69 | + "find", | |
70 | + (PyCFunction) py3270_session_find, | |
71 | + METH_VARARGS, | |
72 | + "" | |
73 | + }, | |
74 | + | |
75 | + { | |
76 | + "count", | |
77 | + (PyCFunction) py3270_session_count, | |
78 | + METH_VARARGS, | |
79 | + "" | |
80 | + }, | |
81 | + | |
82 | + { | |
69 | 83 | NULL |
70 | 84 | } |
71 | 85 | }; |
72 | 86 | |
87 | + | |
88 | +const struct PyGetSetDef py3270_session_attributes[] = { | |
89 | + | |
90 | + { | |
91 | + .name = "timeout", | |
92 | + .doc = "Timeout (in seconds) for host access", | |
93 | + .get = py3270_session_get_timeout, | |
94 | + .set = py3270_session_set_timeout | |
95 | + }, | |
96 | + | |
97 | + { | |
98 | + .name = NULL | |
99 | + } | |
100 | +}; | |
101 | + | |
73 | 102 | // https://docs.python.org/3/c-api/typeobj.html |
74 | 103 | PyTypeObject py3270_session_type = { |
75 | 104 | ... | ... |
src/session/wait.cc
testprograms/sample.py
... | ... | @@ -7,25 +7,32 @@ import tn3270 |
7 | 7 | print("Using TN3270 Version " + tn3270.version()) |
8 | 8 | print(tn3270.revision()) |
9 | 9 | |
10 | -session = tn3270.Session(":a") | |
10 | +session = tn3270.Session("") | |
11 | +session.timeout = 10 | |
11 | 12 | |
12 | 13 | print("Using tn3270 version " + session.version + " revision " + session.revision) |
13 | 14 | |
15 | +print(session.timeout) | |
16 | + | |
14 | 17 | #print(session.cstate) |
15 | 18 | #print(session.width) |
16 | 19 | #print(session.connected) |
17 | -#print(session.url) | |
20 | +print(session.url) | |
21 | +session.url = "http://www.google.com" | |
22 | +print(session.url) | |
18 | 23 | |
19 | -print(session.reconnect) | |
24 | +#print(session.reconnect) | |
20 | 25 | |
21 | 26 | # |
22 | 27 | # Can reconnect? If yes do it! |
23 | 28 | # |
24 | -if session.reconnect.activatable: | |
25 | - print("Reconnecting...") | |
26 | - session.reconnect().wait(10) | |
29 | +#if session.reconnect.activatable: | |
30 | +# print("Reconnecting...") | |
31 | +# session.reconnect().wait(10) | |
27 | 32 | |
28 | -print(session.connected) | |
33 | +#print(session.connected) | |
34 | +#print(session.find('sisbb')) | |
35 | +#print(session.count('sisbb')) | |
29 | 36 | |
30 | 37 | #print('----------------------') |
31 | 38 | #print(dir(session)) |
... | ... | @@ -33,17 +40,17 @@ print(session.connected) |
33 | 40 | |
34 | 41 | #print(session.get(14,22,38)) |
35 | 42 | |
36 | -print("-----------------------------------------------------------------------") | |
37 | -print(session) | |
38 | -print("-----------------------------------------------------------------------") | |
43 | +#print("-----------------------------------------------------------------------") | |
44 | +#print(session) | |
45 | +#print("-----------------------------------------------------------------------") | |
39 | 46 | |
40 | -session.enter().wait(14,2,"Senha") | |
47 | +#session.enter().wait(14,2,"Senha") | |
41 | 48 | |
42 | -session.set("value") | |
49 | +#session.set("value") | |
43 | 50 | |
44 | -print("-----------------------------------------------------------------------") | |
45 | -print(session) | |
46 | -print("-----------------------------------------------------------------------") | |
51 | +#print("-----------------------------------------------------------------------") | |
52 | +#print(session) | |
53 | +#print("-----------------------------------------------------------------------") | |
47 | 54 | |
48 | 55 | input("Press enter to exit") |
49 | 56 | ... | ... |