OSDN Git Service

plugin(一行ずつあぼ〜んの処理が必要なやつ)用の関数追加
[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;
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\\83P\83b\83g\82ð\8f\89\8aú\89»\82·\82é(\8eG\97p\8aÖ\90\94)
109 // *************************************************************************
110 procedure       InitializeSocket(
111         inSocket : TIdHTTP
112 );
113 begin
114
115         if inSocket <> nil then begin
116                 // \83C\83x\83\93\83g\82Ì\90Ý\92è
117                 if Assigned( OnWork ) then
118                         inSocket.OnWork                         := OnWork;
119                 if Assigned( OnWorkBegin ) then
120                         inSocket.OnWorkBegin    := OnWorkBegin;
121                 if Assigned( OnWorkEnd ) then
122                         inSocket.OnWorkEnd              := OnWorkEnd;
123
124                 // \92Ê\90M\82É\8aÖ\82·\82é\90Ý\92è
125                 inSocket.Request.CustomHeaders.Clear;
126                 inSocket.Response.Clear;
127                 inSocket.Request.Clear;
128
129                 inSocket.Request.UserAgent      := GikoSys.GetUserAgent;
130                 inSocket.RecvBufferSize                 := Gikosys.Setting.RecvBufferSize;
131                 inSocket.ProxyParams.BasicAuthentication := False;
132                 {$IFDEF DEBUG}
133                 Writeln('------------------------------------------------------------');
134                 {$ENDIF}
135                 //inSocket.AllowCookies := False;
136                 if GikoSys.Setting.ReadProxy then begin
137                         if GikoSys.Setting.ProxyProtocol then
138                                 inSocket.ProtocolVersion := pv1_1
139                         else
140                                 inSocket.ProtocolVersion := pv1_0;
141                         inSocket.ProxyParams.ProxyServer                := GikoSys.Setting.ReadProxyAddress;
142                         inSocket.ProxyParams.ProxyPort                  := GikoSys.Setting.ReadProxyPort;
143                         inSocket.ProxyParams.ProxyUsername      := GikoSys.Setting.ReadProxyUserID;
144                         inSocket.ProxyParams.ProxyPassword      := GikoSys.Setting.ReadProxyPassword;
145                         if GikoSys.Setting.ReadProxyUserID <> '' then
146                                 inSocket.ProxyParams.BasicAuthentication := True;
147                         {$IFDEF DEBUG}
148                         Writeln('\83v\83\8d\83L\83V\90Ý\92è\82 \82è');
149                         Writeln('\83z\83X\83g: ' + GikoSys.Setting.ReadProxyAddress);
150                         Writeln('\83|\81[\83g: ' + IntToStr( GikoSys.Setting.ReadProxyPort ));
151                         {$ENDIF}
152                 end else begin
153                         if GikoSys.Setting.Protocol then
154                                 inSocket.ProtocolVersion := pv1_1
155                         else
156                                 inSocket.ProtocolVersion := pv1_0;
157                         inSocket.ProxyParams.ProxyServer                := '';
158                         inSocket.ProxyParams.ProxyPort                  := 80;
159                         inSocket.ProxyParams.ProxyUsername      := '';
160                         inSocket.ProxyParams.ProxyPassword      := '';
161                         {$IFDEF DEBUG}
162                         Writeln('\83v\83\8d\83L\83V\90Ý\92è\82È\82µ');
163                         {$ENDIF}
164                 end;
165         end;
166
167 end;
168
169 // *************************************************************************
170 // \8ew\92è\82µ\82½ URL \82ð\83_\83E\83\93\83\8d\81[\83h\82µ\82Ä\95Ô\82·
171 // *************************************************************************
172 function InternalDownload(
173         inURL                                                   : PChar;        // \83_\83E\83\93\83\8d\81[\83h\82·\82é URL
174         var ioModified          : Double;       // \8dÅ\8cã\82É\8eæ\93¾\82µ\82½\93ú\8e\9e
175         var outResultData       : PChar;        // \83_\83E\83\93\83\8d\81[\83h\82³\82ê\82½\95\8e\9a\97ñ
176         inRangeStart                    : DWORD;        // \8aJ\8en\88Ê\92u
177         inRangeEnd                              : DWORD         // \8fI\97¹\88Ê\92u
178 ) : Longint; stdcall;                                   // \83\8c\83X\83|\83\93\83X\83R\81[\83h
179 var
180         httpSocket                              : TIdHTTP;
181         resStream                                       : TMemoryStream;
182         content                                         : string;
183 begin
184
185         {$IFDEF DEBUG}
186         Writeln('ExternalBoardManager.InternalDownload');
187         {$ENDIF}
188         Result := -1;
189
190         httpSocket := TIdHTTP.Create( nil );
191         try
192                 InitializeSocket( httpSocket );
193
194                 httpSocket.Request.ContentRangeStart    := inRangeStart;
195                 httpSocket.Request.ContentRangeEnd              := inRangeEnd;
196                 if (ioModified <> 0) and (ioModified <> ZERO_DATE) then
197                         httpSocket.Request.LastModified := ioModified - OffsetFromUTC;
198                 if inRangeStart = 0 then
199                         httpSocket.Request.AcceptEncoding := 'gzip'
200                 else
201                         httpSocket.Request.AcceptEncoding := '';
202                 httpSocket.Request.Accept := 'text/html';
203
204                 resStream := TMemoryStream.Create;
205                 try
206                         try
207                                 resStream.Clear;
208
209                                 {$IFDEF DEBUG}
210                                 Writeln('URL: ' + inURL);
211                                 {$ENDIF}
212                                 httpSocket.Get( inURL, resStream );
213                                 {$IFDEF DEBUG}
214                                 Writeln('\8eæ\93¾\82Å\97á\8aO\82È\82µ');
215                                 {$ENDIF}
216
217                                 content                 := GikoSys.GzipDecompress( resStream, httpSocket.Response.ContentEncoding );
218                                 ioModified      := httpSocket.Response.LastModified;
219
220                                 Result := httpSocket.ResponseCode;
221                                 if (Length( content ) = 0) and (Result = 206) then
222                                         Result := 304;
223
224                                 outResultData := CreateResultString( content );
225                         except
226                                 on E: EIdSocketError do begin
227                                         ioModified              := ZERO_DATE;
228                                         outResultData   := nil;
229                                 end;
230                                 on E: EIdConnectException do begin
231                                         ioModified              := ZERO_DATE;
232                                         outResultData   := nil;
233                                         //Item.ErrText  := E.Message;
234                                 end;
235                                 on E: Exception do begin
236                                         {$IFDEF DEBUG}
237                                         Writeln('\8eæ\93¾\82Å\97á\8aO\82 \82è');
238                                         Writeln('E.Message: ' + E.Message);
239                                         {$ENDIF}
240                                         ioModified              := ZERO_DATE;
241                                         outResultData   := nil;
242                                         Result                          := httpSocket.ResponseCode;
243                                         //Item.ErrText  := E.Message;
244                                 end;
245                         end;
246                 finally
247                         resStream.Free;
248                 end;
249
250         finally
251                 httpSocket.Free;
252         end;
253
254 end;
255
256 // *************************************************************************
257 // \8ew\92è\82µ\82½ URL \82Ö\83f\81[\83^\82ð\91\97\90M\82·\82é
258 // *************************************************************************
259 function        InternalPost(
260         inURL                                                   : PChar;                        // \91\97\90M\82·\82é URL
261         inSource                                        : PChar;                        // \91\97\90M\82·\82é\93à\97e
262         var outResultData       : PChar                         // \95Ô\82Á\82Ä\82«\82½\95\8e\9a\97ñ
263 ) : Longint; stdcall;                                                   // \83\8c\83X\83|\83\93\83X\83R\81[\83h
264 var
265         httpSocket                              : TIdHTTP;
266         content                                         : string;
267         resStream                                       : TStringStream;
268         sourceStream                    : TStringStream;
269 begin
270
271         {$IFDEF DEBUG}
272         Writeln('ExternalBoardManager.InternalPost');
273         {$ENDIF}
274         Result := -1;
275
276         httpSocket := TIdHTTP.Create( nil );
277         try
278                 InitializeSocket( httpSocket );
279
280                 httpSocket.Request.CustomHeaders.Add('Pragma: no-cache');
281                 httpSocket.Request.AcceptLanguage       := 'ja';
282                 httpSocket.Request.Accept                                       := 'image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*';
283                 httpSocket.Request.ContentType          := 'application/x-www-form-urlencoded';
284
285                 resStream                       := TStringStream.Create( content );
286                 sourceStream    := TStringStream.Create( string( inSource ) );
287                 try
288                         try
289                                 {$IFDEF DEBUG}
290                                 Writeln('URL: ' + inURL);
291                                 Writeln('Source: ' + inSource);
292                                 {$ENDIF}
293                                 httpSocket.Post( string( inURL ), sourceStream, resStream );
294                                 {$IFDEF DEBUG}
295                                 Writeln('\8eæ\93¾\82Å\97á\8aO\82È\82µ');
296                                 {$ENDIF}
297
298                                 Result := httpSocket.ResponseCode;
299
300                                 outResultData := CreateResultString( resStream.DataString );
301                         except
302                                 on E: EIdSocketError do begin
303                                         outResultData   := nil;
304                                 end;
305                                 on E: EIdConnectException do begin
306                                         outResultData   := nil;
307                                 end;
308                                 on E: Exception do begin
309                                         {$IFDEF DEBUG}
310                                         Writeln('\8eæ\93¾\82Å\97á\8aO\82 \82è');
311                                         Writeln('E.Message: ' + E.Message);
312                                         {$ENDIF}
313                                         outResultData   := nil;
314                                         Result                          := httpSocket.ResponseCode;
315                                 end;
316                         end;
317                 finally
318                         resStream.Free;
319                         sourceStream.Free;
320                 end;
321         finally
322                 httpSocket.Free;
323         end;
324
325 end;
326
327 // *************************************************************************
328 // \82Q\82¿\82á\82ñ\82Ë\82é\82Ì dat \8c`\8e®\82ð\83\8d\81[\83J\83\8b\82 \82Ú\81`\82ñ\82É\92Ê\82·
329 // *************************************************************************
330
331 function InternalAbon(
332         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
333         inDatPath       : PChar                         // dat \83t\83@\83C\83\8b\82Ì\83t\83\8b\83p\83X
334
335 ) : PChar; stdcall;                     // \82 \82Ú\81`\82ñ\8dÏ\82Ý\82Ì dat \8c`\8e®\83e\83L\83X\83g
336 var
337         datList : TStringList;
338     FileName : String;
339 begin
340
341         datList := TStringList.Create;
342         datList.Text := string( inDatText );
343     FileName := string( inDatPath );
344         GikoSys.FAbon.IndividualAbon( datList, ChangeFileExt(FileName,'.NG'));
345         GikoSys.FAbon.Execute( datList );
346         GikoSys.FSelectResFilter.Execute( datList );
347
348         Result := CreateResultString( datList.Text );
349
350 end;
351 // *************************************************************************
352 // \82Q\82¿\82á\82ñ\82Ë\82é\82Ì dat \8c`\8e®\82ð\83\8d\81[\83J\83\8b\82 \82Ú\81`\82ñ\82É\92Ê\82·
353 // \82½\82¾\82µ\81A\82P\83\8c\83X\82¸\82Â
354 // *************************************************************************
355
356 function InternalAbonForOne(
357         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
358         inDatPath       : PChar;                                // dat \83t\83@\83C\83\8b\82Ì\83t\83\8b\83p\83X
359         inNo : Integer          //\97v\8b\81\82³\82ê\82½\83\8c\83X\94Ô\8d\86
360 ) : PChar; stdcall;                     // \82 \82Ú\81`\82ñ\8dÏ\82Ý\82Ì dat \8c`\8e®\83e\83L\83X\83g
361 var
362         datString : String;
363     FileName : String;
364 begin
365
366         datString := string( inDatText );
367     FileName := string( inDatPath );
368         GikoSys.FAbon.IndividualAbon( datString, ChangeFileExt(FileName,'.NG'), inNo);
369         GikoSys.FAbon.Execute( datString , inNo);
370         GikoSys.FSelectResFilter.Execute( datString , inNo );
371
372         Result := CreateResultString( datString );
373
374 end;
375
376 // *************************************************************************
377 // \82Q\82¿\82á\82ñ\82Ë\82é\82Ì dat \8c`\8e® 1 \8ds\82ð HTML \82É\95Ï\8a·\82·\82é
378 // *************************************************************************
379 function InternalDat2HTML(
380         inDatRes                : PChar;                        // \96¼\91O<>\83\81\81[\83\8b<>\93ú\95tID<>\96{\95¶<> \82Å\8d\\90¬\82³\82ê\82½\83e\83L\83X\83g
381         inResNo                 : DWORD;                        // \83\8c\83X\94Ô\8d\86
382         inIsNew                 : Boolean                       // \90V\92\85\83\8c\83X\82È\82ç True
383 ) : PChar; stdcall;                             // \90®\8c`\82³\82ê\82½ HTML
384 var
385         board                           : TBoard;
386         threadItem      : TThreadItem;
387 begin
388
389         // \83_\83~\81[\82Ì\83N\83\89\83X
390         board                           := TBoard.Create;
391         threadItem      := TThreadItem.Create;
392
393         try
394                 threadItem.ParentBoard := Board;
395
396                 Result := ThreadItemDat2HTML( DWORD( threadItem ), inDatRes, inResNo, inIsNew );
397         except
398                 Result := nil;
399         end;
400
401 end;
402
403 exports
404         CreateResultString,
405         DisposeResultString,
406         VersionInfo,
407         InternalDownload,
408         InternalPost,
409         InternalAbon,
410     InternalAbonForOne,
411         InternalDat2HTML;
412
413 end.