Commit 2c5467eb44909f6eebba3f004c35a7a512fdde15
1 parent
b4a8defb
Exists in
master
and in
3 other branches
Working on C++ library.
Showing
2 changed files
with
68 additions
and
14 deletions
Show diff stats
src/lib3270++/abstract.cc
| ... | ... | @@ -47,8 +47,8 @@ |
| 47 | 47 | Abstract::Session::Session() { |
| 48 | 48 | |
| 49 | 49 | #ifdef HAVE_ICONV |
| 50 | - this->iconv.local = (iconv_t) (-1); | |
| 51 | - this->iconv.host = (iconv_t) (-1); | |
| 50 | + this->converter.local = (iconv_t) (-1); | |
| 51 | + this->converter.host = (iconv_t) (-1); | |
| 52 | 52 | #endif |
| 53 | 53 | |
| 54 | 54 | this->baddr = 0; |
| ... | ... | @@ -59,11 +59,11 @@ |
| 59 | 59 | |
| 60 | 60 | #ifdef HAVE_ICONV |
| 61 | 61 | |
| 62 | - if(this->iconv.local != (iconv_t) (-1)) | |
| 63 | - iconv_close(this->iconv.local); | |
| 62 | + if(this->converter.local != (iconv_t) (-1)) | |
| 63 | + iconv_close(this->converter.local); | |
| 64 | 64 | |
| 65 | - if(this->iconv.host != (iconv_t) (-1)) | |
| 66 | - iconv_close(this->iconv.host); | |
| 65 | + if(this->converter.host != (iconv_t) (-1)) | |
| 66 | + iconv_close(this->converter.host); | |
| 67 | 67 | |
| 68 | 68 | #endif |
| 69 | 69 | |
| ... | ... | @@ -74,21 +74,21 @@ |
| 74 | 74 | |
| 75 | 75 | #ifdef HAVE_ICONV |
| 76 | 76 | |
| 77 | - if(this->iconv.local != (iconv_t) (-1)) | |
| 78 | - iconv_close(iconv.local); | |
| 77 | + if(this->converter.local != (iconv_t) (-1)) | |
| 78 | + iconv_close(converter.local); | |
| 79 | 79 | |
| 80 | - if(this->iconv.host != (iconv_t) (-1)) | |
| 81 | - iconv_close(iconv.host); | |
| 80 | + if(this->converter.host != (iconv_t) (-1)) | |
| 81 | + iconv_close(converter.host); | |
| 82 | 82 | |
| 83 | 83 | if(strcmp(local,remote)) { |
| 84 | 84 | |
| 85 | 85 | // Local and remote charsets aren't the same, setup conversion |
| 86 | - iconv.local = iconv_open(local, remote); | |
| 87 | - iconv.host = iconv_open(remote,local); | |
| 86 | + converter.local = iconv_open(local, remote); | |
| 87 | + converter.host = iconv_open(remote,local); | |
| 88 | 88 | |
| 89 | 89 | } else { |
| 90 | 90 | // Same charset, doesn't convert |
| 91 | - iconv.local = iconv.host = (iconv_t)(-1); | |
| 91 | + converter.local = converter.host = (iconv_t)(-1); | |
| 92 | 92 | } |
| 93 | 93 | |
| 94 | 94 | #else |
| ... | ... | @@ -100,6 +100,51 @@ |
| 100 | 100 | |
| 101 | 101 | } |
| 102 | 102 | |
| 103 | + /// @brief Converte charset. | |
| 104 | + std::string Abstract::Session::convertCharset(iconv_t &converter, const char *str) { | |
| 105 | + | |
| 106 | + std::string rc; | |
| 107 | + | |
| 108 | +#ifdef HAVE_ICONV | |
| 109 | + size_t in = strlen(str); | |
| 110 | + | |
| 111 | + if(in && converter != (iconv_t)(-1)) { | |
| 112 | + | |
| 113 | + size_t out = (in << 1); | |
| 114 | + char * ptr; | |
| 115 | + char * outBuffer = (char *) malloc(out); | |
| 116 | + char * inBuffer = (char *) str; | |
| 117 | + | |
| 118 | + memset(ptr=outBuffer,0,out); | |
| 119 | + | |
| 120 | + iconv(converter,NULL,NULL,NULL,NULL); // Reset state | |
| 121 | + | |
| 122 | + if(iconv(converter,&inBuffer,&in,&ptr,&out) != ((size_t) -1)) | |
| 123 | + rc.assign(outBuffer); | |
| 124 | + | |
| 125 | + free(outBuffer); | |
| 126 | + | |
| 127 | + } | |
| 128 | + | |
| 129 | +#else | |
| 130 | + | |
| 131 | + rc = str; | |
| 132 | + | |
| 133 | +#endif // HAVE_ICONV | |
| 134 | + | |
| 135 | + return rc; | |
| 136 | + } | |
| 137 | + | |
| 138 | + /// @brief Converte string recebida do host para o charset atual. | |
| 139 | + std::string Abstract::Session::convertFromHost(const char *str) const { | |
| 140 | + return convertCharset(const_cast<Abstract::Session *>(this)->converter.local,str); | |
| 141 | + } | |
| 142 | + | |
| 143 | + /// @brief Converte string do charset atual para o charset do host. | |
| 144 | + std::string Abstract::Session::convertToHost(const char *str) const { | |
| 145 | + return convertCharset(const_cast<Abstract::Session *>(this)->converter.host,str); | |
| 146 | + } | |
| 147 | + | |
| 103 | 148 | |
| 104 | 149 | } |
| 105 | 150 | ... | ... |
src/lib3270++/private.h
| ... | ... | @@ -72,9 +72,12 @@ |
| 72 | 72 | /// @brief Convert string from local codepage to host codepage. |
| 73 | 73 | iconv_t host; |
| 74 | 74 | |
| 75 | - } iconv; | |
| 75 | + } converter; | |
| 76 | 76 | #endif |
| 77 | 77 | |
| 78 | + /// @brief Converte charset. | |
| 79 | + static std::string convertCharset(iconv_t &converter, const char *str); | |
| 80 | + | |
| 78 | 81 | protected: |
| 79 | 82 | |
| 80 | 83 | /// @brief Current in/out position. |
| ... | ... | @@ -86,6 +89,12 @@ |
| 86 | 89 | /// @brief Setup charsets |
| 87 | 90 | void setCharSet(const char *remote, const char *local = SYSTEM_CHARSET); |
| 88 | 91 | |
| 92 | + /// @brief Converte string recebida do host para o charset atual. | |
| 93 | + std::string convertFromHost(const char *str) const; | |
| 94 | + | |
| 95 | + /// @brief Converte string do charset atual para o charset do host. | |
| 96 | + std::string convertToHost(const char *str) const; | |
| 97 | + | |
| 89 | 98 | }; |
| 90 | 99 | |
| 91 | 100 | } | ... | ... |