OSDN Git Service

・ExternalBoardManager が大きくなったので分割。
[gikonavigoeson/gikonavi.git] / ExternalBoardManager.pas
1 unit ExternalBoardManager;
2
3 interface
4
5 uses
6         Windows, Classes, SysUtils,
7         IdHTTP, IdComponent, IdGlobal, IdException,
8         ExternalBoardPlugInMain, ExternalFilePath, ExternalThreadItem, ExternalBoardItem;
9
10 type
11         // =========================================================================
12         // \83v\83\89\83O\83C\83\93\82ð\8aÇ\97\9d\82·\82é TBoardPlugin \83N\83\89\83X
13         // =========================================================================
14         TBoardPlugIn = class( TObject )
15         private
16                 FFilePath                                               : string;               // \83v\83\89\83O\83C\83\93\82ð\8e¦\82·\83p\83X
17                 FModule                                                 : HMODULE;      // \83v\83\89\83O\83C\83\93\82Ì\83\82\83W\83\85\81[\83\8b\83n\83\93\83h\83\8b
18
19                 FVersionInfo                            : TOnVersionInfo;
20                 FAcceptURL                                      : TOnAcceptURL;
21
22                 FCreateThreadItem               : TThreadItemCreate;
23                 FDisposeThreadItem      : TThreadItemDispose;
24                 FDownloadThread                 : TThreadItemOnDownload;
25                 FGetRes                                                 : TThreadItemOnGetRes;
26                 FGetHeader                                      : TThreadItemOnGetHeader;
27                 FGetFooter                                      : TThreadItemOnGetFooter;
28                 FGetBoardURL                            : TThreadItemOnGetBoardURL;
29
30                 FCreateBoardItem                : TBoardItemCreate;
31                 FDisposeBoardItem               : TBoardItemDispose;
32                 FDownloadBoard                  : TBoardItemOnDownload;
33                 FEnumThread                                     : TBoardItemOnEnumThread;
34                 FFileName2ThreadURL     : TBoardItemOnFileName2ThreadURL;
35
36         public
37                 // \83R\83\93\83X\83g\83\89\83N\83^
38                 constructor     Create;
39                 // \83v\83\89\83O\83C\83\93\82Ì\83p\83X\82ð\8ew\92è\82µ\82Ä\8dì\90¬
40                 constructor     CreateFromPath( inPath : string );
41                 // \83v\83\89\83O\83C\83\93\96¼\82ð\8ew\92è\82µ\82Ä\8dì\90¬
42                 constructor     CreateFromName( inName : string );
43                 // \83\82\83W\83\85\81[\83\8b\83n\83\93\83h\83\8b\82ð\8ew\92è\82µ\82Ä\8dì\90¬
44                 constructor     CreateFromModule( inModule : HMODULE );
45
46                 // \83v\83\89\83O\83C\83\93\82Ì\83p\83X\82ð\8ew\92è\82µ\82Ä\83\8d\81[\83h
47                 procedure       LoadFromPath( inPath : string );
48                 // \83v\83\89\83O\83C\83\93\96¼\82ð\8ew\92è\82µ\82Ä\83\8d\81[\83h
49                 procedure       LoadFromName( inName : string );
50                 // \83\82\83W\83\85\81[\83\8b\83n\83\93\83h\83\8b\82ð\8ew\92è\82µ\82Ä\83\8d\81[\83h
51                 procedure       LoadFromModule( inModule : HMODULE );
52
53                 //===== PlugInMain \8aÖ\98A
54                 // \83o\81[\83W\83\87\83\93\8fî\95ñ
55                 procedure       VersionInfo(    var outAgent : string;
56                         var outMajor : DWORD; var outMinor : DWORD;
57                         var outRelease : string; var outRevision : DWORD );
58                 // \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©
59                 function        AcceptURL( inURL : string ) : Boolean;
60
61                 //===== TThreadItem \8aÖ\98A
62                 // TThreadItem \82ª\90\90¬\82³\82ê\82½
63                 procedure       CreateThreadItem( threadItem : DWORD );
64                 // TThreadItem \82ª\94j\8aü\82³\82ê\82½
65                 procedure       DisposeThreadItem( threadItem : DWORD );
66                 // \83_\83E\83\93\83\8d\81[\83h\82ð\8ew\8e¦
67                 function        DownloadThread( threadItem : DWORD ) : TDownloadState;
68                 // \83\8c\83X\94Ô\8d\86 n \82É\91Î\82·\82é html \82ð\97v\8b\81
69                 function        GetRes( threadItem : DWORD; inNo : DWORD ) : string;
70                 // \83X\83\8c\83b\83h\82Ì\83w\83b\83_ html \82ð\97v\8b\81
71                 function        GetHeader( threadItem : DWORD; inOptionalHeader : string ) : string;
72                 // \83X\83\8c\83b\83h\82Ì\83t\83b\83^ html \82ð\97v\8b\81
73                 function        GetFooter( threadItem : DWORD; inOptionalFooter : string ) : string;
74                 // \82±\82Ì ThreadItem \82ª\91®\82·\82é\94Â\82Ì URL \82ð\97v\8b\81
75                 function        GetBoardURL( threadItem : DWORD ) : string;
76
77                 //===== TBoardItem \8aÖ\98A
78                 // TBoard \82ª\90\90¬\82³\82ê\82½
79                 procedure       CreateBoardItem( boardItem : DWORD );
80                 // TBoardItem \82ª\94j\8aü\82³\82ê\82½
81                 procedure       DisposeBoardItem( boardItem : DWORD );
82                 // \83_\83E\83\93\83\8d\81[\83h\82ð\8ew\8e¦
83                 function        DownloadBoard( boardItem : DWORD ) : TDownloadState;
84                 // \82±\82Ì\94Â\82É\95Û\97L\82µ\82Ä\82¢\82é\83X\83\8c\82ð\97ñ\8b\93
85                 procedure EnumThread( boardItem : DWORD; inCallBack : TBoardItemEnumThreadCallBack );
86                 // \83t\83@\83C\83\8b\96¼\82©\82ç\83X\83\8c\83b\83h\82Ì URL \82ð\97v\8b\81
87                 function        FileName2ThreadURL( boardItem : DWORD; inFileName : string ) : string;
88
89         private
90                 procedure       LoadPlugInAPI;
91
92         public
93                 property        FilePath        : string        read FFilePath;
94                 property        Module          : HMODULE       read FModule;
95         end;
96
97 var
98         OnWork                          : TWorkEvent;
99         OnWorkBegin             : TWorkBeginEvent;
100         OnWorkEnd                       : TWorkEndEvent;
101
102         BoardPlugIns    : array of TBoardPlugIn;
103
104 procedure InitializeBoardPlugIns;
105
106 implementation
107
108 uses GikoSystem;
109
110 // *************************************************************************
111 // BoardPlugin \83t\83H\83\8b\83_\82É\82 \82é\83v\83\89\83O\83C\83\93\82ð\91S\82Ä\83\8d\81[\83h
112 // *************************************************************************
113 procedure InitializeBoardPlugIns;
114 var
115         i, bound                : Integer;
116         pluginNames     : TStringList;
117 begin
118
119         pluginNames := TStringList.Create;
120         try
121                 GikoSys.GetFileList( GikoSys.Setting.GetBoardPlugInDir, '*', pluginNames, False, False );
122                 SetLength( BoardPlugIns, pluginNames.Count );
123
124                 bound := pluginNames.Count - 1;
125                 for i := 0 to bound do
126                         BoardPlugIns[ i ] := TBoardPlugIn.CreateFromName( pluginNames.Strings[ i ] );
127         finally
128                 pluginNames.Free;
129         end;
130
131 end;
132
133
134
135 // =========================================================================
136 // \83v\83\89\83O\83C\83\93\82ð\8aÇ\97\9d\82·\82é TBoardPlugin \83N\83\89\83X
137 // =========================================================================
138
139 // *************************************************************************
140 // \83R\83\93\83X\83g\83\89\83N\83^
141 // *************************************************************************
142 constructor     TBoardPlugIn.Create;
143 begin
144
145         inherited;
146
147         FVersionInfo                            := nil;
148         FAcceptURL                                      := nil;
149
150         FCreateThreadItem               := nil;
151         FDisposeThreadItem      := nil;
152         FDownloadThread                 := nil;
153         FGetRes                                                 := nil;
154         FGetHeader                                      := nil;
155         FGetFooter                                      := nil;
156
157         FCreateBoardItem                := nil;
158         FDisposeBoardItem               := nil;
159         FDownloadBoard                  := nil;
160         FEnumThread                                     := nil;
161         FFileName2ThreadURL     := nil;
162
163 end;
164
165 // *************************************************************************
166 // \83v\83\89\83O\83C\83\93\82Ì\83p\83X\82ð\8ew\92è\82µ\82Ä\8dì\90¬
167 // *************************************************************************
168 constructor     TBoardPlugIn.CreateFromPath(
169         inPath : string
170 );
171 begin
172
173         Create;
174
175         LoadFromPath( inPath );
176
177 end;
178
179 // *************************************************************************
180 // \83v\83\89\83O\83C\83\93\96¼\82ð\8ew\92è\82µ\82Ä\8dì\90¬
181 // *************************************************************************
182 constructor     TBoardPlugIn.CreateFromName(
183         inName : string
184 );
185 begin
186
187         Create;
188
189         LoadFromName( inName );
190
191 end;
192
193 // *************************************************************************
194 // \83\82\83W\83\85\81[\83\8b\83n\83\93\83h\83\8b\82ð\8ew\92è\82µ\82Ä\8dì\90¬
195 // *************************************************************************
196 constructor     TBoardPlugIn.CreateFromModule(
197         inModule : HMODULE
198 );
199 begin
200
201         inherited Create;
202
203         LoadFromModule( inModule );
204
205 end;
206
207 // *************************************************************************
208 // \83v\83\89\83O\83C\83\93\82Ì\83p\83X\82ð\8ew\92è\82µ\82Ä\83\8d\81[\83h
209 // *************************************************************************
210 procedure TBoardPlugIn.LoadFromPath(
211         inPath : string
212 );
213 begin
214
215         FFilePath := inPath;
216         if FileExists( inPath ) then
217                 FModule := LoadLibrary( PChar( inPath ) )
218         else if FileExists( inPath + '.dll' ) then
219                 FModule := LoadLibrary( PChar( inPath + '.dll' ) );
220
221         LoadPlugInAPI;
222
223 end;
224
225 // *************************************************************************
226 // \83v\83\89\83O\83C\83\93\96¼\82ð\8ew\92è\82µ\82Ä\83\8d\81[\83h
227 // *************************************************************************
228 procedure TBoardPlugIn.LoadFromName(
229         inName : string
230 );
231 begin
232
233         LoadFromPath( GikoSys.Setting.GetBoardPlugInDir + inName );
234
235 end;
236
237 // *************************************************************************
238 // \83\82\83W\83\85\81[\83\8b\83n\83\93\83h\83\8b\82ð\8ew\92è\82µ\82Ä\83\8d\81[\83h
239 // *************************************************************************
240 procedure TBoardPlugIn.LoadFromModule(
241         inModule        : HMODULE
242 );
243 var
244         tmp                             : array [0..MAX_PATH] of Char;
245 begin
246
247         GetModuleFileName( inModule, tmp, SizeOf( tmp ) );
248         FFilePath       := tmp;
249         FModule         := inModule;
250
251         LoadPlugInAPI;
252
253 end;
254
255 // *************************************************************************
256 // \83o\81[\83W\83\87\83\93\8fî\95ñ
257 // *************************************************************************
258 procedure TBoardPlugIn.VersionInfo(
259         var outAgent            : string;               // \83o\81[\83W\83\87\83\93\82ð\88ê\90Ø\8aÜ\82Ü\82È\82¢\8f\83\90\88\82È\96¼\8fÌ
260         var outMajor            : DWORD;                // \83\81\83W\83\83\81[\83o\81[\83W\83\87\83\93
261         var outMinor            : DWORD;                // \83}\83C\83i\81[\83o\81[\83W\83\87\83\93
262         var outRelease  : string;               // \83\8a\83\8a\81[\83X\92i\8aK\96¼
263         var outRevision : DWORD                 // \83\8a\83r\83W\83\87\83\93\83i\83\93\83o\81[
264 );
265 var
266         agent                                           : PChar;
267         release                                 : PChar;
268 begin
269
270         if Assigned( FVersionInfo ) then begin
271                 FVersionInfo( agent, outMajor, outMinor, release, outRevision );
272                 outAgent                := string( agent );
273                 outRelease      := string( release );
274                 DisposeResultString( agent );
275                 DisposeResultString( release );
276         end;
277
278 end;
279
280 // *************************************************************************
281 // \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©
282 // *************************************************************************
283 function        TBoardPlugIn.AcceptURL(
284         inURL : string
285 ) : Boolean;
286 begin
287
288         if Assigned( FAcceptURL ) then
289                 Result := FAcceptURL( PChar( inURL ) )
290         else
291                 Result := False;
292
293 end;
294
295 // *************************************************************************
296 // TThreadItem \82ª\90\90¬\82³\82ê\82½
297 // *************************************************************************
298 procedure       TBoardPlugIn.CreateThreadItem(
299         threadItem : DWORD      // ThreadItem \82Ì\83C\83\93\83X\83^\83\93\83X
300 );
301 begin
302
303         if Assigned( FCreateThreadItem ) then
304                 FCreateThreadItem( threadItem );
305
306 end;
307
308 // *************************************************************************
309 // TThreadItem \82ª\94j\8aü\82³\82ê\82½
310 // *************************************************************************
311 procedure       TBoardPlugIn.DisposeThreadItem(
312         threadItem : DWORD      // ThreadItem \82Ì\83C\83\93\83X\83^\83\93\83X
313 );
314 begin
315
316         if Assigned( FDisposeThreadItem ) then
317                 FDisposeThreadItem( threadItem );
318
319 end;
320
321 // *************************************************************************
322 // \83_\83E\83\93\83\8d\81[\83h\82ð\8ew\8e¦
323 // *************************************************************************
324 function        TBoardPlugIn.DownloadThread(
325         threadItem : DWORD      // ThreadItem \82Ì\83C\83\93\83X\83^\83\93\83X
326 ) : TDownloadState;
327 begin
328
329         if Assigned( FDownloadThread ) then
330                 Result := FDownloadThread( threadItem )
331         else
332                 Result := dsError;
333
334 end;
335
336 // *************************************************************************
337 // \83\8c\83X\94Ô\8d\86 n \82É\91Î\82·\82é html \82ð\97v\8b\81
338 // *************************************************************************
339 function TBoardPlugIn.GetRes(
340         threadItem      : DWORD;                // ThreadItem \82Ì\83C\83\93\83X\83^\83\93\83X
341         inNo                            : DWORD                 // \95\\8e¦\82·\82é\83\8c\83X\94Ô\8d\86
342 ) : string;                                                     // \95\\8e¦\82·\82é HTML
343 var
344         tmp                                     : PChar;
345 begin
346
347         if Assigned( FGetRes ) then begin
348                 tmp                     := FGetRes( threadItem, inNo );
349                 Result  := string( tmp );
350                 DisposeResultString( tmp );
351         end;
352
353 end;
354
355 // *************************************************************************
356 // \83X\83\8c\83b\83h\82Ì\83w\83b\83_ html \82ð\97v\8b\81
357 // *************************************************************************
358 function TBoardPlugIn.GetHeader(
359         threadItem                              : DWORD;        // ThreadItem \82Ì\83C\83\93\83X\83^\83\93\83X
360         inOptionalHeader        : string        // \92Ç\89Á\82Ì\83w\83b\83_
361 ) : string;                                                                             // \90®\8c`\82³\82ê\82½ HTML
362 var
363         tmp                                                             : PChar;
364 begin
365
366         if Assigned( FGetHeader ) then begin
367                 tmp                     := FGetHeader( threadItem, PChar( inOptionalHeader ) );
368                 Result  := string( tmp );
369                 DisposeResultString( tmp );
370         end;
371
372 end;
373
374 // *************************************************************************
375 // \83X\83\8c\83b\83h\82Ì\83t\83b\83^ html \82ð\97v\8b\81
376 // *************************************************************************
377 function TBoardPlugIn.GetFooter(
378         threadItem                              : DWORD;        // ThreadItem \82Ì\83C\83\93\83X\83^\83\93\83X
379         inOptionalFooter        : string        // \92Ç\89Á\82Ì\83t\83b\83^
380 ) : string;                                                                             // \90®\8c`\82³\82ê\82½ HTML
381 var
382         tmp                                                             : PChar;
383 begin
384
385         if Assigned( FGetFooter ) then begin
386                 tmp                     := FGetFooter( threadItem, PChar( inOptionalFooter ) );
387                 Result  := string( tmp );
388                 DisposeResultString( tmp );
389         end;
390
391 end;
392
393 // *************************************************************************
394 // \82±\82Ì ThreadItem \82ª\91®\82·\82é\94Â\82Ì URL \82ð\97v\8b\81
395 // *************************************************************************
396 function        TBoardPlugIn.GetBoardURL(
397         threadItem      : DWORD // ThreadItem \82Ì\83C\83\93\83X\83^\83\93\83X
398 ) : string;
399 var
400         tmp                                     : PChar;
401 begin
402
403         if Assigned( FGetBoardURL ) then begin
404                 tmp                     := FGetBoardURL( threadItem );
405                 Result  := string( tmp );
406                 DisposeResultString( tmp );
407         end;
408
409 end;
410
411 // *************************************************************************
412 // TBoardItem \82ª\90\90¬\82³\82ê\82½
413 // *************************************************************************
414 procedure       TBoardPlugIn.CreateBoardItem(
415         boardItem : DWORD       // BoardItem \82Ì\83C\83\93\83X\83^\83\93\83X
416 );
417 begin
418
419         if Assigned( FCreateBoardItem ) then
420                 FCreateBoardItem( boardItem );
421
422 end;
423
424 // *************************************************************************
425 // TBoardItem \82ª\94j\8aü\82³\82ê\82½
426 // *************************************************************************
427 procedure       TBoardPlugIn.DisposeBoardItem(
428         boardItem : DWORD       // BoardItem \82Ì\83C\83\93\83X\83^\83\93\83X
429 );
430 begin
431
432         if Assigned( FDisposeBoardItem ) then
433                 FDisposeBoardItem( boardItem );
434
435 end;
436
437 // *************************************************************************
438 // \83_\83E\83\93\83\8d\81[\83h\82ð\8ew\8e¦
439 // *************************************************************************
440 function        TBoardPlugIn.DownloadBoard(
441         boardItem : DWORD       // BoardItem \82Ì\83C\83\93\83X\83^\83\93\83X
442 ) : TDownloadState;
443 begin
444
445         if Assigned( FDownloadBoard ) then
446                 Result := FDownloadBoard( boardItem )
447         else
448                 Result := dsError;
449
450 end;
451
452 // *************************************************************************
453 // \82±\82Ì\94Â\82É\95Û\97L\82µ\82Ä\82¢\82é\83X\83\8c\82ð\97ñ\8b\93
454 // *************************************************************************
455 procedure TBoardPlugIn.EnumThread(
456         boardItem               : DWORD;        // BoardItem \82Ì\83C\83\93\83X\83^\83\93\83X
457         inCallBack      : TBoardItemEnumThreadCallBack
458 );
459 begin
460
461         if Assigned( FEnumThread ) then
462                 FEnumThread( boardItem, inCallBack );
463
464 end;
465
466 // *************************************************************************
467 // \83t\83@\83C\83\8b\96¼\82©\82ç\83X\83\8c\83b\83h\82Ì URL \82ð\97v\8b\81
468 // *************************************************************************
469 function        TBoardPlugIn.FileName2ThreadURL(
470         boardItem               : DWORD;        // BoardItem \82Ì\83C\83\93\83X\83^\83\93\83X
471         inFileName      : string
472 ) : string;
473 var
474         tmp                                                             : PChar;
475 begin
476
477         if Assigned( FFileName2ThreadURL ) then begin
478                 tmp                     := FFileName2ThreadURL( boardItem, PChar( inFileName ) );
479                 Result  := string( tmp );
480                 DisposeResultString( tmp );
481         end;
482
483 end;
484
485 // *************************************************************************
486 // \83v\83\89\83O\83C\83\93\82Ì API \82ð\8eæ\93¾
487 // *************************************************************************
488 procedure TBoardPlugIn.LoadPlugInAPI;
489 begin
490
491         try
492                 if Assigned( Pointer( FModule ) ) then begin
493                         FVersionInfo                            := GetProcAddress( FModule, 'OnVersionInfo' );
494                         FAcceptURL                                      := GetProcAddress( FModule, 'OnAcceptURL' );
495
496                         FCreateThreadItem               := GetProcAddress( FModule, 'ThreadItemCreate' );
497                         FDisposeThreadItem      := GetProcAddress( FModule, 'ThreadItemDispose' );
498                         FDownloadThread                 := GetProcAddress( FModule, 'ThreadItemOnDownload' );
499                         FGetRes                                                 := GetProcAddress( FModule, 'ThreadItemOnGetRes' );
500                         FGetHeader                                      := GetProcAddress( FModule, 'ThreadItemOnGetHeader' );
501                         FGetFooter                                      := GetProcAddress( FModule, 'ThreadItemOnGetFooter' );
502                         FGetBoardURL                            := GetProcAddress( FModule, 'ThreadItemOnGetBoardURL' );
503
504                         FCreateBoardItem                := GetProcAddress( FModule, 'BoardItemCreate' );
505                         FDisposeBoardItem               := GetProcAddress( FModule, 'BoardItemDispose' );
506                         FDownloadBoard                  := GetProcAddress( FModule, 'BoardItemOnDownload' );
507                         FEnumThread                                     := GetProcAddress( FModule, 'BoardItemOnEnumThread' );
508                         FFileName2ThreadURL     := GetProcAddress( FModule, 'BoardItemOnFileName2ThreadURL' );
509                 end;
510         except
511         end;
512
513 end;
514
515 end.
516