Commit bccb3c515b5eecb8d9c084d5d8ead5841a5fd021
Exists in
master
and in
1 other branch
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,9 +133,16 @@ install-windows-lib: | ||
| 133 | doc: | 133 | doc: |
| 134 | @$(DOXYGEN) ./doxygen/doxyfile | 134 | @$(DOXYGEN) ./doxygen/doxyfile |
| 135 | 135 | ||
| 136 | +#---[ Install Targets ]------------------------------------------------------------------ | ||
| 137 | + | ||
| 138 | +Debug: | ||
| 139 | + | ||
| 140 | + @$(MAKE) -C client $@ | ||
| 141 | + @$(MAKE) -C server $@ | ||
| 142 | + | ||
| 136 | #---[ Clean Targets ]-------------------------------------------------------------------- | 143 | #---[ Clean Targets ]-------------------------------------------------------------------- |
| 137 | 144 | ||
| 138 | -clean: \ | 145 | +clean: |
| 139 | 146 | ||
| 140 | @$(MAKE) -C client $@ | 147 | @$(MAKE) -C client $@ |
| 141 | @$(MAKE) -C server $@ | 148 | @$(MAKE) -C server $@ |
README.md
| @@ -74,3 +74,24 @@ Compiling for Windows (With MSYS2) | @@ -74,3 +74,24 @@ Compiling for Windows (With MSYS2) | ||
| 74 | 74 | ||
| 75 | * make install | 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,6 +79,7 @@ | ||
| 79 | <Unit filename="src/session/local/get.cc" /> | 79 | <Unit filename="src/session/local/get.cc" /> |
| 80 | <Unit filename="src/session/local/init.cc" /> | 80 | <Unit filename="src/session/local/init.cc" /> |
| 81 | <Unit filename="src/session/local/private.h" /> | 81 | <Unit filename="src/session/local/private.h" /> |
| 82 | + <Unit filename="src/session/local/properties.cc" /> | ||
| 82 | <Unit filename="src/session/local/set.cc" /> | 83 | <Unit filename="src/session/local/set.cc" /> |
| 83 | <Unit filename="src/session/local/wait.cc" /> | 84 | <Unit filename="src/session/local/wait.cc" /> |
| 84 | <Unit filename="src/session/remote/actions.cc" /> | 85 | <Unit filename="src/session/remote/actions.cc" /> |
| @@ -97,9 +98,6 @@ | @@ -97,9 +98,6 @@ | ||
| 97 | <Unit filename="src/session/tools.cc" /> | 98 | <Unit filename="src/session/tools.cc" /> |
| 98 | <Unit filename="src/testprogram/testprogram.cc" /> | 99 | <Unit filename="src/testprogram/testprogram.cc" /> |
| 99 | <Extensions> | 100 | <Extensions> |
| 100 | - <code_completion /> | ||
| 101 | - <envvars /> | ||
| 102 | - <debugger /> | ||
| 103 | <lib_finder disable_auto="1" /> | 101 | <lib_finder disable_auto="1" /> |
| 104 | </Extensions> | 102 | </Extensions> |
| 105 | </Project> | 103 | </Project> |
client/src/core/abstract.cc
| @@ -79,6 +79,8 @@ | @@ -79,6 +79,8 @@ | ||
| 79 | /// @brief Setup charsets | 79 | /// @brief Setup charsets |
| 80 | void Abstract::Session::setCharSet(const char *remote, const char *local) { | 80 | void Abstract::Session::setCharSet(const char *remote, const char *local) { |
| 81 | 81 | ||
| 82 | + debug("Charsets: remote=",remote," local=",local); | ||
| 83 | + | ||
| 82 | if(!local) { | 84 | if(!local) { |
| 83 | 85 | ||
| 84 | // TODO: Detect the current value (maybee something like g_charset) | 86 | // TODO: Detect the current value (maybee something like g_charset) |
| @@ -117,8 +119,8 @@ | @@ -117,8 +119,8 @@ | ||
| 117 | converter = lib3270_iconv_new(remote,local); | 119 | converter = lib3270_iconv_new(remote,local); |
| 118 | 120 | ||
| 119 | debug("lib3270_iconv_new(",remote,",",local,"=",(void *) converter); | 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,11 +170,17 @@ | ||
| 168 | #else | 170 | #else |
| 169 | if(converter) { | 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 | if(converted) { | 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 | return str; | 186 | return str; |
| @@ -185,22 +193,32 @@ | @@ -185,22 +193,32 @@ | ||
| 185 | 193 | ||
| 186 | #ifdef HAVE_ICONV | 194 | #ifdef HAVE_ICONV |
| 187 | 195 | ||
| 196 | + debug("Using ICONV"); | ||
| 188 | return convertCharset(const_cast<Abstract::Session *>(this)->converter.host,text,length); | 197 | return convertCharset(const_cast<Abstract::Session *>(this)->converter.host,text,length); |
| 189 | 198 | ||
| 190 | #else | 199 | #else |
| 191 | 200 | ||
| 192 | if(converter) { | 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 | if(converted) { | 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 | #endif // HAVE_ICONV | 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,7 +77,7 @@ | ||
| 77 | if(!response.msg) { | 77 | if(!response.msg) { |
| 78 | string message = error.message; | 78 | string message = error.message; |
| 79 | dbus_error_free(&error); | 79 | dbus_error_free(&error); |
| 80 | - throw std::runtime_error(message.c_str()); | 80 | + throw std::runtime_error(message); |
| 81 | } | 81 | } |
| 82 | 82 | ||
| 83 | dbus_message_iter_init(response.msg, &response.iter); | 83 | dbus_message_iter_init(response.msg, &response.iter); |
| @@ -128,7 +128,8 @@ | @@ -128,7 +128,8 @@ | ||
| 128 | } | 128 | } |
| 129 | 129 | ||
| 130 | IPC::Request & IPC::Request::push(const bool arg) { | 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 | IPC::Request & IPC::Request::push(const uint8_t arg) { | 135 | IPC::Request & IPC::Request::push(const uint8_t arg) { |
client/src/core/windows/pop.cc
| @@ -44,11 +44,31 @@ | @@ -44,11 +44,31 @@ | ||
| 44 | 44 | ||
| 45 | namespace TN3270 { | 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 | IPC::Request & IPC::Request::pop(std::string &value) { | 67 | IPC::Request & IPC::Request::pop(std::string &value) { |
| 48 | DataBlock * block = getNextBlock(); | 68 | DataBlock * block = getNextBlock(); |
| 49 | 69 | ||
| 50 | if(block->type != IPC::Request::String) | 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 | const char *ptr = (const char *) (block+1); | 73 | const char *ptr = (const char *) (block+1); |
| 54 | 74 | ||
| @@ -80,7 +100,7 @@ | @@ -80,7 +100,7 @@ | ||
| 80 | break; | 100 | break; |
| 81 | 101 | ||
| 82 | default: | 102 | default: |
| 83 | - throw std::runtime_error("Invalid format"); | 103 | + throw InvalidFormatException(block->type, IPC::Request::Int16); |
| 84 | } | 104 | } |
| 85 | 105 | ||
| 86 | return *this; | 106 | return *this; |
| @@ -107,7 +127,7 @@ | @@ -107,7 +127,7 @@ | ||
| 107 | break; | 127 | break; |
| 108 | 128 | ||
| 109 | default: | 129 | default: |
| 110 | - throw std::runtime_error("Invalid format"); | 130 | + throw InvalidFormatException(block->type, IPC::Request::Uint16); |
| 111 | } | 131 | } |
| 112 | 132 | ||
| 113 | return *this; | 133 | return *this; |
| @@ -139,7 +159,7 @@ | @@ -139,7 +159,7 @@ | ||
| 139 | break; | 159 | break; |
| 140 | 160 | ||
| 141 | default: | 161 | default: |
| 142 | - throw std::runtime_error("Invalid format"); | 162 | + throw InvalidFormatException(block->type, IPC::Request::Boolean); |
| 143 | } | 163 | } |
| 144 | 164 | ||
| 145 | return *this; | 165 | return *this; |
client/src/core/windows/request.cc
| @@ -37,6 +37,7 @@ | @@ -37,6 +37,7 @@ | ||
| 37 | */ | 37 | */ |
| 38 | 38 | ||
| 39 | #include <ipc-client-internals.h> | 39 | #include <ipc-client-internals.h> |
| 40 | + #include <lib3270/trace.h> | ||
| 40 | 41 | ||
| 41 | using std::string; | 42 | using std::string; |
| 42 | 43 | ||
| @@ -46,6 +47,51 @@ | @@ -46,6 +47,51 @@ | ||
| 46 | 47 | ||
| 47 | #define PIPE_BUFFER_LENGTH 8192 | 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 | IPC::Request::Request(HANDLE hPipe, const char *name, uint16_t type) { | 95 | IPC::Request::Request(HANDLE hPipe, const char *name, uint16_t type) { |
| 50 | 96 | ||
| 51 | this->hPipe = hPipe; | 97 | this->hPipe = hPipe; |
| @@ -114,7 +160,7 @@ | @@ -114,7 +160,7 @@ | ||
| 114 | IPC::Request & IPC::Request::call() { | 160 | IPC::Request & IPC::Request::call() { |
| 115 | 161 | ||
| 116 | #ifdef DEBUG | 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 | #endif // DEBUG | 164 | #endif // DEBUG |
| 119 | 165 | ||
| 120 | debug("Sending request with ", *this->outvalues, " elements"); | 166 | debug("Sending request with ", *this->outvalues, " elements"); |
| @@ -137,8 +183,19 @@ | @@ -137,8 +183,19 @@ | ||
| 137 | 183 | ||
| 138 | debug("Received response \"", in.block, "\" with ", in.used, " bytes"); | 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 | #ifdef DEBUG | 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 | #endif // DEBUG | 199 | #endif // DEBUG |
| 143 | 200 | ||
| 144 | // Extract response name | 201 | // Extract response name |
client/src/core/windows/tools.cc
| @@ -90,7 +90,7 @@ | @@ -90,7 +90,7 @@ | ||
| 90 | 90 | ||
| 91 | for(ix = 0; installLocation.empty() && ix < (sizeof(keys)/sizeof(keys[0])); ix++) { | 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 | rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE,keys[ix],0,KEY_QUERY_VALUE,&hKey); | 95 | rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE,keys[ix],0,KEY_QUERY_VALUE,&hKey); |
| 96 | if(rc == ERROR_SUCCESS) { | 96 | if(rc == ERROR_SUCCESS) { |
| @@ -103,11 +103,8 @@ | @@ -103,11 +103,8 @@ | ||
| 103 | 103 | ||
| 104 | rc = RegQueryValueExA(hKey,"InstallLocation",NULL,&datatype,(LPBYTE) datadir,&datalen); | 104 | rc = RegQueryValueExA(hKey,"InstallLocation",NULL,&datatype,(LPBYTE) datadir,&datalen); |
| 105 | if(rc == ERROR_SUCCESS) { | 105 | if(rc == ERROR_SUCCESS) { |
| 106 | - | ||
| 107 | - debug("Found: ",datadir); | ||
| 108 | - | 106 | +// debug("Found: ",datadir); |
| 109 | installLocation.assign(datadir); | 107 | installLocation.assign(datadir); |
| 110 | - | ||
| 111 | } | 108 | } |
| 112 | 109 | ||
| 113 | RegCloseKey(hKey); | 110 | RegCloseKey(hKey); |
client/src/host/properties.cc
| @@ -58,7 +58,7 @@ std::vector<TN3270::Attribute> TN3270::Host::getAttributes() const { | @@ -58,7 +58,7 @@ std::vector<TN3270::Attribute> 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 | this->timeout = timeout; | 62 | this->timeout = timeout; |
| 63 | this->session->setTimeout(timeout); | 63 | this->session->setTimeout(timeout); |
| 64 | } | 64 | } |
client/src/include/lib3270/ipc.h
| @@ -38,6 +38,7 @@ | @@ -38,6 +38,7 @@ | ||
| 38 | #include <lib3270.h> | 38 | #include <lib3270.h> |
| 39 | #include <lib3270/keyboard.h> | 39 | #include <lib3270/keyboard.h> |
| 40 | #include <lib3270/actions.h> | 40 | #include <lib3270/actions.h> |
| 41 | + #include <lib3270/ssl.h> | ||
| 41 | 42 | ||
| 42 | #if defined(_WIN32) || defined(_MSC_VER) | 43 | #if defined(_WIN32) || defined(_MSC_VER) |
| 43 | 44 | ||
| @@ -113,29 +114,28 @@ | @@ -113,29 +114,28 @@ | ||
| 113 | * | 114 | * |
| 114 | */ | 115 | */ |
| 115 | template<typename T> | 116 | template<typename T> |
| 116 | - class lib3270_auto_cleanup { | 117 | + class lib3270_ptr { |
| 117 | private: | 118 | private: |
| 118 | - T *data; | 119 | + T *ptr; |
| 119 | 120 | ||
| 120 | public: | 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 | operator bool() const noexcept { | 129 | operator bool() const noexcept { |
| 130 | - return this->data != NULL; | 130 | + return this->ptr != NULL; |
| 131 | } | 131 | } |
| 132 | 132 | ||
| 133 | T * operator->() { | 133 | T * operator->() { |
| 134 | - return this->data; | 134 | + return this->ptr; |
| 135 | } | 135 | } |
| 136 | 136 | ||
| 137 | operator T *() const noexcept { | 137 | operator T *() const noexcept { |
| 138 | - return this->data; | 138 | + return this->ptr; |
| 139 | } | 139 | } |
| 140 | 140 | ||
| 141 | }; | 141 | }; |
| @@ -212,7 +212,7 @@ | @@ -212,7 +212,7 @@ | ||
| 212 | /// @brief connection state. | 212 | /// @brief connection state. |
| 213 | enum ConnectionState : uint8_t { | 213 | enum ConnectionState : uint8_t { |
| 214 | DISCONNECTED = LIB3270_NOT_CONNECTED, ///< @brief disconnected | 214 | DISCONNECTED = LIB3270_NOT_CONNECTED, ///< @brief disconnected |
| 215 | - RESOLVING = LIB3270_RESOLVING, ///< @brief resolving hostname | 215 | + RESOLVING = LIB3270_CONNECTING, ///< @brief Connecting to host |
| 216 | PENDING = LIB3270_PENDING, ///< @brief connection pending | 216 | PENDING = LIB3270_PENDING, ///< @brief connection pending |
| 217 | CONNECTED_INITIAL = LIB3270_CONNECTED_INITIAL, ///< @brief connected, no mode yet | 217 | CONNECTED_INITIAL = LIB3270_CONNECTED_INITIAL, ///< @brief connected, no mode yet |
| 218 | CONNECTED_ANSI = LIB3270_CONNECTED_ANSI, ///< @brief connected in NVT ANSI mode | 218 | CONNECTED_ANSI = LIB3270_CONNECTED_ANSI, ///< @brief connected in NVT ANSI mode |
| @@ -229,6 +229,7 @@ | @@ -229,6 +229,7 @@ | ||
| 229 | SSL_SECURE = LIB3270_SSL_SECURE, ///< @brief Connection secure with CA check | 229 | SSL_SECURE = LIB3270_SSL_SECURE, ///< @brief Connection secure with CA check |
| 230 | SSL_NEGOTIATED = LIB3270_SSL_NEGOTIATED, ///< @brief Connection secure, no CA, self-signed or expired CRL | 230 | SSL_NEGOTIATED = LIB3270_SSL_NEGOTIATED, ///< @brief Connection secure, no CA, self-signed or expired CRL |
| 231 | SSL_NEGOTIATING = LIB3270_SSL_NEGOTIATING, ///< @brief Negotiating SSL | 231 | SSL_NEGOTIATING = LIB3270_SSL_NEGOTIATING, ///< @brief Negotiating SSL |
| 232 | + SSL_VERIFYING = LIB3270_SSL_VERIFYING, ///< @brief Verifying SSL (Getting CRL) | ||
| 232 | SSL_UNDEFINED = LIB3270_SSL_UNDEFINED ///< @brief Undefined | 233 | SSL_UNDEFINED = LIB3270_SSL_UNDEFINED ///< @brief Undefined |
| 233 | }; | 234 | }; |
| 234 | 235 | ||
| @@ -450,6 +451,15 @@ | @@ -450,6 +451,15 @@ | ||
| 450 | 451 | ||
| 451 | public: | 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 | /// @brief Get an instance of the TN3270 session based on the supplied ID. | 463 | /// @brief Get an instance of the TN3270 session based on the supplied ID. |
| 454 | static Session * getInstance(const char *id = nullptr, const char *charset = nullptr); | 464 | static Session * getInstance(const char *id = nullptr, const char *charset = nullptr); |
| 455 | virtual ~Session(); | 465 | virtual ~Session(); |
| @@ -585,6 +595,9 @@ | @@ -585,6 +595,9 @@ | ||
| 585 | /// @brief Get cursor address | 595 | /// @brief Get cursor address |
| 586 | virtual unsigned short getCursorAddress() = 0; | 596 | virtual unsigned short getCursorAddress() = 0; |
| 587 | 597 | ||
| 598 | + /// @brief Get cursor position. | ||
| 599 | + virtual struct Cursor getCursorPosition() = 0; | ||
| 600 | + | ||
| 588 | /// @brief Set local charset. | 601 | /// @brief Set local charset. |
| 589 | virtual void setCharSet(const char *charset = NULL) = 0; | 602 | virtual void setCharSet(const char *charset = NULL) = 0; |
| 590 | 603 | ||
| @@ -647,6 +660,11 @@ | @@ -647,6 +660,11 @@ | ||
| 647 | int compare(int baddr, const char* s, int len = -1) const; | 660 | int compare(int baddr, const char* s, int len = -1) const; |
| 648 | int compare(unsigned short row, unsigned short col, const char* s, int len = -1) const; | 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 | /// @brief TN3270 Host | 670 | /// @brief TN3270 Host |
| @@ -782,6 +800,10 @@ | @@ -782,6 +800,10 @@ | ||
| 782 | return session->getCursorAddress(); | 800 | return session->getCursorAddress(); |
| 783 | } | 801 | } |
| 784 | 802 | ||
| 803 | + inline Session::Cursor getCursorPosition() { | ||
| 804 | + return session->getCursorPosition(); | ||
| 805 | + } | ||
| 806 | + | ||
| 785 | inline void setHostURL(const char *url) { | 807 | inline void setHostURL(const char *url) { |
| 786 | session->setHostURL(url); | 808 | session->setHostURL(url); |
| 787 | } | 809 | } |
| @@ -799,6 +821,23 @@ | @@ -799,6 +821,23 @@ | ||
| 799 | return getAttribute(name); | 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 | /// @brief Get lib3270 version. | 841 | /// @brief Get lib3270 version. |
| 803 | inline std::string getVersion() const { | 842 | inline std::string getVersion() const { |
| 804 | return session->getVersion(); | 843 | return session->getVersion(); |
| @@ -839,7 +878,7 @@ | @@ -839,7 +878,7 @@ | ||
| 839 | } | 878 | } |
| 840 | 879 | ||
| 841 | // Set properties | 880 | // Set properties |
| 842 | - void setTimeout(time_t timeout = DEFAULT_TIMEOUT) noexcept; | 881 | + void setTimeout(time_t timeout = DEFAULT_TIMEOUT); |
| 843 | 882 | ||
| 844 | inline void setUnlockDelay(unsigned short delay = 350) { | 883 | inline void setUnlockDelay(unsigned short delay = 350) { |
| 845 | session->setUnlockDelay(delay); | 884 | session->setUnlockDelay(delay); |
| @@ -937,6 +976,19 @@ | @@ -937,6 +976,19 @@ | ||
| 937 | int compare(int baddr, const char* s, int len = -1) const; | 976 | int compare(int baddr, const char* s, int len = -1) const; |
| 938 | int compare(unsigned short row, unsigned short col, const char* s, int len = -1) const; | 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 | // Set contents. | 992 | // Set contents. |
| 941 | 993 | ||
| 942 | /// @brief Input string. | 994 | /// @brief Input string. |
client/src/include/lib3270/ipc/request.h
| @@ -58,12 +58,8 @@ | @@ -58,12 +58,8 @@ | ||
| 58 | 58 | ||
| 59 | /// @brief PW3270 IPC Request/Response. | 59 | /// @brief PW3270 IPC Request/Response. |
| 60 | class TN3270_PUBLIC Request { | 60 | class TN3270_PUBLIC Request { |
| 61 | - private: | ||
| 62 | - | 61 | + public: |
| 63 | #ifdef _WIN32 | 62 | #ifdef _WIN32 |
| 64 | - /// @brief Pipe Handle. | ||
| 65 | - HANDLE hPipe; | ||
| 66 | - | ||
| 67 | /// @brief IPC Data type. | 63 | /// @brief IPC Data type. |
| 68 | enum Type : uint8_t { | 64 | enum Type : uint8_t { |
| 69 | String = 's', | 65 | String = 's', |
| @@ -77,6 +73,13 @@ | @@ -77,6 +73,13 @@ | ||
| 77 | Int64 = 'x', | 73 | Int64 = 'x', |
| 78 | Uint64 = 't' | 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 | struct { | 84 | struct { |
| 82 | DWORD length; ///< @brief Length of input buffer. | 85 | DWORD length; ///< @brief Length of input buffer. |
client/src/session/local/actions.cc
| @@ -74,7 +74,7 @@ | @@ -74,7 +74,7 @@ | ||
| 74 | 74 | ||
| 75 | void Local::Session::action(const char *action_name) { | 75 | void Local::Session::action(const char *action_name) { |
| 76 | std::lock_guard<std::recursive_mutex> lock(sync); | 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 | if(this->timeout) | 78 | if(this->timeout) |
| 79 | chkResponse(lib3270_wait_for_ready(hSession,this->timeout)); | 79 | chkResponse(lib3270_wait_for_ready(hSession,this->timeout)); |
| 80 | } | 80 | } |
client/src/session/local/attribute.cc
| @@ -527,6 +527,16 @@ | @@ -527,6 +527,16 @@ | ||
| 527 | return rc; | 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 | std::string Local::Session::getVersion() const { | 540 | std::string Local::Session::getVersion() const { |
| 531 | 541 | ||
| 532 | std::lock_guard<std::recursive_mutex> lock(const_cast<Local::Session *>(this)->sync); | 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,7 +46,7 @@ | ||
| 46 | 46 | ||
| 47 | std::lock_guard<std::recursive_mutex> lock(const_cast<Local::Session *>(this)->sync); | 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 | if(!text) { | 51 | if(!text) { |
| 52 | throw std::runtime_error( _("Can't get screen contents") ); | 52 | throw std::runtime_error( _("Can't get screen contents") ); |
| @@ -59,7 +59,7 @@ | @@ -59,7 +59,7 @@ | ||
| 59 | 59 | ||
| 60 | std::lock_guard<std::recursive_mutex> lock(const_cast<Local::Session *>(this)->sync); | 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 | if(!text) { | 64 | if(!text) { |
| 65 | throw std::runtime_error( _("Can't get screen contents") ); | 65 | throw std::runtime_error( _("Can't get screen contents") ); |
| @@ -72,7 +72,7 @@ | @@ -72,7 +72,7 @@ | ||
| 72 | 72 | ||
| 73 | std::lock_guard<std::recursive_mutex> lock(const_cast<Local::Session *>(this)->sync); | 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 | if(!text) { | 77 | if(!text) { |
| 78 | throw std::runtime_error( _("Can't get screen contents") ); | 78 | throw std::runtime_error( _("Can't get screen contents") ); |
client/src/session/local/private.h
| @@ -161,7 +161,11 @@ | @@ -161,7 +161,11 @@ | ||
| 161 | unsigned short setCursor(int addr) override; | 161 | unsigned short setCursor(int addr) override; |
| 162 | unsigned short setCursor(unsigned short row, unsigned short col) override; | 162 | unsigned short setCursor(unsigned short row, unsigned short col) override; |
| 163 | unsigned short getCursorAddress() override; | 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 |
| @@ -0,0 +1,85 @@ | @@ -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,7 +39,10 @@ | ||
| 39 | #include "private.h" | 39 | #include "private.h" |
| 40 | #include <lib3270/actions.h> | 40 | #include <lib3270/actions.h> |
| 41 | #include <signal.h> | 41 | #include <signal.h> |
| 42 | - #include <unistd.h> | 42 | + |
| 43 | +#ifndef _WIN32 | ||
| 44 | + #include <unistd.h> | ||
| 45 | +#endif // _WIN32 | ||
| 43 | 46 | ||
| 44 | /*---[ Implement ]----------------------------------------------------------------------------------*/ | 47 | /*---[ Implement ]----------------------------------------------------------------------------------*/ |
| 45 | 48 |
client/src/session/remote/attribute.cc
| @@ -489,7 +489,18 @@ | @@ -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,6 +166,11 @@ | ||
| 166 | unsigned short setCursor(int addr) override; | 166 | unsigned short setCursor(int addr) override; |
| 167 | unsigned short setCursor(unsigned short row, unsigned short col) override; | 167 | unsigned short setCursor(unsigned short row, unsigned short col) override; |
| 168 | unsigned short getCursorAddress() override; | 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,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,9 +205,9 @@ | ||
| 205 | 205 | ||
| 206 | void IPC::Session::wait(unsigned short row, unsigned short col, const char *text, int seconds) { | 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 | wait(seconds, [this, key, row, col]() { | 212 | wait(seconds, [this, key, row, col]() { |
| 213 | 213 |
client/src/testprogram/testprogram.cc
| @@ -38,14 +38,15 @@ | @@ -38,14 +38,15 @@ | ||
| 38 | 38 | ||
| 39 | #include <ctime> | 39 | #include <ctime> |
| 40 | 40 | ||
| 41 | - #include <getopt.h> | ||
| 42 | - | ||
| 43 | #if defined(_MSC_VER) | 41 | #if defined(_MSC_VER) |
| 44 | #pragma comment(lib,"ipc3270.lib") | 42 | #pragma comment(lib,"ipc3270.lib") |
| 45 | #else | 43 | #else |
| 46 | #pragma GCC diagnostic ignored "-Wunused-function" | 44 | #pragma GCC diagnostic ignored "-Wunused-function" |
| 47 | #pragma GCC diagnostic ignored "-Wunused-parameter" | 45 | #pragma GCC diagnostic ignored "-Wunused-parameter" |
| 48 | #pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant" | 46 | #pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant" |
| 47 | + | ||
| 48 | + #include <getopt.h> | ||
| 49 | + | ||
| 49 | #endif // _MSC_VER | 50 | #endif // _MSC_VER |
| 50 | 51 | ||
| 51 | #include <cstdlib> | 52 | #include <cstdlib> |
| @@ -98,12 +99,22 @@ | @@ -98,12 +99,22 @@ | ||
| 98 | */ | 99 | */ |
| 99 | 100 | ||
| 100 | // Test Attributes | 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 | TN3270::Host host{session}; | 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 | for(auto attribute : host.getAttributes()) { | 112 | for(auto attribute : host.getAttributes()) { |
| 106 | 113 | ||
| 114 | + if(name && *name && strcasecmp(name,"all") && strcasecmp(attribute.getName(),name)) { | ||
| 115 | + continue; | ||
| 116 | + } | ||
| 117 | + | ||
| 107 | cout << attribute.getName() << ":\t"; | 118 | cout << attribute.getName() << ":\t"; |
| 108 | 119 | ||
| 109 | try { | 120 | try { |
| @@ -112,13 +123,27 @@ | @@ -112,13 +123,27 @@ | ||
| 112 | 123 | ||
| 113 | } catch(const std::exception &e) { | 124 | } catch(const std::exception &e) { |
| 114 | 125 | ||
| 115 | - cout << e.what(); | 126 | + cout << "Exception(" << e.what() << ")"; |
| 116 | } | 127 | } |
| 117 | 128 | ||
| 118 | cout << endl; | 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 | // Performance test. | 149 | // Performance test. |
| @@ -233,41 +258,80 @@ | @@ -233,41 +258,80 @@ | ||
| 233 | const char * session = ":A"; | 258 | const char * session = ":A"; |
| 234 | const char * url = nullptr; | 259 | const char * url = nullptr; |
| 235 | 260 | ||
| 261 | +#if ! defined(_MSC_VER) | ||
| 262 | + | ||
| 236 | static struct option options[] = { | 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 | { 0, 0, 0, 0} | 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 |
ipc3270.exp
No preview for this file type
server/pw3270-plugin-ipc.cbp
| @@ -68,9 +68,6 @@ | @@ -68,9 +68,6 @@ | ||
| 68 | <Option compilerVar="CC" /> | 68 | <Option compilerVar="CC" /> |
| 69 | </Unit> | 69 | </Unit> |
| 70 | <Unit filename="src/core/linux/gobject.h" /> | 70 | <Unit filename="src/core/linux/gobject.h" /> |
| 71 | - <Unit filename="src/core/linux/response.c"> | ||
| 72 | - <Option compilerVar="CC" /> | ||
| 73 | - </Unit> | ||
| 74 | <Unit filename="src/core/linux/start.c"> | 71 | <Unit filename="src/core/linux/start.c"> |
| 75 | <Option compilerVar="CC" /> | 72 | <Option compilerVar="CC" /> |
| 76 | </Unit> | 73 | </Unit> |
| @@ -102,6 +99,9 @@ | @@ -102,6 +99,9 @@ | ||
| 102 | <Unit filename="src/core/methods/wait.c"> | 99 | <Unit filename="src/core/methods/wait.c"> |
| 103 | <Option compilerVar="CC" /> | 100 | <Option compilerVar="CC" /> |
| 104 | </Unit> | 101 | </Unit> |
| 102 | + <Unit filename="src/core/response.c"> | ||
| 103 | + <Option compilerVar="CC" /> | ||
| 104 | + </Unit> | ||
| 105 | <Unit filename="src/core/setproperties.c"> | 105 | <Unit filename="src/core/setproperties.c"> |
| 106 | <Option compilerVar="CC" /> | 106 | <Option compilerVar="CC" /> |
| 107 | </Unit> | 107 | </Unit> |
| @@ -121,9 +121,6 @@ | @@ -121,9 +121,6 @@ | ||
| 121 | <Unit filename="src/core/windows/resources.rc"> | 121 | <Unit filename="src/core/windows/resources.rc"> |
| 122 | <Option compilerVar="WINDRES" /> | 122 | <Option compilerVar="WINDRES" /> |
| 123 | </Unit> | 123 | </Unit> |
| 124 | - <Unit filename="src/core/windows/response.c"> | ||
| 125 | - <Option compilerVar="CC" /> | ||
| 126 | - </Unit> | ||
| 127 | <Unit filename="src/core/windows/start.c"> | 124 | <Unit filename="src/core/windows/start.c"> |
| 128 | <Option compilerVar="CC" /> | 125 | <Option compilerVar="CC" /> |
| 129 | </Unit> | 126 | </Unit> |
| @@ -161,9 +158,6 @@ | @@ -161,9 +158,6 @@ | ||
| 161 | <Option compilerVar="CC" /> | 158 | <Option compilerVar="CC" /> |
| 162 | </Unit> | 159 | </Unit> |
| 163 | <Extensions> | 160 | <Extensions> |
| 164 | - <code_completion /> | ||
| 165 | - <envvars /> | ||
| 166 | - <debugger /> | ||
| 167 | <lib_finder disable_auto="1" /> | 161 | <lib_finder disable_auto="1" /> |
| 168 | </Extensions> | 162 | </Extensions> |
| 169 | </Project> | 163 | </Project> |
server/src/core/getproperties.c
| @@ -127,6 +127,7 @@ GVariant * ipc3270_get_property(GObject *object, const gchar *property_name, GEr | @@ -127,6 +127,7 @@ GVariant * ipc3270_get_property(GObject *object, const gchar *property_name, GEr | ||
| 127 | if(strprop[ix].get && !g_ascii_strcasecmp(strprop[ix].name, property_name)) { | 127 | if(strprop[ix].get && !g_ascii_strcasecmp(strprop[ix].name, property_name)) { |
| 128 | 128 | ||
| 129 | // Found it! | 129 | // Found it! |
| 130 | + errno = 0; | ||
| 130 | const char * value = strprop[ix].get(hSession); | 131 | const char * value = strprop[ix].get(hSession); |
| 131 | 132 | ||
| 132 | if(value) { | 133 | if(value) { |
| @@ -134,9 +135,14 @@ GVariant * ipc3270_get_property(GObject *object, const gchar *property_name, GEr | @@ -134,9 +135,14 @@ GVariant * ipc3270_get_property(GObject *object, const gchar *property_name, GEr | ||
| 134 | return g_variant_new_string(value); | 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,7 +120,7 @@ void ipc3270_add_terminal_introspection(GString *introspection) { | ||
| 120 | " <arg type='s' name='name' direction='in' />" \ | 120 | " <arg type='s' name='name' direction='in' />" \ |
| 121 | " <arg type='b' name='result' direction='out' />" \ | 121 | " <arg type='b' name='result' direction='out' />" \ |
| 122 | " </method>" | 122 | " </method>" |
| 123 | - " <method name='setwaitmode'>" | 123 | + " <method name='setWaitMode'>" |
| 124 | " <arg type='b' name='mode' direction='in' />" \ | 124 | " <arg type='b' name='mode' direction='in' />" \ |
| 125 | " <arg type='i' name='result' direction='out' />" \ | 125 | " <arg type='i' name='result' direction='out' />" \ |
| 126 | " </method>" | 126 | " </method>" |
| @@ -197,6 +197,10 @@ void ipc3270_add_terminal_introspection(GString *introspection) { | @@ -197,6 +197,10 @@ void ipc3270_add_terminal_introspection(GString *introspection) { | ||
| 197 | " <arg type='i' name='addr' direction='in' />" \ | 197 | " <arg type='i' name='addr' direction='in' />" \ |
| 198 | " <arg type='i' name='old' direction='out' />" \ | 198 | " <arg type='i' name='old' direction='out' />" \ |
| 199 | " </method>" \ | 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 | " <method name= 'getFieldAttribute'>" \ | 204 | " <method name= 'getFieldAttribute'>" \ |
| 201 | " <arg type='u' name='attribute' direction='out' />" \ | 205 | " <arg type='u' name='attribute' direction='out' />" \ |
| 202 | " </method>" \ | 206 | " </method>" \ |
server/src/core/linux/response.c
| @@ -1,149 +0,0 @@ | @@ -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,8 +67,16 @@ static void | ||
| 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. | 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 | // Even if the method has a single out-parameter, it must be contained in a tuple. | 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 | } else { | 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,7 +39,13 @@ int ipc3270_method_action(GObject *session, GVariant *request, GObject *response | ||
| 39 | 39 | ||
| 40 | GVariant *value = g_variant_get_child_value(request,0); | 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 | g_variant_unref(value); | 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,3 +66,22 @@ int ipc3270_method_set_cursor(GObject *session, GVariant *request, GObject *resp | ||
| 66 | return 0; | 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,6 +71,7 @@ int ipc3270_method_call(GObject *object, const gchar *method_name, GVariant *req | ||
| 71 | 71 | ||
| 72 | { "setCursorAddress", ipc3270_method_set_cursor }, | 72 | { "setCursorAddress", ipc3270_method_set_cursor }, |
| 73 | { "setCursorPosition", ipc3270_method_set_cursor }, | 73 | { "setCursorPosition", ipc3270_method_set_cursor }, |
| 74 | + { "getCursorPosition", ipc3270_method_get_cursor_position }, | ||
| 74 | 75 | ||
| 75 | { "action", ipc3270_method_action }, | 76 | { "action", ipc3270_method_action }, |
| 76 | { "activatable", ipc3270_method_activatable }, | 77 | { "activatable", ipc3270_method_activatable }, |
server/src/core/methods/private.h
| @@ -57,6 +57,7 @@ | @@ -57,6 +57,7 @@ | ||
| 57 | G_GNUC_INTERNAL int ipc3270_method_wait_for_keyboard_unlock(GObject *session, GVariant *request, GObject *response, GError **error); | 57 | G_GNUC_INTERNAL int ipc3270_method_wait_for_keyboard_unlock(GObject *session, GVariant *request, GObject *response, GError **error); |
| 58 | 58 | ||
| 59 | G_GNUC_INTERNAL int ipc3270_method_set_cursor(GObject *session, GVariant *request, GObject *response, GError **error); | 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 | G_GNUC_INTERNAL int ipc3270_method_action(GObject *session, GVariant *request, GObject *response, GError **error); | 62 | G_GNUC_INTERNAL int ipc3270_method_action(GObject *session, GVariant *request, GObject *response, GError **error); |
| 62 | G_GNUC_INTERNAL int ipc3270_method_activatable(GObject *session, GVariant *request, GObject *response, GError **error); | 63 | G_GNUC_INTERNAL int ipc3270_method_activatable(GObject *session, GVariant *request, GObject *response, GError **error); |
| @@ -0,0 +1,145 @@ | @@ -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,7 +59,7 @@ unsigned char * ipc3270_pack_error(const GError *error, size_t * szPacket) { | ||
| 59 | txtptr += strlen((char *) txtptr) + 1; | 59 | txtptr += strlen((char *) txtptr) + 1; |
| 60 | 60 | ||
| 61 | // Add RC | 61 | // Add RC |
| 62 | - *((guint16 *) txtptr) = (guint16) error->code; | 62 | + *((guint16 *) txtptr) = (guint16) (error->code ? error->code : -1); |
| 63 | txtptr += sizeof(guint16); | 63 | txtptr += sizeof(guint16); |
| 64 | 64 | ||
| 65 | // Add message | 65 | // Add message |
| @@ -168,6 +168,40 @@ unsigned char * pack_value(unsigned char *txtptr, GVariant *value) { | @@ -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 | unsigned char * ipc3270_pack_value(const gchar *name, int id, GVariant *value, size_t * szPacket) { | 205 | unsigned char * ipc3270_pack_value(const gchar *name, int id, GVariant *value, size_t * szPacket) { |
| 172 | 206 | ||
| 173 | debug("%s(%s)",__FUNCTION__,name); | 207 | debug("%s(%s)",__FUNCTION__,name); |
| @@ -239,6 +273,7 @@ unsigned char * ipc3270_pack(const gchar * name, int id, GVariant *values, size_ | @@ -239,6 +273,7 @@ unsigned char * ipc3270_pack(const gchar * name, int id, GVariant *values, size_ | ||
| 239 | 273 | ||
| 240 | return outputBuffer; | 274 | return outputBuffer; |
| 241 | } | 275 | } |
| 276 | +*/ | ||
| 242 | 277 | ||
| 243 | GVariant * ipc3270_unpack(const unsigned char *packet, int *id) { | 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,3 +422,4 @@ GVariant * ipc3270_unpack(const unsigned char *packet, int *id) { | ||
| 387 | return g_variant_builder_end(&builder); | 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,7 +109,7 @@ static void process_input(IPC3270_PIPE_SOURCE *source, DWORD cbRead) { | ||
| 109 | */ | 109 | */ |
| 110 | 110 | ||
| 111 | g_autoptr (GError) error = NULL; | 111 | g_autoptr (GError) error = NULL; |
| 112 | - g_autoptr (GVariant) response = NULL; | 112 | + g_autoptr(GObject) response = ipc3270_response_new(); |
| 113 | g_autoptr (GVariant) parameters = ipc3270_unpack(source->buffer, &request_type); | 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,30 +123,16 @@ static void process_input(IPC3270_PIPE_SOURCE *source, DWORD cbRead) { | ||
| 123 | // Process query | 123 | // Process query |
| 124 | switch(request_type) { | 124 | switch(request_type) { |
| 125 | case 1: // getProperty | 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 | break; | 127 | break; |
| 128 | 128 | ||
| 129 | case 2: // setProperty | 129 | case 2: // setProperty |
| 130 | ipc3270_set_property(source->object, request_name, parameters, &error); | 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 | break; | 132 | break; |
| 133 | 133 | ||
| 134 | case 3: // method | 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 | break; | 136 | break; |
| 151 | 137 | ||
| 152 | default: | 138 | default: |
| @@ -177,7 +163,7 @@ static void process_input(IPC3270_PIPE_SOURCE *source, DWORD cbRead) { | @@ -177,7 +163,7 @@ static void process_input(IPC3270_PIPE_SOURCE *source, DWORD cbRead) { | ||
| 177 | 163 | ||
| 178 | } else { | 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,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,13 +106,18 @@ | ||
| 106 | typedef struct _ipc3270ResponseClass ipc3270ResponseClass; | 106 | typedef struct _ipc3270ResponseClass ipc3270ResponseClass; |
| 107 | 107 | ||
| 108 | GObject * ipc3270_response_new(); | 108 | GObject * ipc3270_response_new(); |
| 109 | + GType ipc3270Response_get_type(void); | ||
| 109 | 110 | ||
| 111 | + void ipc3270_response_append(GObject *object, GVariant *value); | ||
| 110 | void ipc3270_response_append_int32(GObject *object, gint32 value); | 112 | void ipc3270_response_append_int32(GObject *object, gint32 value); |
| 111 | void ipc3270_response_append_uint32(GObject *object, guint32 value); | 113 | void ipc3270_response_append_uint32(GObject *object, guint32 value); |
| 112 | void ipc3270_response_append_string(GObject *object, const gchar *text); | 114 | void ipc3270_response_append_string(GObject *object, const gchar *text); |
| 113 | void ipc3270_response_append_boolean(GObject *object, gboolean value); | 115 | void ipc3270_response_append_boolean(GObject *object, gboolean value); |
| 114 | 116 | ||
| 115 | gboolean ipc3270_response_has_values(GObject *object); | 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 | GVariant * ipc3270_response_steal_value(GObject *object); | 121 | GVariant * ipc3270_response_steal_value(GObject *object); |
| 117 | 122 | ||
| 118 | 123 | ||
| @@ -149,9 +154,10 @@ | @@ -149,9 +154,10 @@ | ||
| 149 | GVariant * ipc3270_get_property(GObject *object, const gchar *property_name, GError **error); | 154 | GVariant * ipc3270_get_property(GObject *object, const gchar *property_name, GError **error); |
| 150 | 155 | ||
| 151 | #ifdef _WIN32 | 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 | unsigned char * ipc3270_pack_error(const GError *error, size_t * szPacket); | 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 | GVariant * ipc3270_unpack(const unsigned char *packet, int *id); | 161 | GVariant * ipc3270_unpack(const unsigned char *packet, int *id); |
| 156 | #endif // _WIN32 | 162 | #endif // _WIN32 |
| 157 | 163 |
server/src/testprogram/testprogram.c
| @@ -43,6 +43,7 @@ | @@ -43,6 +43,7 @@ | ||
| 43 | #include <glib.h> | 43 | #include <glib.h> |
| 44 | #include <glib/gstdio.h> | 44 | #include <glib/gstdio.h> |
| 45 | #include <lib3270/toggle.h> | 45 | #include <lib3270/toggle.h> |
| 46 | + #include <lib3270/ssl.h> | ||
| 46 | 47 | ||
| 47 | /*---[ Globals ]------------------------------------------------------------------------------------*/ | 48 | /*---[ Globals ]------------------------------------------------------------------------------------*/ |
| 48 | 49 | ||
| @@ -106,6 +107,9 @@ | @@ -106,6 +107,9 @@ | ||
| 106 | GtkWidget * notebook = gtk_notebook_new(); | 107 | GtkWidget * notebook = gtk_notebook_new(); |
| 107 | GModule * module = NULL; | 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 | gtk_widget_set_name(window,session_name); | 113 | gtk_widget_set_name(window,session_name); |
| 110 | v3270_set_session_name(terminal,session_name); | 114 | v3270_set_session_name(terminal,session_name); |
| 111 | 115 |
| @@ -0,0 +1,14 @@ | @@ -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,10 +3,12 @@ | ||
| 3 | # https://stackoverflow.com/questions/48648952/set-get-property-using-dbus-send | 3 | # https://stackoverflow.com/questions/48648952/set-get-property-using-dbus-send |
| 4 | # | 4 | # |
| 5 | 5 | ||
| 6 | +. ./dbus.conf | ||
| 7 | + | ||
| 6 | dbus-send \ | 8 | dbus-send \ |
| 7 | --session \ | 9 | --session \ |
| 8 | - --dest=br.com.bb.pw3270.a\ | 10 | + --dest=${DBUS_DEST} \ |
| 9 | --print-reply \ | 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,13 +12,14 @@ | ||
| 12 | # string:br.com.bb.tn3270.session \ | 12 | # string:br.com.bb.tn3270.session \ |
| 13 | # string:url | 13 | # string:url |
| 14 | 14 | ||
| 15 | +. ./dbus.conf | ||
| 15 | 16 | ||
| 16 | gdbus \ | 17 | gdbus \ |
| 17 | call \ | 18 | call \ |
| 18 | --session \ | 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 | --method org.freedesktop.DBus.Properties.Get \ | 22 | --method org.freedesktop.DBus.Properties.Get \ |
| 22 | - "br.com.bb.tn3270.session" \ | 23 | + "${DBUS_INTERFACE}" \ |
| 23 | "url" | 24 | "url" |
| 24 | 25 |
server/testscripts/introspect.sh
| 1 | #!/bin/bash | 1 | #!/bin/bash |
| 2 | 2 | ||
| 3 | -PRODUCT_NAME=$(pkg-config --variable=product_name lib3270) | 3 | +. ./dbus.conf |
| 4 | 4 | ||
| 5 | gdbus \ | 5 | gdbus \ |
| 6 | introspect \ | 6 | introspect \ |
| 7 | --session \ | 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 |
| @@ -0,0 +1,138 @@ | @@ -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,6 +84,7 @@ OBJ_FILES= \ | ||
| 84 | testprogram.exe: \ | 84 | testprogram.exe: \ |
| 85 | client\src\testprogram\testprogram.obj \ | 85 | client\src\testprogram\testprogram.obj \ |
| 86 | ipc3270.dll | 86 | ipc3270.dll |
| 87 | + | ||
| 87 | @echo Build exe file.... | 88 | @echo Build exe file.... |
| 88 | @link \ | 89 | @link \ |
| 89 | /nologo \ | 90 | /nologo \ |
| @@ -91,45 +92,50 @@ testprogram.exe: \ | @@ -91,45 +92,50 @@ testprogram.exe: \ | ||
| 91 | client\src\testprogram\testprogram.obj | 92 | client\src\testprogram\testprogram.obj |
| 92 | 93 | ||
| 93 | install: \ | 94 | install: \ |
| 94 | - $(OBJ_FILES) \ | 95 | + ipc3270.dll \ |
| 96 | + ipc3270.lib \ | ||
| 95 | $(LIB3270_NAME).lib | 97 | $(LIB3270_NAME).lib |
| 96 | @echo Building library... | 98 | @echo Building library... |
| 97 | @-mkdir "$(PW3270_SDK_PATH)\lib" | 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 | @lib \ | 111 | @lib \ |
| 99 | /NOLOGO \ | 112 | /NOLOGO \ |
| 100 | - /OUT:"$(PW3270_SDK_PATH)\lib\ipc3270.lib" \ | 113 | + /OUT:"ipc3270.lib" \ |
| 101 | $(OBJ_FILES) | 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 | ipc3270.dll: \ | 116 | ipc3270.dll: \ |
| 110 | $(OBJ_FILES) \ | 117 | $(OBJ_FILES) \ |
| 111 | client\src\core\windows\dynamic\init.obj \ | 118 | client\src\core\windows\dynamic\init.obj \ |
| 112 | $(LIB3270_NAME).lib | 119 | $(LIB3270_NAME).lib |
| 113 | @echo Build dll file.... | 120 | @echo Build dll file.... |
| 114 | - link \ | 121 | + @link \ |
| 115 | /NOLOGO \ | 122 | /NOLOGO \ |
| 116 | /DLL \ | 123 | /DLL \ |
| 117 | /OUT:"$@" \ | 124 | /OUT:"$@" \ |
| 125 | + /IMPLIB:ipc3270.dll.lib \ | ||
| 118 | $(OBJ_FILES) \ | 126 | $(OBJ_FILES) \ |
| 119 | client\src\core\windows\dynamic\init.obj \ | 127 | client\src\core\windows\dynamic\init.obj \ |
| 120 | /DELAYLOAD:$(LIB3270_NAME).dll | 128 | /DELAYLOAD:$(LIB3270_NAME).dll |
| 121 | 129 | ||
| 122 | $(LIB3270_NAME).lib: | 130 | $(LIB3270_NAME).lib: |
| 123 | - lib \ | 131 | + @lib \ |
| 124 | /def:"$(PW3270_SDK_PATH)\def\$(LIB3270_NAME).def" \ | 132 | /def:"$(PW3270_SDK_PATH)\def\$(LIB3270_NAME).def" \ |
| 125 | /out:$(LIB3270_NAME).lib | 133 | /out:$(LIB3270_NAME).lib |
| 126 | 134 | ||
| 127 | clean: | 135 | clean: |
| 128 | del \ | 136 | del \ |
| 129 | - $(LIB3270_NAME).lib \ | ||
| 130 | - $(LIB3270_NAME).dll \ | ||
| 131 | - ipc3270.lib \ | ||
| 132 | - ipc3270.dll \ | 137 | + *.lib \ |
| 138 | + *.dll \ | ||
| 133 | $(OBJ_FILES) \ | 139 | $(OBJ_FILES) \ |
| 134 | client\src\core\windows\dynamic\init.obj \ | 140 | client\src\core\windows\dynamic\init.obj \ |
| 135 | testprogram.* | 141 | testprogram.* |