Commit bccb3c515b5eecb8d9c084d5d8ead5841a5fd021

Authored by Perry Werneck
2 parents d5a03c36 172d0c61
Exists in master and in 1 other branch develop

Merge branch 'develop'

Showing 46 changed files with 892 additions and 434 deletions   Show diff stats
Makefile.in
... ... @@ -133,9 +133,16 @@ install-windows-lib:
133 133 doc:
134 134 @$(DOXYGEN) ./doxygen/doxyfile
135 135  
  136 +#---[ Install Targets ]------------------------------------------------------------------
  137 +
  138 +Debug:
  139 +
  140 + @$(MAKE) -C client $@
  141 + @$(MAKE) -C server $@
  142 +
136 143 #---[ Clean Targets ]--------------------------------------------------------------------
137 144  
138   -clean: \
  145 +clean:
139 146  
140 147 @$(MAKE) -C client $@
141 148 @$(MAKE) -C server $@
... ...
README.md
... ... @@ -74,3 +74,24 @@ Compiling for Windows (With MSYS2)
74 74  
75 75 * make install
76 76  
  77 +Compiling for Windows (With MSVC)
  78 +---------------------------------
  79 +
  80 +1. Install pw3270 with remote control and sdk modules
  81 +
  82 +2. Install git for windows
  83 +
  84 +3. Download and install Visual Studio Build Tools (https://visualstudio.microsoft.com/pt-br/downloads/)
  85 +
  86 +4. Get sources from git
  87 +
  88 + ```shell
  89 + git clone https://github.com/PerryWerneck/libipc3270.git ./ipc3270
  90 + ```
  91 +
  92 +5. Build and install
  93 +
  94 + ```shell
  95 + cd ipc3270
  96 + install.bat
  97 + ```
... ...
client/ipcclient.cbp
... ... @@ -79,6 +79,7 @@
79 79 <Unit filename="src/session/local/get.cc" />
80 80 <Unit filename="src/session/local/init.cc" />
81 81 <Unit filename="src/session/local/private.h" />
  82 + <Unit filename="src/session/local/properties.cc" />
82 83 <Unit filename="src/session/local/set.cc" />
83 84 <Unit filename="src/session/local/wait.cc" />
84 85 <Unit filename="src/session/remote/actions.cc" />
... ... @@ -97,9 +98,6 @@
97 98 <Unit filename="src/session/tools.cc" />
98 99 <Unit filename="src/testprogram/testprogram.cc" />
99 100 <Extensions>
100   - <code_completion />
101   - <envvars />
102   - <debugger />
103 101 <lib_finder disable_auto="1" />
104 102 </Extensions>
105 103 </Project>
... ...
client/src/core/abstract.cc
... ... @@ -79,6 +79,8 @@
79 79 /// @brief Setup charsets
80 80 void Abstract::Session::setCharSet(const char *remote, const char *local) {
81 81  
  82 + debug("Charsets: remote=",remote," local=",local);
  83 +
82 84 if(!local) {
83 85  
84 86 // TODO: Detect the current value (maybee something like g_charset)
... ... @@ -117,8 +119,8 @@
117 119 converter = lib3270_iconv_new(remote,local);
118 120  
119 121 debug("lib3270_iconv_new(",remote,",",local,"=",(void *) converter);
120   -#endif
121 122  
  123 +#endif
122 124  
123 125 }
124 126  
... ... @@ -168,11 +170,17 @@
168 170 #else
169 171 if(converter) {
170 172  
171   - lib3270_auto_cleanup<char> converted = lib3270_iconv_from_host(converter,str.c_str(),str.size());
  173 + char * converted = lib3270_iconv_from_host(converter,str.c_str(),str.size());
172 174 if(converted) {
173   - return std::string(converted);
  175 + std::string rc(converted);
  176 + lib3270_free(converted);
  177 + return rc;
174 178 }
175 179  
  180 + } else {
  181 +
  182 + throw std::runtime_error("Unable to convert charsets");
  183 +
176 184 }
177 185  
178 186 return str;
... ... @@ -185,22 +193,32 @@
185 193  
186 194 #ifdef HAVE_ICONV
187 195  
  196 + debug("Using ICONV");
188 197 return convertCharset(const_cast<Abstract::Session *>(this)->converter.host,text,length);
189 198  
190 199 #else
191 200  
192 201 if(converter) {
193 202  
194   - lib3270_auto_cleanup<char> converted = lib3270_iconv_to_host(converter,text,length);
  203 + debug("Converting \"",text,"\" with lib3270 converter ",((void *) converter));
  204 +
  205 + char * converted = lib3270_iconv_to_host(converter,text,length);
  206 +
195 207 if(converted) {
196   - return std::string(converted);
  208 + std::string rc(converted);
  209 + debug("Converted=\"",rc,"\"");
  210 + lib3270_free(converted);
  211 + return rc;
197 212 }
198 213  
199 214 }
200 215  
201 216 #endif // HAVE_ICONV
202 217  
203   - return std::string(text,length);
  218 + if(length > 0)
  219 + return std::string(text,length);
  220 +
  221 + return std::string(text);
204 222  
205 223 }
206 224  
... ...
client/src/core/linux/request.cc
... ... @@ -77,7 +77,7 @@
77 77 if(!response.msg) {
78 78 string message = error.message;
79 79 dbus_error_free(&error);
80   - throw std::runtime_error(message.c_str());
  80 + throw std::runtime_error(message);
81 81 }
82 82  
83 83 dbus_message_iter_init(response.msg, &response.iter);
... ... @@ -128,7 +128,8 @@
128 128 }
129 129  
130 130 IPC::Request & IPC::Request::push(const bool arg) {
131   - return push(DBUS_TYPE_BOOLEAN,&arg);
  131 + dbus_bool_t bl = (arg ? 1 : 0);
  132 + return push(DBUS_TYPE_BOOLEAN,&bl);
132 133 }
133 134  
134 135 IPC::Request & IPC::Request::push(const uint8_t arg) {
... ...
client/src/core/windows/pop.cc
... ... @@ -44,11 +44,31 @@
44 44  
45 45 namespace TN3270 {
46 46  
  47 + class InvalidFormatException : public std::exception {
  48 + private:
  49 + string message;
  50 +
  51 + public:
  52 + InvalidFormatException(const IPC::Request::Type received, const IPC::Request::Type expected) {
  53 +
  54 + message = "Invalid format on IPC package, expecting \'";
  55 + message += (char) expected;
  56 + message += "\' but received \'";
  57 + message += (char) received;
  58 + message += "\'";
  59 +
  60 + }
  61 +
  62 + const char * what() const noexcept override {
  63 + return message.c_str();
  64 + }
  65 + };
  66 +
47 67 IPC::Request & IPC::Request::pop(std::string &value) {
48 68 DataBlock * block = getNextBlock();
49 69  
50 70 if(block->type != IPC::Request::String)
51   - throw std::runtime_error("Invalid format");
  71 + throw InvalidFormatException(block->type, IPC::Request::String);
52 72  
53 73 const char *ptr = (const char *) (block+1);
54 74  
... ... @@ -80,7 +100,7 @@
80 100 break;
81 101  
82 102 default:
83   - throw std::runtime_error("Invalid format");
  103 + throw InvalidFormatException(block->type, IPC::Request::Int16);
84 104 }
85 105  
86 106 return *this;
... ... @@ -107,7 +127,7 @@
107 127 break;
108 128  
109 129 default:
110   - throw std::runtime_error("Invalid format");
  130 + throw InvalidFormatException(block->type, IPC::Request::Uint16);
111 131 }
112 132  
113 133 return *this;
... ... @@ -139,7 +159,7 @@
139 159 break;
140 160  
141 161 default:
142   - throw std::runtime_error("Invalid format");
  162 + throw InvalidFormatException(block->type, IPC::Request::Boolean);
143 163 }
144 164  
145 165 return *this;
... ...
client/src/core/windows/request.cc
... ... @@ -37,6 +37,7 @@
37 37 */
38 38  
39 39 #include <ipc-client-internals.h>
  40 + #include <lib3270/trace.h>
40 41  
41 42 using std::string;
42 43  
... ... @@ -46,6 +47,51 @@
46 47  
47 48 #define PIPE_BUFFER_LENGTH 8192
48 49  
  50 +#ifdef DEBUG
  51 +
  52 + // From lib3270_trace_data
  53 + static void trace_data(const char *msg, const unsigned char *data, size_t datalen)
  54 +{
  55 + // 00000000001111111111222222222233333333334444444444555555555566666666667777777777
  56 + // 01234567890123456789012345678901234567890123456789012345678901234567890123456789
  57 + // xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx . . . . . . . . . . . . . . . .
  58 +
  59 + size_t ix;
  60 + char buffer[80];
  61 + char hexvalue[3];
  62 +
  63 + memset(buffer,0,sizeof(buffer));
  64 +
  65 + std::cout << msg << "(" << datalen << " bytes)" << std::endl;
  66 +
  67 + for(ix = 0; ix < datalen; ix++)
  68 + {
  69 + size_t col = (ix%15);
  70 +
  71 + if(col == 0)
  72 + {
  73 + if(ix) {
  74 + std::cout << "\t" << buffer << std::endl;
  75 + }
  76 +
  77 + memset(buffer,' ',79);
  78 + buffer[79] = 0;
  79 + }
  80 +
  81 + snprintf(hexvalue,3,"%02x",data[ix]);
  82 + memcpy(buffer+(col*3),hexvalue,2);
  83 +
  84 + if(data[ix] > ' ')
  85 + buffer[48 + (col*2)] = data[ix];
  86 +
  87 + }
  88 +
  89 + std::cout << "\t" << buffer << std::endl;
  90 +
  91 +}
  92 +
  93 +#endif // DEBUG
  94 +
