
Смышленный
  
Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля
Репутация: 9 Всего: 38
|
У меня тут проблема возникла. Я делаю клиент для сайта, для создания новостей. Есть dll-файл, который отправляет новость на сайт. Выглядит следующим образом: | Код | unit uInet;
interface
uses uInetThread, IdHTTP, IdCookieManager;
function GetError(ACode: Integer): string; stdcall; procedure StopPost; stdcall; procedure PostArticle(const ALogin, APassword, ACaption, AText, ADoc, AInLink, ACategory: string; AIsProxy: Boolean; const AProxyAdress: string; AProxyPort: Integer; const AProxyLogin, AProxyPassword: string; ATimeOut: Integer; AHandle, WM_StartPost, WM_EndPost, WM_StatusText: Cardinal); stdcall; function About: string; stdcall; function Copiright: string; stdcall;
procedure DLLEntryPoint(Reason: LongWord);
var FHTTP: TIdHTTP; FCookie: TIdCookieManager; FThread: TInetThread;
implementation
uses Windows, Classes, SysUtils, uInetConsts;
function GetError(ACode: Integer): string; stdcall; begin // возврат строки с описанием ошибки end;
procedure PostArticle(const ALogin, APassword, ACaption, AText, ADoc, AInLink, ACategory: string; AIsProxy: Boolean; const AProxyAdress: string; AProxyPort: Integer; const AProxyLogin, AProxyPassword: string; ATimeOut: Integer; AHandle, WM_StartPost, WM_EndPost, WM_StatusText: Cardinal); stdcall; begin FThread := TInetThread.Create(True); FThread.FreeOnTerminate := False; FThread.FHTTP := FHTTP; FThread.ALogin := ALogin; FThread.APassword := APassword; FThread.ACaption := ACaption; FThread.AText := AText; FThread.ADoc := ADoc; FThread.AInLink := AInLink; FThread.ACategory := ACategory; FThread.AIsProxy := AIsProxy; FThread.AProxyAdress := AProxyAdress; FThread.AProxyPort := AProxyPort; FThread.AProxyLogin := AProxyLogin; FThread.AProxyPassword := AProxyPassword; FThread.ATimeOut := ATimeOut; FThread.FHandle := AHandle; FThread.WM_StartPost := WM_StartPost; FThread.WM_EndPost := WM_EndPost; FThread.WM_StatusText := WM_StatusText; FThread.Resume; end;
procedure StopPost; stdcall; begin if Assigned(FThread) then FThread.Free; FHTTP.CookieManager.CookieCollection.Clear; FThread := nil; end;
procedure DLLEntryPoint(Reason: LongWord); begin case Reason of DLL_PROCESS_ATTACH: // Ïðîãðàììà ïîäêëþ÷àåòñÿ ê DLL begin FHTTP := TIdHTTP.Create(nil); FHTTP.Host := Pg_Host; FHTTP.Port := 80; FCookie := TIdCookieManager.Create(nil); FHTTP.CookieManager := FCookie; FHTTP.HandleRedirects := True; FHTTP.HTTPOptions := []; FHTTP.Request.BasicAuthentication := False; FThread := nil; end; DLL_THREAD_ATTACH: ; DLL_THREAD_DETACH: ; DLL_PROCESS_DETACH: begin if Assigned(FCookie) then FCookie.Free; if Assigned(FHTTP) then FHTTP.Free; FCookie := nil; FHTTP := nil; if Assigned(FThread) then begin FThread.Free; FThread := nil; end; end; end; end;
end.
|
| Код | unit uInetThread;
interface
uses Classes, IdHTTP, IdMultipartFormData, IdGlobal, Messages, Windows;
type TInetThread = class(TThread) public FHTTP: TIdHTTP; ALogin: string; APassword: string; ACaption: string; ADoc: string; AText: string; AInLink: string; ACategory: string; AProxyAdress: string; AProxyPort: Integer; AProxyLogin: string; AProxyPassword: string; ATimeOut: Integer; AIsProxy: Boolean; WM_StartPost: Cardinal; WM_EndPost: Cardinal; WM_StatusText: Cardinal; FHandle: Cardinal; private { Private declarations } FResult: Integer; function DoLogin(const ALogin, APassword: string; AIsProxy: Boolean; const AProxyAdress: string; AProxyPort: Integer; const AProxyLogin, AProxyPassword: string): Integer; function GetDoc(const AUrl: string; out ADoc: Integer): Integer; function PostHDDImage(const ADoc, APath: string; out AUrl: string): Integer; function DoImages(const ADoc: string; var AText: string): Integer; protected procedure Execute; override; end;
implementation
uses SysUtils, uInetConsts;
{ TInetThread }
function TInetThread.DoLogin(const ALogin, APassword: string; AIsProxy: Boolean; const AProxyAdress: string; AProxyPort: Integer; const AProxyLogin, AProxyPassword: string): Integer; var Data: TStringList; ResStr: string; begin Result := -1; if AIsProxy then begin FHTTP.ProxyParams.ProxyServer := AProxyAdress; FHTTP.ProxyParams.ProxyPort := AProxyPort; FHTTP.ProxyParams.ProxyUsername := AProxyLogin; FHTTP.ProxyParams.ProxyPassword := AProxyPassword; end else begin FHTTP.ProxyParams.ProxyServer := ''; FHTTP.ProxyParams.ProxyPort := 0; FHTTP.ProxyParams.ProxyUsername := ''; FHTTP.ProxyParams.ProxyPassword := ''; end; if ATimeOut <= 0 then ATimeOut := 30; Data := TStringList.Create; try Data.Text := C_Login + '=' + ALogin + '&' + C_Password + '=' + APassword; ResStr := ''; try ResStr := FHTTP.Post(pg_Host, Data); if (ResStr = '') or (Pos(C_UnLogin, ResStr) > 0) then Result := 1; except Result := 6; end; finally Data.Free; end; end;
function TInetThread.GetDoc(const AUrl: string; out ADoc: Integer): Integer; var ResStr, sVal: string; Idx: Integer; lUrl: string; begin Result := -1; ADoc := 0; lUrl := AUrl; if lUrl[Length(lUrl)] <> '/' then lUrl := lUrl + '/'; lUrl := lUrl + C_AddNew; ResStr := FHTTP.Get(lUrl); <------------------------------------------------------ ВНИМАНИЕ!!!! if (ResStr = '') or (Pos(C_Doc, ResStr) <= 0) or (Pos(C_AddForm, ResStr) <= 0) then Result := 2; if Result < 0 then begin Idx := Pos(C_Doc, ResStr); if Idx > 0 then begin Inc(Idx, Length(C_Doc)); sVal := ''; while (Idx < Length(ResStr)) and (ResStr[Idx] <>'"') do begin sVal := sVal + ResStr[Idx]; Inc(Idx); end; ADoc := StrToIntDef(sVal, 0); end; end; end;
function TInetThread.PostHDDImage(const ADoc, APath: string; out AUrl: string): Integer; var lData: TIdMultiPartFormDataStream; lResStr, lRes: string; lUrl, lPref: string; Idx: Integer; begin Result := -1; AUrl := ''; lData := TIdMultiPartFormDataStream.Create; try lData.AddFile(C_HDDImage, APath, GetMIMETypeFromFile(APath)); lUrl := ADoc; if lUrl[Length(lUrl)] <> '/' then lUrl := lUrl + '/'; lUrl := lUrl + C_AddImage; lResStr := FHTTP.Post(lUrl, lData); if (lResStr <> '') and (Pos(C_SParseImg, LowerCase(lResStr)) > 0) then begin lRes := ''; Idx := Pos(C_SParseImg, LowerCase(lResStr)) + Length(C_SParseImg) + 1; while lResStr[Idx] <> '''' do begin lRes := lRes + lResStr[Idx]; Inc(Idx); end; lPref := ''; Inc(Idx, 4); while lResStr[Idx] <> '''' do begin lPref := lPref + lResStr[Idx]; Inc(Idx); end; if (lRes = '') or (lPref = '') then Result := 4 else AUrl := lPref + ':' + lRes; end else Result := 3; finally lData.Free; end; end;
function TInetThread.DoImages(const ADoc: string; var AText: string): Integer; var lUrl, lImg, lNewImg: string; Idx: Integer; FImg: Boolean; Num: Integer; lStr, sss: string; begin Result := -1; Num := 0; FHTTP.Host := ADoc; lUrl := ADoc; if lUrl[Length(lUrl)] <> '/' then lUrl := lUrl + '/'; lUrl := lUrl + C_AddImage; FHTTP.Request.Referer := lUrl; Idx := 1; FImg := False; lImg := ''; while Idx < Length(AText) do begin sss := LowerCase(Copy(AText, Idx, Length(C_StartImg))); if (LowerCase(Copy(AText, Idx, Length(C_EndImg))) = C_EndImg) and FImg then begin Inc(Num); lStr := str_DoImages + IntToStr(Num) + str_DoImagesSuf; PostMessage(FHandle, WM_StatusText, Integer(lStr), Length(lStr)); Result := PostHDDImage(ADoc, lImg, lNewImg); if Result >= 0 then Exit; AText := StringReplace(AText, lImg, lNewImg, [rfReplaceAll, rfIgnoreCase]); Idx := Idx - Length(lImg) + Length(lNewImg) - 1; FImg := False; lImg := ''; end; if FImg then lImg := lImg + AText[Idx]; if (LowerCase(Copy(AText, Idx, Length(C_StartImg))) = C_StartImg) and not FImg then begin FImg := True; Inc(Idx, Length(C_StartImg) - 1); end; sss := ''; Inc(Idx); end; end;
procedure TInetThread.Execute; var lDocID: Integer; lTxt: string; lData: TStream; lUrl: string; lCat: Integer; lResStr: string; lStr: string; begin if (FHandle > 0) and (WM_StartPost > 0) then PostMessage(FHandle, WM_StartPost, 0, 0); try FHTTP.ReadTimeout := 1000 * ATimeOut; FHTTP.Request.Referer := pg_Host; FHTTP.AllowCookies := True; FHTTP.CookieManager.CookieCollection.Clear; PostMessage(FHandle, WM_StatusText, Integer(PChar(str_Auths)), Length(str_Auths)); FResult := DoLogin(ALogin, APassword, AIsProxy, AProxyAdress, AProxyPort, AProxyLogin, AProxyPassword); if FResult >= 0 then Exit; PostMessage(FHandle, WM_StatusText, Integer(PChar(str_GetDocs)), Length(str_GetDocs)); FResult := GetDoc(ADoc, lDocID); if FResult >= 0 then Exit; lTxt := AText; PostMessage(FHandle, WM_StatusText, Integer(PChar(str_StartImages)), Length(str_StartImages)); FResult := DoImages(ADoc, lTxt); if FResult >= 0 then Exit; PostMessage(FHandle, WM_StatusText, Integer(PChar(str_DoText)), Length(str_DoText)); lTxt := StringReplace(lTxt, '&', '%26', [rfReplaceAll]); FHTTP.Host := Pg_Host; lUrl := ADoc; if lUrl[Length(lUrl)] <> '/' then lUrl := lUrl + '/'; lUrl := lUrl + C_AddNew; FHTTP.Request.Referer := lUrl; FHTTP.Request.ContentType := 'application/x-www-form-urlencoded'; FHTTP.Request.AcceptCharSet := 'windows-1251,utf-8;q=0.7,*;q=0.7'; FHTTP.Request.AcceptEncoding := 'gzip,deflate'; FHTTP.Request.AcceptLanguage := 'ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3'; FHTTP.Request.Accept := 'text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5'; lStr := C_Caption + '=' + ACaption + '&' + C_Text + '=' + lTxt; lData := TStringStream.Create(lStr); try FHTTP.HTTPOptions := [hoForceEncodeParams]; lResStr := FHTTP.Post(C_PostNews, lData); FHTTP.HTTPOptions := []; if lResStr = '' then FResult := 5; finally lData.Free; end; finally if (FHandle > 0) and (WM_StartPost > 0) then begin if FResult < 0 then FResult := 0; PostMessage(FHandle, WM_EndPost, FResult, 0); end; end; end;
end.
|
Проблема заключается в следующем. Во втором листинге есть строка, помеченная "<------------------- Внимание!!!". Эта строка получает проверяет наличие поределенного адреса. Работает так: адреса на сайте представляют из себя следующее - http://адрес_страницы.host.ru. В программе я добавляю окончание "/addnews", чтобы быть уверенным, что пользователь авторизован и страница существует. При отправке первой новости все проходит отлично. В ResStr заностится содержание страницы. А вот при последующих отправках (с новыми данными) - приходит абракадабра: | Код | #$1F'‹'#8#0#0#0#0#0#0#3'Ü[ÝsÛF’^ý'#$15'cl] �D‚¤ü)‘temo6W–ãÚhëîÊçr'#$D'�!‰'#8#4'¸À@²¼·Y^|9gו³“ujoïá'#$1E#2'ÓBD“"DR›rRò�¯'#7'_'#$1C'‚ ÄPޝj]e›3ÓóëžžžAñÜõ�®mþóí'#$1B'¨N'#$1B#$1A'ºý›_Üüð'#$1A#$12'2’ô�«×$éúæuôO¿Úܸ‰òÙ'#$1C'Ú4±n©T5t¬IÒ�[Â'#2'‚?B�Òæš$íììdwV³†Y“6-Ýgxy'#6#$10'þÌP®wV¡ŠP^(úLï74Ý*¥Àä¯\¹'#$12'ô'#$16'�†õZI ºÀÈ×âR'#$19'D(Ö'#9'Vʾ,EªR�”ºÑD'#$19't˸…7HQ'#$A'*'#3'‚'#6'¡'#$18'1V'#$19'ò[[Ý.'#9'×'#$C'�'#$12'�f6w›D@rP*'#9'”ܧ'#$12'c½Žä:6-BK;ª®'#$18';V&_¸�'#$17'�Ä'#3'ê¸AJÂ'#$16'ÙÝ1LÅâ`˜$©´'#$A'±dSm²áàÈ'#3'‰G'#$1D'4UßB&Ñ'#0'ˆîjĪ'#$13'B'#5'DAÔPBÙ'#2'n'#$D'¢¨¸$`'#$D'Æ©n’êØXêz#kÚŒPRH'#$15'Û'#$1A'•¬-¢'#$11'šõûþ´œ'#$1A'D·ß'#5#$1F'ƒÖ‰9Îè\&sG¢'#$F'o ‹wRÞ*I0¾CtEÞÍdæaÛ4U�ÎÆØ'=ÃèÖ±®Ô‰¦ÌÆ-¢žÊ°n˜T¶)RefÒ'#1'Oµ�kD‚šé<ªx›õÈúD'#$11'l°6'#2#$10'Ñ'#$17'ü'#$13'¼�ƒZ±¼�M¤'#$18'`[%‘¯'#$10'I\/J'#1'ÅÌ XQÌ’8)Ó‰PB'#2'J@–)§iö‰%Y'#$14'›4û‰uU';«Bù-¡‚Ÿ©'#$18'ØT¦'#1'Ÿ'#9'¼R‘'#$D'…¼u™Ák³úé"'#$17'¥È�'#$17'+†²‹T¥$Tj'#$19'pº”˜™U!䯨Û~Ó'#$16's-'#$C#5'*'#$12'MMUVõª‘ÞȰ…˜gT«‘*Ýð'#1'ã'#1'Œ'#7#$12#7#$14'Fí'#4'#'#6#$17'®a'#$B'6±X\äo:±G/G{'#$11'Nr(ÚZÔÙÖ'#$12'2ÀòŠÚ|8P'#9'�Ë '#$18'²'#$1A#9'áï5þÞÇØ'#$14'%M'#$1D'C:µ¯„•†'#$A'[êýƒv¯='#$18'öÛ}¯åôÚn'#$C'÷#Ñ'#$14'˜i¡üÈ{î´ÚÃר絼Áðõ¤pÜ`Ì'#2'ü'#0'[°ÿo©Bù�Î ëô:íS £1¬™'#4'æþÏÎËîñÄèŒÓü»Óuûî›S¨ž'#$D'Ž»Œù‰D�÷Ÿ÷�^Ïsyº¢dkå·1ÿ¶EL+'#$1A#$1D'¼Eí'#$A#$16'ÊÁÿ©FàÛr#Ó4”ŠanáIÀÆnˆ&”'#$F'½½ç^¿ãœ'#4'ô'#0'oiXas1'#$15'Hª'#$18'ÆV'#3'›[–PÞw:]g/mÂF�L¥'#$19#$15'í¶_õŽ]´'#7'ã{ìž„ÙÀªv’ˆAû¡÷jx¢¶†'#$1F'¯Y'!Å$='#7'V�÷òd]™W©V…r«ÓÍ"'#9'%a9'#$F#$13'S'#$1E#3'i'#$12'Ò7§Ø™Y'#4'›r½j˜� <f¿`ϧu'#3#$1A'k, À2'#$13'2f'#$13'tˆ}Y¹¨êM›÷ñB'#$18'´þ6ösAí6Öl¨>ôÚƒŽ?'#$C'pº²'#$D'�ju‘ÖU+'#$1B'4—D¿]\ú'#$1D'W)Šë¿g=*šmNvHÐ'#6'ýY'#7'i\6Ë®4T'#$1A#$B'U±)e±G(Ö§Ÿú'#$1D'$¦?œ5‚Í }¹�æw(ó¬›'#$1F'ÝÎ'#$14'rhÏëx-~'#6'Në,”Ÿz-f¦Þ¸1„ýüH$Ȇf˜k?¿öËÂjau=±ÕTìÚƒØøC¿ú'#$D'ê9ß»]ôo΋£s#\ε¼'#$D#7'“bÙ-çûö„2iÒ'#6'¦'#2'†<ZÇÁ†s'#7'ßeP'#$13'æ?F+”'#1'EÔî'#$D'Ý~ÏM[§³Š'#0'1)~ ê'#$19'Ý`V=£,é�„ò'#$1F'Žú=§‹FÛû|2qqìi’ð¤Ó¶ûYÙâŠaS8éŒð¾|î¡ÖÀ=@kKóÃn'#$19'ú–mZÜ'#$A'øÂëuŽúƒãù1«&!°íËÜØÿ¹ß†í0?&ì�'#0'©p&'#$16'TÌ�('#$1B'�†«tw„ùÌóžÿà'#$E'†-o~ئiÔLÜ'#0'»¨eÀ�eƦìö¨'#$11'A#z_ÓÎ2$F£b›vƒ'#$1F'”°j~TC×v3'#$15'bÑŒeTé'#8'úk¯ûºã¡îÑ«ïÛ/ÑÀûëp~'#$1E';¤¢�m¢'#$19'MbŽ8@m&®ž'#$1F#$1C#$E'Ìæ.,~J8‡ôÄ{‰özn«×îÌ�\·'#$1B'0¡UÓ?h@'#$12'U'ÜøüŠ5¢_B#º'#9'�ï}x‹Ð38¾'#$1A'ÍÔÀ{q*l|°‰>`Uó£n'#$13'™'#$1A'܈·ÜÎÐëÏ�g'#$12'¬ùC1‚ü“ët_÷œ7èÛö~ïÄ'#3'ÄÉÐͺA'#$D'æ1! Ôm̯¡¨'#5#$1D'õ½3̦E´j´Xy3|æ'#$1C' gîs'#$17'}Õ÷^ô�ƒ'#3'8_�a9ÙTƒ :iÄ ®š†šj'#$10'“›;œÐØX'#$1F'»Ùì(Ì'#$C#$11'øÈÂ�6ÃÐ��ž3'#$15'¬ë,pçØ¦…³†B'#$C'=82SlB4Z'#$12'îUØqŽ…��ÚX'#6#1'Êùø'#$10'áÃç'#$B'¹û«¹\¶¦V'#5#4'Þ[!'#$10'=æ‚0'#$F'�d'#$1B'�û9a&+G'#$19#3'\#|T'#$14'ÕCØ×Hf'#5' œJ '#4#3#$1B'Ž…™�àìA"|cUñ±Š'#$15'Ò')‰TU5’„òëb,¿4'#$1B'Xè¨Z'#$12'-¨Œá‚âŒxö'#3'UN±º'#$11#$1A'+Í'#6'ÖÄZ#)›_'#$17'ƒù¥©`'#$11#$12'Ñ'#$15'a'#$C'˜¹»$°_'#$17#3'û¥4`ßÜÇ'>>h'#$18'pÐh'#8''뤚†ždí×ŬýÒl'#3#4'ÛX'#$12'‹UÅP¬0'#$1B'’'#$C'þ•ªÛ$�'#$16'ULjQÅl¨Û*¬ë'#4'¤_'#$17'ãù¥ÙÀü-QHÙ&c0¿ôãÁ¿&H'#0#7'W'#7#$11'°_:Ý'#$1A#$12'΄w'#$18''9BÎ'#$F'*;Ø'#4'Ž‘'#$13#$C'|àÈ'#5'r”*ÍPbš*l²»Ì'#$13'ú9uKÊK'#$17's¹ûà'#$10'ïåsùì'Í'#$1A'ÚQ'#$15'Z/A-ª'#$13'µV§%hŒœd'#$E'a'#$D'\í¸/ÜÞžÓg{i'#$1B'ö!a'#6'¿É9zj'#$18'Z'#5'óº%¼aj\Æ¥IËÁ�Ô'#1'†â§?⬓61�'#2#$13'³'#$12'^¯%×+§Ø8E±’’´¬'#4'¸ãÙ”¦aqé”èh'#$1E'fK¢ƒúB’›'#$E'F¢'#$19'ò–àK'#7'%¢¨t2)'#$D#$D'M¬'#$13'�'#$1F'îÉÌLHÉXFŒãb˜'#8'yêìûyÜP™¶?'#$1A'ø¾Fô'#$1A'˜‹p)'#$17'_»„'#$13#$1A'{¹'#$A'Å5!1GQ£³!¤Îb<‰£›�µmCU'#$16'sKë,ç#kª¼5Öªê'#$16'1é¢(ÛT\)¬ –ü'#1'ÚɈ?³%hŠï¦*'#$15#9'º'#6'QA°'#$A'„B^ˆ–�Pˆ#„·+®bÈâJ~.q¡ë|âŽû¶ñ´â¸‹úÿœHÛÔÄ•ÕÄÈ„7"ŸA„é/'#1'KŸ'#$1F'M½4JŒ'#$18'»i|ç3Ìò³*‚z'#$E'ºá'’gÔˆÑþ´'#$1A#5'/'#$16'²pôÕ'#$17'ùkN«ŽMU¯1™ì¦f`'#5'‚-“®•mÖ›WÁ£äÅ'#$15'$'#6'M,Äd¥@Æ'#$B'¹ÜJ$cáÒ'#5#$18#$18'£Y*°Jv'#8'`¿Ä©ÃôWçewÖ±a\ßùlû;ëéÓÝqúÃvovËõaÿ–W{eÒ'#$B'Fcv¼çvÙ˜'#$D'ÝÎ`'#8'Ç÷~ïø`Öq«'#$18'šòîm`V]X:³ÝòfÖF¥'#$18'˜¾s}ì©ú|åí½rû�ÞQ¤Ò¬šØ:D”àŽßý'#2'µ¦*óGg>],jª[?íâ'#$1C'‹ª‹,hÃp´'#$1A'…jcaœ_(í[X'#$18''#$15'¥¨O'#$C#$12'D�£hRµÆ^ùpq ß'#$12'†�á`<'#$1E#$C'½W½v'æéÓÄ!à—ÃÃ~àçZ¨ïìƒÍ�G�r�È['#$15'ã~Ìäž‚52'#$A'6óÜ'#$14'ªÕÅs'#$10'éØ'#$D'ˆ³,p¶îˆAT,Þ½#†=Å»Y'#$1F'“(K¿;�ØÄ@h'#$11'ú>…)«Ø”@ü¥Z¸¢'#$11'…mOñï¥õß'#$13'Í"§B™¤al“4´¥à¦'#$11#$15'-¢'#$11'™FzšX@'#$11'MIˆ~ÁÌ'#7'¹³HÿœP¾ƒZÇÏÝ~{èF#x·'#$18'fØ’Ôù('#$1F'”Þ\ˆS<éí«£œM:Áy¡üUßÓÚ-v[—NrA(?q»Þ^{*ÅE¡Ì'#$16'cæ°ßîzߺ½ö›i”—„òíkè0Ìq'#$1E'O#»,”Ÿ'#$D'
|
Я так понимаю - это в сжатом виде приходит. Но почему и как это исправить? Ведь на первый запрос все нормально приходит!!! P.S.: заметил еще странность. Если использую прокси (в моем случае - httpTracer), то данной ошибки нет... Это сообщение отредактировал(а) aktuba - 30.1.2007, 05:22
|