1 unit ExternalBoardPlugInMain;
6 Windows, Classes, SysUtils,
7 IdHTTP, IdComponent, IdGlobal, IdException,
12 //
\83_
\83E
\83\93\83\8d\81[
\83h
\82ª
\90¬
\8c÷
\82µ
\82½
\82©
\82Ç
\82¤
\82©
13 TDownloadState = (dsWait, dsWork, dsComplete, dsDiffComplete, dsNotModify, dsAbort, dsError);
15 //
\8ew
\92è
\82µ
\82½ URL
\82ð
\82±
\82Ì
\83v
\83\89\83O
\83C
\83\93\82Å
\8eó
\82¯
\95t
\82¯
\82é
\82©
\82Ç
\82¤
\82©
16 TAcceptType = (atNoAccept, atBBS, atBoard, atThread);
18 // *************************************************************************
19 //
\83v
\83\89\83O
\83C
\83\93\82Ì
\83o
\81[
\83W
\83\87\83\93
20 // *************************************************************************
21 TOnVersionInfo = procedure(
22 var outAgent : PChar; //
\83o
\81[
\83W
\83\87\83\93\82ð
\88ê
\90Ø
\8aÜ
\82Ü
\82È
\82¢
\8f\83\90\88\82È
\96¼
\8fÌ
23 var outMajor : DWORD; //
\83\81\83W
\83\83\81[
\83o
\81[
\83W
\83\87\83\93
24 var outMinor : DWORD; //
\83}
\83C
\83i
\81[
\83o
\81[
\83W
\83\87\83\93
25 var outRelease : PChar; //
\83\8a\83\8a\81[
\83X
\92i
\8aK
\96¼
26 var outRevision : DWORD //
\83\8a\83r
\83W
\83\87\83\93\83i
\83\93\83o
\81[
29 // *************************************************************************
30 //
\8ew
\92è
\82µ
\82½ URL
\82ð
\82±
\82Ì
\83v
\83\89\83O
\83C
\83\93\82Å
\8eó
\82¯
\95t
\82¯
\82é
\82©
\82Ç
\82¤
\82©
31 // *************************************************************************
32 TOnAcceptURL = function(
33 inURL : PChar //
\94»
\92f
\82ð
\8bÂ
\82¢
\82Å
\82¢
\82é URL
34 ): TAcceptType; stdcall; // URL
\82Ì
\8eí
\97Þ
36 // *************************************************************************
37 //
\83X
\83\8c\88ê
\97\97\82Ì URL
\82©
\82ç
\83X
\83\8c\83b
\83h
\82Ì URL
\82ð
\93±
\82«
\8fo
\82·
38 // *************************************************************************
39 TOnListURL2ThreadURL = function(
40 inListURL : PChar; //
\83X
\83\8c\88ê
\97\97\82ð
\8e¦
\82µ
\82½ URL
41 inFileName : PChar //
\83X
\83\8c\83b
\83h
\83t
\83@
\83C
\83\8b\96¼
42 ) : PChar; stdcall; //
\83X
\83\8c\83b
\83h
\82Ì URL
44 function CreateResultString(
48 procedure DisposeResultString(
54 uses ExternalBoardManager, ExternalThreadItem, GikoSystem, BoardGroup, Giko;
56 // *************************************************************************
57 //
\96ß
\82è
\92l
\82ª PChar
\82Å
\82 \82é API
\82Ì
\83\81\83\82\83\8a\82ð
\8am
\95Û
\82·
\82é
58 // *************************************************************************
59 function CreateResultString(
66 tmp := PChar( resultStr );
67 GetMem( Result, Length( tmp ) + 1 );
68 Move( tmp^, Result^, Length( tmp ) + 1 );
72 // *************************************************************************
73 //
\96ß
\82è
\92l
\82ª PChar
\82Å
\82 \82é API
\82Ì
\83\81\83\82\83\8a\82ð
\8aJ
\95ú
\82·
\82é
74 // *************************************************************************
75 procedure DisposeResultString(
84 // *************************************************************************
85 //
\83v
\83\8d\83O
\83\89\83\80\96{
\91Ì
\82Ì
\83o
\81[
\83W
\83\87\83\93\82ð
\8eæ
\93¾
\82·
\82é
86 // *************************************************************************
87 procedure VersionInfo(
88 var outAgent : PChar; //
\83o
\81[
\83W
\83\87\83\93\82ð
\88ê
\90Ø
\8aÜ
\82Ü
\82È
\82¢
\8f\83\90\88\82È
\96¼
\8fÌ
89 var outMajor : DWORD; //
\83\81\83W
\83\83\81[
\83o
\81[
\83W
\83\87\83\93
90 var outMinor : DWORD; //
\83}
\83C
\83i
\81[
\83o
\81[
\83W
\83\87\83\93
91 var outRelease : PChar; //
\83\8a\83\8a\81[
\83X
\92i
\8aK
\96¼
92 var outRevision : DWORD //
\83\8a\83r
\83W
\83\87\83\93\83i
\83\93\83o
\81[
97 Writeln('ExternalBoardManager.VersionInfo');
99 outAgent := CreateResultString( PChar( APP_NAME ) );
102 outRelease := CreateResultString( PChar( BETA_VERSION_NAME_E ) );
103 outRevision := BETA_VERSION;
107 // *************************************************************************
108 //
\83\81\83b
\83Z
\81[
\83W
\82ð
\95\
\8e¦
\82·
\82é
109 // *************************************************************************
110 procedure InternalPrint(
111 inMessage : PChar //
\83\81\83b
\83Z
\81[
\83W
115 GikoForm.AddMessageList( inMessage, nil, gmiWhat );
119 // *************************************************************************
120 //
\83f
\83o
\83b
\83O
\83\81\83b
\83Z
\81[
\83W
\82ð
\95\
\8e¦
\82·
\82é
121 // *************************************************************************
122 procedure InternalDebugPrint(
123 inMessage : PChar //
\83\81\83b
\83Z
\81[
\83W
128 Writeln( inMessage );
133 // *************************************************************************
134 //
\83\
\83P
\83b
\83g
\82ð
\8f\89\8aú
\89»
\82·
\82é(
\8eG
\97p
\8aÖ
\90\94)
135 // *************************************************************************
136 procedure InitializeSocket(
141 if inSocket <> nil then begin
142 //
\83C
\83x
\83\93\83g
\82Ì
\90Ý
\92è
143 if Assigned( OnWork ) then
144 inSocket.OnWork := OnWork;
145 if Assigned( OnWorkBegin ) then
146 inSocket.OnWorkBegin := OnWorkBegin;
147 if Assigned( OnWorkEnd ) then
148 inSocket.OnWorkEnd := OnWorkEnd;
150 //
\92Ê
\90M
\82É
\8aÖ
\82·
\82é
\90Ý
\92è
151 inSocket.Request.CustomHeaders.Clear;
152 inSocket.Response.Clear;
153 inSocket.Request.Clear;
155 inSocket.Request.UserAgent := GikoSys.GetUserAgent;
156 inSocket.RecvBufferSize := Gikosys.Setting.RecvBufferSize;
157 inSocket.ProxyParams.BasicAuthentication := False;
159 Writeln('------------------------------------------------------------');
161 //inSocket.AllowCookies := False;
162 if GikoSys.Setting.ReadProxy then begin
163 if GikoSys.Setting.ProxyProtocol then
164 inSocket.ProtocolVersion := pv1_1
166 inSocket.ProtocolVersion := pv1_0;
167 inSocket.ProxyParams.ProxyServer := GikoSys.Setting.ReadProxyAddress;
168 inSocket.ProxyParams.ProxyPort := GikoSys.Setting.ReadProxyPort;
169 inSocket.ProxyParams.ProxyUsername := GikoSys.Setting.ReadProxyUserID;
170 inSocket.ProxyParams.ProxyPassword := GikoSys.Setting.ReadProxyPassword;
171 if GikoSys.Setting.ReadProxyUserID <> '' then
172 inSocket.ProxyParams.BasicAuthentication := True;
174 Writeln('
\83v
\83\8d\83L
\83V
\90Ý
\92è
\82 \82è');
175 Writeln('
\83z
\83X
\83g: ' + GikoSys.Setting.ReadProxyAddress);
176 Writeln('
\83|
\81[
\83g: ' + IntToStr( GikoSys.Setting.ReadProxyPort ));
179 if GikoSys.Setting.Protocol then
180 inSocket.ProtocolVersion := pv1_1
182 inSocket.ProtocolVersion := pv1_0;
183 inSocket.ProxyParams.ProxyServer := '';
184 inSocket.ProxyParams.ProxyPort := 80;
185 inSocket.ProxyParams.ProxyUsername := '';
186 inSocket.ProxyParams.ProxyPassword := '';
188 Writeln('
\83v
\83\8d\83L
\83V
\90Ý
\92è
\82È
\82µ');
195 // *************************************************************************
196 //
\8ew
\92è
\82µ
\82½ URL
\82ð
\83_
\83E
\83\93\83\8d\81[
\83h
\82µ
\82Ä
\95Ô
\82·
197 // *************************************************************************
198 function InternalDownload(
199 inURL : PChar; //
\83_
\83E
\83\93\83\8d\81[
\83h
\82·
\82é URL
200 var ioModified : Double; //
\8dÅ
\8cã
\82É
\8eæ
\93¾
\82µ
\82½
\93ú
\8e\9e
201 var outResultData : PChar; //
\83_
\83E
\83\93\83\8d\81[
\83h
\82³
\82ê
\82½
\95¶
\8e\9a\97ñ
202 inRangeStart : DWORD; //
\8aJ
\8en
\88Ê
\92u
203 inRangeEnd : DWORD //
\8fI
\97¹
\88Ê
\92u
204 ) : Longint; stdcall; //
\83\8c\83X
\83|
\83\93\83X
\83R
\81[
\83h
206 httpSocket : TIdHTTP;
207 resStream : TMemoryStream;
212 Writeln('ExternalBoardManager.InternalDownload');
216 httpSocket := TIdHTTP.Create( nil );
218 InitializeSocket( httpSocket );
220 httpSocket.Request.ContentRangeStart := inRangeStart;
221 httpSocket.Request.ContentRangeEnd := inRangeEnd;
222 if (ioModified <> 0) and (ioModified <> ZERO_DATE) then
223 httpSocket.Request.LastModified := ioModified - OffsetFromUTC;
224 if inRangeStart = 0 then
225 httpSocket.Request.AcceptEncoding := 'gzip'
227 httpSocket.Request.AcceptEncoding := '';
228 httpSocket.Request.Accept := 'text/html';
230 resStream := TMemoryStream.Create;
236 Writeln('URL: ' + inURL);
238 httpSocket.Get( inURL, resStream );
240 Writeln('
\8eæ
\93¾
\82Å
\97á
\8aO
\82È
\82µ');
243 content := GikoSys.GzipDecompress( resStream, httpSocket.Response.ContentEncoding );
244 ioModified := httpSocket.Response.LastModified;
246 Result := httpSocket.ResponseCode;
247 if (Length( content ) = 0) and (Result = 206) then
250 outResultData := CreateResultString( content );
252 on E: EIdSocketError do begin
253 ioModified := ZERO_DATE;
254 outResultData := nil;
256 on E: EIdConnectException do begin
257 ioModified := ZERO_DATE;
258 outResultData := nil;
259 //Item.ErrText := E.Message;
261 on E: Exception do begin
263 Writeln('
\8eæ
\93¾
\82Å
\97á
\8aO
\82 \82è');
264 Writeln('E.Message: ' + E.Message);
266 ioModified := ZERO_DATE;
267 outResultData := nil;
268 Result := httpSocket.ResponseCode;
269 //Item.ErrText := E.Message;
282 // *************************************************************************
283 //
\8ew
\92è
\82µ
\82½ URL
\82Ö
\83f
\81[
\83^
\82ð
\91\97\90M
\82·
\82é
284 // *************************************************************************
285 function InternalPost(
286 inURL : PChar; //
\91\97\90M
\82·
\82é URL
287 inSource : PChar; //
\91\97\90M
\82·
\82é
\93à
\97e
288 var outResultData : PChar //
\95Ô
\82Á
\82Ä
\82«
\82½
\95¶
\8e\9a\97ñ
289 ) : Longint; stdcall; //
\83\8c\83X
\83|
\83\93\83X
\83R
\81[
\83h
291 httpSocket : TIdHTTP;
293 resStream : TStringStream;
294 sourceStream : TStringStream;
298 Writeln('ExternalBoardManager.InternalPost');
302 httpSocket := TIdHTTP.Create( nil );
304 InitializeSocket( httpSocket );
306 httpSocket.Request.CustomHeaders.Add('Pragma: no-cache');
307 httpSocket.Request.AcceptLanguage := 'ja';
308 httpSocket.Request.Accept := 'image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*';
309 httpSocket.Request.ContentType := 'application/x-www-form-urlencoded';
311 resStream := TStringStream.Create( content );
312 sourceStream := TStringStream.Create( string( inSource ) );
316 Writeln('URL: ' + inURL);
317 Writeln('Source: ' + inSource);
319 httpSocket.Post( string( inURL ), sourceStream, resStream );
321 Writeln('
\8eæ
\93¾
\82Å
\97á
\8aO
\82È
\82µ');
324 Result := httpSocket.ResponseCode;
326 outResultData := CreateResultString( resStream.DataString );
328 on E: EIdSocketError do begin
329 outResultData := nil;
331 on E: EIdConnectException do begin
332 outResultData := nil;
334 on E: Exception do begin
336 Writeln('
\8eæ
\93¾
\82Å
\97á
\8aO
\82 \82è');
337 Writeln('E.Message: ' + E.Message);
339 outResultData := CreateResultString( resStream.DataString );
340 Result := httpSocket.ResponseCode;
353 // *************************************************************************
354 //
\82Q
\82¿
\82á
\82ñ
\82Ë
\82é
\82Ì dat
\8c`
\8e®
\82ð
\83\8d\81[
\83J
\83\8b\82 \82Ú
\81`
\82ñ
\82É
\92Ê
\82·
355 // *************************************************************************
357 function InternalAbon(
358 inDatText : PChar; //
\96¼
\91O<>
\83\81\81[
\83\8b<>
\93ú
\95tID<>
\96{
\95¶<>[
\89ü
\8ds]
\82Å
\8d\
\90¬
\82³
\82ê
\82½
\83e
\83L
\83X
\83g
359 inDatPath : PChar // dat
\83t
\83@
\83C
\83\8b\82Ì
\83t
\83\8b\83p
\83X
361 ) : PChar; stdcall; //
\82 \82Ú
\81`
\82ñ
\8dÏ
\82Ý
\82Ì dat
\8c`
\8e®
\83e
\83L
\83X
\83g
363 datList : TStringList;
367 datList := TStringList.Create;
368 datList.Text := string( inDatText );
369 FileName := string( inDatPath );
370 GikoSys.FAbon.IndividualAbon( datList, ChangeFileExt(FileName,'.NG'));
371 GikoSys.FAbon.Execute( datList );
372 GikoSys.FSelectResFilter.Execute( datList );
374 Result := CreateResultString( datList.Text );
377 // *************************************************************************
378 //
\82Q
\82¿
\82á
\82ñ
\82Ë
\82é
\82Ì dat
\8c`
\8e®
\82ð
\83\8d\81[
\83J
\83\8b\82 \82Ú
\81`
\82ñ
\82É
\92Ê
\82·
379 //
\82½
\82¾
\82µ
\81A
\82P
\83\8c\83X
\82¸
\82Â
380 // *************************************************************************
382 function InternalAbonForOne(
383 inDatText : PChar; //
\96¼
\91O<>
\83\81\81[
\83\8b<>
\93ú
\95tID<>
\96{
\95¶<>[
\89ü
\8ds]
\82Å
\8d\
\90¬
\82³
\82ê
\82½
\83e
\83L
\83X
\83g
384 inDatPath : PChar; // dat
\83t
\83@
\83C
\83\8b\82Ì
\83t
\83\8b\83p
\83X
385 inNo : Integer //
\97v
\8b\81\82³
\82ê
\82½
\83\8c\83X
\94Ô
\8d\86
386 ) : PChar; stdcall; //
\82 \82Ú
\81`
\82ñ
\8dÏ
\82Ý
\82Ì dat
\8c`
\8e®
\83e
\83L
\83X
\83g
392 datString := string( inDatText );
393 FileName := string( inDatPath );
394 GikoSys.FAbon.IndividualAbon( datString, ChangeFileExt(FileName,'.NG'), inNo);
395 GikoSys.FAbon.Execute( datString , inNo);
396 GikoSys.FSelectResFilter.Execute( datString , inNo );
398 Result := CreateResultString( datString );
402 // *************************************************************************
403 //
\82Q
\82¿
\82á
\82ñ
\82Ë
\82é
\82Ì dat
\8c`
\8e® 1
\8ds
\82ð HTML
\82É
\95Ï
\8a·
\82·
\82é
404 // *************************************************************************
405 function InternalDat2HTML(
406 inDatRes : PChar; //
\96¼
\91O<>
\83\81\81[
\83\8b<>
\93ú
\95tID<>
\96{
\95¶<>
\82Å
\8d\
\90¬
\82³
\82ê
\82½
\83e
\83L
\83X
\83g
407 inResNo : DWORD; //
\83\8c\83X
\94Ô
\8d\86
408 inIsNew : Boolean //
\90V
\92\85\83\8c\83X
\82È
\82ç True
409 ) : PChar; stdcall; //
\90®
\8c`
\82³
\82ê
\82½ HTML
412 threadItem : TThreadItem;
415 //
\83_
\83~
\81[
\82Ì
\83N
\83\89\83X
416 board := TBoard.Create;
417 threadItem := TThreadItem.Create;
420 threadItem.ParentBoard := Board;
422 Result := ThreadItemDat2HTML( DWORD( threadItem ), inDatRes, inResNo, inIsNew );