Commit 2c5467eb44909f6eebba3f004c35a7a512fdde15

Authored by Perry Werneck
1 parent b4a8defb

Working on C++ library.

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 }
... ...