49 95 IPC::Request::Request(HANDLE hPipe, const char *name, uint16_t type) {
50 96  
51 97 this->hPipe = hPipe;
... ... @@ -114,7 +160,7 @@
114 160 IPC::Request & IPC::Request::call() {
115 161  
116 162 #ifdef DEBUG
117   - // lib3270_trace_data(NULL,"Request block",(const char *) this->out.block, this->out.used);
  163 + // trace_data("Request block",(const unsigned char *) this->out.block, this->out.used);
118 164 #endif // DEBUG
119 165  
120 166 debug("Sending request with ", *this->outvalues, " elements");
... ... @@ -137,8 +183,19 @@
137 183  
138 184 debug("Received response \"", in.block, "\" with ", in.used, " bytes");
139 185  
  186 + //
  187 + // Heaer format:
  188 + //
  189 + // STRING Response name
  190 + // uint16_t Return code
  191 + // uint16_t Arguments
  192 + //
  193 + // Data block:
  194 + //
  195 + //
  196 +
140 197 #ifdef DEBUG
141   - // lib3270_trace_data(NULL,"Response block",(const char *) this->in.block, this->in.used);
  198 + trace_data("Response block",(const unsigned char *) this->in.block, this->in.used);
142 199 #endif // DEBUG
143 200  
144 201 // Extract response name
... ...
client/src/core/windows/tools.cc
... ... @@ -90,7 +90,7 @@
90 90  
91 91 for(ix = 0; installLocation.empty() && ix < (sizeof(keys)/sizeof(keys[0])); ix++) {
92 92  
93   - debug(ix,"=",keys[ix]);
  93 +// debug(ix,"=",keys[ix]);
94 94  
95 95 rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE,keys[ix],0,KEY_QUERY_VALUE,&hKey);
96 96 if(rc == ERROR_SUCCESS) {
... ... @@ -103,11 +103,8 @@
103 103  
104 104 rc = RegQueryValueExA(hKey,"InstallLocation",NULL,&datatype,(LPBYTE) datadir,&datalen);
105 105 if(rc == ERROR_SUCCESS) {
106   -
107   - debug("Found: ",datadir);
108   -
  106 +// debug("Found: ",datadir);
109 107 installLocation.assign(datadir);
110   -
111 108 }
112 109  
113 110 RegCloseKey(hKey);
... ...
client/src/host/properties.cc
... ... @@ -58,7 +58,7 @@ std::vector&lt;TN3270::Attribute&gt; TN3270::Host::getAttributes() const {
58 58  
59 59 }
60 60  
61   -void TN3270::Host::setTimeout(time_t timeout) noexcept {
  61 +void TN3270::Host::setTimeout(time_t timeout) {
62 62 this->timeout = timeout;
63 63 this->session->setTimeout(timeout);
64 64 }
... ...
client/src/include/lib3270/ipc.h
... ... @@ -38,6 +38,7 @@
38 38 #include <lib3270.h>
39 39 #include <lib3270/keyboard.h>
40 40 #include <lib3270/actions.h>
  41 + #include <lib3270/ssl.h>
41 42  
42 43 #if defined(_WIN32) || defined(_MSC_VER)
43 44  
... ... @@ -113,29 +114,28 @@
113 114 *
114 115 */
115 116 template<typename T>
116   - class lib3270_auto_cleanup {
  117 + class lib3270_ptr {
117 118 private:
118   - T *data;
  119 + T *ptr;
119 120  
120 121 public:
121   - lib3270_auto_cleanup(T *data) {
122   - this->data = data;
  122 + lib3270_ptr(T *d) : ptr(d) {
123 123 }
124 124  
125   - ~lib3270_auto_cleanup() {
126   - lib3270_free((void *) this->data);
  125 + ~lib3270_ptr() {
  126 + lib3270_free((void *) this->ptr);
127 127 }
128 128  
129 129 operator bool() const noexcept {
130   - return this->data != NULL;
  130 + return this->ptr != NULL;
131 131 }
132 132  
133 133 T * operator->() {
134   - return this->data;
  134 + return this->ptr;
135 135 }
136 136  
137 137 operator T *() const noexcept {
138   - return this->data;
  138 + return this->ptr;
139 139 }
140 140  
141 141 };
... ... @@ -212,7 +212,7 @@
212 212 /// @brief connection state.
213 213 enum ConnectionState : uint8_t {
214 214 DISCONNECTED = LIB3270_NOT_CONNECTED, ///< @brief disconnected
215   - RESOLVING = LIB3270_RESOLVING, ///< @brief resolving hostname
  215 + RESOLVING = LIB3270_CONNECTING, ///< @brief Connecting to host
216 216 PENDING = LIB3270_PENDING, ///< @brief connection pending
217 217 CONNECTED_INITIAL = LIB3270_CONNECTED_INITIAL, ///< @brief connected, no mode yet
218 218 CONNECTED_ANSI = LIB3270_CONNECTED_ANSI, ///< @brief connected in NVT ANSI mode
... ... @@ -229,6 +229,7 @@
229 229 SSL_SECURE = LIB3270_SSL_SECURE, ///< @brief Connection secure with CA check
230 230 SSL_NEGOTIATED = LIB3270_SSL_NEGOTIATED, ///< @brief Connection secure, no CA, self-signed or expired CRL
231 231 SSL_NEGOTIATING = LIB3270_SSL_NEGOTIATING, ///< @brief Negotiating SSL
  232 + SSL_VERIFYING = LIB3270_SSL_VERIFYING, ///< @brief Verifying SSL (Getting CRL)
232 233 SSL_UNDEFINED = LIB3270_SSL_UNDEFINED ///< @brief Undefined
233 234 };
234 235  
... ... @@ -450,6 +451,15 @@
450 451  
451 452 public:
452 453  
  454 + struct Cursor {
  455 + unsigned short row;
  456 + unsigned short col;
  457 +
  458 + Cursor(unsigned short r, unsigned short c) : row(r), col(c) {
  459 + }
  460 +
  461 + };
  462 +
453 463 /// @brief Get an instance of the TN3270 session based on the supplied ID.
454 464 static Session * getInstance(const char *id = nullptr, const char *charset = nullptr);
455 465 virtual ~Session();
... ... @@ -585,6 +595,9 @@
585 595 /// @brief Get cursor address
586 596 virtual unsigned short getCursorAddress() = 0;
587 597  
  598 + /// @brief Get cursor position.
  599 + virtual struct Cursor getCursorPosition() = 0;
  600 +
588 601 /// @brief Set local charset.
589 602 virtual void setCharSet(const char *charset = NULL) = 0;
590 603  
... ... @@ -647,6 +660,11 @@
647 660 int compare(int baddr, const char* s, int len = -1) const;
648 661 int compare(unsigned short row, unsigned short col, const char* s, int len = -1) const;
649 662  
  663 + virtual void setProperty(const char *name, const int value) = 0;
  664 + virtual void setProperty(const char *name, const unsigned int value) = 0;
  665 + virtual void setProperty(const char *name, const bool value) = 0;
  666 + virtual void setProperty(const char *name, const char *value) = 0;
  667 +
650 668 };
651 669  
652 670 /// @brief TN3270 Host
... ... @@ -782,6 +800,10 @@
782 800 return session->getCursorAddress();
783 801 }
784 802  
  803 + inline Session::Cursor getCursorPosition() {
  804 + return session->getCursorPosition();
  805 + }
  806 +
785 807 inline void setHostURL(const char *url) {
786 808 session->setHostURL(url);
787 809 }
... ... @@ -799,6 +821,23 @@
799 821 return getAttribute(name);
800 822 }
801 823  
  824 + // Set properties.
  825 + inline void setProperty(const char *name, const int value) {
  826 + session->setProperty(name,value);
  827 + }
  828 +
  829 + inline void setProperty(const char *name, const unsigned int value) {
  830 + session->setProperty(name,value);
  831 + }
  832 +
  833 + inline void setProperty(const char *name, const bool value) {
  834 + session->setProperty(name,value);
  835 + }
  836 +
  837 + inline void setProperty(const char *name, const char *value) {
  838 + session->setProperty(name,value);
  839 + }
  840 +
802 841 /// @brief Get lib3270 version.
803 842 inline std::string getVersion() const {
804 843 return session->getVersion();
... ... @@ -839,7 +878,7 @@
839 878 }
840 879  
841 880 // Set properties
842   - void setTimeout(time_t timeout = DEFAULT_TIMEOUT) noexcept;
  881 + void setTimeout(time_t timeout = DEFAULT_TIMEOUT);
843 882  
844 883 inline void setUnlockDelay(unsigned short delay = 350) {
845 884 session->setUnlockDelay(delay);
... ... @@ -937,6 +976,19 @@
937 976 int compare(int baddr, const char* s, int len = -1) const;
938 977 int compare(unsigned short row, unsigned short col, const char* s, int len = -1) const;
939 978  
  979 + /*
  980 + Host & setProperty(const char *name, const std::string &value) {
  981 + session->setProperty(name,value.c_str());
  982 + return *this;
  983 + }
  984 +
  985 + template <typename T>
  986 + Host & setProperty(const char *name, const T value) {
  987 + session->setProperty(name,value);
  988 + return *this;
  989 + }
  990 + */
  991 +
940 992 // Set contents.
941 993  
942 994 /// @brief Input string.
... ...
client/src/include/lib3270/ipc/request.h
... ... @@ -58,12 +58,8 @@
58 58  
59 59 /// @brief PW3270 IPC Request/Response.
60 60 class TN3270_PUBLIC Request {
61   - private:
62   -
  61 + public:
63 62 #ifdef _WIN32
64   - /// @brief Pipe Handle.
65   - HANDLE hPipe;
66   -
67 63 /// @brief IPC Data type.
68 64 enum Type : uint8_t {
69 65 String = 's',
... ... @@ -77,6 +73,13 @@
77 73 Int64 = 'x',
78 74 Uint64 = 't'
79 75 };
  76 +#endif // _WIN32
  77 +
  78 + private:
  79 +
  80 +#ifdef _WIN32
  81 + /// @brief Pipe Handle.
  82 + HANDLE hPipe;
80 83  
81 84 struct {
82 85 DWORD length; ///< @brief Length of input buffer.
... ...
client/src/session/local/actions.cc
... ... @@ -74,7 +74,7 @@
74 74  
75 75 void Local::Session::action(const char *action_name) {
76 76 std::lock_guard<std::recursive_mutex> lock(sync);
77   - chkResponse(lib3270_action_activate_by_name(action_name,hSession));
  77 + chkResponse(lib3270_activate_by_name(hSession,action_name));
78 78 if(this->timeout)
79 79 chkResponse(lib3270_wait_for_ready(hSession,this->timeout));
80 80 }
... ...
client/src/session/local/attribute.cc
... ... @@ -527,6 +527,16 @@
527 527 return rc;
528 528 }
529 529  
  530 + struct Session::Cursor Local::Session::getCursorPosition() {
  531 +
  532 + std::lock_guard<std::recursive_mutex> lock(sync);
  533 +
  534 + unsigned short row = 0, col = 0;
  535 +
  536 + return Session::Cursor(row,col);
  537 +
  538 + };
  539 +
530 540 std::string Local::Session::getVersion() const {
531 541  
532 542 std::lock_guard<std::recursive_mutex> lock(const_cast<Local::Session *>(this)->sync);
... ...
client/src/session/local/get.cc
... ... @@ -46,7 +46,7 @@
46 46  
47 47 std::lock_guard<std::recursive_mutex> lock(const_cast<Local::Session *>(this)->sync);
48 48  
49   - lib3270_auto_cleanup<char> text = lib3270_get_string_at_address(hSession, 0, -1, '\n');
  49 + lib3270_ptr<char> text = lib3270_get_string_at_address(hSession, 0, -1, '\n');
50 50  
51 51 if(!text) {
52 52 throw std::runtime_error( _("Can't get screen contents") );
... ... @@ -59,7 +59,7 @@
59 59  
60 60 std::lock_guard<std::recursive_mutex> lock(const_cast<Local::Session *>(this)->sync);
61 61  
62   - lib3270_auto_cleanup<char> text = lib3270_get_string_at_address(hSession, baddr, len, lf);
  62 + lib3270_ptr<char> text = lib3270_get_string_at_address(hSession, baddr, len, lf);
63 63  
64 64 if(!text) {
65 65 throw std::runtime_error( _("Can't get screen contents") );
... ... @@ -72,7 +72,7 @@
72 72  
73 73 std::lock_guard<std::recursive_mutex> lock(const_cast<Local::Session *>(this)->sync);
74 74  
75   - lib3270_auto_cleanup<char> text = lib3270_get_string_at(hSession, row, col, len, lf);
  75 + lib3270_ptr<char> text = lib3270_get_string_at(hSession, row, col, len, lf);
76 76  
77 77 if(!text) {
78 78 throw std::runtime_error( _("Can't get screen contents") );
... ...
client/src/session/local/private.h
... ... @@ -161,7 +161,11 @@
161 161 unsigned short setCursor(int addr) override;
162 162 unsigned short setCursor(unsigned short row, unsigned short col) override;
163 163 unsigned short getCursorAddress() override;
164   -
  164 + Session::Cursor getCursorPosition() override;
  165 + void setProperty(const char *name, const int value) override;
  166 + void setProperty(const char *name, const unsigned int value) override;
  167 + void setProperty(const char *name, const bool value) override;
  168 + void setProperty(const char *name, const char *value) override;
165 169  
166 170 };
167 171  
... ...
client/src/session/local/properties.cc 0 → 100644
... ... @@ -0,0 +1,85 @@
  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 - 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 + */
  29 +
  30 +/**
  31 + * @file
  32 + *
  33 + * @brief
  34 + *
  35 + * @author perry.werneck@gmail.com
  36 + *
  37 + */
  38 +
  39 + #include "private.h"
  40 + #include <lib3270/ipc.h>
  41 + #include <lib3270/properties.h>
  42 +
  43 +/*---[ Implement ]----------------------------------------------------------------------------------*/
  44 +
  45 + namespace TN3270 {
  46 +
  47 + void Local::Session::setProperty(const char *name, const int value) {
  48 +
  49 + std::lock_guard<std::recursive_mutex> lock(const_cast<Local::Session *>(this)->sync);
  50 + int rc = lib3270_set_int_property(hSession,name,value,0);
  51 + if(rc)
  52 + chkResponse(rc);
  53 +
  54 + }
  55 +
  56 + void Local::Session::setProperty(const char *name, const unsigned int value) {
  57 +
  58 + std::lock_guard<std::recursive_mutex> lock(const_cast<Local::Session *>(this)->sync);
  59 + int rc = lib3270_set_uint_property(hSession,name,value,0);
  60 + if(rc)
  61 + chkResponse(rc);
  62 +
  63 + }
  64 +
  65 + void Local::Session::setProperty(const char *name, const bool value) {
  66 +
  67 + std::lock_guard<std::recursive_mutex> lock(const_cast<Local::Session *>(this)->sync);
  68 + int rc = lib3270_set_boolean_property(hSession,name,(int) value, 0);
  69 + if(rc)
  70 + chkResponse(rc);
  71 +
  72 + }
  73 +
  74 + void Local::Session::setProperty(const char *name, const char *value) {
  75 +
  76 + std::lock_guard<std::recursive_mutex> lock(const_cast<Local::Session *>(this)->sync);
  77 + int rc = lib3270_set_string_property(hSession, name, value, 0);
  78 + if(rc)
  79 + chkResponse(rc);
  80 +
  81 + }
  82 +
  83 + }
  84 +
  85 +
... ...
client/src/session/local/wait.cc
... ... @@ -39,7 +39,10 @@
39 39 #include "private.h"
40 40 #include <lib3270/actions.h>
41 41 #include <signal.h>
42   - #include <unistd.h>
  42 +
  43 +#ifndef _WIN32
  44 + #include <unistd.h>
  45 +#endif // _WIN32
43 46  
44 47 /*---[ Implement ]----------------------------------------------------------------------------------*/
45 48  
... ...
client/src/session/remote/attribute.cc
... ... @@ -489,7 +489,18 @@
489 489  
490 490 }
491 491  
  492 + Session::Cursor IPC::Session::getCursorPosition() {
492 493  
  494 + uint32_t row, col;
  495 +
  496 + Request(*this,"getCursorPosition")
  497 + .call()
  498 + .pop(row)
  499 + .pop(col);
  500 +
  501 + return Session::Cursor(row,col);
  502 +
  503 + }
493 504  
494 505 }
495 506  
... ...
client/src/session/remote/private.h
... ... @@ -166,6 +166,11 @@
166 166 unsigned short setCursor(int addr) override;
167 167 unsigned short setCursor(unsigned short row, unsigned short col) override;
168 168 unsigned short getCursorAddress() override;
  169 + Session::Cursor getCursorPosition() override;
  170 + void setProperty(const char *name, const int value) override;
  171 + void setProperty(const char *name, const unsigned int value) override;
  172 + void setProperty(const char *name, const bool value) override;
  173 + void setProperty(const char *name, const char *value) override;
169 174  
170 175 };
171 176  
... ...
client/src/session/remote/properties.cc
... ... @@ -236,6 +236,22 @@
236 236  
237 237 }
238 238  
  239 + void IPC::Session::setProperty(const char *name, const int value) {
  240 + setAttribute(name,value);
  241 + }
  242 +
  243 + void IPC::Session::setProperty(const char *name, const unsigned int value) {
  244 + setAttribute(name,value);
  245 + }
  246 +
  247 + void IPC::Session::setProperty(const char *name, const bool value) {
  248 + setAttribute(name,value);
  249 + }
  250 +
  251 + void IPC::Session::setProperty(const char *name, const char *value) {
  252 + setAttribute(name,value);
  253 + }
  254 +
239 255 }
240 256  
241 257  
... ...
client/src/session/remote/wait.cc
... ... @@ -205,9 +205,9 @@
205 205  
206 206 void IPC::Session::wait(unsigned short row, unsigned short col, const char *text, int seconds) {
207 207  
208   - string key = convertToHost(text,-1);
  208 + debug((const char *) __FUNCTION__, "(", row, ",", col, ",\"",text,"\")");
209 209  
210   - debug((const char *) __FUNCTION__, "(", (int) row, ",", (int) col, ", \"", text, "\", length=", key.size());
  210 + string key = convertToHost(text,-1);
211 211  
212 212 wait(seconds, [this, key, row, col]() {
213 213  
... ...
client/src/testprogram/testprogram.cc
... ... @@ -38,14 +38,15 @@
38 38  
39 39 #include <ctime>
40 40  
41   - #include <getopt.h>
42   -
43 41 #if defined(_MSC_VER)
44 42 #pragma comment(lib,"ipc3270.lib")
45 43 #else
46 44 #pragma GCC diagnostic ignored "-Wunused-function"
47 45 #pragma GCC diagnostic ignored "-Wunused-parameter"
48 46 #pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant"
  47 +
  48 + #include <getopt.h>
  49 +
49 50 #endif // _MSC_VER
50 51  
51 52 #include <cstdlib>
... ... @@ -98,12 +99,22 @@
98 99 */
99 100  
100 101 // Test Attributes
101   - static void testAttributes(const char *session, const char *url) {
  102 + static void testAttributes(const char *session, const char *name) {
102 103  
103 104 TN3270::Host host{session};
104 105  
  106 + host.setTimeout(5);
  107 + host.setProperty("crl_download",false);
  108 +
  109 + //name="url";
  110 +
  111 + cout << endl << endl;
105 112 for(auto attribute : host.getAttributes()) {
106 113  
  114 + if(name && *name && strcasecmp(name,"all") && strcasecmp(attribute.getName(),name)) {
  115 + continue;
  116 + }
  117 +
107 118 cout << attribute.getName() << ":\t";
108 119  
109 120 try {
... ... @@ -112,13 +123,27 @@
112 123  
113 124 } catch(const std::exception &e) {
114 125  
115   - cout << e.what();
  126 + cout << "Exception(" << e.what() << ")";
116 127 }
117 128  
118 129 cout << endl;
119 130  
120 131 }
121 132  
  133 + cout << "Cursor position: ";
  134 +
  135 + try {
  136 +
  137 + auto cursor = host.getCursorPosition();
  138 + cout << cursor.row << "," << cursor.col;
  139 +
  140 + } catch(const std::exception &e) {
  141 +
  142 + cout << "Exception(" << e.what() << ")";
  143 + }
  144 +
  145 + cout << endl << endl << endl;
  146 +
122 147 }
123 148  
124 149 // Performance test.
... ... @@ -233,41 +258,80 @@
233 258 const char * session = ":A";
234 259 const char * url = nullptr;
235 260  
  261 +#if ! defined(_MSC_VER)
  262 +
236 263 static struct option options[] = {
237   - { "session", required_argument, 0, 's' },
238   - { "url", required_argument, 0, 'U' },
239   - { "perftest", no_argument, 0, 'P' },
240   - { "info", no_argument, 0, 'I' },
  264 + { "session", required_argument, 0, 's' },
  265 + { "url", required_argument, 0, 'U' },
  266 + { "perftest", no_argument, 0, 'P' },
  267 + { "attribute", optional_argument, 0, 'A' },
  268 + { "info", no_argument, 0, 'I' },
241 269 { 0, 0, 0, 0}
242 270  
243 271 };
244 272  
245   - int long_index =0;
246   - int opt;
247   - while((opt = getopt_long(argc, argv, "s:", options, &long_index )) != -1) {
  273 + try {
  274 +
  275 + int long_index =0;
  276 + int opt;
  277 + while((opt = getopt_long(argc, argv, "s:A", options, &long_index )) != -1) {
  278 +
  279 + switch(opt) {
  280 + case 's':
  281 + session = optarg;
  282 + cout << "Session: " << session << endl;
  283 + break;
248 284  
249   - switch(opt) {
250   - case 's':
251   - session = optarg;
252   - cout << "Session: " << session << endl;
253   - break;
  285 + case 'A':
254 286  
255   - case 'U':
256   - url = optarg;
257   - cout << "URL: " << session << endl;
258   - break;
  287 + try {
259 288  
260   - case 'P':
261   - testPerformance(session,url);
262   - return 0;
  289 + testAttributes(session,optarg);
263 290  
264   - case 'I':
265   - testHost(session,url);
266   - return 0;
  291 + } catch(const std::exception &e) {
  292 +
  293 + cerr << e.what() << endl;
  294 + return -1;
  295 + }
  296 +
  297 + break;
  298 +
  299 + case 'U':
  300 + url = optarg;
  301 + cout << "URL: " << session << endl;
  302 + break;
  303 +
  304 + case 'P':
  305 + testPerformance(session,url);
  306 + return 0;
  307 +
  308 + case 'I':
  309 + testHost(session,url);
  310 + return 0;
  311 +
  312 + }
267 313  
268 314 }
269 315  
  316 + } catch(const std::exception &e) {
  317 +
  318 + cerr << "Error:" << endl << "\t" << e.what() << endl << endl;
  319 + exit(-1);
  320 +
270 321 }
  322 +#else
  323 +
  324 + printf("\nRunning IPC Client tests\n");
  325 +
  326 + TN3270::Host host{session};
  327 + host.setTimeout(10);
  328 + host.connect();
  329 + printf("\n\nWaiting...\n");
  330 + host.wait(14,22,"SISTEMA");
  331 +
  332 + host.disconnect();
  333 +
  334 +#endif // !_MSC_VER
271 335  
272 336 /*
273 337  
... ...
install-debug.bat 0 → 100644
... ... @@ -0,0 +1,2 @@
  1 +@echo off
  2 +nmake /f win\Makefile-debug.msc install
... ...
ipc3270.exp
No preview for this file type
server/pw3270-plugin-ipc.cbp
... ... @@ -68,9 +68,6 @@
68 68 <Option compilerVar="CC" />
69 69 </Unit>
70 70 <Unit filename="src/core/linux/gobject.h" />
71   - <Unit filename="src/core/linux/response.c">
72   - <Option compilerVar="CC" />
73   - </Unit>
74 71 <Unit filename="src/core/linux/start.c">
75 72 <Option compilerVar="CC" />
76 73 </Unit>
... ... @@ -102,6 +99,9 @@
102 99 <Unit filename="src/core/methods/wait.c">
103 100 <Option compilerVar="CC" />
104 101 </Unit>
  102 + <Unit filename="src/core/response.c">
  103 + <Option compilerVar="CC" />
  104 + </Unit>
105 105 <Unit filename="src/core/setproperties.c">
106 106 <Option compilerVar="CC" />
107 107 </Unit>
... ... @@ -121,9 +121,6 @@
121 121 <Unit filename="src/core/windows/resources.rc">
122 122 <Option compilerVar="WINDRES" />
123 123 </Unit>
124   - <Unit filename="src/core/windows/response.c">
125   - <Option compilerVar="CC" />
126   - </Unit>
127 124 <Unit filename="src/core/windows/start.c">
128 125 <Option compilerVar="CC" />
129 126 </Unit>
... ... @@ -161,9 +158,6 @@
161 158 <Option compilerVar="CC" />
162 159 </Unit>
163 160 <Extensions>
164   - <code_completion />
165   - <envvars />
166   - <debugger />
167 161 <lib_finder disable_auto="1" />
168 162 </Extensions>
169 163 </Project>
... ...
server/src/core/getproperties.c
... ... @@ -127,6 +127,7 @@ GVariant * ipc3270_get_property(GObject *object, const gchar *property_name, GEr
127 127 if(strprop[ix].get && !g_ascii_strcasecmp(strprop[ix].name, property_name)) {
128 128  
129 129 // Found it!
  130 + errno = 0;
130 131 const char * value = strprop[ix].get(hSession);
131 132  
132 133 if(value) {
... ... @@ -134,9 +135,14 @@ GVariant * ipc3270_get_property(GObject *object, const gchar *property_name, GEr
134 135 return g_variant_new_string(value);
135 136 }
136 137  
137   - // Erro!
138   - ipc3270_set_error(object,errno,error);
139   - return NULL;
  138 + debug("%s=%s",property_name,"NULL");
  139 +
  140 + if(errno) {
  141 + ipc3270_set_error(object,errno,error);
  142 + return NULL;
  143 + }
  144 +
  145 + return g_variant_new_string("");
140 146  
141 147 }
142 148  
... ...
server/src/core/linux/gobject.c
... ... @@ -120,7 +120,7 @@ void ipc3270_add_terminal_introspection(GString *introspection) {
120 120 " <arg type='s' name='name' direction='in' />" \
121 121 " <arg type='b' name='result' direction='out' />" \
122 122 " </method>"
123   - " <method name='setwaitmode'>"
  123 + " <method name='setWaitMode'>"
124 124 " <arg type='b' name='mode' direction='in' />" \
125 125 " <arg type='i' name='result' direction='out' />" \
126 126 " </method>"
... ... @@ -197,6 +197,10 @@ void ipc3270_add_terminal_introspection(GString *introspection) {
197 197 " <arg type='i' name='addr' direction='in' />" \
198 198 " <arg type='i' name='old' direction='out' />" \
199 199 " </method>" \
  200 + " <method name= 'getCursorPosition'>" \
  201 + " <arg type='u' name='row' direction='out' />" \
  202 + " <arg type='u' name='col' direction='out' />" \
  203 + " </method>" \
200 204 " <method name= 'getFieldAttribute'>" \
201 205 " <arg type='u' name='attribute' direction='out' />" \
202 206 " </method>" \
... ...
server/src/core/linux/response.c
... ... @@ -1,149 +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 - e possui - linhas de código.
22   - *
23   - * Referências:
24   - *
25   - * https://github.com/joprietoe/gdbus/blob/master/gdbus-example-server.c
26   - * https://github.com/bratsche/glib/blob/master/gio/tests/gdbus-example-export.c
27   - *
28   - * Contatos:
29   - *
30   - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
31   - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
32   - *
33   - */
34   -
35   -#include "gobject.h"
36   -#include <lib3270.h>
37   -#include <lib3270/actions.h>
38   -#include <lib3270/properties.h>
39   -#include <lib3270/toggle.h>
40   -#include <v3270.h>
41   -
42   -#include <dbus/dbus-glib.h>
43   -#include <dbus/dbus-glib-bindings.h>
44   -
45   -/*--[ Widget definition ]----------------------------------------------------------------------------*/
46   -
47   -struct _ipc3270Response {
48   - GObject parent;
49   - GVariant * value;
50   -};
51   -
52   -struct _ipc3270ResponseClass {
53   -
54   - GObjectClass parent;
55   - int dummy;
56   -
57   -};
58   -
59   -
60   -G_DEFINE_TYPE(ipc3270Response, ipc3270Response, G_TYPE_OBJECT)
61   -
62   -/*--[ Implement ]------------------------------------------------------------------------------------*/
63   -
64   -static void ipc3270Response_finalize(GObject *object) {
65   -
66   - ipc3270Response * response = IPC3270_RESPONSE(object);
67   -
68   - debug("%s value=%p",__FUNCTION__,response->value);
69   -
70   - if(response->value)
71   - g_variant_unref(response->value);
72   -
73   -}
74   -
75   -
76   -static void ipc3270Response_class_init(ipc3270ResponseClass *klass) {
77   -
78   - debug("%s",__FUNCTION__);
79   -
80   - GObjectClass *object_class;
81   - object_class = G_OBJECT_CLASS (klass);
82   - object_class->finalize = ipc3270Response_finalize;
83   -
84   -}
85   -
86   -static void ipc3270Response_init(ipc3270Response *object) {
87   -
88   - object->value = NULL;
89   -
90   -}
91   -
92   -GObject * ipc3270_response_new() {
93   - return g_object_new(GLIB_TYPE_IPC3270_RESPONSE, NULL);
94   -}
95   -
96   -void ipc3270_response_append_int32(GObject *object, gint32 value) {
97   -
98   - ipc3270Response * response = IPC3270_RESPONSE(object);
99   -
100   - if(response->value)
101   - g_variant_unref(response->value);
102   -
103   - response->value = g_variant_new_int32(value);
104   -}
105   -
106   -void ipc3270_response_append_uint32(GObject *object, guint32 value) {
107   -
108   - ipc3270Response * response = IPC3270_RESPONSE(object);
109   -
110   - if(response->value)
111   - g_variant_unref(response->value);
112   -
113   - response->value = g_variant_new_uint32(value);
114   -}
115   -
116   -void ipc3270_response_append_string(GObject *object, const gchar *text) {
117   -
118   - ipc3270Response * response = IPC3270_RESPONSE(object);
119   -
120   - if(response->value)
121   - g_variant_unref(response->value);
122   -
123   - response->value = g_variant_new_string(text);
124   -
125   -}
126   -
127   -void ipc3270_response_append_boolean(GObject *object, gboolean value) {
128   -
129   - ipc3270Response * response = IPC3270_RESPONSE(object);
130   -
131   - if(response->value)
132   - g_variant_unref(response->value);
133   -
134   - response->value = g_variant_new_boolean(value);
135   -}
136   -
137   -GVariant * ipc3270_response_steal_value(GObject *object) {
138   -
139   - ipc3270Response * response = IPC3270_RESPONSE(object);
140   -
141   - GVariant * value = response->value;
142   - response->value = NULL;
143   -
144   - return value;
145   -}
146   -
147   -gboolean ipc3270_response_has_values(GObject *object) {
148   - return IPC3270_RESPONSE(object)->value != NULL;
149   -}
server/src/core/linux/start.c
... ... @@ -67,8 +67,16 @@ static void
67 67 // It is an error if parameters is not of the right format: it must be a tuple containing the out-parameters of the D-Bus method.
68 68 // Even if the method has a single out-parameter, it must be contained in a tuple.
69 69  
70   - GVariant *values[] = { ipc3270_response_steal_value(response) };
71   - g_dbus_method_invocation_return_value(invocation, g_variant_new_tuple(values,1));
  70 + guint ix;
  71 + guint length = ipc3270_response_length(response);
  72 +
  73 + g_autofree GVariant ** values = g_new0(GVariant *, length);
  74 +
  75 + for(ix = 0; ix < length; ix++) {
  76 + values[ix] = ipc3270_response_steal_value(response);
  77 + }
  78 +
  79 + g_dbus_method_invocation_return_value(invocation, g_variant_new_tuple(values,length));
72 80  
73 81 } else {
74 82  
... ...
server/src/core/methods/action.c
... ... @@ -39,7 +39,13 @@ int ipc3270_method_action(GObject *session, GVariant *request, GObject *response
39 39  
40 40 GVariant *value = g_variant_get_child_value(request,0);
41 41  
42   - ipc3270_response_append_int32(response, lib3270_action_activate_by_name(g_variant_get_string(value,NULL), ipc3270_get_session(session)));
  42 + ipc3270_response_append_int32(
  43 + response,
  44 + lib3270_activate_by_name(
  45 + ipc3270_get_session(session),
  46 + g_variant_get_string(value,NULL)
  47 + )
  48 + );
43 49  
44 50 g_variant_unref(value);
45 51  
... ...
server/src/core/methods/cursor.c
... ... @@ -66,3 +66,22 @@ int ipc3270_method_set_cursor(GObject *session, GVariant *request, GObject *resp
66 66 return 0;
67 67 }
68 68  
  69 +int ipc3270_method_get_cursor_position(GObject *session, GVariant G_GNUC_UNUSED(*request), GObject *response, GError **error) {
  70 +
  71 + H3270 *hSession = ipc3270_get_session(session);
  72 +
  73 + if(*error)
  74 + return 0;
  75 +
  76 + unsigned short row, col;
  77 +
  78 + int rc = lib3270_get_cursor_position(hSession,&row,&col);
  79 + if(rc)
  80 + return rc;
  81 +
  82 + ipc3270_response_append_uint32(response, (guint32) row);
  83 + ipc3270_response_append_uint32(response, (guint32) col);
  84 +
  85 + return 0;
  86 +}
  87 +
... ...
server/src/core/methods/methods.c
... ... @@ -71,6 +71,7 @@ int ipc3270_method_call(GObject *object, const gchar *method_name, GVariant *req
71 71  
72 72 { "setCursorAddress", ipc3270_method_set_cursor },
73 73 { "setCursorPosition", ipc3270_method_set_cursor },
  74 + { "getCursorPosition", ipc3270_method_get_cursor_position },
74 75  
75 76 { "action", ipc3270_method_action },
76 77 { "activatable", ipc3270_method_activatable },
... ...
server/src/core/methods/private.h
... ... @@ -57,6 +57,7 @@
57 57 G_GNUC_INTERNAL int ipc3270_method_wait_for_keyboard_unlock(GObject *session, GVariant *request, GObject *response, GError **error);
58 58  
59 59 G_GNUC_INTERNAL int ipc3270_method_set_cursor(GObject *session, GVariant *request, GObject *response, GError **error);
  60 + G_GNUC_INTERNAL int ipc3270_method_get_cursor_position(GObject *session, GVariant *request, GObject *response, GError **error);
60 61  
61 62 G_GNUC_INTERNAL int ipc3270_method_action(GObject *session, GVariant *request, GObject *response, GError **error);
62 63 G_GNUC_INTERNAL int ipc3270_method_activatable(GObject *session, GVariant *request, GObject *response, GError **error);
... ...
server/src/core/response.c 0 → 100644
... ... @@ -0,0 +1,145 @@
  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 - e possui - linhas de código.
  22 + *
  23 + * Referências:
  24 + *
  25 + * https://github.com/joprietoe/gdbus/blob/master/gdbus-example-server.c
  26 + * https://github.com/bratsche/glib/blob/master/gio/tests/gdbus-example-export.c
  27 + *
  28 + * Contatos:
  29 + *
  30 + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
  31 + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
  32 + *
  33 + */
  34 +
  35 +#include <internals.h>
  36 +
  37 +#include <glib.h>
  38 +#include <gio/gio.h>
  39 +
  40 +#include <ipc-glib.h>
  41 +#include <lib3270.h>
  42 +
  43 +#include <lib3270/actions.h>
  44 +#include <lib3270/properties.h>
  45 +#include <lib3270/toggle.h>
  46 +#include <v3270.h>
  47 +
  48 +#ifndef _WIN32
  49 + #include <dbus/dbus-glib.h>
  50 + #include <dbus/dbus-glib-bindings.h>
  51 +#endif // _WIN32
  52 +
  53 +/*--[ Widget definition ]----------------------------------------------------------------------------*/
  54 +
  55 +struct _ipc3270Response {
  56 + GObject parent;
  57 + GList * values;
  58 +};
  59 +
  60 +struct _ipc3270ResponseClass {
  61 +
  62 + GObjectClass parent;
  63 + int dummy;
  64 +
  65 +};
  66 +
  67 +
  68 +G_DEFINE_TYPE(ipc3270Response, ipc3270Response, G_TYPE_OBJECT)
  69 +
  70 +/*--[ Implement ]------------------------------------------------------------------------------------*/
  71 +
  72 +static void ipc3270Response_finalize(GObject *object) {
  73 +
  74 + ipc3270Response * response = IPC3270_RESPONSE(object);
  75 +
  76 + if(response->values)
  77 + g_list_free_full(response->values,(GDestroyNotify) g_variant_unref);
  78 +
  79 +}
  80 +
  81 +
  82 +static void ipc3270Response_class_init(ipc3270ResponseClass *klass) {
  83 +
  84 + debug("%s",__FUNCTION__);
  85 +
  86 + GObjectClass *object_class;
  87 + object_class = G_OBJECT_CLASS (klass);
  88 + object_class->finalize = ipc3270Response_finalize;
  89 +
  90 +}
  91 +
  92 +static void ipc3270Response_init(ipc3270Response *object) {
  93 +
  94 + object->values = NULL;
  95 +
  96 +}
  97 +
  98 +GObject * ipc3270_response_new() {
  99 + return g_object_new(GLIB_TYPE_IPC3270_RESPONSE, NULL);
  100 +}
  101 +
  102 +void ipc3270_response_append(GObject *object, GVariant *value) {
  103 + ipc3270Response * response = IPC3270_RESPONSE(object);
  104 + response->values = g_list_append(response->values,value);
  105 +}
  106 +
  107 +void ipc3270_response_append_int32(GObject *object, gint32 value) {
  108 + ipc3270_response_append(object,g_variant_new_int32(value));
  109 +}
  110 +
  111 +void ipc3270_response_append_uint32(GObject *object, guint32 value) {
  112 + ipc3270_response_append(object,g_variant_new_uint32(value));
  113 +}
  114 +
  115 +void ipc3270_response_append_string(GObject *object, const gchar *text) {
  116 + ipc3270_response_append(object,g_variant_new_string(text));
  117 +}
  118 +
  119 +void ipc3270_response_append_boolean(GObject *object, gboolean value) {
  120 + ipc3270_response_append(object,g_variant_new_boolean(value));
  121 +}
  122 +
  123 +GVariant * ipc3270_response_steal_value(GObject *object) {
  124 +
  125 + ipc3270Response * response = IPC3270_RESPONSE(object);
  126 +
  127 + GList *first = g_list_first(response->values);
  128 + GVariant * value = first->data;
  129 +
  130 + response->values = g_list_remove(response->values,value);
  131 +
  132 + return value;
  133 +}
  134 +
  135 +const GList * ipc3270_get_values(GObject *object) {
  136 + return IPC3270_RESPONSE(object)->values;
  137 +}
  138 +
  139 +guint ipc3270_response_length(GObject *object) {
  140 + return g_list_length(IPC3270_RESPONSE(object)->values);
  141 +}
  142 +
  143 +gboolean ipc3270_response_has_values(GObject *object) {
  144 + return IPC3270_RESPONSE(object)->values != NULL;
  145 +}
... ...
server/src/core/windows/inout.c
... ... @@ -59,7 +59,7 @@ unsigned char * ipc3270_pack_error(const GError *error, size_t * szPacket) {
59 59 txtptr += strlen((char *) txtptr) + 1;
60 60  
61 61 // Add RC
62   - *((guint16 *) txtptr) = (guint16) error->code;
  62 + *((guint16 *) txtptr) = (guint16) (error->code ? error->code : -1);
63 63 txtptr += sizeof(guint16);
64 64  
65 65 // Add message
... ... @@ -168,6 +168,40 @@ unsigned char * pack_value(unsigned char *txtptr, GVariant *value) {
168 168  
169 169 }
170 170  
  171 +unsigned char * ipc3270_pack(const gchar *name, GObject *object, int id, size_t * szPacket) {
  172 +
  173 + const GList * node;
  174 + size_t vCount = 0;
  175 +
  176 + g_return_val_if_fail(IS_IPC3270_RESPONSE(object),NULL);
  177 +
  178 + // Set packet size.
  179 + *szPacket =
  180 + strlen(name) + 1
  181 + + (sizeof(guint16) * 2);
  182 +
  183 + for(node = ipc3270_get_values(object); node; node = g_list_next(node)) {
  184 + vCount++;
  185 + *szPacket += g_variant_get_size(node->data)+1;
  186 + }
  187 +
  188 + unsigned char * outputBuffer = g_malloc0(*szPacket);
  189 + unsigned char * txtptr = setup_header(outputBuffer,name,id,vCount);
  190 +
  191 + for(node = ipc3270_get_values(object); node; node = g_list_next(node)) {
  192 + txtptr = pack_value(txtptr, node->data);
  193 + if(!txtptr) {
  194 + g_free(outputBuffer);
  195 + return NULL;
  196 + }
  197 + }
  198 +
  199 + debug("used=%u allocated=%u",(unsigned int) (txtptr-outputBuffer), (unsigned int) *szPacket);
  200 + return outputBuffer;
  201 +
  202 +}
  203 +
  204 +/*
171 205 unsigned char * ipc3270_pack_value(const gchar *name, int id, GVariant *value, size_t * szPacket) {
172 206  
173 207 debug("%s(%s)",__FUNCTION__,name);
... ... @@ -239,6 +273,7 @@ unsigned char * ipc3270_pack(const gchar * name, int id, GVariant *values, size_
239 273  
240 274 return outputBuffer;
241 275 }
  276 +*/
242 277  
243 278 GVariant * ipc3270_unpack(const unsigned char *packet, int *id) {
244 279  
... ... @@ -387,3 +422,4 @@ GVariant * ipc3270_unpack(const unsigned char *packet, int *id) {
387 422 return g_variant_builder_end(&builder);
388 423  
389 424 }
  425 +
... ...
server/src/core/windows/pipesource.c
... ... @@ -109,7 +109,7 @@ static void process_input(IPC3270_PIPE_SOURCE *source, DWORD cbRead) {
109 109 */
110 110  
111 111 g_autoptr (GError) error = NULL;
112   - g_autoptr (GVariant) response = NULL;
  112 + g_autoptr(GObject) response = ipc3270_response_new();
113 113 g_autoptr (GVariant) parameters = ipc3270_unpack(source->buffer, &request_type);
114 114  
115 115 /*
... ... @@ -123,30 +123,16 @@ static void process_input(IPC3270_PIPE_SOURCE *source, DWORD cbRead) {
123 123 // Process query
124 124 switch(request_type) {
125 125 case 1: // getProperty
126   - response = ipc3270_get_property(source->object, request_name, &error);
  126 + ipc3270_response_append(response,ipc3270_get_property(source->object, request_name, &error));
127 127 break;
128 128  
129 129 case 2: // setProperty
130 130 ipc3270_set_property(source->object, request_name, parameters, &error);
131   - response = g_variant_new_int32(0);
  131 + ipc3270_response_append_int32(response,0);
132 132 break;
133 133  
134 134 case 3: // method
135   - {
136   - g_autoptr(GObject) rsp = ipc3270_response_new();
137   -
138   - debug("Parameters: %p", parameters);
139   - debug("rsp: %p", rsp);
140   - debug("Error=%p",error);
141   -
142   - ipc3270_method_call(source->object, request_name, parameters, rsp, &error);
143   -
144   - debug("Error=%p",error);
145   -
146   - if(ipc3270_response_has_values(rsp))
147   - response = ipc3270_response_steal_value(rsp);
148   -
149   - }
  135 + ipc3270_method_call(source->object, request_name, parameters, response, &error);
150 136 break;
151 137  
152 138 default:
... ... @@ -177,7 +163,7 @@ static void process_input(IPC3270_PIPE_SOURCE *source, DWORD cbRead) {
177 163  
178 164 } else {
179 165  
180   - buffer = ipc3270_pack_value(request_name, 0, response, &szPacket);
  166 + buffer = ipc3270_pack(request_name,response,0,&szPacket);
181 167  
182 168 }
183 169  
... ...
server/src/core/windows/response.c
... ... @@ -1,150 +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 - e possui - linhas de código.
22   - *
23   - * Referências:
24   - *
25   - * https://github.com/joprietoe/gdbus/blob/master/gdbus-example-server.c
26   - * https://github.com/bratsche/glib/blob/master/gio/tests/gdbus-example-export.c
27   - *
28   - * Contatos:
29   - *
30   - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
31   - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
32   - *
33   - */
34   -
35   -#include "gobject.h"
36   -#include <lib3270.h>
37   -#include <lib3270/actions.h>
38   -#include <lib3270/properties.h>
39   -#include <lib3270/toggle.h>
40   -#include <lib3270/log.h>
41   -#include <v3270.h>
42   -
43   -/*--[ Widget definition ]----------------------------------------------------------------------------*/
44   -
45   -struct _ipc3270Response {
46   - GObject parent;
47   - GVariant * value;
48   -};
49   -
50   -struct _ipc3270ResponseClass {
51   -
52   - GObjectClass parent;
53   - int dummy;
54   -
55   -};
56   -
57   -
58   -G_DEFINE_TYPE(ipc3270Response, ipc3270Response, G_TYPE_OBJECT)
59   -
60   -/*--[ Implement ]------------------------------------------------------------------------------------*/
61   -
62   -static void ipc3270Response_finalize(GObject *object) {
63   -
64   - ipc3270Response * response = IPC3270_RESPONSE(object);
65   -
66   - debug("%s value=%p",__FUNCTION__,response->value);
67   -
68   - if(response->value)
69   - g_variant_unref(response->value);
70   -
71   -}
72   -
73   -
74   -static void ipc3270Response_class_init(ipc3270ResponseClass *klass) {
75   -
76   - debug("%s",__FUNCTION__);
77   -
78   - GObjectClass *object_class;
79   - object_class = G_OBJECT_CLASS (klass);
80   - object_class->finalize = ipc3270Response_finalize;
81   -
82   -}
83   -
84   -static void ipc3270Response_init(ipc3270Response *object) {
85   -
86   - object->value = NULL;
87   -
88   -}
89   -
90   -GObject * ipc3270_response_new() {
91   - return g_object_new(GLIB_TYPE_IPC3270_RESPONSE, NULL);
92   -}
93   -
94   -void ipc3270_response_append_int32(GObject *object, gint32 value) {
95   -
96   - debug("%s(%d)",__FUNCTION__,value);
97   -
98   - ipc3270Response * response = IPC3270_RESPONSE(object);
99   -
100   - if(response->value)
101   - g_variant_unref(response->value);
102   -
103   - response->value = g_variant_new_int32(value);
104   -}
105   -
106   -void ipc3270_response_append_uint32(GObject *object, guint32 value) {
107   -
108   - ipc3270Response * response = IPC3270_RESPONSE(object);
109   -
110   - if(response->value)
111   - g_variant_unref(response->value);
112   -
113   - response->value = g_variant_new_uint32(value);
114   -}
115   -
116   -void ipc3270_response_append_string(GObject *object, const gchar *text) {
117   -
118   - ipc3270Response * response = IPC3270_RESPONSE(object);
119   -
120   - if(response->value)
121   - g_variant_unref(response->value);
122   -
123   - response->value = g_variant_new_string(text);
124   -
125   -}
126   -
127   -void ipc3270_response_append_boolean(GObject *object, gboolean value) {
128   -
129   - ipc3270Response * response = IPC3270_RESPONSE(object);
130   -
131   - if(response->value)
132   - g_variant_unref(response->value);
133   -
134   - response->value = g_variant_new_boolean(value);
135   -}
136   -
137   -
138   -GVariant * ipc3270_response_steal_value(GObject *object) {
139   -
140   - ipc3270Response * response = IPC3270_RESPONSE(object);
141   -
142   - GVariant * value = response->value;
143   - response->value = NULL;
144   -
145   - return value;
146   -}
147   -
148   -gboolean ipc3270_response_has_values(GObject *object) {
149   - return IPC3270_RESPONSE(object)->value != NULL;
150   -}
server/src/include/ipc-glib.h
... ... @@ -106,13 +106,18 @@
106 106 typedef struct _ipc3270ResponseClass ipc3270ResponseClass;
107 107  
108 108 GObject * ipc3270_response_new();
  109 + GType ipc3270Response_get_type(void);
109 110  
  111 + void ipc3270_response_append(GObject *object, GVariant *value);
110 112 void ipc3270_response_append_int32(GObject *object, gint32 value);
111 113 void ipc3270_response_append_uint32(GObject *object, guint32 value);
112 114 void ipc3270_response_append_string(GObject *object, const gchar *text);
113 115 void ipc3270_response_append_boolean(GObject *object, gboolean value);
114 116  
115 117 gboolean ipc3270_response_has_values(GObject *object);
  118 + guint ipc3270_response_length(GObject *object);
  119 + const GList * ipc3270_get_values(GObject *object);
  120 +
116 121 GVariant * ipc3270_response_steal_value(GObject *object);
117 122  
118 123  
... ... @@ -149,9 +154,10 @@
149 154 GVariant * ipc3270_get_property(GObject *object, const gchar *property_name, GError **error);
150 155  
151 156 #ifdef _WIN32
152   - unsigned char * ipc3270_pack(const gchar *name, int id, GVariant *values, size_t * szPacket);
153   - unsigned char * ipc3270_pack_value(const gchar *name, int id, GVariant *value, size_t * szPacket);
  157 +// unsigned char * ipc3270_pack(const gchar *name, int id, GVariant *values, size_t * szPacket);
  158 +// unsigned char * ipc3270_pack_value(const gchar *name, int id, GVariant *value, size_t * szPacket);
154 159 unsigned char * ipc3270_pack_error(const GError *error, size_t * szPacket);
  160 + unsigned char * ipc3270_pack(const gchar *name, GObject *object, int id, size_t * szPacket);
155 161 GVariant * ipc3270_unpack(const unsigned char *packet, int *id);
156 162 #endif // _WIN32
157 163  
... ...
server/src/testprogram/testprogram.c
... ... @@ -43,6 +43,7 @@
43 43 #include <glib.h>
44 44 #include <glib/gstdio.h>
45 45 #include <lib3270/toggle.h>
  46 + #include <lib3270/ssl.h>
46 47  
47 48 /*---[ Globals ]------------------------------------------------------------------------------------*/
48 49  
... ... @@ -106,6 +107,9 @@
106 107 GtkWidget * notebook = gtk_notebook_new();
107 108 GModule * module = NULL;
108 109  
  110 + // Hack to speed up the tests.
  111 + lib3270_ssl_set_crl_download(v3270_get_session(terminal),0);
  112 +
109 113 gtk_widget_set_name(window,session_name);
110 114 v3270_set_session_name(terminal,session_name);
111 115  
... ...
server/testscripts/dbus.conf 0 → 100644
... ... @@ -0,0 +1,6 @@
  1 +
  2 +PRODUCT_NAME=$(pkg-config --variable=product_name lib3270)
  3 +
  4 +DBUS_DEST=br.com.bb.${PRODUCT_NAME}.a
  5 +DBUS_PATH="/br/com/bb/${PRODUCT_NAME}/a"
  6 +DBUS_INTERFACE="br.com.bb.tn3270.session"
... ...
server/testscripts/getcursorposition.sh 0 → 100755
... ... @@ -0,0 +1,14 @@
  1 +#!/bin/bash
  2 +#
  3 +# https://stackoverflow.com/questions/48648952/set-get-property-using-dbus-send
  4 +#
  5 +
  6 +. ./dbus.conf
  7 +
  8 +dbus-send \
  9 + --session \
  10 + --dest=${DBUS_DEST} \
  11 + --print-reply \
  12 + "${DBUS_PATH}" \
  13 + "${DBUS_INTERFACE}.getCursorPosition"
  14 +
... ...
server/testscripts/getstring.sh
... ... @@ -3,10 +3,12 @@
3 3 # https://stackoverflow.com/questions/48648952/set-get-property-using-dbus-send
4 4 #
5 5  
  6 +. ./dbus.conf
  7 +
6 8 dbus-send \
7 9 --session \
8   - --dest=br.com.bb.pw3270.a\
  10 + --dest=${DBUS_DEST} \
9 11 --print-reply \
10   - "/br/com/bb/tn3270/session" \
11   - "br.com.bb.tn3270.session.getString"
  12 + "${DBUS_PATH}" \
  13 + "${DBUS_INTERFACE}.getString"
12 14  
... ...
server/testscripts/geturl.sh
... ... @@ -12,13 +12,14 @@
12 12 # string:br.com.bb.tn3270.session \
13 13 # string:url
14 14  
  15 +. ./dbus.conf
15 16  
16 17 gdbus \
17 18 call \
18 19 --session \
19   - --dest "br.com.bb.pw3270.a" \
20   - --object-path "/br/com/bb/tn3270/session" \
  20 + --dest ${DBUS_DEST} \
  21 + --object-path "${DBUS_PATH}" \
21 22 --method org.freedesktop.DBus.Properties.Get \
22   - "br.com.bb.tn3270.session" \
  23 + "${DBUS_INTERFACE}" \
23 24 "url"
24 25  
... ...
server/testscripts/introspect.sh
1 1 #!/bin/bash
2 2  
3   -PRODUCT_NAME=$(pkg-config --variable=product_name lib3270)
  3 +. ./dbus.conf
4 4  
5 5 gdbus \
6 6 introspect \
7 7 --session \
8   - --dest=br.com.bb.${PRODUCT_NAME}.a \
9   - --object-path=/br/com/bb/${PRODUCT_NAME}/a
  8 + --dest=${DBUS_DEST} \
  9 + --object-path="${DBUS_PATH}"
10 10  
... ...
win/Makefile-debug.msc 0 → 100644
... ... @@ -0,0 +1,138 @@
  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., 59 Temple
  19 +# Place, Suite 330, Boston, MA, 02111-1307, USA
  20 +#
  21 +# Contatos:
  22 +#
  23 +# perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
  24 +# erico.mendonca@gmail.com (Erico Mascarenhas de Mendonça)
  25 +#
  26 +
  27 +!include "$(PW3270_SDK_PATH)\lib3270.mak"
  28 +
  29 +OBJ_FILES= \
  30 + client\src\core\abstract.obj \
  31 + client\src\core\actions.obj \
  32 + client\src\core\attribute.obj \
  33 + client\src\core\constants.obj \
  34 + client\src\core\events.obj \
  35 + client\src\core\session.obj \
  36 + client\src\core\windows\attribute.obj \
  37 + client\src\core\windows\pop.obj \
  38 + client\src\core\windows\push.obj \
  39 + client\src\core\windows\request.obj \
  40 + client\src\core\windows\tools.obj \
  41 + client\src\host\actions.obj \
  42 + client\src\host\init.obj \
  43 + client\src\host\pop.obj \
  44 + client\src\host\properties.obj \
  45 + client\src\host\push.obj \
  46 + client\src\host\states.obj \
  47 + client\src\host\stream.obj \
  48 + client\src\host\string.obj \
  49 + client\src\session\action.obj \
  50 + client\src\session\get.obj \
  51 + client\src\session\set.obj \
  52 + client\src\session\tools.obj \
  53 + client\src\session\local\actions.obj \
  54 + client\src\session\local\attribute.obj \
  55 + client\src\session\local\events.obj \
  56 + client\src\session\local\get.obj \
  57 + client\src\session\local\init.obj \
  58 + client\src\session\local\set.obj \
  59 + client\src\session\local\wait.obj \
  60 + client\src\session\remote\actions.obj \
  61 + client\src\session\remote\attribute.obj \
  62 + client\src\session\remote\get.obj \
  63 + client\src\session\remote\properties.obj \
  64 + client\src\session\remote\set.obj \
  65 + client\src\session\remote\tools.obj \
  66 + client\src\session\remote\wait.obj \
  67 + client\src\session\remote\windows\request.obj \
  68 + client\src\session\remote\windows\session.obj
  69 +
  70 +.cc.obj:
  71 + @echo Compiling...
  72 + @$(CPP) \
  73 + /c \
  74 + /DPACKAGE_NAME=\"ipc3270\" \
  75 + /DPRODUCT_NAME=$(PRODUCT_NAME) \
  76 + /DLIB3270_NAME=$(LIB3270_NAME) \
  77 + /DDEBUG=1 \
  78 + /I".\client\src\include" \
  79 + /I"$(PW3270_SDK_PATH)\include" \
  80 + /EHsc \
  81 + /Fo"$@" \
  82 + $<
  83 +
  84 +testprogram.exe: \
  85 + client\src\testprogram\testprogram.obj \
  86 + ipc3270.dll
  87 +
  88 + @echo Build exe file....
  89 + @link \
  90 + /nologo \
  91 + /OUT:"$@" \
  92 + client\src\testprogram\testprogram.obj
  93 +
  94 +install: \
  95 + $(OBJ_FILES) \
  96 + ipc3270.dll
  97 + @echo Building library...
  98 + @-mkdir "$(PW3270_SDK_PATH)\lib"
  99 + @lib \
  100 + /NOLOGO \
  101 + /OUT:"$(PW3270_SDK_PATH)\lib\ipc3270.lib" \
  102 + $(OBJ_FILES)
  103 +
  104 + @copy "ipc3270.dll" "$(PW3270_SDK_PATH)\..\ipc3270.dll"
  105 + @copy "ipc3270.dll.lib" "$(PW3270_SDK_PATH)\lib\ipc3270.dll.lib"
  106 +
  107 + @-mkdir "$(PW3270_SDK_PATH)\include\lib3270\ipc"
  108 + @copy "client\src\include\lib3270\ipc\*.h" "$(PW3270_SDK_PATH)\include\lib3270\ipc"
  109 + @copy "client\src\include\lib3270\*.h" "$(PW3270_SDK_PATH)\include\lib3270"
  110 +
  111 +ipc3270.dll: \
  112 + $(OBJ_FILES) \
  113 + client\src\core\windows\dynamic\init.obj \
  114 + $(LIB3270_NAME).lib
  115 + @echo Build dll file....
  116 + link \
  117 + /NOLOGO \
  118 + /DLL \
  119 + /OUT:"$@" \
  120 + /IMPLIB:ipc3270.dll.lib \
  121 + $(OBJ_FILES) \
  122 + client\src\core\windows\dynamic\init.obj \
  123 + /DELAYLOAD:$(LIB3270_NAME).dll
  124 +
  125 +$(LIB3270_NAME).lib:
  126 + lib \
  127 + /def:"$(PW3270_SDK_PATH)\def\$(LIB3270_NAME).def" \
  128 + /out:$(LIB3270_NAME).lib
  129 +
  130 +clean:
  131 + del \
  132 + $(LIB3270_NAME).lib \
  133 + $(LIB3270_NAME).dll \
  134 + *.lib \
  135 + *.dll \
  136 + $(OBJ_FILES) \
  137 + client\src\core\windows\dynamic\init.obj \
  138 + testprogram.*
... ...
win/Makefile.msc
... ... @@ -84,6 +84,7 @@ OBJ_FILES= \
84 84 testprogram.exe: \
85 85 client\src\testprogram\testprogram.obj \
86 86 ipc3270.dll
  87 +
87 88 @echo Build exe file....
88 89 @link \
89 90 /nologo \
... ... @@ -91,45 +92,50 @@ testprogram.exe: \
91 92 client\src\testprogram\testprogram.obj
92 93  
93 94 install: \
94   - $(OBJ_FILES) \
  95 + ipc3270.dll \
  96 + ipc3270.lib \
95 97 $(LIB3270_NAME).lib
96 98 @echo Building library...
97 99 @-mkdir "$(PW3270_SDK_PATH)\lib"
  100 + copy "$(LIB3270_NAME).lib" "$(PW3270_SDK_PATH)\lib\$(LIB3270_NAME).lib"
  101 + copy "ipc3270.lib" "$(PW3270_SDK_PATH)\lib\ipc3270.lib"
  102 + copy "ipc3270.dll" "$(PW3270_SDK_PATH)\..\ipc3270.dll"
  103 + copy "ipc3270.dll.lib" "$(PW3270_SDK_PATH)\lib\ipc3270.dll.lib"
  104 + @-mkdir "$(PW3270_SDK_PATH)\include\lib3270\ipc"
  105 + copy "client\src\include\lib3270\ipc\*.h" "$(PW3270_SDK_PATH)\include\lib3270\ipc"
  106 + copy "client\src\include\lib3270\*.h" "$(PW3270_SDK_PATH)\include\lib3270"
  107 +
  108 +ipc3270.lib: \
  109 + $(OBJ_FILES)
  110 + @echo Build dll file....
98 111 @lib \
99 112 /NOLOGO \
100   - /OUT:"$(PW3270_SDK_PATH)\lib\ipc3270.lib" \
  113 + /OUT:"ipc3270.lib" \
101 114 $(OBJ_FILES)
102 115  
103   -
104   - @copy "$(LIB3270_NAME).lib" "$(PW3270_SDK_PATH)\lib\$(LIB3270_NAME).lib"
105   - @-mkdir "$(PW3270_SDK_PATH)\include\lib3270\ipc"
106   - @copy "client\src\include\lib3270\ipc\*.h" "$(PW3270_SDK_PATH)\include\lib3270\ipc"
107   - @copy "client\src\include\lib3270\*.h" "$(PW3270_SDK_PATH)\include\lib3270"
108   -
109 116 ipc3270.dll: \
110 117 $(OBJ_FILES) \
111 118 client\src\core\windows\dynamic\init.obj \
112 119 $(LIB3270_NAME).lib
113 120 @echo Build dll file....
114   - link \
  121 + @link \
115 122 /NOLOGO \
116 123 /DLL \
117 124 /OUT:"$@" \
  125 + /IMPLIB:ipc3270.dll.lib \
118 126 $(OBJ_FILES) \
119 127 client\src\core\windows\dynamic\init.obj \
120 128 /DELAYLOAD:$(LIB3270_NAME).dll
121 129  
122 130 $(LIB3270_NAME).lib:
123   - lib \
  131 + @lib \
124 132 /def:"$(PW3270_SDK_PATH)\def\$(LIB3270_NAME).def" \
125 133 /out:$(LIB3270_NAME).lib
126 134  
127 135 clean:
128 136 del \
129   - $(LIB3270_NAME).lib \
130   - $(LIB3270_NAME).dll \
131   - ipc3270.lib \
132   - ipc3270.dll \
  137 + *.lib \
  138 + *.dll \
133 139 $(OBJ_FILES) \
134 140 client\src\core\windows\dynamic\init.obj \
135 141 testprogram.*
... ...