Commit 98721dff2b55f6114ef1c0bdeb0eebc0b09313bf
1 parent
35ca683c
Exists in
master
Implementing action object.
Showing
10 changed files
with
208 additions
and
90 deletions
Show diff stats
py3270.cbp
... | ... | @@ -44,6 +44,7 @@ |
44 | 44 | </Linker> |
45 | 45 | <Unit filename="src/action/init.cc" /> |
46 | 46 | <Unit filename="src/action/new.cc" /> |
47 | + <Unit filename="src/action/tools.cc" /> | |
47 | 48 | <Unit filename="src/action/type.c"> |
48 | 49 | <Option compilerVar="CC" /> |
49 | 50 | </Unit> |
... | ... | @@ -54,13 +55,13 @@ |
54 | 55 | <Option compilerVar="CC" /> |
55 | 56 | </Unit> |
56 | 57 | <Unit filename="src/module/properties.cc" /> |
57 | - <Unit filename="src/module/tools.cc" /> | |
58 | 58 | <Unit filename="src/session/actions.cc" /> |
59 | 59 | <Unit filename="src/session/attributes.cc" /> |
60 | 60 | <Unit filename="src/session/get.cc" /> |
61 | 61 | <Unit filename="src/session/init.cc" /> |
62 | 62 | <Unit filename="src/session/network.cc" /> |
63 | 63 | <Unit filename="src/session/set.cc" /> |
64 | + <Unit filename="src/session/tools.cc" /> | |
64 | 65 | <Unit filename="src/session/type.c"> |
65 | 66 | <Option compilerVar="CC" /> |
66 | 67 | </Unit> | ... | ... |
src/action/init.cc
... | ... | @@ -36,6 +36,7 @@ |
36 | 36 | |
37 | 37 | #include <py3270.h> |
38 | 38 | #include <lib3270/ipc.h> |
39 | + #include <lib3270/ipc/action.h> | |
39 | 40 | |
40 | 41 | /*---[ Implement ]----------------------------------------------------------------------------------*/ |
41 | 42 | |
... | ... | @@ -43,3 +44,34 @@ void py3270_action_type_init(PyTypeObject *type) { |
43 | 44 | |
44 | 45 | |
45 | 46 | } |
47 | + | |
48 | +static void cleanup(pyAction * self) { | |
49 | + | |
50 | + if(self->action) { | |
51 | + delete self->action; | |
52 | + self->action = nullptr; | |
53 | + } | |
54 | + | |
55 | +} | |
56 | + | |
57 | +void py3270_action_dealloc(PyObject * self) { | |
58 | + debug("%s",__FUNCTION__); | |
59 | + cleanup((pyAction *) self); | |
60 | +} | |
61 | + | |
62 | +void py3270_action_finalize(PyObject *self) { | |
63 | + debug("%s",__FUNCTION__); | |
64 | + cleanup((pyAction *) self); | |
65 | +} | |
66 | + | |
67 | +PyObject * py3270_action_activatable(PyObject *self, PyObject *args) { | |
68 | + | |
69 | + return py3270_action_call(self, [](TN3270::Action &action) { | |
70 | + | |
71 | + return PyBool_FromLong(action.activatable()); | |
72 | + | |
73 | + }); | |
74 | + | |
75 | + | |
76 | +} | |
77 | + | ... | ... |
src/action/new.cc
... | ... | @@ -41,4 +41,10 @@ |
41 | 41 | |
42 | 42 | DLL_PRIVATE PyObject * py3270_action_new_from_session(PyObject *session, void *action) { |
43 | 43 | |
44 | + pyAction * object = (pyAction *) _PyObject_New(&py3270_action_type); | |
45 | + | |
46 | + object->action = ((pySession *) session)->host->getAction((const LIB3270_ACTION *) action); | |
47 | + | |
48 | + return (PyObject *) object; | |
49 | + | |
44 | 50 | } | ... | ... |
... | ... | @@ -0,0 +1,61 @@ |
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 misc.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 | + * 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 | + */ | |
36 | + | |
37 | + #include <py3270.h> | |
38 | + | |
39 | +/*---[ Implement ]----------------------------------------------------------------------------------*/ | |
40 | + | |
41 | +PyObject * py3270_action_call(PyObject *self, std::function<PyObject * (TN3270::Action &Action)> worker) noexcept { | |
42 | + | |
43 | + try { | |
44 | + | |
45 | + TN3270::Action *action = ((pyAction * ) self)->action; | |
46 | + return worker(*action); | |
47 | + | |
48 | + } catch(const exception &e) { | |
49 | + | |
50 | + PyErr_SetString(PyExc_RuntimeError, e.what()); | |
51 | + | |
52 | + } catch( ... ) { | |
53 | + | |
54 | + PyErr_SetString(PyExc_RuntimeError, "Unexpected error in action object"); | |
55 | + | |
56 | + } | |
57 | + | |
58 | + return NULL; | |
59 | + | |
60 | +} | |
61 | + | ... | ... |
src/action/type.c
... | ... | @@ -38,14 +38,12 @@ |
38 | 38 | |
39 | 39 | static PyMethodDef py3270_action_methods[] = { |
40 | 40 | |
41 | - /* | |
42 | 41 | { |
43 | 42 | "activatable", |
44 | 43 | (PyCFunction) py3270_action_activatable, |
45 | 44 | METH_NOARGS, |
46 | 45 | "" |
47 | 46 | }, |
48 | - */ | |
49 | 47 | |
50 | 48 | { |
51 | 49 | NULL |
... | ... | @@ -58,13 +56,17 @@ PyTypeObject py3270_action_type = { |
58 | 56 | PyVarObject_HEAD_INIT(NULL, 0) |
59 | 57 | |
60 | 58 | .tp_name = "tn3270.Session.Action", |
61 | - .tp_doc = "TN3270 Session Action Object", | |
59 | + .tp_doc = "TN3270 Action Object", | |
62 | 60 | .tp_basicsize = sizeof(pyAction), |
63 | 61 | .tp_itemsize = 0, |
64 | 62 | .tp_flags = Py_TPFLAGS_DEFAULT, |
65 | 63 | |
66 | 64 | .tp_methods = py3270_action_methods, |
67 | 65 | |
66 | + .tp_dealloc = py3270_action_dealloc, | |
67 | + .tp_finalize = py3270_action_finalize, | |
68 | + | |
69 | + | |
68 | 70 | }; |
69 | 71 | |
70 | 72 | ... | ... |
src/include/py3270.h
... | ... | @@ -77,20 +77,25 @@ |
77 | 77 | #include <stdexcept> |
78 | 78 | #include <vector> |
79 | 79 | #include <lib3270/ipc.h> |
80 | + #include <lib3270/ipc/action.h> | |
80 | 81 | #include <lib3270/actions.h> |
81 | 82 | |
82 | 83 | using std::exception; |
83 | 84 | using std::runtime_error; |
84 | 85 | using TN3270::Host; |
86 | + using TN3270::Action; | |
85 | 87 | |
86 | 88 | DLL_PRIVATE PyObject * py3270_session_call(PyObject *self, std::function<PyObject * (TN3270::Host &host)> worker) noexcept; |
87 | 89 | DLL_PRIVATE PyObject * py3270_session_call(PyObject *self, std::function<int (TN3270::Host &host)> worker) noexcept; |
88 | 90 | |
91 | + DLL_PRIVATE PyObject * py3270_action_call(PyObject *self, std::function<PyObject * (TN3270::Action &action)> worker) noexcept; | |
92 | + | |
89 | 93 | extern "C" { |
90 | 94 | |
91 | 95 | #else |
92 | 96 | |
93 | 97 | typedef void Host; |
98 | + typedef void Action; | |
94 | 99 | |
95 | 100 | #endif |
96 | 101 | |
... | ... | @@ -101,8 +106,7 @@ |
101 | 106 | |
102 | 107 | typedef struct { |
103 | 108 | PyObject_HEAD |
104 | - Host *host; | |
105 | - const struct _lib3270_action * action; | |
109 | + Action *action; | |
106 | 110 | } pyAction; |
107 | 111 | |
108 | 112 | DLL_PRIVATE PyTypeObject py3270_session_type; |
... | ... | @@ -136,6 +140,10 @@ |
136 | 140 | // Action object |
137 | 141 | DLL_PRIVATE PyObject * py3270_action_new_from_session(PyObject *session, void *action); |
138 | 142 | |
143 | + DLL_PRIVATE void py3270_action_dealloc(PyObject * self); | |
144 | + DLL_PRIVATE void py3270_action_finalize(PyObject *self); | |
145 | + | |
146 | + DLL_PRIVATE PyObject * py3270_action_activatable(PyObject *self, PyObject *args); | |
139 | 147 | |
140 | 148 | /* |
141 | 149 | ... | ... |
src/module/tools.cc
... | ... | @@ -1,82 +0,0 @@ |
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 misc.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 | - * 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 | - */ | |
36 | - | |
37 | - #include <py3270.h> | |
38 | - | |
39 | -/*---[ Implement ]----------------------------------------------------------------------------------*/ | |
40 | - | |
41 | -PyObject * py3270_session_call(PyObject *self, std::function<PyObject * (TN3270::Host &host)> worker) noexcept { | |
42 | - | |
43 | - try { | |
44 | - | |
45 | - TN3270::Host *host = ((pySession * ) self)->host; | |
46 | - return worker(*host); | |
47 | - | |
48 | - } catch(const exception &e) { | |
49 | - | |
50 | - PyErr_SetString(PyExc_RuntimeError, e.what()); | |
51 | - | |
52 | - } catch( ... ) { | |
53 | - | |
54 | - PyErr_SetString(PyExc_RuntimeError, "Unexpected error in core module"); | |
55 | - | |
56 | - } | |
57 | - | |
58 | - return NULL; | |
59 | - | |
60 | -} | |
61 | - | |
62 | -PyObject * py3270_session_call(PyObject *self, std::function<int (TN3270::Host &host)> worker) noexcept { | |
63 | - | |
64 | - try { | |
65 | - | |
66 | - TN3270::Host *host = ((pySession * ) self)->host; | |
67 | - return PyLong_FromLong(worker(*host)); | |
68 | - | |
69 | - } catch(const exception &e) { | |
70 | - | |
71 | - PyErr_SetString(PyExc_RuntimeError, e.what()); | |
72 | - | |
73 | - } catch( ... ) { | |
74 | - | |
75 | - PyErr_SetString(PyExc_RuntimeError, "Unexpected error in core module"); | |
76 | - | |
77 | - } | |
78 | - | |
79 | - return NULL; | |
80 | - | |
81 | -} | |
82 | - |
src/session/init.cc
... | ... | @@ -70,7 +70,7 @@ void py3270_session_type_init(PyTypeObject *type) { |
70 | 70 | |
71 | 71 | for(auto attribute : attributes) { |
72 | 72 | |
73 | -// debug("Creating attribute %s",attribute->name); | |
73 | + debug("Creating attribute %s",attribute->name); | |
74 | 74 | |
75 | 75 | py3270_session_attribute_init(&type->tp_getset[ix], (const LIB3270_PROPERTY *) attribute); |
76 | 76 | ... | ... |
... | ... | @@ -0,0 +1,82 @@ |
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 misc.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 | + * 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 | + */ | |
36 | + | |
37 | + #include <py3270.h> | |
38 | + | |
39 | +/*---[ Implement ]----------------------------------------------------------------------------------*/ | |
40 | + | |
41 | +PyObject * py3270_session_call(PyObject *self, std::function<PyObject * (TN3270::Host &host)> worker) noexcept { | |
42 | + | |
43 | + try { | |
44 | + | |
45 | + TN3270::Host *host = ((pySession * ) self)->host; | |
46 | + return worker(*host); | |
47 | + | |
48 | + } catch(const exception &e) { | |
49 | + | |
50 | + PyErr_SetString(PyExc_RuntimeError, e.what()); | |
51 | + | |
52 | + } catch( ... ) { | |
53 | + | |
54 | + PyErr_SetString(PyExc_RuntimeError, "Unexpected error in core module"); | |
55 | + | |
56 | + } | |
57 | + | |
58 | + return NULL; | |
59 | + | |
60 | +} | |
61 | + | |
62 | +PyObject * py3270_session_call(PyObject *self, std::function<int (TN3270::Host &host)> worker) noexcept { | |
63 | + | |
64 | + try { | |
65 | + | |
66 | + TN3270::Host *host = ((pySession * ) self)->host; | |
67 | + return PyLong_FromLong(worker(*host)); | |
68 | + | |
69 | + } catch(const exception &e) { | |
70 | + | |
71 | + PyErr_SetString(PyExc_RuntimeError, e.what()); | |
72 | + | |
73 | + } catch( ... ) { | |
74 | + | |
75 | + PyErr_SetString(PyExc_RuntimeError, "Unexpected error in core module"); | |
76 | + | |
77 | + } | |
78 | + | |
79 | + return NULL; | |
80 | + | |
81 | +} | |
82 | + | ... | ... |
testprograms/sample.py
... | ... | @@ -20,10 +20,18 @@ print(session.url) |
20 | 20 | |
21 | 21 | print(session.connected) |
22 | 22 | |
23 | +#print('----------------------') | |
24 | +#print(dir(session)) | |
25 | +#print('----------------------') | |
26 | + | |
27 | +test = session.reconnect | |
23 | 28 | print('----------------------') |
24 | -print(dir(session)) | |
29 | +print(dir(test)) | |
25 | 30 | print('----------------------') |
26 | 31 | |
32 | +print(test.activatable()) | |
33 | + | |
34 | + | |
27 | 35 | #print(session.get(14,22,38)) |
28 | 36 | |
29 | 37 | #print("-----------------------------------------------------------------------") | ... | ... |