OSDN Git Service

・BoardItemGetItems を追加し忘れていたので追加。
[gikonavigoeson/gikonavi.git] / ExternalBoardManager.pas
1 unit ExternalBoardManager;
2
3 interface
4
5 uses
6         Windows, Classes, SysUtils,
7         IdHTTP, IdComponent, IdGlobal, IdException,
8         AbonUnit;
9
10 type
11         // =========================================================================
12         // PlugInMain \8aÖ\98A
13         // =========================================================================
14
15         // \83_\83E\83\93\83\8d\81[\83h\82ª\90¬\8c÷\82µ\82½\82©\82Ç\82¤\82©
16         TDownloadState = (dsWait, dsWork, dsComplete, dsDiffComplete, dsNotModify, dsAbort, dsError);
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         ): Boolean; stdcall;                    // \8eó\82¯\95t\82¯\82é\82È\82ç True
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
45
46         // =========================================================================
47         // TThreadItem \8aÖ\98A
48         // =========================================================================
49
50         // TThreadItem \82Ì\83v\83\8d\83p\83e\83B\90Ý\92è\81^\8eæ\93¾ ID
51         TThreadItemProperty = (
52                 tipContext,                                                     // : DWORD                      // \8e©\97R\82É\90Ý\92è\82µ\82Ä\82¢\82¢\92l
53                 tipNo,                                                                  // : Integer            // \94Ô\8d\86
54                 tipFileName,                                            // : string                     // \83X\83\8c\83b\83h\83t\83@\83C\83\8b\96¼
55                 tipTitle,                                                               // : string                     // \83X\83\8c\83b\83h\83^\83C\83g\83\8b
56                 tipRoundDate,                                           // : TDateTime  // \83X\83\8c\83b\83h\82ð\8eæ\93¾\82µ\82½\93ú\8e\9e\81i\8f\84\89ñ\93ú\8e\9e\81j
57                 tipLastModified,                                // : TDateTime  // \83X\83\8c\83b\83h\82ª\8dX\90V\82³\82ê\82Ä\82¢\82é\93ú\8e\9e\81i\83T\81[\83o\91¤\93ú\8e\9e\81j
58                 tipCount,                                                               // : Integer            // \83X\83\8c\83b\83h\83J\83E\83\93\83g\81i\83\8d\81[\83J\83\8b\81j
59                 tipAllResCount,                                 // : Integer            // \83X\83\8c\83b\83h\83J\83E\83\93\83g\81i\83T\81[\83o\81j
60                 tipNewResCount,                                 // : Integer            // \83X\83\8c\83b\83h\90V\92\85\90\94
61                 tipSize,                                                                // : Integer            // \83X\83\8c\83b\83h\83T\83C\83Y
62                 tipRound,                                                               // : Boolean            // \8f\84\89ñ\83t\83\89\83O
63                 tipRoundName,                                           // : string                     // \8f\84\89ñ\96¼
64                 tipIsLogFile,                                           // : Boolean            // \83\8d\83O\91\8dÝ\83t\83\89\83O
65                 tipKokomade,                                            // : Integer            // \83R\83R\82Ü\82Å\93Ç\82ñ\82¾\94Ô\8d\86
66                 tipNewReceive,                                  // : Integer            // \83R\83R\82©\82ç\90V\8bK\8eó\90M
67                 tipNewArrival,                                  // : Boolean            // \90V\92\85
68                 tipUnRead,                                                      // : Boolean            // \96¢\93Ç\83t\83\89\83O
69                 tipScrollTop,                                           // : Integer            // \83X\83N\83\8d\81[\83\8b\88Ê\92u
70                 tipDownloadHost,                                // : string                     // \8d¡\82Ì\83z\83X\83g\82Æ\88á\82¤\8fê\8d\87\82Ì\83z\83X\83g
71                 tipAgeSage,                                                     // : TThreadAgeSage     // \83A\83C\83e\83\80\82Ì\8fã\82°\89º\82°
72                 tipURL,                                                                 // : string                     // \83X\83\8c\83b\83h\82ð\83u\83\89\83E\83U\82Å\95\\8e¦\82·\82é\8dÛ\82Ì URL
73                 tipFilePath                                                     // : string                     // \82±\82Ì\83X\83\8c\82ª\95Û\91\82³\82ê\82Ä\82¢\82é\83p\83X
74         );
75
76         // *************************************************************************
77         // TThreadItem \82ª\90\90¬\82³\82ê\82½
78         // *************************************************************************
79         TThreadItemCreate = procedure(
80                 inInstance : DWORD
81         ); stdcall;
82
83         // *************************************************************************
84         // TThreadItem \82ª\94j\8aü\82³\82ê\82½
85         // *************************************************************************
86         TThreadItemDispose = procedure(
87                 inInstance : DWORD
88         ); stdcall;
89
90         // *************************************************************************
91         // \83_\83E\83\93\83\8d\81[\83h\82ð\8ew\8e¦\82³\82ê\82½
92         // *************************************************************************
93         TThreadItemOnDownload = function(
94                 inInstance      : DWORD                                 // \83C\83\93\83X\83^\83\93\83X
95         ) : TDownloadState; stdcall;    // \83_\83E\83\93\83\8d\81[\83h\82ª\90¬\8c÷\82µ\82½\82©\82Ç\82¤\82©
96
97         // *************************************************************************
98         // \83\8c\83X\94Ô\8d\86 n \82É\91Î\82·\82é html \82ð\97v\8b\81\82³\82ê\82½
99         // *************************************************************************
100         TThreadItemOnGetRes = function(
101                 inInstance      : DWORD;                // \83C\83\93\83X\83^\83\93\83X
102                 inNo                            : DWORD                 // \95\\8e¦\82·\82é\83\8c\83X\94Ô\8d\86
103         ) : PChar; stdcall;                             // \95\\8e¦\82·\82é HTML
104
105         // *************************************************************************
106         // \83X\83\8c\83b\83h\82Ì\83w\83b\83_ html \82ð\97v\8b\81\82³\82ê\82½
107         // *************************************************************************
108         TThreadItemOnGetHeader = function(
109                 inInstance                              : DWORD;        // \83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X
110                 inOptionalHeader        : PChar         // \92Ç\89Á\82Ì\83w\83b\83_
111         ) : PChar; stdcall;                                             // \90®\8c`\82³\82ê\82½ HTML
112
113         // *************************************************************************
114         // \83X\83\8c\83b\83h\82Ì\83t\83b\83^ html \82ð\97v\8b\81\82³\82ê\82½
115         // *************************************************************************
116         TThreadItemOnGetFooter = function(
117                 inInstance                              : DWORD;        // \83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X
118                 inOptionalFooter        : PChar         // \92Ç\89Á\82Ì\83t\83b\83^
119         ) : PChar; stdcall;                                             // \90®\8c`\82³\82ê\82½ HTML
120
121
122
123         // =========================================================================
124         // TBoardItem \8aÖ\98A
125         // =========================================================================
126
127         // TBoardItem \82Ì\83v\83\8d\83p\83e\83B\90Ý\92è\81^\8eæ\93¾ ID
128         TBoardItemProperty = (
129                 bipContext,                                                     // : DWORD                              // \8e©\97R\82É\90Ý\92è\82µ\82Ä\82¢\82¢\92l
130                 bipItems,                                                               // : TThreadItem        // \94Â\82É\8cq\82ª\82ê\82Ä\82¢\82é\83X\83\8c\83b\83h
131                 bipNo,                                                                  // : Integer                    // \94Ô\8d\86
132                 bipTitle,                                                               // : string                             // \94Â\83^\83C\83g\83\8b
133                 bipRoundDate,                                           // : TDateTime          // \94Â\82ð\8eæ\93¾\82µ\82½\93ú\8e\9e\81i\8f\84\89ñ\93ú\8e\9e\81j
134                 bipLastModified,                                // : TDateTime          // \94Â\82ª\8dX\90V\82³\82ê\82Ä\82¢\82é\93ú\8e\9e\81i\83T\81[\83o\91¤\93ú\8e\9e\81j
135                 bipLastGetTime,                                 // : TDateTime          // \83X\83\8c\83b\83h\82Ü\82½\82Í\83X\83\8c\83b\83h\88ê\97\97\82ð\8dÅ\8cã\82É\8dX\90V\82µ\82½\93ú\8e\9e\81i\83T\81[\83o\91¤\93ú\8e\9e\81E\8f\91\82«\8d\9e\82Ý\8e\9e\82É\8eg\97p\82·\82é\81j
136                 bipRound,                                                               // : Boolean                    // \8f\84\89ñ\97\\96ñ
137                 bipRoundName,                                           // : string                             // \8f\84\89ñ\96¼
138                 bipIsLogFile,                                           // : Boolean                    // \83\8d\83O\91\8dÝ\83t\83\89\83O
139                 bipUnRead,                                                      // : Integer                    // \83X\83\8c\83b\83h\96¢\93Ç\90\94
140                 bipURL,                                                                 // : string                             // \94Â\82ð\83u\83\89\83E\83U\82Å\95\\8e¦\82·\82é\8dÛ\82Ì URL
141                 bipFilePath                                                     // : string                             // \82±\82Ì\94Â\82ª\95Û\91\82³\82ê\82Ä\82¢\82é\83p\83X
142         );
143
144         // *************************************************************************
145         // TBoardItem \82ª\90\90¬\82³\82ê\82½
146         // *************************************************************************
147         TBoardItemCreate = procedure(
148                 inInstance : DWORD
149         ); stdcall;
150
151         // *************************************************************************
152         // TBoardItem \82ª\94j\8aü\82³\82ê\82½
153         // *************************************************************************
154         TBoardItemDispose = procedure(
155                 inInstance : DWORD
156         ); stdcall;
157
158         // *************************************************************************
159         // \83_\83E\83\93\83\8d\81[\83h\82ð\8ew\8e¦\82³\82ê\82½
160         // *************************************************************************
161         TBoardItemOnDownload = function(
162                 inInstance      : DWORD                                 // \83C\83\93\83X\83^\83\93\83X
163         ) : TDownloadState; stdcall;    // \83_\83E\83\93\83\8d\81[\83h\82ª\90¬\8c÷\82µ\82½\82©\82Ç\82¤\82©
164
165         // *************************************************************************
166         // \8ae\83X\83\8c\82Ì\8fî\95ñ\82ð\95Ô\8bp
167         // *************************************************************************
168         TBoardItemEnumThreadCallBack = function(
169                 inURL           : PChar;                        // \83X\83\8c\83b\83h\82Ì URL
170                 inTitle : PChar;                        // \83X\83\8c\83^\83C
171                 inCount : DWORD                         // \83\8c\83X\82Ì\90\94
172         ) : Boolean; stdcall;                                   // \97ñ\8b\93\82ð\91±\82¯\82é\82È\82ç True
173
174         // *************************************************************************
175         // \82±\82Ì\94Â\82É\95Û\97L\82µ\82Ä\82¢\82é\83X\83\8c\82ð\97ñ\8b\93
176         // *************************************************************************
177         TBoardItemOnEnumThread = procedure(
178                 inInstance      : DWORD;                                                                                                // \83C\83\93\83X\83^\83\93\83X
179                 inCallBack      : TBoardItemEnumThreadCallBack  // \95Ô\8bp\82·\82×\82«\83R\81[\83\8b\83o\83b\83N
180         ); stdcall;
181
182
183
184         // =========================================================================
185         // \83v\83\89\83O\83C\83\93\82ð\8aÇ\97\9d\82·\82é TBoardPlugin \83N\83\89\83X
186         // =========================================================================
187         TBoardPlugIn = class( TObject )
188         private
189                 FFilePath                                               : string;               // \83v\83\89\83O\83C\83\93\82ð\8e¦\82·\83p\83X
190                 FModule                                                 : HMODULE;      // \83v\83\89\83O\83C\83\93\82Ì\83\82\83W\83\85\81[\83\8b\83n\83\93\83h\83\8b
191
192                 FVersionInfo                            : TOnVersionInfo;
193                 FAcceptURL                                      : TOnAcceptURL;
194
195                 FCreateThreadItem               : TThreadItemCreate;
196                 FDisposeThreadItem      : TThreadItemDispose;
197                 FDownloadThread                 : TThreadItemOnDownload;
198                 FGetRes                                                 : TThreadItemOnGetRes;
199                 FGetHeader                                      : TThreadItemOnGetHeader;
200                 FGetFooter                                      : TThreadItemOnGetFooter;
201
202                 FCreateBoardItem                : TBoardItemCreate;
203                 FDisposeBoardItem               : TBoardItemDispose;
204                 FDownloadBoard                  : TBoardItemOnDownload;
205                 FEnumThread                                     : TBoardItemOnEnumThread;
206
207         public
208                 // \83R\83\93\83X\83g\83\89\83N\83^
209                 constructor     Create;
210                 // \83v\83\89\83O\83C\83\93\82Ì\83p\83X\82ð\8ew\92è\82µ\82Ä\8dì\90¬
211                 constructor     CreateFromPath( inPath : string );
212                 // \83v\83\89\83O\83C\83\93\96¼\82ð\8ew\92è\82µ\82Ä\8dì\90¬
213                 constructor     CreateFromName( inName : string );
214                 // \83\82\83W\83\85\81[\83\8b\83n\83\93\83h\83\8b\82ð\8ew\92è\82µ\82Ä\8dì\90¬
215                 constructor     CreateFromModule( inModule : HMODULE );
216
217                 // \83v\83\89\83O\83C\83\93\82Ì\83p\83X\82ð\8ew\92è\82µ\82Ä\83\8d\81[\83h
218                 procedure       LoadFromPath( inPath : string );
219                 // \83v\83\89\83O\83C\83\93\96¼\82ð\8ew\92è\82µ\82Ä\83\8d\81[\83h
220                 procedure       LoadFromName( inName : string );
221                 // \83\82\83W\83\85\81[\83\8b\83n\83\93\83h\83\8b\82ð\8ew\92è\82µ\82Ä\83\8d\81[\83h
222                 procedure       LoadFromModule( inModule : HMODULE );
223
224                 //===== PlugInMain \8aÖ\98A
225                 // \83o\81[\83W\83\87\83\93\8fî\95ñ
226                 procedure       VersionInfo(    var outAgent : string;
227                         var outMajor : DWORD; var outMinor : DWORD;
228                         var outRelease : string; var outRevision : DWORD );
229                 // \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©
230                 function        AcceptURL( inURL : string ) : Boolean;
231
232                 //===== TThreadItem \8aÖ\98A
233                 // TThreadItem \82ª\90\90¬\82³\82ê\82½
234                 procedure       CreateThreadItem( threadItem : DWORD );
235                 // TThreadItem \82ª\94j\8aü\82³\82ê\82½
236                 procedure       DisposeThreadItem( threadItem : DWORD );
237                 // \83_\83E\83\93\83\8d\81[\83h\82ð\8ew\8e¦
238                 function        DownloadThread( threadItem : DWORD ) : TDownloadState;
239                 // \83\8c\83X\94Ô\8d\86 n \82É\91Î\82·\82é html \82ð\97v\8b\81
240                 function        GetRes( threadItem : DWORD; inNo : DWORD ) : string;
241                 // \83X\83\8c\83b\83h\82Ì\83w\83b\83_ html \82ð\97v\8b\81
242                 function        GetHeader( threadItem : DWORD; inOptionalHeader : string ) : string;
243                 // \83X\83\8c\83b\83h\82Ì\83t\83b\83^ html \82ð\97v\8b\81
244                 function        GetFooter( threadItem : DWORD; inOptionalFooter : string ) : string;
245
246                 //===== TBoardItem \8aÖ\98A
247                 // TBoard \82ª\90\90¬\82³\82ê\82½
248                 procedure       CreateBoardItem( boardItem : DWORD );
249                 // TBoardItem \82ª\94j\8aü\82³\82ê\82½
250                 procedure       DisposeBoardItem( boardItem : DWORD );
251                 // \83_\83E\83\93\83\8d\81[\83h\82ð\8ew\8e¦
252                 function        DownloadBoard( boardItem : DWORD ) : TDownloadState;
253                 // \82±\82Ì\94Â\82É\95Û\97L\82µ\82Ä\82¢\82é\83X\83\8c\82ð\97ñ\8b\93
254                 procedure EnumThread( inInstance : DWORD; inCallBack : TBoardItemEnumThreadCallBack );
255
256         private
257                 procedure       LoadPlugInAPI;
258
259         public
260                 property        FilePath        : string        read FFilePath;
261                 property        Module          : HMODULE       read FModule;
262         end;
263
264 var
265         OnWork                          : TWorkEvent;
266         OnWorkBegin             : TWorkBeginEvent;
267         OnWorkEnd                       : TWorkEndEvent;
268
269         BoardPlugIns    : array of TBoardPlugIn;
270
271 procedure InitializeBoardPlugIns;
272
273 function CreateResultString(
274         resultStr : string
275 ) : PChar; stdcall;
276
277 function ThreadItemDat2HTML(
278         inInstance      : DWORD;                // \83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X
279         inDatRes                : PChar;                // \96¼\91O<>\83\81\81[\83\8b<>\93ú\95tID<>\96{\95¶<> \82Å\8d\\90¬\82³\82ê\82½\83e\83L\83X\83g
280         inResNo                 : DWORD;                // \83\8c\83X\94Ô\8d\86
281         inIsNew                 : Boolean               // \90V\92\85\83\8c\83X\82È\82ç True
282 ) : PChar; stdcall;                             // \90®\8c`\82³\82ê\82½ HTML
283
284 procedure DisposeResultString(
285         resultStr : PChar
286 ); stdcall;
287
288 implementation
289
290 uses GikoSystem, BoardGroup;
291
292 // *************************************************************************
293 // BoardPlugin \83t\83H\83\8b\83_\82É\82 \82é\83v\83\89\83O\83C\83\93\82ð\91S\82Ä\83\8d\81[\83h
294 // *************************************************************************
295 procedure InitializeBoardPlugIns;
296 var
297         i, bound                : Integer;
298         pluginNames     : TStringList;
299 begin
300
301         pluginNames := TStringList.Create;
302         try
303                 GikoSys.GetFileList( GikoSys.Setting.GetBoardPlugInDir, '*', pluginNames, False, False );
304                 SetLength( BoardPlugIns, pluginNames.Count );
305
306                 bound := pluginNames.Count - 1;
307                 for i := 0 to bound do
308                         BoardPlugIns[ i ] := TBoardPlugIn.CreateFromName( pluginNames.Strings[ i ] );
309         finally
310                 pluginNames.Free;
311         end;
312
313 end;
314
315
316
317 // =========================================================================
318 // \83v\83\89\83O\83C\83\93\82ð\8aÇ\97\9d\82·\82é TBoardPlugin \83N\83\89\83X
319 // =========================================================================
320
321 // *************************************************************************
322 // \83R\83\93\83X\83g\83\89\83N\83^
323 // *************************************************************************
324 constructor     TBoardPlugIn.Create;
325 begin
326
327         inherited;
328
329         FVersionInfo                            := nil;
330         FAcceptURL                                      := nil;
331
332         FCreateThreadItem               := nil;
333         FDisposeThreadItem      := nil;
334         FDownloadThread                 := nil;
335         FGetRes                                                 := nil;
336         FGetHeader                                      := nil;
337         FGetFooter                                      := nil;
338
339         FCreateBoardItem                := nil;
340         FDisposeBoardItem               := nil;
341         FDownloadBoard                  := nil;
342         FEnumThread                                     := nil;
343
344 end;
345
346 // *************************************************************************
347 // \83v\83\89\83O\83C\83\93\82Ì\83p\83X\82ð\8ew\92è\82µ\82Ä\8dì\90¬
348 // *************************************************************************
349 constructor     TBoardPlugIn.CreateFromPath(
350         inPath : string
351 );
352 begin
353
354         Create;
355
356         LoadFromPath( inPath );
357
358 end;
359
360 // *************************************************************************
361 // \83v\83\89\83O\83C\83\93\96¼\82ð\8ew\92è\82µ\82Ä\8dì\90¬
362 // *************************************************************************
363 constructor     TBoardPlugIn.CreateFromName(
364         inName : string
365 );
366 begin
367
368         Create;
369
370         LoadFromName( inName );
371
372 end;
373
374 // *************************************************************************
375 // \83\82\83W\83\85\81[\83\8b\83n\83\93\83h\83\8b\82ð\8ew\92è\82µ\82Ä\8dì\90¬
376 // *************************************************************************
377 constructor     TBoardPlugIn.CreateFromModule(
378         inModule : HMODULE
379 );
380 begin
381
382         inherited Create;
383
384         LoadFromModule( inModule );
385
386 end;
387
388 // *************************************************************************
389 // \83v\83\89\83O\83C\83\93\82Ì\83p\83X\82ð\8ew\92è\82µ\82Ä\83\8d\81[\83h
390 // *************************************************************************
391 procedure TBoardPlugIn.LoadFromPath(
392         inPath : string
393 );
394 begin
395
396         FFilePath := inPath;
397         if FileExists( inPath ) then
398                 FModule := LoadLibrary( PChar( inPath ) )
399         else if FileExists( inPath + '.dll' ) then
400                 FModule := LoadLibrary( PChar( inPath + '.dll' ) );
401
402         LoadPlugInAPI;
403
404 end;
405
406 // *************************************************************************
407 // \83v\83\89\83O\83C\83\93\96¼\82ð\8ew\92è\82µ\82Ä\83\8d\81[\83h
408 // *************************************************************************
409 procedure TBoardPlugIn.LoadFromName(
410         inName : string
411 );
412 begin
413
414         LoadFromPath( GikoSys.Setting.GetBoardPlugInDir + inName );
415
416 end;
417
418 // *************************************************************************
419 // \83\82\83W\83\85\81[\83\8b\83n\83\93\83h\83\8b\82ð\8ew\92è\82µ\82Ä\83\8d\81[\83h
420 // *************************************************************************
421 procedure TBoardPlugIn.LoadFromModule(
422         inModule        : HMODULE
423 );
424 var
425         tmp                             : array [0..MAX_PATH] of Char;
426 begin
427
428         GetModuleFileName( inModule, tmp, SizeOf( tmp ) );
429         FFilePath       := tmp;
430         FModule         := inModule;
431
432         LoadPlugInAPI;
433
434 end;
435
436 // *************************************************************************
437 // \83o\81[\83W\83\87\83\93\8fî\95ñ
438 // *************************************************************************
439 procedure TBoardPlugIn.VersionInfo(
440         var outAgent            : string;               // \83o\81[\83W\83\87\83\93\82ð\88ê\90Ø\8aÜ\82Ü\82È\82¢\8f\83\90\88\82È\96¼\8fÌ
441         var outMajor            : DWORD;                // \83\81\83W\83\83\81[\83o\81[\83W\83\87\83\93
442         var outMinor            : DWORD;                // \83}\83C\83i\81[\83o\81[\83W\83\87\83\93
443         var outRelease  : string;               // \83\8a\83\8a\81[\83X\92i\8aK\96¼
444         var outRevision : DWORD                 // \83\8a\83r\83W\83\87\83\93\83i\83\93\83o\81[
445 );
446 var
447         agent                                           : PChar;
448         release                                 : PChar;
449 begin
450
451         if Assigned( FVersionInfo ) then begin
452                 FVersionInfo( agent, outMajor, outMinor, release, outRevision );
453                 outAgent                := string( agent );
454                 outRelease      := string( release );
455                 DisposeResultString( agent );
456                 DisposeResultString( release );
457         end;
458
459 end;
460
461 // *************************************************************************
462 // \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©
463 // *************************************************************************
464 function        TBoardPlugIn.AcceptURL(
465         inURL : string
466 ) : Boolean;
467 begin
468
469         if Assigned( FAcceptURL ) then
470                 Result := FAcceptURL( PChar( inURL ) )
471         else
472                 Result := False;
473
474 end;
475
476 // *************************************************************************
477 // TThreadItem \82ª\90\90¬\82³\82ê\82½
478 // *************************************************************************
479 procedure       TBoardPlugIn.CreateThreadItem(
480         threadItem : DWORD
481 );
482 begin
483
484         if Assigned( FCreateThreadItem ) then
485                 FCreateThreadItem( threadItem );
486
487 end;
488
489 // *************************************************************************
490 // TThreadItem \82ª\94j\8aü\82³\82ê\82½
491 // *************************************************************************
492 procedure       TBoardPlugIn.DisposeThreadItem(
493         threadItem : DWORD
494 );
495 begin
496
497         if Assigned( FDisposeThreadItem ) then
498                 FDisposeThreadItem( threadItem );
499
500 end;
501
502 // *************************************************************************
503 // \83_\83E\83\93\83\8d\81[\83h\82ð\8ew\8e¦
504 // *************************************************************************
505 function        TBoardPlugIn.DownloadThread(
506         threadItem : DWORD
507 ) : TDownloadState;
508 begin
509
510         if Assigned( FDownloadThread ) then
511                 Result := FDownloadThread( threadItem )
512         else
513                 Result := dsError;
514
515 end;
516
517 // *************************************************************************
518 // \83\8c\83X\94Ô\8d\86 n \82É\91Î\82·\82é html \82ð\97v\8b\81
519 // *************************************************************************
520 function TBoardPlugIn.GetRes(
521         threadItem      : DWORD;                // \83C\83\93\83X\83^\83\93\83X
522         inNo                            : DWORD                 // \95\\8e¦\82·\82é\83\8c\83X\94Ô\8d\86
523 ) : string;                                                     // \95\\8e¦\82·\82é HTML
524 var
525         tmp                                     : PChar;
526 begin
527
528         if Assigned( FGetRes ) then begin
529                 tmp                     := FGetRes( threadItem, inNo );
530                 Result  := string( tmp );
531                 DisposeResultString( tmp );
532         end;
533
534 end;
535
536 // *************************************************************************
537 // \83X\83\8c\83b\83h\82Ì\83w\83b\83_ html \82ð\97v\8b\81
538 // *************************************************************************
539 function TBoardPlugIn.GetHeader(
540         threadItem                              : DWORD;        // \83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X
541         inOptionalHeader        : string        // \92Ç\89Á\82Ì\83w\83b\83_
542 ) : string;                                                                             // \90®\8c`\82³\82ê\82½ HTML
543 var
544         tmp                                                             : PChar;
545 begin
546
547         if Assigned( FGetHeader ) then begin
548                 tmp                     := FGetHeader( threadItem, PChar( inOptionalHeader ) );
549                 Result  := string( tmp );
550                 DisposeResultString( tmp );
551         end;
552
553 end;
554
555 // *************************************************************************
556 // \83X\83\8c\83b\83h\82Ì\83t\83b\83^ html \82ð\97v\8b\81
557 // *************************************************************************
558 function TBoardPlugIn.GetFooter(
559         threadItem                              : DWORD;        // \83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X
560         inOptionalFooter        : string        // \92Ç\89Á\82Ì\83t\83b\83^
561 ) : string;                                                                             // \90®\8c`\82³\82ê\82½ HTML
562 var
563         tmp                                                             : PChar;
564 begin
565
566         if Assigned( FGetFooter ) then begin
567                 tmp                     := FGetFooter( threadItem, PChar( inOptionalFooter ) );
568                 Result  := string( tmp );
569                 DisposeResultString( tmp );
570         end;
571
572 end;
573
574 // *************************************************************************
575 // TBoardItem \82ª\90\90¬\82³\82ê\82½
576 // *************************************************************************
577 procedure       TBoardPlugIn.CreateBoardItem(
578         BoardItem : DWORD
579 );
580 begin
581
582         if Assigned( FCreateBoardItem ) then
583                 FCreateBoardItem( BoardItem );
584
585 end;
586
587 // *************************************************************************
588 // TBoardItem \82ª\94j\8aü\82³\82ê\82½
589 // *************************************************************************
590 procedure       TBoardPlugIn.DisposeBoardItem(
591         BoardItem : DWORD
592 );
593 begin
594
595         if Assigned( FDisposeBoardItem ) then
596                 FDisposeBoardItem( BoardItem );
597
598 end;
599
600 // *************************************************************************
601 // \83_\83E\83\93\83\8d\81[\83h\82ð\8ew\8e¦
602 // *************************************************************************
603 function        TBoardPlugIn.DownloadBoard(
604         BoardItem : DWORD
605 ) : TDownloadState;
606 begin
607
608         if Assigned( FDownloadBoard ) then
609                 Result := FDownloadBoard( BoardItem )
610         else
611                 Result := dsError;
612
613 end;
614
615 // *************************************************************************
616 // \82±\82Ì\94Â\82É\95Û\97L\82µ\82Ä\82¢\82é\83X\83\8c\82ð\97ñ\8b\93
617 // *************************************************************************
618 procedure TBoardPlugIn.EnumThread(
619         inInstance      : DWORD;
620         inCallBack      : TBoardItemEnumThreadCallBack
621 );
622 begin
623
624         if Assigned( FEnumThread ) then
625                 FEnumThread( inInstance, inCallBack );
626
627 end;
628
629 // *************************************************************************
630 // \83v\83\89\83O\83C\83\93\82Ì API \82ð\8eæ\93¾
631 // *************************************************************************
632 procedure TBoardPlugIn.LoadPlugInAPI;
633 begin
634
635         try
636                 if Assigned( Pointer( FModule ) ) then begin
637                         FVersionInfo                            := GetProcAddress( FModule, 'OnVersionInfo' );
638                         FAcceptURL                                      := GetProcAddress( FModule, 'OnAcceptURL' );
639
640                         FCreateThreadItem               := GetProcAddress( FModule, 'ThreadItemCreate' );
641                         FDisposeThreadItem      := GetProcAddress( FModule, 'ThreadItemDispose' );
642                         FDownloadThread                 := GetProcAddress( FModule, 'ThreadItemOnDownload' );
643                         FGetRes                                                 := GetProcAddress( FModule, 'ThreadItemOnGetRes' );
644                         FGetHeader                                      := GetProcAddress( FModule, 'ThreadItemOnGetHeader' );
645                         FGetFooter                                      := GetProcAddress( FModule, 'ThreadItemOnGetFooter' );
646
647                         FCreateBoardItem                := GetProcAddress( FModule, 'BoardItemCreate' );
648                         FDisposeBoardItem               := GetProcAddress( FModule, 'BoardItemDispose' );
649                         FDownloadBoard                  := GetProcAddress( FModule, 'BoardItemOnDownload' );
650                         FEnumThread                                     := GetProcAddress( FModule, 'BoardItemOnEnumThread' );
651                 end;
652         except
653         end;
654
655 end;
656
657
658
659 // =========================================================================
660 // PlugInMain
661 // =========================================================================
662
663 // *************************************************************************
664 // \96ß\82è\92l\82ª PChar \82Å\82 \82é API \82Ì\83\81\83\82\83\8a\82ð\8am\95Û\82·\82é
665 // *************************************************************************
666 function CreateResultString(
667         resultStr : string
668 ) : PChar; stdcall;
669 var
670         tmp : PChar;
671 begin
672
673         tmp := PChar( resultStr );
674         GetMem( Result, Length( tmp ) + 1 );
675         Move( tmp^, Result^, Length( tmp ) + 1 );
676
677 end;
678
679 // *************************************************************************
680 // \96ß\82è\92l\82ª PChar \82Å\82 \82é API \82Ì\83\81\83\82\83\8a\82ð\8aJ\95ú\82·\82é
681 // *************************************************************************
682 procedure DisposeResultString(
683         resultStr : PChar
684 ); stdcall;
685 begin
686
687         FreeMem( resultStr );
688
689 end;
690
691 // *************************************************************************
692 // \83v\83\8d\83O\83\89\83\80\96{\91Ì\82Ì\83o\81[\83W\83\87\83\93\82ð\8eæ\93¾\82·\82é
693 // *************************************************************************
694 procedure VersionInfo(
695         var outAgent            : PChar;        // \83o\81[\83W\83\87\83\93\82ð\88ê\90Ø\8aÜ\82Ü\82È\82¢\8f\83\90\88\82È\96¼\8fÌ
696         var outMajor            : DWORD;        // \83\81\83W\83\83\81[\83o\81[\83W\83\87\83\93
697         var outMinor            : DWORD;        // \83}\83C\83i\81[\83o\81[\83W\83\87\83\93
698         var outRelease  : PChar;        // \83\8a\83\8a\81[\83X\92i\8aK\96¼
699         var outRevision : DWORD         // \83\8a\83r\83W\83\87\83\93\83i\83\93\83o\81[
700 ); stdcall;
701 begin
702
703         outAgent                := CreateResultString( PChar( APP_NAME ) );
704         outMajor                := 1;
705         outMinor                := 0;
706         outRelease      := CreateResultString( PChar( BETA_VERSION_NAME_E ) );
707         outRevision     := BETA_VERSION;
708
709 end;
710
711 // *************************************************************************
712 // \8ew\92è\82µ\82½ URL \82ð\83_\83E\83\93\83\8d\81[\83h\82µ\82Ä\95Ô\82·
713 // *************************************************************************
714 function InternalDownload(
715         inURL                                                   : PChar;        // \83_\83E\83\93\83\8d\81[\83h\82·\82é URL
716         var ioModified          : Double;       // \8dÅ\8cã\82É\8eæ\93¾\82µ\82½\93ú\8e\9e
717         var outResultData       : PChar;        // \83_\83E\83\93\83\8d\81[\83h\82³\82ê\82½\95\8e\9a\97ñ
718         inRangeStart                    : DWORD;        // \8aJ\8en\88Ê\92u
719         inRangeEnd                              : DWORD         // \8fI\97¹\88Ê\92u
720 ) : Longint; stdcall;                                   // \83\8c\83X\83|\83\93\83X\83R\81[\83h
721 var
722         httpSocket                              : TIdHTTP;
723         resStream                                       : TMemoryStream;
724         content                                         : string;
725 begin
726
727         Result := -1;
728
729         httpSocket := TIdHTTP.Create( nil );
730         try
731                 // \83C\83x\83\93\83g\82Ì\90Ý\92è
732                 if Assigned( OnWork ) then
733                         httpSocket.OnWork                               := OnWork;
734                 if Assigned( OnWorkBegin ) then
735                         httpSocket.OnWorkBegin  := OnWorkBegin;
736                 if Assigned( OnWorkEnd ) then
737                         httpSocket.OnWorkEnd            := OnWorkEnd;
738
739                 // \92Ê\90M\82É\8aÖ\82·\82é\90Ý\92è
740                 httpSocket.Request.CustomHeaders.Clear;
741                 httpSocket.Response.Clear;
742                 httpSocket.Request.Clear;
743
744                 httpSocket.Request.UserAgent    := GikoSys.GetUserAgent;
745                 httpSocket.RecvBufferSize                       := Gikosys.Setting.RecvBufferSize;
746                 httpSocket.ProxyParams.BasicAuthentication := False;
747                 {$IFDEF DEBUG}
748                 Writeln('------------------------------------------------------------');
749                 {$ENDIF}
750                 //httpSocket.AllowCookies := False;
751                 if GikoSys.Setting.ReadProxy then begin
752                         if GikoSys.Setting.ProxyProtocol then
753                                 httpSocket.ProtocolVersion := pv1_1
754                         else
755                                 httpSocket.ProtocolVersion := pv1_0;
756                         httpSocket.ProxyParams.ProxyServer              := GikoSys.Setting.ReadProxyAddress;
757                         httpSocket.ProxyParams.ProxyPort                        := GikoSys.Setting.ReadProxyPort;
758                         httpSocket.ProxyParams.ProxyUsername    := GikoSys.Setting.ReadProxyUserID;
759                         httpSocket.ProxyParams.ProxyPassword    := GikoSys.Setting.ReadProxyPassword;
760                         if GikoSys.Setting.ReadProxyUserID <> '' then
761                                 httpSocket.ProxyParams.BasicAuthentication := True;
762                         {$IFDEF DEBUG}
763                         Writeln('\83v\83\8d\83L\83V\90Ý\92è\82 \82è');
764                         Writeln('\83z\83X\83g: ' + GikoSys.Setting.ReadProxyAddress);
765                         Writeln('\83|\81[\83g: ' + IntToStr( GikoSys.Setting.ReadProxyPort ));
766                         {$ENDIF}
767                 end else begin
768                         if GikoSys.Setting.Protocol then
769                                 httpSocket.ProtocolVersion := pv1_1
770                         else
771                                 httpSocket.ProtocolVersion := pv1_0;
772                         httpSocket.ProxyParams.ProxyServer              := '';
773                         httpSocket.ProxyParams.ProxyPort                        := 80;
774                         httpSocket.ProxyParams.ProxyUsername    := '';
775                         httpSocket.ProxyParams.ProxyPassword    := '';
776                         {$IFDEF DEBUG}
777                         Writeln('\83v\83\8d\83L\83V\90Ý\92è\82È\82µ');
778                         {$ENDIF}
779                 end;
780
781                 httpSocket.Request.ContentRangeStart    := inRangeStart;
782                 httpSocket.Request.ContentRangeEnd              := inRangeEnd;
783                 if (ioModified <> 0) and (ioModified <> ZERO_DATE) then
784                         httpSocket.Request.LastModified := ioModified - OffsetFromUTC;
785                 if inRangeStart = 0 then
786                         httpSocket.Request.AcceptEncoding := 'gzip'
787                 else
788                         httpSocket.Request.AcceptEncoding := '';
789                 httpSocket.Request.Accept := 'text/html';
790
791                 resStream := TMemoryStream.Create;
792                 try
793                         try
794                                 resStream.Clear;
795
796                                 {$IFDEF DEBUG}
797                                 Writeln('URL: ' + inURL);
798                                 {$ENDIF}
799                                 httpSocket.Get( inURL, resStream );
800                                 {$IFDEF DEBUG}
801                                 Writeln('\8eæ\93¾\82Å\97á\8aO\82È\82µ');
802                                 {$ENDIF}
803
804                                 content                 := GikoSys.GzipDecompress( resStream, httpSocket.Response.ContentEncoding );
805                                 ioModified      := httpSocket.Response.LastModified;
806
807                                 Result := httpSocket.ResponseCode;
808                                 if (Length( content ) = 0) and (Result = 206) then
809                                         Result := 304;
810
811                                 outResultData := CreateResultString( content );
812                         except
813                                 on E: EIdSocketError do begin
814                                         ioModified              := ZERO_DATE;
815                                         outResultData   := nil;
816                                 end;
817                                 on E: EIdConnectException do begin
818                                         ioModified              := ZERO_DATE;
819                                         outResultData   := nil;
820                                         //Item.ErrText  := E.Message;
821                                 end;
822                                 on E: Exception do begin
823                                         {$IFDEF DEBUG}
824                                         Writeln('\8eæ\93¾\82Å\97á\8aO\82 \82è');
825                                         Writeln('E.Message: ' + E.Message);
826                                         {$ENDIF}
827                                         ioModified              := ZERO_DATE;
828                                         outResultData   := nil;
829                                         Result                          := httpSocket.ResponseCode;
830                                         //Item.ErrText  := E.Message;
831                                 end;
832                         end;
833                 finally
834                         resStream.Free;
835                 end;
836
837         finally
838                 httpSocket.Free;
839         end;
840
841 end;
842
843 // *************************************************************************
844 // \82Q\82¿\82á\82ñ\82Ë\82é\82Ì dat \8c`\8e®\82ð\83\8d\81[\83J\83\8b\82 \82Ú\81`\82ñ\82É\92Ê\82·
845 // *************************************************************************
846 function InternalAbon(
847         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
848 ) : PChar; stdcall;                             // \82 \82Ú\81`\82ñ\8dÏ\82Ý\82Ì dat \8c`\8e®\83e\83L\83X\83g
849 var
850         datList : TStringList;
851 begin
852
853         datList := TStringList.Create;
854         datList.Text := string( inDatText );
855         //GikoSys.FAbon.IndividualAbon( datList, ChangeFileExt(FileName,'.NG'));
856         GikoSys.FAbon.Execute( datList );
857         GikoSys.FSelectResFilter.Execute( datList );
858
859         Result := CreateResultString( datList.Text );
860
861 end;
862
863 // *************************************************************************
864 // \82Q\82¿\82á\82ñ\82Ë\82é\82Ì dat \8c`\8e® 1 \8ds\82ð HTML \82É\95Ï\8a·\82·\82é
865 // *************************************************************************
866 function InternalDat2HTML(
867         inDatRes        : PChar;                        // \96¼\91O<>\83\81\81[\83\8b<>\93ú\95tID<>\96{\95¶<> \82Å\8d\\90¬\82³\82ê\82½\83e\83L\83X\83g
868         inResNo         : DWORD;                        // \83\8c\83X\94Ô\8d\86
869         inIsNew         : Boolean                       // \90V\92\85\83\8c\83X\82È\82ç True
870 ) : PChar; stdcall;                             // \90®\8c`\82³\82ê\82½ HTML
871 var
872         board : TBoard;
873         threadItem : TThreadItem;
874 begin
875
876         // \83_\83~\81[\82Ì\83N\83\89\83X
877         board                           := TBoard.Create;
878         threadItem      := TThreadItem.Create;
879
880         try
881                 threadItem.ParentBoard := Board;
882
883                 Result := ThreadItemDat2HTML( DWORD( threadItem ), inDatRes, inResNo, inIsNew );
884         except
885                 Result := nil;
886         end;
887
888 end;
889
890
891
892 // =========================================================================
893 // FilePath
894 // =========================================================================
895
896 // *************************************************************************
897 // \83u\83\89\83E\83U\96{\91Ì\82ª\92u\82¢\82Ä\82 \82é\83t\83H\83\8b\83_
898 // *************************************************************************
899 function ApplicationFolder : PChar; stdcall;
900 begin
901
902         Result := CreateResultString( GikoSys.GetAppDir );
903
904 end;
905
906 // *************************************************************************
907 // \8f\89\8aú\90Ý\92è\83t\83H\83\8b\83_
908 // *************************************************************************
909 function PreferencesFolder : PChar; stdcall;
910 begin
911
912         Result := CreateResultString( GikoSys.GetConfigDir );
913
914 end;
915
916 // *************************************************************************
917 // \8f\89\8aú\90Ý\92è\83t\83@\83C\83\8b
918 // *************************************************************************
919 function PreferencesFile : PChar; stdcall;
920 begin
921
922         Result := CreateResultString( GikoSys.GetAppDir + 'gikoNavi.ini' );
923
924 end;
925
926 // *************************************************************************
927 // \83\8d\83O\83t\83H\83\8b\83_
928 // *************************************************************************
929 function LogFolder : PChar; stdcall;
930 begin
931
932         Result := CreateResultString( GikoSys.GetAppDir + 'Log\' );
933
934 end;
935
936 // *************************************************************************
937 // CSS \83t\83H\83\8b\83_
938 // *************************************************************************
939 function CSSFolder : PChar; stdcall;
940 begin
941
942         Result := CreateResultString( GikoSys.GetStyleSheetDir );
943
944 end;
945
946 // *************************************************************************
947 // \83X\83L\83\93\82ð\93ü\82ê\82Ä\82¨\82­\83t\83H\83\8b\83_
948 // *************************************************************************
949 function SkinFolder : PChar; stdcall;
950 begin
951
952         Result := CreateResultString( GikoSys.GetSkinDir );
953
954 end;
955
956 // *************************************************************************
957 // \8eg\97p\82µ\82Ä\82¢\82é CSS / \83X\83L\83\93
958 // *************************************************************************
959 function SkinFile : PChar; stdcall;
960 begin
961
962         Result := CreateResultString( GikoSys.Setting.CSSFileName );
963
964 end;
965
966 // *************************************************************************
967 // \82 \82Ú\81[\82ñ\8bK\91¥\82ª\92u\82¢\82Ä\82 \82é\83f\83B\83\8c\83N\83g\83\8a
968 // *************************************************************************
969 function AbonFolder : PChar; stdcall;
970 begin
971
972         Result := CreateResultString( GikoSys.Setting.GetNGWordsDir );
973
974 end;
975
976 // *************************************************************************
977 // \8eg\97p\82µ\82Ä\82¢\82é\82 \82Ú\81[\82ñ\8bK\91¥
978 // *************************************************************************
979 function AbonFile : PChar; stdcall;
980 begin
981
982         Result := CreateResultString( GikoSys.FAbon.GetNGwordpath );
983
984 end;
985
986
987
988 // =========================================================================
989 // ThreadItem
990 // =========================================================================
991
992 // *************************************************************************
993 // TThreadItem \83N\83\89\83X\82Ì\83v\83\8d\83p\83e\83B\82ð\8eæ\93¾\82·\82é
994 // *************************************************************************
995 function ThreadItemGetLong(
996         instance                : DWORD;
997         propertyID      : TThreadItemProperty
998 ) : DWORD; stdcall;
999 var
1000         threadItem : TThreadItem;
1001 begin
1002
1003         threadItem := TThreadItem( instance );
1004         case propertyID of
1005                 tipContext:                                                     // : DWORD                      // \8e©\97R\82É\90Ý\92è\82µ\82Ä\82¢\82¢\92l
1006                         Result := threadItem.Context;
1007                 tipNo:                                                                  // : Integer            // \94Ô\8d\86
1008                         Result := threadItem.No;
1009                 tipFileName:                                            // : string                     // \83X\83\8c\83b\83h\83t\83@\83C\83\8b\96¼
1010                         Result := DWORD( CreateResultString( threadItem.FileName ) );
1011                 tipTitle:                                                               // : string                     // \83X\83\8c\83b\83h\83^\83C\83g\83\8b
1012                         Result := DWORD( CreateResultString( threadItem.Title ) );
1013                 tipCount:                                                               // : Integer            // \83X\83\8c\83b\83h\83J\83E\83\93\83g\81i\83\8d\81[\83J\83\8b\81j
1014                         Result := threadItem.Count;
1015                 tipAllResCount:                                 // : Integer            // \83X\83\8c\83b\83h\83J\83E\83\93\83g\81i\83T\81[\83o\81j
1016                         Result := threadItem.AllResCount;
1017                 tipNewResCount:                                 // : Integer            // \83X\83\8c\83b\83h\90V\92\85\90\94
1018                         Result := threadItem.NewResCount;
1019                 tipSize:                                                                // : Integer            // \83X\83\8c\83b\83h\83T\83C\83Y
1020                         Result := threadItem.Size;
1021                 tipRound:                                                               // : Boolean            // \8f\84\89ñ\83t\83\89\83O
1022                         Result := DWORD( threadItem.Round );
1023                 tipRoundName:                                           // : string                     // \8f\84\89ñ\96¼
1024                         Result := DWORD( CreateResultString( threadItem.RoundName ) );
1025                 tipIsLogFile:                                           // : Boolean            // \83\8d\83O\91\8dÝ\83t\83\89\83O
1026                         Result := DWORD( threadItem.IsLogFile );
1027                 tipKokomade:                                            // : Integer            // \83R\83R\82Ü\82Å\93Ç\82ñ\82¾\94Ô\8d\86
1028                         Result := threadItem.Kokomade;
1029                 tipNewReceive:                                  // : Integer            // \83R\83R\82©\82ç\90V\8bK\8eó\90M
1030                         Result := threadItem.NewReceive;
1031                 tipNewArrival:                                  // : Boolean            // \90V\92\85
1032                         Result := DWORD( threadItem.NewArrival );
1033                 tipUnRead:                                                      // : Boolean            // \96¢\93Ç\83t\83\89\83O
1034                         Result := DWORD( threadItem.UnRead );
1035                 tipScrollTop:                                           // : Integer            // \83X\83N\83\8d\81[\83\8b\88Ê\92u
1036                         Result := threadItem.ScrollTop;
1037                 tipDownloadHost:                                // : string                     // \8d¡\82Ì\83z\83X\83g\82Æ\88á\82¤\8fê\8d\87\82Ì\83z\83X\83g
1038                         Result := DWORD( CreateResultString( threadItem.DownloadHost ) );
1039                 tipAgeSage:                                                     // : TThreadAgeSage     // \83A\83C\83e\83\80\82Ì\8fã\82°\89º\82°
1040                         Result := DWORD( threadItem.AgeSage );
1041                 tipURL:                                                                 // : string                     // \83X\83\8c\83b\83h\82ð\83u\83\89\83E\83U\82Å\95\\8e¦\82·\82é\8dÛ\82Ì URL
1042                         Result := DWORD( CreateResultString( threadItem.URL ) );
1043                 tipFilePath:                                                                                                            // \82±\82Ì\83X\83\8c\82ª\95Û\91\82³\82ê\82Ä\82¢\82é\83p\83X
1044                         Result := DWORD( CreateResultString( threadItem.FilePath ) );
1045         else
1046                 Result := 0;
1047         end;
1048 end;
1049
1050 // *************************************************************************
1051 // TThreadItem \83N\83\89\83X\82Ì\83v\83\8d\83p\83e\83B\82ð\90Ý\92è\82·\82é
1052 // *************************************************************************
1053 procedure ThreadItemSetLong(
1054         instance                : DWORD;
1055         propertyID      : TThreadItemProperty;
1056         param : DWORD
1057 ); stdcall;
1058 var
1059         threadItem      : TThreadItem;
1060 begin
1061
1062         threadItem := TThreadItem( instance );
1063         case propertyID of
1064                 tipContext:                                                     // : DWORD                      // \8e©\97R\82É\90Ý\92è\82µ\82Ä\82¢\82¢\92l
1065                         threadItem.Context                      := param;
1066                 tipNo:                                                                  // : Integer            // \94Ô\8d\86
1067                         threadItem.No                                           := param;
1068                 tipFileName:                                            // : string                     // \83X\83\8c\83b\83h\83t\83@\83C\83\8b\96¼
1069                         threadItem.FileName                     := string( PChar( param ) );
1070                 tipTitle:                                                               // : string                     // \83X\83\8c\83b\83h\83^\83C\83g\83\8b
1071                         threadItem.Title                                := string( PChar( param ) );
1072                 tipCount:                                                               // : Integer            // \83X\83\8c\83b\83h\83J\83E\83\93\83g\81i\83\8d\81[\83J\83\8b\81j
1073                         threadItem.Count                                := param;
1074                 tipAllResCount:                                 // : Integer            // \83X\83\8c\83b\83h\83J\83E\83\93\83g\81i\83T\81[\83o\81j
1075                         threadItem.AllResCount  := param;
1076                 tipNewResCount:                                 // : Integer            // \83X\83\8c\83b\83h\90V\92\85\90\94
1077                         threadItem.NewResCount  := param;
1078                 tipSize:                                                                // : Integer            // \83X\83\8c\83b\83h\83T\83C\83Y
1079                         threadItem.Size                                 := param;
1080                 tipRound:                                                               // : Boolean            // \8f\84\89ñ\83t\83\89\83O
1081                         threadItem.Round                                := Boolean( param );
1082                 tipRoundName:                                           // : string                     // \8f\84\89ñ\96¼
1083                         threadItem.RoundName            := string( PChar( param ) );
1084                 tipIsLogFile:                                           // : Boolean            // \83\8d\83O\91\8dÝ\83t\83\89\83O
1085                         threadItem.IsLogFile            := Boolean( param );
1086                 tipKokomade:                                            // : Integer            // \83R\83R\82Ü\82Å\93Ç\82ñ\82¾\94Ô\8d\86
1087                         threadItem.Kokomade                     := param;
1088                 tipNewReceive:                                  // : Integer            // \83R\83R\82©\82ç\90V\8bK\8eó\90M
1089                         threadItem.NewReceive           := param;
1090                 tipNewArrival:                                  // : Boolean            // \90V\92\85
1091                         threadItem.NewArrival           := Boolean( param );
1092                 tipUnRead:                                                      // : Boolean            // \96¢\93Ç\83t\83\89\83O
1093                         threadItem.UnRead                               := Boolean( param );
1094                 tipScrollTop:                                           // : Integer            // \83X\83N\83\8d\81[\83\8b\88Ê\92u
1095                         threadItem.ScrollTop             := param;
1096                 tipDownloadHost:                                // : string                     // \8d¡\82Ì\83z\83X\83g\82Æ\88á\82¤\8fê\8d\87\82Ì\83z\83X\83g
1097                         threadItem.DownloadHost := string( PChar( param ) );
1098                 tipAgeSage:                                                     // : TThreadAgeSage     // \83A\83C\83e\83\80\82Ì\8fã\82°\89º\82°
1099                         threadItem.AgeSage                      := TGikoAgeSage( param );
1100                 tipURL:                                                                 // : string                     // \83X\83\8c\83b\83h\82ð\83u\83\89\83E\83U\82Å\95\\8e¦\82·\82é\8dÛ\82Ì URL
1101                         threadItem.URL                                  := string( PChar( param ) );
1102                 tipFilePath:                                            // : string                     // \82±\82Ì\83X\83\8c\82ª\95Û\91\82³\82ê\82Ä\82¢\82é\83p\83X
1103                         threadItem.FilePath                     := string( PChar( param ) );
1104         end;
1105
1106 end;
1107
1108 // *************************************************************************
1109 // TThreadItem \83N\83\89\83X\82Ì\83v\83\8d\83p\83e\83B\82ð\8eæ\93¾\82·\82é
1110 // *************************************************************************
1111 function ThreadItemGetDouble(
1112         instance                : DWORD;
1113         propertyID      : TThreadItemProperty
1114 ) : Double; stdcall;
1115 var
1116         threadItem : TThreadItem;
1117 begin
1118
1119         threadItem := TThreadItem( instance );
1120         case propertyID of
1121                 tipRoundDate:                                           // : TDateTime  // \83X\83\8c\83b\83h\82ð\8eæ\93¾\82µ\82½\93ú\8e\9e\81i\8f\84\89ñ\93ú\8e\9e\81j
1122                         Result := threadItem.RoundDate;
1123                 tipLastModified:                                // : TDateTime  // \83X\83\8c\83b\83h\82ª\8dX\90V\82³\82ê\82Ä\82¢\82é\93ú\8e\9e\81i\83T\81[\83o\91¤\93ú\8e\9e\81j
1124                         Result := threadItem.LastModified;
1125         else
1126                 Result := 0;
1127         end;
1128
1129 end;
1130
1131 // *************************************************************************
1132 // TThreadItem \83N\83\89\83X\82Ì\83v\83\8d\83p\83e\83B\82ð\90Ý\92è\82·\82é
1133 // *************************************************************************
1134 procedure ThreadItemSetDouble(
1135         instance                : DWORD;
1136         propertyID      : TThreadItemProperty;
1137         param                           : Double
1138 ); stdcall;
1139 var
1140         threadItem : TThreadItem;
1141 begin
1142
1143         threadItem := TThreadItem( instance );
1144         case propertyID of
1145                 tipRoundDate:                                           // : TDateTime  // \83X\83\8c\83b\83h\82ð\8eæ\93¾\82µ\82½\93ú\8e\9e\81i\8f\84\89ñ\93ú\8e\9e\81j
1146                         threadItem.RoundDate            := param;
1147                 tipLastModified:                                // : TDateTime  // \83X\83\8c\83b\83h\82ª\8dX\90V\82³\82ê\82Ä\82¢\82é\93ú\8e\9e\81i\83T\81[\83o\91¤\93ú\8e\9e\81j
1148                         threadItem.LastModified := param;
1149         end;
1150
1151 end;
1152
1153 // *************************************************************************
1154 // TThreadItem \83N\83\89\83X\82ð\8c³\82É\82Q\82¿\82á\82ñ\82Ë\82é\82Ì dat \8c`\8e® 1 \8ds\82ð HTML \82É\95Ï\8a·\82·\82é
1155 // *************************************************************************
1156 function ThreadItemDat2HTML(
1157         inInstance      : DWORD;                // \83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X
1158         inDatRes                : PChar;                // \96¼\91O<>\83\81\81[\83\8b<>\93ú\95tID<>\96{\95¶<> \82Å\8d\\90¬\82³\82ê\82½\83e\83L\83X\83g
1159         inResNo                 : DWORD;                // \83\8c\83X\94Ô\8d\86
1160         inIsNew                 : Boolean               // \90V\92\85\83\8c\83X\82È\82ç True
1161 ) : PChar; stdcall;                             // \90®\8c`\82³\82ê\82½ HTML
1162 var
1163         threadItem : TThreadItem;
1164         res : TResRec;
1165         no : string;
1166 begin
1167
1168         threadItem      := TThreadItem( inInstance );
1169         // \88ø\90\94\82ð\95ª\89ð
1170         res                                     := GikoSys.DivideStrLine( string( inDatRes ) );
1171         no                                      := IntToStr( inResNo );
1172
1173         try
1174                 if GikoSys.Setting.UseSkin then begin
1175                         // \83X\83L\83\93
1176                         if inIsNew then
1177                                 Result := CreateResultString( GikoSys.SkinedRes(
1178                                         GikoSys.LoadFromSkin(
1179                                                 GikoSys.Setting.GetSkinNewResFileName, threadItem, threadItem.SizeByte
1180                                         ), res, no
1181                                 ) )
1182                         else
1183                                 Result := CreateResultString( GikoSys.SkinedRes(
1184                                         GikoSys.LoadFromSkin(
1185                                                 GikoSys.Setting.GetSkinResFileName, threadItem, threadItem.SizeByte
1186                                         ), res, no
1187                                 ) );
1188                 end else begin
1189                         // CSS or \83f\83t\83H\83\8b\83g
1190                         if res.FName = '' then
1191                                 res.FName := '&nbsp;';
1192                         if res.FMailTo = '' then
1193                                 Result := CreateResultString( '<a name="' + no + '"></a>'
1194                                                                 + '<div class="header"><span class="no"><a href="menu:' + No + '">' + no + '</a></span> '
1195                                                                 + '<span class="name_label">\96¼\91O\81F</span> '
1196                                                                 + '<span class="name"><b>' + res.FName + '</b></span> '
1197                                                                 + '<span class="date_label">\93\8a\8de\93ú\81F</span> '
1198                                                                 + '<span class="date">' + res.FDateTime+ '</span></div>'
1199                                                                 + '<div class="mes">' + res.FBody + ' </div>' )
1200                         else if GikoSys.Setting.ShowMail then
1201                                 Result := CreateResultString( '<a name="' + no + '"></a>'
1202                                                                 + '<div class="header"><span class="no"><a href="menu:' + no + '">' + no + '</a></span>'
1203                                                                 + '<span class="name_label"> \96¼\91O\81F </span>'
1204                                                                 + '<a class="name_mail" href="mailto:' + res.FMailTo + '">'
1205                                                                 + '<b>' + res.FName + '</b></a><span class="mail"> [' + res.FMailTo + ']</span>'
1206                                                                 + '<span class="date_label"> \93\8a\8de\93ú\81F</span>'
1207                                                                 + '<span class="date"> ' + res.FDateTime+ '</span></div>'
1208                                                                 + '<div class="mes">' + res.FBody + ' </div>' )
1209                         else
1210                                 Result := CreateResultString( '<a name="' + no + '"></a>'
1211                                                                 + '<div class="header"><span class="no"><a href="menu:' + no + '">' + no + '</a></span>'
1212                                                                 + '<span class="name_label"> \96¼\91O\81F </span>'
1213                                                                 + '<a class="name_mail" href="mailto:' + res.FMailTo + '">'
1214                                                                 + '<b>' + res.FName + '</b></a>'
1215                                                                 + '<span class="date_label"> \93\8a\8de\93ú\81F</span>'
1216                                                                 + '<span class="date"> ' + res.FDateTime+ '</span></div>'
1217                                                                 + '<div class="mes">' + res.FBody + ' </div>' );
1218                 end;
1219         except
1220                 Result := nil;
1221         end;
1222
1223 end;
1224
1225 // *************************************************************************
1226 // TThreadItem \83N\83\89\83X\82ð\8c³\82É\83X\83\8c\83b\83h\82Ì\83w\83b\83_\82ð\8eæ\93¾\82·\82é
1227 // *************************************************************************
1228 function ThreadItemGetHeader(
1229         inInstance                              : DWORD;        // \83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X
1230         inOptionalHeader        : PChar         // \92Ç\89Á\82Ì\83w\83b\83_
1231 ) : PChar; stdcall;                                             // \90®\8c`\82³\82ê\82½ HTML
1232 var
1233         threadItem                              : TThreadItem;
1234         skinHeader                              : string;
1235         optionalHeader          : string;
1236 begin
1237
1238         threadItem                      := TThreadItem( inInstance );
1239         optionalHeader  := string( inOptionalHeader );
1240
1241         try
1242                 if GikoSys.Setting.UseSkin then begin
1243                         // \83X\83L\83\93
1244                         skinHeader := GikoSys.LoadFromSkin( GikoSys.Setting.GetSkinHeaderFileName, threadItem, threadItem.SizeByte );
1245                         if Length( optionalHeader ) > 0 then
1246                                 skinHeader :=
1247                                         StringReplace( skinHeader, '</head>', optionalHeader + '</head>', [] );
1248                 end else if GikoSys.Setting.UseCSS then begin
1249                         // CSS
1250                         skinHeader :=
1251                                 '<html><head>' +
1252                                 '<title>' + threadItem.Title + '</title>' +
1253                                 '<link rel="stylesheet" href="'+ GikoSys.Setting.GetStyleSheetDir + GikoSys.Setting.CSSFileName +'" type="text/css">' +
1254                                 optionalHeader +
1255                                 '</head>' +
1256                                 '<body>' +
1257                                 '<div class="title">' + threadItem.Title + '</div>';
1258                 end else begin
1259                         // \83f\83t\83H\83\8b\83g
1260                         skinHeader :=
1261                                 '<html><head>' +
1262                                 '<title>' + threadItem.Title + '</title>' +
1263                                 optionalHeader +
1264                                 '</head>' +
1265                                 '<body>' +
1266                                 '<div class="title">' + threadItem.Title + '</div>';
1267                 end;
1268         except
1269         end;
1270
1271         Result := CreateResultString( skinHeader );
1272
1273 end;
1274
1275 // *************************************************************************
1276 // TThreadItem \83N\83\89\83X\82ð\8c³\82É\83X\83\8c\83b\83h\82Ì\83t\83b\83^\82ð\8eæ\93¾\82·\82é
1277 // *************************************************************************
1278 function ThreadItemGetFooter(
1279         inInstance                              : DWORD;        // \83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X
1280         inOptionalFooter        : PChar         // \92Ç\89Á\82Ì\83t\83b\83^
1281 ) : PChar; stdcall;                                             // \90®\8c`\82³\82ê\82½ HTML
1282 var
1283         threadItem                              : TThreadItem;
1284         skinFooter                              : string;
1285         optionalFooter          : string;
1286 begin
1287
1288         threadItem                      := TThreadItem( inInstance );
1289         optionalFooter  := string( inOptionalFooter );
1290
1291         try
1292                 if GikoSys.Setting.UseSkin then begin
1293                         skinFooter := GikoSys.LoadFromSkin( GikoSys.Setting.GetSkinFooterFileName, threadItem, threadItem.SizeByte );
1294                         if Length( optionalFooter ) > 0 then
1295                                 skinFooter :=
1296                                         StringReplace( skinFooter, '</body>', optionalFooter + '</body>', [] );
1297                 end else begin
1298                                 skinFooter :=
1299                                         '<a name="bottom"></a>' +
1300                                         optionalFooter +
1301                                         '</body></html>' +
1302                                         '<a name="last"></a>' +
1303                                         '</body></html>';
1304                 end;
1305         except
1306         end;
1307
1308         Result := CreateResultString( skinFooter );
1309
1310 end;
1311
1312 // *************************************************************************
1313 // \83X\83\8c\83b\83h\82Ì\83_\83E\83\93\83\8d\81[\83h\82ª\90i\8ds\82µ\82½
1314 // *************************************************************************
1315 procedure ThreadItemWork(
1316         inInstance      : DWORD;                        // \83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X
1317         inWorkCount     : Integer                       // \8c»\8dÝ\82Ì\90i\95à\8fó\8bµ(\83J\83E\83\93\83g)
1318 ); stdcall;
1319 begin
1320
1321         if Assigned( OnWork ) then
1322                 OnWork( TObject( inInstance ), wmRead, inWorkCount );
1323
1324 end;
1325
1326 // *************************************************************************
1327 // \83X\83\8c\83b\83h\82Ì\83_\83E\83\93\83\8d\81[\83h\82ª\8en\82Ü\82Á\82½
1328 // *************************************************************************
1329 procedure ThreadItemWorkBegin(
1330         inInstance                      : DWORD;        // \83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X
1331         inWorkCountMax  : Integer       // \92Ê\90M\82Ì\8fI\82í\82è\82ð\8e¦\82·\83J\83E\83\93\83g
1332 ); stdcall;
1333 begin
1334
1335         if Assigned( OnWorkBegin ) then
1336                 OnWorkBegin( TObject( inInstance ), wmRead, inWorkCountMax );
1337
1338 end;
1339
1340 // *************************************************************************
1341 // \83X\83\8c\83b\83h\82Ì\83_\83E\83\93\83\8d\81[\83h\82ª\8fI\82í\82Á\82½
1342 // *************************************************************************
1343 procedure ThreadItemWorkEnd(
1344         inInstance      : DWORD                         // \83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X
1345 ); stdcall;
1346 begin
1347
1348         if Assigned( OnWorkEnd ) then
1349                 OnWorkEnd( TObject( inInstance ), wmRead );
1350
1351 end;
1352
1353
1354
1355 // =========================================================================
1356 // BoardItem
1357 // =========================================================================
1358
1359 // *************************************************************************
1360 // TBoardItem \83N\83\89\83X\82Ì\83v\83\8d\83p\83e\83B\82ð\8eæ\93¾\82·\82é
1361 // *************************************************************************
1362 function BoardItemGetLong(
1363         instance                : DWORD;
1364         propertyID      : TBoardItemProperty
1365 ) : DWORD; stdcall;
1366 var
1367         boardItem : TBoard;
1368 begin
1369
1370         boardItem := TBoard( instance );
1371         case propertyID of
1372                 bipContext:                                                     // : DWORD                              // \8e©\97R\82É\90Ý\92è\82µ\82Ä\82¢\82¢\92l
1373                         Result := boardItem.Context;
1374                 bipNo:                                                                  // : Integer                    // \94Ô\8d\86
1375                         Result := boardItem.No;
1376                 bipTitle:                                                               // : string                             // \83X\83\8c\83b\83h\83^\83C\83g\83\8b
1377                         Result := DWORD( CreateResultString( boardItem.Title ) );
1378                 bipRound:                                                               // : Boolean                    // \8f\84\89ñ\83t\83\89\83O
1379                         Result := DWORD( boardItem.Round );
1380                 bipRoundName:                                           // : string                             // \8f\84\89ñ\96¼
1381                         Result := DWORD( CreateResultString( boardItem.RoundName ) );
1382                 bipIsLogFile:                                           // : Boolean                    // \83\8d\83O\91\8dÝ\83t\83\89\83O
1383                         Result := DWORD( boardItem.IsLogFile );
1384                 bipUnRead:                                                      // : Integer                    // \83X\83\8c\83b\83h\96¢\93Ç\90\94
1385                         Result := DWORD( boardItem.UnRead );
1386                 bipURL:                                                                 // : string                             // \83X\83\8c\83b\83h\82ð\83u\83\89\83E\83U\82Å\95\\8e¦\82·\82é\8dÛ\82Ì URL
1387                         Result := DWORD( CreateResultString( boardItem.URL ) );
1388                 bipFilePath:                                                                                                                    // \82±\82Ì\83X\83\8c\82ª\95Û\91\82³\82ê\82Ä\82¢\82é\83p\83X
1389                         Result := DWORD( CreateResultString( boardItem.FilePath ) );
1390         else
1391                 Result := 0;
1392         end;
1393 end;
1394
1395 // *************************************************************************
1396 // TBoardItem \83N\83\89\83X\82Ì\83v\83\8d\83p\83e\83B\82ð\90Ý\92è\82·\82é
1397 // *************************************************************************
1398 procedure BoardItemSetLong(
1399         instance                : DWORD;
1400         propertyID      : TBoardItemProperty;
1401         param : DWORD
1402 ); stdcall;
1403 var
1404         boardItem       : TBoard;
1405 begin
1406
1407         boardItem := TBoard( instance );
1408         case propertyID of
1409                 bipContext:                                                     // : DWORD                      // \8e©\97R\82É\90Ý\92è\82µ\82Ä\82¢\82¢\92l
1410                         boardItem.Context                       := param;
1411                 bipNo:                                                                  // : Integer            // \94Ô\8d\86
1412                         boardItem.No                                            := param;
1413                 bipTitle:                                                               // : string                     // \83X\83\8c\83b\83h\83^\83C\83g\83\8b
1414                         boardItem.Title                         := string( PChar( param ) );
1415                 bipRound:                                                               // : Boolean            // \8f\84\89ñ\83t\83\89\83O
1416                         boardItem.Round                         := Boolean( param );
1417                 bipRoundName:                                           // : string                     // \8f\84\89ñ\96¼
1418                         boardItem.RoundName             := string( PChar( param ) );
1419                 bipIsLogFile:                                           // : Boolean            // \83\8d\83O\91\8dÝ\83t\83\89\83O
1420                         boardItem.IsLogFile             := Boolean( param );
1421                 bipUnRead:                                                      // : Integer            // \83X\83\8c\83b\83h\96¢\93Ç\90\94
1422                         boardItem.UnRead                                := Integer( param );
1423                 bipURL:                                                                 // : string                     // \83X\83\8c\83b\83h\82ð\83u\83\89\83E\83U\82Å\95\\8e¦\82·\82é\8dÛ\82Ì URL
1424                         boardItem.URL                                   := string( PChar( param ) );
1425                 bipFilePath:                                            // : string                     // \82±\82Ì\83X\83\8c\82ª\95Û\91\82³\82ê\82Ä\82¢\82é\83p\83X
1426                         boardItem.FilePath                      := string( PChar( param ) );
1427         end;
1428
1429 end;
1430
1431 // *************************************************************************
1432 // TBoardItem \83N\83\89\83X\82Ì\83v\83\8d\83p\83e\83B\82ð\8eæ\93¾\82·\82é
1433 // *************************************************************************
1434 function BoardItemGetDouble(
1435         instance                : DWORD;
1436         propertyID      : TBoardItemProperty
1437 ) : Double; stdcall;
1438 var
1439         boardItem : TBoard;
1440 begin
1441
1442         boardItem := TBoard( instance );
1443         case propertyID of
1444                 bipRoundDate:                                           // : TDateTime  // \83X\83\8c\83b\83h\82ð\8eæ\93¾\82µ\82½\93ú\8e\9e\81i\8f\84\89ñ\93ú\8e\9e\81j
1445                         Result := boardItem.RoundDate;
1446                 bipLastModified:                                // : TDateTime  // \83X\83\8c\83b\83h\82ª\8dX\90V\82³\82ê\82Ä\82¢\82é\93ú\8e\9e\81i\83T\81[\83o\91¤\93ú\8e\9e\81j
1447                         Result := boardItem.LastModified;
1448                 bipLastGetTime:                                 // : TDateTime  // \83X\83\8c\83b\83h\82Ü\82½\82Í\83X\83\8c\83b\83h\88ê\97\97\82ð\8dÅ\8cã\82É\8dX\90V\82µ\82½\93ú\8e\9e\81i\83T\81[\83o\91¤\93ú\8e\9e\81E\8f\91\82«\8d\9e\82Ý\8e\9e\82É\8eg\97p\82·\82é\81j
1449                         Result := boardItem.LastGetTime;
1450         else
1451                 Result := 0;
1452         end;
1453
1454 end;
1455
1456 // *************************************************************************
1457 // TBoardItem \83N\83\89\83X\82Ì\83v\83\8d\83p\83e\83B\82ð\90Ý\92è\82·\82é
1458 // *************************************************************************
1459 procedure BoardItemSetDouble(
1460         instance                : DWORD;
1461         propertyID      : TBoardItemProperty;
1462         param                           : Double
1463 ); stdcall;
1464 var
1465         boardItem : TBoard;
1466 begin
1467
1468         boardItem := TBoard( instance );
1469         case propertyID of
1470                 bipRoundDate:                                           // : TDateTime  // \83X\83\8c\83b\83h\82ð\8eæ\93¾\82µ\82½\93ú\8e\9e\81i\8f\84\89ñ\93ú\8e\9e\81j
1471                         boardItem.RoundDate             := param;
1472                 bipLastModified:                                // : TDateTime  // \83X\83\8c\83b\83h\82ª\8dX\90V\82³\82ê\82Ä\82¢\82é\93ú\8e\9e\81i\83T\81[\83o\91¤\93ú\8e\9e\81j
1473                         boardItem.LastModified  := param;
1474                 bipLastGetTime:                                 // : TDateTime  // \83X\83\8c\83b\83h\82Ü\82½\82Í\83X\83\8c\83b\83h\88ê\97\97\82ð\8dÅ\8cã\82É\8dX\90V\82µ\82½\93ú\8e\9e\81i\83T\81[\83o\91¤\93ú\8e\9e\81E\8f\91\82«\8d\9e\82Ý\8e\9e\82É\8eg\97p\82·\82é\81j
1475                         boardItem.LastGetTime   := param;
1476         end;
1477
1478 end;
1479
1480 // *************************************************************************
1481 // TBoardItem \83N\83\89\83X\82É\8cq\82ª\82ê\82Ä\82¢\82é TThreadItem \83N\83\89\83X\82ð\8eæ\93¾\82·\82é
1482 // *************************************************************************
1483 function BoardItemGetItems(
1484         instance        : DWORD;
1485         index                   : Integer
1486 ) : DWORD; stdcall;
1487 var
1488         boardItem : TBoard;
1489 begin
1490
1491         boardItem       := TBoard( instance );
1492         Result          := DWORD( boardItem.Items[ index ] );
1493
1494 end;
1495
1496 // *************************************************************************
1497 // \94Â\82Ì\83_\83E\83\93\83\8d\81[\83h\82ª\90i\8ds\82µ\82½
1498 // *************************************************************************
1499 procedure BoardItemWork(
1500         inInstance      : DWORD;                        // \83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X
1501         inWorkCount     : Integer                       // \8c»\8dÝ\82Ì\90i\95à\8fó\8bµ(\83J\83E\83\93\83g)
1502 ); stdcall;
1503 begin
1504
1505         if Assigned( OnWork ) then
1506                 OnWork( TObject( inInstance ), wmRead, inWorkCount );
1507
1508 end;
1509
1510 // *************************************************************************
1511 // \94Â\82Ì\83_\83E\83\93\83\8d\81[\83h\82ª\8en\82Ü\82Á\82½
1512 // *************************************************************************
1513 procedure BoardItemWorkBegin(
1514         inInstance                      : DWORD;        // \83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X
1515         inWorkCountMax  : Integer       // \92Ê\90M\82Ì\8fI\82í\82è\82ð\8e¦\82·\83J\83E\83\93\83g
1516 ); stdcall;
1517 begin
1518
1519         if Assigned( OnWorkBegin ) then
1520                 OnWorkBegin( TObject( inInstance ), wmRead, inWorkCountMax );
1521
1522 end;
1523
1524 // *************************************************************************
1525 // \94Â\82Ì\83_\83E\83\93\83\8d\81[\83h\82ª\8fI\82í\82Á\82½
1526 // *************************************************************************
1527 procedure BoardItemWorkEnd(
1528         inInstance      : DWORD                         // \83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X
1529 ); stdcall;
1530 begin
1531
1532         if Assigned( OnWorkEnd ) then
1533                 OnWorkEnd( TObject( inInstance ), wmRead );
1534
1535 end;
1536
1537 // *************************************************************************
1538 // \94Â\82ª\95Û\97L\82·\82é\83X\83\8c\88ê\97\97\82Ì\97ñ\8b\93\8f\88\97\9d\82ð\83v\83\8d\83O\83\89\83\80\96{\91Ì\82É\94C\82³\82ê\82½
1539 // *************************************************************************
1540 procedure BoardItemEnumThread(
1541         inInstance              : DWORD;
1542         inCallBack              : TBoardItemEnumThreadCallBack;
1543         inSubjectText   : PChar
1544 ); stdcall;
1545 var
1546         board                                   : TBoard;
1547         subject                         : TStringList;
1548         i                                                       : Integer;
1549         rec                                             : TSubjectRec;
1550         isContinue              : Boolean;
1551 begin
1552
1553         try
1554                 board           := TBoard( inInstance );
1555                 subject := TStringList.Create;
1556                 try
1557                         subject.Text := inSubjectText;
1558
1559                         for i := 0 to subject.Count - 1 do begin
1560                                 rec                                             := GikoSys.DivideSubject( subject[i] );
1561                                 rec.FFileName   := Trim(rec.FFileName);
1562                                 if (rec.FTitle = '') and (rec.FCount = 0) then
1563                                         Continue;
1564
1565                                 isContinue := inCallBack(
1566                                         PChar( GikoSys.GetURL( board.BBSID, rec.FFileName ) ),
1567                                         PChar( rec.FTitle ),
1568                                         DWORD( rec.FCount ) );
1569
1570                                 if ( not isContinue ) then
1571                                         Break;
1572                         end;
1573                 finally
1574                         subject.Free;
1575                 end;
1576         except
1577         end;
1578
1579 end;
1580
1581 exports
1582         CreateResultString,
1583         DisposeResultString,
1584         VersionInfo,
1585         ApplicationFolder,
1586         PreferencesFolder,
1587         PreferencesFile,
1588         LogFolder,
1589         CSSFolder,
1590         SkinFolder,
1591         SkinFile,
1592         AbonFolder,
1593         AbonFile,
1594         InternalDownload,
1595         InternalAbon,
1596         InternalDat2HTML,
1597         ThreadItemGetLong,
1598         ThreadItemSetLong,
1599         ThreadItemGetDouble,
1600         ThreadItemSetDouble,
1601         ThreadItemDat2HTML,
1602         ThreadItemGetHeader,
1603         ThreadItemGetFooter,
1604         ThreadItemWork,
1605         ThreadItemWorkBegin,
1606         ThreadItemWorkEnd,
1607         BoardItemGetLong,
1608         BoardItemSetLong,
1609         BoardItemGetDouble,
1610         BoardItemSetDouble,
1611         BoardItemGetItems,
1612         BoardItemEnumThread,
1613         BoardItemWork,
1614         BoardItemWorkBegin,
1615         BoardItemWorkEnd;
1616
1617 end.
1618