Hi,

I'm having problems getting idHTTP (from indy 10.5.8) to work due to a bug that causes the follow function not to work under Ubuntu (or any Linux platform i guess). It works under Windows however. I've been corresponding with Remy Lebeau since 2 weeks ago on this issue, you can find a list of emails on the Indy Dev Yahoo Group - http://tech.groups.yahoo.com/group/Indy-Dev-Public/messages (last post here - http://tech.groups.yahoo.com/group/Indy-Dev-Public/message/6445).

Has anyone of you encountered a similar problem?

Grateful for any comments.  Thanks.


function TIdMBCSEncoding.GetCharCount(Bytes: PByte; ByteCount: Integer): Integer;
{$IFDEF USE_ICONV}
var
 LChars: array[0..3] of WideChar;
 LBytesPtr, LCharsPtr: PAnsiChar;
 LByteCount, LCharsSize: size_t;
{$ENDIF}
begin
 {$IFDEF USE_ICONV}
// RLebeau: iconv() does not allow for querying a pre-calculated character count // for the input like Microsoft does, so have to determine the max characters
 // by actually encoding the Ansi data to a real buffer.  We'll encode to a
 // small local buffer so we don't have to use a lot of memory...
 Result := 0;
 LBytesPtr := PAnsiChar(Bytes);
 LByteCount := ByteCount;
 while LByteCount > 0 do
 begin
   LCharsPtr := PAnsiChar(@LChars[0]);
   LCharsSize := SizeOf(LChars);
//Kylix has an odd definition in iconv. In Kylix, __outbytesleft is defined as a var //while in FreePascal's libc and our IdIconv units define it as a pSize_t if iconv(FToUTF16, @LBytesPtr, @LByteCount, @LCharsPtr, {$IFNDEF KYLIX}@{$ENDIF}LCharsSize) = size_t(-1) then
   begin
     Result := 0;
     Exit;
   end;
// LBufferCount was decremented by the number of bytes stored in the output buffer
   Inc(Result, (SizeOf(LChars)-LCharsSize) div SizeOf(WideChar));
 end;
 {$ELSE}
   {$IFDEF WINDOWS}
Result := MultiByteToWideChar(FCodePage, FMBToWCharFlags, PAnsiChar(Bytes), ByteCount, nil, 0);
   {$ELSE}
ToDo('GetCharCount() method of TIdMBCSEncoding class is not implemented for this platform yet'); {do not localize}
   {$ENDIF}
 {$ENDIF}
end;


{$IFDEF USE_ICONV}
constructor TIdMBCSEncoding.Create(const CharSet: AnsiString);
const
 // RLebeau: iconv() does not provide a maximum character byte size like
 // Microsoft does, so have to determine the max bytes by manually encoding
 // an actual Unicode codepoint.  We'll encode the largest codepoint that
 // UTF-16 supports, $10FFFD, for now...
 cValue: array[0..1] of Word = ($DBFF, $DFFD);
begin
     writelog('sys', 'Main', #9 + '0' + #9 + '1TIdMBCSEncoding.Create');
       writelog('sys', 'Main', #9 + '0' + #9 + 'CharSet:'+CharSet);
 inherited Create;
 FCharSet := CharSet;
// FToUTF16 := iconv_open(PAnsiChar(CharSet), 'UTF-16'); {do not localize} // FFromUTF16 := iconv_open('UTF-16', PAnsiChar(CharSet)); {do not localize} FToUTF16 := iconv_open('UTF-16', PAnsiChar(CharSet)); {do not localize} //amended by joshua on remy's instruction FFromUTF16 := iconv_open(PAnsiChar(CharSet), 'UTF-16'); {do not localize} //amended by joshua on remy's instruction

 if (FToUTF16 = iconv_t(-1)) or (FFromUTF16 = iconv_t(-1)) then begin
   if FToUTF16 <> iconv_t(-1) then begin
     iconv_close(FToUTF16);
     FToUTF16 := iconv_t(-1);
   end;
   if FFromUTF16 <> iconv_t(-1) then begin
     iconv_close(FFromUTF16);
     FFromUTF16 := iconv_t(-1);
   end;
   raise EIdException.CreateResFmt(@RSInvalidCharSet, [CharSet]);
 end;

 FMaxCharSize := GetByteCount(PWideChar(@cValue[0]), 2);
 FIsSingleByte := FMaxCharSize = 1;
end;
--
_______________________________________________
Lazarus mailing list
[email protected]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus

Reply via email to