OSDN Git Service

・InternalPrint, InternalDebugPrint を追加。
[gikonavigoeson/gikonavi.git] / ExternalBoardPlugInMain.pas
1 unit ExternalBoardPlugInMain;
2
3 interface
4
5 uses
6         Windows, Classes, SysUtils,
7         IdHTTP, IdComponent, IdGlobal, IdException,
8         AbonUnit;
9
10 type
11
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);
14
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);
17
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[
27         ); stdcall;
28
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Þ
35
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
43
44 function CreateResultString(
45         resultStr : string
46 ) : PChar; stdcall;
47
48 procedure DisposeResultString(
49         resultStr : PChar
50 ); stdcall;
51
52 implementation
53
54 uses ExternalBoardManager, ExternalThreadItem, GikoSystem, BoardGroup, Giko;
55
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(
60         resultStr : string
61 ) : PChar; stdcall;
62 var
63         tmp : PChar;
64 begin
65
66         tmp := PChar( resultStr );
67         GetMem( Result, Length( tmp ) + 1 );
68         Move( tmp^, Result^, Length( tmp ) + 1 );
69
70 end;
71
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(
76         resultStr : PChar
77 ); stdcall;
78 begin
79
80         FreeMem( resultStr );
81
82 end;
83
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[
93 ); stdcall;
94 begin
95
96         {$IFDEF DEBUG}
97         Writeln('ExternalBoardManager.VersionInfo');
98         {$ENDIF}
99         outAgent                := CreateResultString( PChar( APP_NAME ) );
100         outMajor                := 1;
101         outMinor                := 0;
102         outRelease      := CreateResultString( PChar( BETA_VERSION_NAME_E ) );
103         outRevision     := BETA_VERSION;
104
105 end;
106
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
112 ); stdcall;
113 begin
114
115         GikoForm.AddMessageList( inMessage, nil, gmiWhat );
116
117 end;
118
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
124 ); stdcall;
125 begin
126
127         {$IFDEF DEBUG}
128         Writeln( inMessage );
129         {$ENDIF}
130
131 end;
132
133 // *************************************************************************
134 // \83\\83P\83b\83g\82ð\8f\89\8aú\89»\82·\82é(\8eG\97p\8aÖ\90\94)
135 // *************************************************************************
136 procedure       InitializeSocket(
137         inSocket : TIdHTTP
138 );
139 begin
140
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;
149
150                 // \92Ê\90M\82É\8aÖ\82·\82é\90Ý\92è
151                 inSocket.Request.CustomHeaders.Clear;
152                 inSocket.Response.Clear;
153                 inSocket.Request.Clear;
154
155                 inSocket.Request.UserAgent      := GikoSys.GetUserAgent;
156                 inSocket.RecvBufferSize                 := Gikosys.Setting.RecvBufferSize;
157                 inSocket.ProxyParams.BasicAuthentication := False;
158                 {$IFDEF DEBUG}
159                 Writeln('------------------------------------------------------------');
160                 {$ENDIF}
161                 //inSocket.AllowCookies := False;
162                 if GikoSys.Setting.ReadProxy then begin
163                         if GikoSys.Setting.ProxyProtocol then
164                                 inSocket.ProtocolVersion := pv1_1
165                         else
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;
173                         {$IFDEF DEBUG}
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 ));
177                         {$ENDIF}
178                 end else begin
179                         if GikoSys.Setting.Protocol then
180                                 inSocket.ProtocolVersion := pv1_1
181                         else
182                                 inSocket.ProtocolVersion := pv1_0;
183                         inSocket.ProxyParams.ProxyServer                := '';
184                         inSocket.ProxyParams.ProxyPort                  := 80;
185                         inSocket.ProxyParams.ProxyUsername      := '';
186                         inSocket.ProxyParams.ProxyPassword      := '';
187                         {$IFDEF DEBUG}
188                         Writeln('\83v\83\8d\83L\83V\90Ý\92è\82È\82µ');
189                         {$ENDIF}
190                 end;
191         end;
192
193 end;
194
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
205 var
206         httpSocket                              : TIdHTTP;
207         resStream                                       : TMemoryStream;
208         content                                         : string;
209 begin
210
211         {$IFDEF DEBUG}
212         Writeln('ExternalBoardManager.InternalDownload');
213         {$ENDIF}
214         Result := -1;
215
216         httpSocket := TIdHTTP.Create( nil );
217         try
218                 InitializeSocket( httpSocket );
219
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'
226                 else
227                         httpSocket.Request.AcceptEncoding := '';
228                 httpSocket.Request.Accept := 'text/html';
229
230                 resStream := TMemoryStream.Create;
231                 try
232                         try
233                                 resStream.Clear;
234
235                                 {$IFDEF DEBUG}
236                                 Writeln('URL: ' + inURL);
237                                 {$ENDIF}
238                                 httpSocket.Get( inURL, resStream );
239                                 {$IFDEF DEBUG}
240                                 Writeln('\8eæ\93¾\82Å\97á\8aO\82È\82µ');
241                                 {$ENDIF}
242
243                                 content                 := GikoSys.GzipDecompress( resStream, httpSocket.Response.ContentEncoding );
244                                 ioModified      := httpSocket.Response.LastModified;
245
246                                 Result := httpSocket.ResponseCode;
247                                 if (Length( content ) = 0) and (Result = 206) then
248                                         Result := 304;
249
250                                 outResultData := CreateResultString( content );
251                         except
252                                 on E: EIdSocketError do begin
253                                         ioModified              := ZERO_DATE;
254                                         outResultData   := nil;
255                                 end;
256                                 on E: EIdConnectException do begin
257                                         ioModified              := ZERO_DATE;
258                                         outResultData   := nil;
259                                         //Item.ErrText  := E.Message;
260                                 end;
261                                 on E: Exception do begin
262                                         {$IFDEF DEBUG}
263                                         Writeln('\8eæ\93¾\82Å\97á\8aO\82 \82è');
264                                         Writeln('E.Message: ' + E.Message);
265                                         {$ENDIF}
266                                         ioModified              := ZERO_DATE;
267                                         outResultData   := nil;
268                                         Result                          := httpSocket.ResponseCode;
269                                         //Item.ErrText  := E.Message;
270                                 end;
271                         end;
272                 finally
273                         resStream.Free;
274                 end;
275
276         finally
277                 httpSocket.Free;
278         end;
279
280 end;
281
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
290 var
291         httpSocket                              : TIdHTTP;
292         content                                         : string;
293         resStream                                       : TStringStream;
294         sourceStream                    : TStringStream;
295 begin
296
297         {$IFDEF DEBUG}
298         Writeln('ExternalBoardManager.InternalPost');
299         {$ENDIF}
300         Result := -1;
301
302         httpSocket := TIdHTTP.Create( nil );
303         try
304                 InitializeSocket( httpSocket );
305
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';
310
311                 resStream                       := TStringStream.Create( content );
312                 sourceStream    := TStringStream.Create( string( inSource ) );
313                 try
314                         try
315                                 {$IFDEF DEBUG}
316                                 Writeln('URL: ' + inURL);
317                                 Writeln('Source: ' + inSource);
318                                 {$ENDIF}
319                                 httpSocket.Post( string( inURL ), sourceStream, resStream );
320                                 {$IFDEF DEBUG}
321                                 Writeln('\8eæ\93¾\82Å\97á\8aO\82È\82µ');
322                                 {$ENDIF}
323
324                                 Result := httpSocket.ResponseCode;
325
326                                 outResultData := CreateResultString( resStream.DataString );
327                         except
328                                 on E: EIdSocketError do begin
329                                         outResultData   := nil;
330                                 end;
331                                 on E: EIdConnectException do begin
332                                         outResultData   := nil;
333                                 end;
334                                 on E: Exception do begin
335                                         {$IFDEF DEBUG}
336                                         Writeln('\8eæ\93¾\82Å\97á\8aO\82 \82è');
337                                         Writeln('E.Message: ' + E.Message);
338                                         {$ENDIF}
339                                         outResultData := CreateResultString( resStream.DataString );
340                                         Result                          := httpSocket.ResponseCode;
341                                 end;
342                         end;
343                 finally
344                         resStream.Free;
345                         sourceStream.Free;
346                 end;
347         finally
348                 httpSocket.Free;
349         end;
350
351 end;
352
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 // *************************************************************************
356
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
360
361 ) : PChar; stdcall;                     // \82 \82Ú\81`\82ñ\8dÏ\82Ý\82Ì dat \8c`\8e®\83e\83L\83X\83g
362 var
363         datList : TStringList;
364                 FileName : String;
365 begin
366
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 );
373
374         Result := CreateResultString( datList.Text );
375
376 end;
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 // *************************************************************************
381
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
387 var
388         datString : String;
389                 FileName : String;
390 begin
391
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 );
397
398         Result := CreateResultString( datString );
399
400 end;
401
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
410 var
411         board                           : TBoard;
412         threadItem      : TThreadItem;
413 begin
414
415         // \83_\83~\81[\82Ì\83N\83\89\83X
416         board                           := TBoard.Create;
417         threadItem      := TThreadItem.Create;
418
419         try
420                 threadItem.ParentBoard := Board;
421
422                 Result := ThreadItemDat2HTML( DWORD( threadItem ), inDatRes, inResNo, inIsNew );
423         except
424                 Result := nil;
425         end;
426
427 end;
428
429 exports
430         CreateResultString,
431         DisposeResultString,
432         VersionInfo,
433         InternalPrint,
434         InternalDebugPrint,
435         InternalDownload,
436         InternalPost,
437         InternalAbon,
438         InternalAbonForOne,
439         InternalDat2HTML;
440
441 end.