Commit ee9aad5f5798b938fa6f3ebbb7ada6d47678a95e

Authored by perry.werneck@gmail.com
1 parent f4f81190

Correcao na conversao de codepage em windows

Showing 1 changed file with 26 additions and 13 deletions   Show diff stats
@@ -160,16 +160,9 @@ LIB3270_EXPORT const char * lib3270_win32_strerror(int e) @@ -160,16 +160,9 @@ LIB3270_EXPORT const char * lib3270_win32_strerror(int e)
160 return buffer; 160 return buffer;
161 } 161 }
162 162
163 - trace("%s",buffer);  
164 -  
165 #ifdef HAVE_ICONV 163 #ifdef HAVE_ICONV
166 { 164 {
167 // Convert from windows codepage to UTF-8 pw3270´s default charset 165 // Convert from windows codepage to UTF-8 pw3270´s default charset
168 - char tmpbuffer[4096];  
169 - size_t in = strlen(buffer);  
170 - size_t out = 4095;  
171 - char * ptr = tmpbuffer;  
172 -  
173 iconv_t hConv = iconv_open("UTF-8",lib3270_win32_local_charset()); 166 iconv_t hConv = iconv_open("UTF-8",lib3270_win32_local_charset());
174 167
175 trace("[%s]",buffer); 168 trace("[%s]",buffer);
@@ -178,23 +171,43 @@ LIB3270_EXPORT const char * lib3270_win32_strerror(int e) @@ -178,23 +171,43 @@ LIB3270_EXPORT const char * lib3270_win32_strerror(int e)
178 { 171 {
179 lib3270_write_log(NULL,"iconv","%s: Error creating charset conversion",__FUNCTION__); 172 lib3270_write_log(NULL,"iconv","%s: Error creating charset conversion",__FUNCTION__);
180 } 173 }
181 - else if(iconv(hConv,(const char **) &buffer,&in,&ptr,&out) != ((size_t) -1)) 174 + else
182 { 175 {
183 - // strncpy(buffer,tmpbuffer,4096);  
184 - } 176 + size_t in = strlen(buffer);
  177 + size_t out = (in << 1);
  178 + char * ptr;
  179 + char * outBuffer = (char *) malloc(out);
  180 + ICONV_CONST char * inBuffer = (ICONV_CONST char *) buffer;
185 181
186 - trace("[%s]",buffer); 182 + memset(ptr=outBuffer,0,out);
  183 +
  184 + iconv(hConv,NULL,NULL,NULL,NULL); // Reset state
  185 +
  186 + if(iconv(hConv,&inBuffer,&in,&ptr,&out) != ((size_t) -1))
  187 + {
  188 + strncpy(buffer,outBuffer,4095);
  189 + }
  190 +
  191 + free(outBuffer);
  192 +
  193 + iconv_close(hConv);
  194 + }
187 195
188 - iconv_close(hConv);  
189 } 196 }
190 #endif // HAVE_ICONV 197 #endif // HAVE_ICONV
191 198
192 - trace("[%s]",buffer);  
193 return buffer; 199 return buffer;
194 } 200 }
195 201
196 LIB3270_EXPORT const char * lib3270_win32_local_charset(void) 202 LIB3270_EXPORT const char * lib3270_win32_local_charset(void)
197 { 203 {
  204 + // Reference:
  205 + // http://msdn.microsoft.com/en-us/library/windows/desktop/dd318070(v=vs.85).aspx
  206 +
  207 + #warning TODO: Use GetACP() to identify the correct code page
  208 +
  209 + trace("Windows CHARSET is %u",GetACP());
  210 +
198 return "CP1252"; 211 return "CP1252";
199 } 212 }
200 213