OSDN Git Service

・TBoardPlugIn のメンバが異常時に初期化されないことがあったので修正。
[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         // TThreadItem \82Ì\83v\83\8d\83p\83e\83B\90Ý\92è\81^\8eæ\93¾ ID
12         TThreadItemProperty = (
13                 tipContext,                                                     // : DWORD                      // \8e©\97R\82É\90Ý\92è\82µ\82Ä\82¢\82¢\92l
14                 tipNo,                                                                  // : Integer            // \94Ô\8d\86
15                 tipFileName,                                            // : string                     // \83X\83\8c\83b\83h\83t\83@\83C\83\8b\96¼
16                 tipTitle,                                                               // : string                     // \83X\83\8c\83b\83h\83^\83C\83g\83\8b
17                 tipRoundDate,                                           // : TDateTime  // \83X\83\8c\83b\83h\82ð\8eæ\93¾\82µ\82½\93ú\8e\9e\81i\8f\84\89ñ\93ú\8e\9e\81j
18                 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
19                 tipCount,                                                               // : Integer            // \83X\83\8c\83b\83h\83J\83E\83\93\83g\81i\83\8d\81[\83J\83\8b\81j
20                 tipAllResCount,                                 // : Integer            // \83X\83\8c\83b\83h\83J\83E\83\93\83g\81i\83T\81[\83o\81j
21                 tipNewResCount,                                 // : Integer            // \83X\83\8c\83b\83h\90V\92\85\90\94
22                 tipSize,                                                                // : Integer            // \83X\83\8c\83b\83h\83T\83C\83Y
23                 tipRound,                                                               // : Boolean            // \8f\84\89ñ\83t\83\89\83O
24                 tipRoundName,                                           // : string                     // \8f\84\89ñ\96¼
25                 tipIsLogFile,                                           // : Boolean            // \83\8d\83O\91\8dÝ\83t\83\89\83O
26                 tipKokomade,                                            // : Integer            // \83R\83R\82Ü\82Å\93Ç\82ñ\82¾\94Ô\8d\86
27                 tipNewReceive,                                  // : Integer            // \83R\83R\82©\82ç\90V\8bK\8eó\90M
28                 tipNewArrival,                                  // : Boolean            // \90V\92\85
29                 tipUnRead,                                                      // : Boolean            // \96¢\93Ç\83t\83\89\83O
30                 tipScrollTop,                                           // : Integer            // \83X\83N\83\8d\81[\83\8b\88Ê\92u
31                 tipDownloadHost,                                // : string                     // \8d¡\82Ì\83z\83X\83g\82Æ\88á\82¤\8fê\8d\87\82Ì\83z\83X\83g
32                 tipAgeSage,                                                     // : TThreadAgeSage     // \83A\83C\83e\83\80\82Ì\8fã\82°\89º\82°
33                 tipURL,                                                                 // : string                     // \83X\83\8c\83b\83h\82ð\83u\83\89\83E\83U\82Å\95\\8e¦\82·\82é\8dÛ\82Ì URL
34                 tipFilePath                                                     // : string                     // \82±\82Ì\83X\83\8c\82ª\95Û\91\82³\82ê\82Ä\82¢\82é\83p\83X
35         );
36
37         // *************************************************************************
38         // \83v\83\89\83O\83C\83\93\82Ì\83o\81[\83W\83\87\83\93
39         // *************************************************************************
40         TOnVersionInfo = procedure(
41                 var outAgent            : PChar;        // \83o\81[\83W\83\87\83\93\82ð\88ê\90Ø\8aÜ\82Ü\82È\82¢\8f\83\90\88\82È\96¼\8fÌ
42                 var outMajor            : DWORD;        // \83\81\83W\83\83\81[\83o\81[\83W\83\87\83\93
43                 var outMinor            : DWORD;        // \83}\83C\83i\81[\83o\81[\83W\83\87\83\93
44                 var outRelease  : PChar;        // \83\8a\83\8a\81[\83X\92i\8aK\96¼
45                 var outRevision : DWORD         // \83\8a\83r\83W\83\87\83\93\83i\83\93\83o\81[
46         ); stdcall;
47
48         // *************************************************************************
49         // \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©
50         // *************************************************************************
51         TOnAcceptURL = function(
52                 inURL : PChar                                           // \94»\92f\82ð\8bÂ\82¢\82Å\82¢\82é URL
53         ): Boolean; stdcall;                    // \8eó\82¯\95t\82¯\82é\82È\82ç True
54
55         // *************************************************************************
56         // TThreadItem \82ª\90\90¬\82³\82ê\82½
57         // *************************************************************************
58         TThreadItemCreate = procedure(
59                 inInstance : DWORD
60         ); stdcall;
61
62         // *************************************************************************
63         // TThreadItem \82ª\94j\8aü\82³\82ê\82½
64         // *************************************************************************
65         TThreadItemDispose = procedure(
66                 inInstance : DWORD
67         ); stdcall;
68
69         // *************************************************************************
70         // \83_\83E\83\93\83\8d\81[\83h\82ð\8ew\8e¦\82³\82ê\82½
71         // *************************************************************************
72         TThreadItemOnDownload = procedure(
73                 inInstance      : DWORD                 // \83C\83\93\83X\83^\83\93\83X
74         ); stdcall;                                                             // \83_\83E\83\93\83\8d\81[\83h\82³\82ê\82½\83X\83\8c\83b\83h
75
76         // *************************************************************************
77         // \83\8c\83X\94Ô\8d\86 n \82É\91Î\82·\82é html \82ð\97v\8b\81\82³\82ê\82½
78         // *************************************************************************
79         TThreadItemOnGetRes = function(
80                 inInstance      : DWORD;                // \83C\83\93\83X\83^\83\93\83X
81                 inNo                            : DWORD                 // \95\\8e¦\82·\82é\83\8c\83X\94Ô\8d\86
82         ) : PChar; stdcall;                             // \95\\8e¦\82·\82é HTML
83
84         // *************************************************************************
85         // \83X\83\8c\83b\83h\82Ì\83w\83b\83_ html \82ð\97v\8b\81\82³\82ê\82½
86         // *************************************************************************
87         TThreadItemOnGetHeader = function(
88                 inInstance                              : DWORD;        // \83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X
89                 inOptionalHeader        : PChar         // \92Ç\89Á\82Ì\83w\83b\83_
90         ) : PChar; stdcall;                                             // \90®\8c`\82³\82ê\82½ HTML
91
92         // *************************************************************************
93         // \83X\83\8c\83b\83h\82Ì\83t\83b\83^ html \82ð\97v\8b\81\82³\82ê\82½
94         // *************************************************************************
95         TThreadItemOnGetFooter = function(
96                 inInstance                              : DWORD;        // \83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X
97                 inOptionalFooter        : PChar         // \92Ç\89Á\82Ì\83t\83b\83^
98         ) : PChar; stdcall;                                             // \90®\8c`\82³\82ê\82½ HTML
99
100
101
102         // =========================================================================
103         // \83v\83\89\83O\83C\83\93\82ð\8aÇ\97\9d\82·\82é TBoardPlugin \83N\83\89\83X
104         // =========================================================================
105         TBoardPlugIn = class( TObject )
106         private
107                 FFilePath                                               : string;               // \83v\83\89\83O\83C\83\93\82ð\8e¦\82·\83p\83X
108                 FModule                                                 : HMODULE;      // \83v\83\89\83O\83C\83\93\82Ì\83\82\83W\83\85\81[\83\8b\83n\83\93\83h\83\8b
109
110                 FVersionInfo                            : TOnVersionInfo;
111                 FAcceptURL                                      : TOnAcceptURL;
112                 FCreateThreadItem               : TThreadItemCreate;
113                 FDisposeThreadItem      : TThreadItemDispose;
114                 FDownload                                               : TThreadItemOnDownload;
115                 FGetRes                                                 : TThreadItemOnGetRes;
116                 FGetHeader                                      : TThreadItemOnGetHeader;
117                 FGetFooter                                      : TThreadItemOnGetFooter;
118
119         public
120                 // \83R\83\93\83X\83g\83\89\83N\83^
121                 constructor     Create;
122                 // \83v\83\89\83O\83C\83\93\82Ì\83p\83X\82ð\8ew\92è\82µ\82Ä\8dì\90¬
123                 constructor     CreateFromPath( inPath : string );
124                 // \83v\83\89\83O\83C\83\93\96¼\82ð\8ew\92è\82µ\82Ä\8dì\90¬
125                 constructor     CreateFromName( inName : string );
126                 // \83\82\83W\83\85\81[\83\8b\83n\83\93\83h\83\8b\82ð\8ew\92è\82µ\82Ä\8dì\90¬
127                 constructor     CreateFromModule( inModule : HMODULE );
128
129                 // \83v\83\89\83O\83C\83\93\82Ì\83p\83X\82ð\8ew\92è\82µ\82Ä\83\8d\81[\83h
130                 procedure       LoadFromPath( inPath : string );
131                 // \83v\83\89\83O\83C\83\93\96¼\82ð\8ew\92è\82µ\82Ä\83\8d\81[\83h
132                 procedure       LoadFromName( inName : string );
133                 // \83\82\83W\83\85\81[\83\8b\83n\83\93\83h\83\8b\82ð\8ew\92è\82µ\82Ä\83\8d\81[\83h
134                 procedure       LoadFromModule( inModule : HMODULE );
135                 // \83o\81[\83W\83\87\83\93\8fî\95ñ
136                 procedure       VersionInfo(    var outAgent : string;
137                         var outMajor : DWORD; var outMinor : DWORD;
138                         var outRelease : string; var outRevision : DWORD );
139                 // \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©
140                 function        AcceptURL( inURL : string ) : Boolean;
141                 // TThreadItem \82ª\90\90¬\82³\82ê\82½
142                 procedure       CreateThreadItem( threadItem : DWORD );
143                 // TThreadItem \82ª\94j\8aü\82³\82ê\82½
144                 procedure       DisposeThreadItem( threadItem : DWORD );
145                 // \83_\83E\83\93\83\8d\81[\83h\82ð\8ew\8e¦
146                 procedure       Download( threadItem: DWORD );
147                 // \83\8c\83X\94Ô\8d\86 n \82É\91Î\82·\82é html \82ð\97v\8b\81
148                 function        GetRes( threadItem : DWORD; inNo : DWORD ) : string;
149                 // \83X\83\8c\83b\83h\82Ì\83w\83b\83_ html \82ð\97v\8b\81
150                 function        GetHeader( threadItem : DWORD; inOptionalHeader : string ) : string;
151                 // \83X\83\8c\83b\83h\82Ì\83t\83b\83^ html \82ð\97v\8b\81
152                 function        GetFooter( threadItem : DWORD; inOptionalFooter : string ) : string;
153
154         private
155                 procedure       LoadPlugInAPI;
156
157         public
158                 property        FilePath        : string        read FFilePath;
159                 property        Module          : HMODULE       read FModule;
160         end;
161
162 var
163         OnWork                          : TWorkEvent;
164         OnWorkBegin             : TWorkBeginEvent;
165         OnWorkEnd                       : TWorkEndEvent;
166
167         BoardPlugIns    : array of TBoardPlugIn;
168
169 procedure InitializeBoardPlugIns;
170
171 function CreateResultString(
172         resultStr : string
173 ) : PChar; stdcall;
174
175 function ThreadItemDat2HTML(
176         inInstance      : DWORD;                // \83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X
177         inDatRes                : PChar;                // \96¼\91O<>\83\81\81[\83\8b<>\93ú\95tID<>\96{\95¶<> \82Å\8d\\90¬\82³\82ê\82½\83e\83L\83X\83g
178         inResNo                 : DWORD;                // \83\8c\83X\94Ô\8d\86
179         inIsNew                 : Boolean               // \90V\92\85\83\8c\83X\82È\82ç True
180 ) : PChar; stdcall;                             // \90®\8c`\82³\82ê\82½ HTML
181
182 procedure DisposeResultString(
183         resultStr : PChar
184 ); stdcall;
185
186 implementation
187
188 uses GikoSystem, BoardGroup;
189
190 // =========================================================================
191 // \83v\83\89\83O\83C\83\93\82ð\8aÇ\97\9d\82·\82é TBoardPlugin \83N\83\89\83X
192 // =========================================================================
193
194 // *************************************************************************
195 // BoardPlugin \83t\83H\83\8b\83_\82É\82 \82é\83v\83\89\83O\83C\83\93\82ð\91S\82Ä\83\8d\81[\83h
196 // *************************************************************************
197 procedure InitializeBoardPlugIns;
198 var
199         i, bound                : Integer;
200         pluginNames     : TStringList;
201 begin
202
203         pluginNames := TStringList.Create;
204         try
205                 GikoSys.GetFileList( GikoSys.Setting.GetBoardPlugInDir, '*', pluginNames, False, False );
206                 SetLength( BoardPlugIns, pluginNames.Count );
207
208                 bound := pluginNames.Count - 1;
209                 for i := 0 to bound do
210                         BoardPlugIns[ i ] := TBoardPlugIn.CreateFromName( pluginNames.Strings[ i ] );
211         finally
212                 pluginNames.Free;
213         end;
214
215 end;
216
217
218
219 // =========================================================================
220 // \83v\83\89\83O\83C\83\93\82ð\8aÇ\97\9d\82·\82é TBoardPlugin \83N\83\89\83X
221 // =========================================================================
222
223 // *************************************************************************
224 // \83R\83\93\83X\83g\83\89\83N\83^
225 // *************************************************************************
226 constructor     TBoardPlugIn.Create;
227 begin
228
229         inherited;
230
231         FVersionInfo                            := nil;
232         FAcceptURL                                      := nil;
233         FCreateThreadItem               := nil;
234         FDisposeThreadItem      := nil;
235         FDownload                                               := nil;
236         FGetRes                                                 := nil;
237         FGetHeader                                      := nil;
238         FGetFooter                                      := nil;
239
240 end;
241
242 // *************************************************************************
243 // \83v\83\89\83O\83C\83\93\82Ì\83p\83X\82ð\8ew\92è\82µ\82Ä\8dì\90¬
244 // *************************************************************************
245 constructor     TBoardPlugIn.CreateFromPath(
246         inPath : string
247 );
248 begin
249
250         Create;
251
252         LoadFromPath( inPath );
253
254 end;
255
256 // *************************************************************************
257 // \83v\83\89\83O\83C\83\93\96¼\82ð\8ew\92è\82µ\82Ä\8dì\90¬
258 // *************************************************************************
259 constructor     TBoardPlugIn.CreateFromName(
260         inName : string
261 );
262 begin
263
264         Create;
265
266         LoadFromName( inName );
267
268 end;
269
270 // *************************************************************************
271 // \83\82\83W\83\85\81[\83\8b\83n\83\93\83h\83\8b\82ð\8ew\92è\82µ\82Ä\8dì\90¬
272 // *************************************************************************
273 constructor     TBoardPlugIn.CreateFromModule(
274         inModule : HMODULE
275 );
276 begin
277
278         inherited Create;
279
280         LoadFromModule( inModule );
281
282 end;
283
284 // *************************************************************************
285 // \83v\83\89\83O\83C\83\93\82Ì\83p\83X\82ð\8ew\92è\82µ\82Ä\83\8d\81[\83h
286 // *************************************************************************
287 procedure TBoardPlugIn.LoadFromPath(
288         inPath : string
289 );
290 begin
291
292         FFilePath := inPath;
293         if FileExists( inPath ) then
294                 FModule := LoadLibrary( PChar( inPath ) )
295         else if FileExists( inPath + '.dll' ) then
296                 FModule := LoadLibrary( PChar( inPath + '.dll' ) );
297
298         LoadPlugInAPI;
299
300 end;
301
302 // *************************************************************************
303 // \83v\83\89\83O\83C\83\93\96¼\82ð\8ew\92è\82µ\82Ä\83\8d\81[\83h
304 // *************************************************************************
305 procedure TBoardPlugIn.LoadFromName(
306         inName : string
307 );
308 begin
309
310         LoadFromPath( GikoSys.Setting.GetBoardPlugInDir + inName );
311
312 end;
313
314 // *************************************************************************
315 // \83\82\83W\83\85\81[\83\8b\83n\83\93\83h\83\8b\82ð\8ew\92è\82µ\82Ä\83\8d\81[\83h
316 // *************************************************************************
317 procedure TBoardPlugIn.LoadFromModule(
318         inModule        : HMODULE
319 );
320 var
321         tmp                             : array [0..MAX_PATH] of Char;
322 begin
323
324         GetModuleFileName( inModule, tmp, SizeOf( tmp ) );
325         FFilePath       := tmp;
326         FModule         := inModule;
327
328         LoadPlugInAPI;
329
330 end;
331
332 // *************************************************************************
333 // \83o\81[\83W\83\87\83\93\8fî\95ñ
334 // *************************************************************************
335 procedure TBoardPlugIn.VersionInfo(
336         var outAgent            : string;               // \83o\81[\83W\83\87\83\93\82ð\88ê\90Ø\8aÜ\82Ü\82È\82¢\8f\83\90\88\82È\96¼\8fÌ
337         var outMajor            : DWORD;                // \83\81\83W\83\83\81[\83o\81[\83W\83\87\83\93
338         var outMinor            : DWORD;                // \83}\83C\83i\81[\83o\81[\83W\83\87\83\93
339         var outRelease  : string;               // \83\8a\83\8a\81[\83X\92i\8aK\96¼
340         var outRevision : DWORD                 // \83\8a\83r\83W\83\87\83\93\83i\83\93\83o\81[
341 );
342 var
343         agent                                           : PChar;
344         release                                 : PChar;
345 begin
346
347         if Assigned( FVersionInfo ) then begin
348                 FVersionInfo( agent, outMajor, outMinor, release, outRevision );
349                 outAgent                := string( agent );
350                 outRelease      := string( release );
351                 DisposeResultString( agent );
352                 DisposeResultString( release );
353         end;
354
355 end;
356
357 // *************************************************************************
358 // \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©
359 // *************************************************************************
360 function        TBoardPlugIn.AcceptURL(
361         inURL : string
362 ) : Boolean;
363 begin
364
365         if Assigned( FAcceptURL ) then
366                 Result := FAcceptURL( PChar( inURL ) )
367         else
368                 Result := False;
369
370 end;
371
372 // *************************************************************************
373 // TThreadItem \82ª\90\90¬\82³\82ê\82½
374 // *************************************************************************
375 procedure       TBoardPlugIn.CreateThreadItem(
376         threadItem : DWORD
377 );
378 begin
379
380         if Assigned( FCreateThreadItem ) then
381                 FCreateThreadItem( threadItem );
382
383 end;
384
385 // *************************************************************************
386 // TThreadItem \82ª\94j\8aü\82³\82ê\82½
387 // *************************************************************************
388 procedure       TBoardPlugIn.DisposeThreadItem(
389         threadItem : DWORD
390 );
391 begin
392
393         if Assigned( FDisposeThreadItem ) then
394                 FDisposeThreadItem( threadItem );
395
396 end;
397
398 // *************************************************************************
399 // \83_\83E\83\93\83\8d\81[\83h\82ð\8ew\8e¦
400 // *************************************************************************
401 procedure       TBoardPlugIn.Download( threadItem: DWORD );
402 begin
403
404         if Assigned( FDownload ) then
405                 FDownload( threadItem );
406
407 end;
408
409 // *************************************************************************
410 // \83\8c\83X\94Ô\8d\86 n \82É\91Î\82·\82é html \82ð\97v\8b\81
411 // *************************************************************************
412 function TBoardPlugIn.GetRes(
413         threadItem      : DWORD;                // \83C\83\93\83X\83^\83\93\83X
414         inNo                            : DWORD                 // \95\\8e¦\82·\82é\83\8c\83X\94Ô\8d\86
415 ) : string;                                                     // \95\\8e¦\82·\82é HTML
416 var
417         tmp                                     : PChar;
418 begin
419
420         if Assigned( FGetRes ) then begin
421                 tmp                     := FGetRes( threadItem, inNo );
422                 Result  := string( tmp );
423                 DisposeResultString( tmp );
424         end;
425
426 end;
427
428 // *************************************************************************
429 // \83X\83\8c\83b\83h\82Ì\83w\83b\83_ html \82ð\97v\8b\81
430 // *************************************************************************
431 function TBoardPlugIn.GetHeader(
432         threadItem                              : DWORD;        // \83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X
433         inOptionalHeader        : string        // \92Ç\89Á\82Ì\83w\83b\83_
434 ) : string;                                                                             // \90®\8c`\82³\82ê\82½ HTML
435 var
436         tmp                                                             : PChar;
437 begin
438
439         if Assigned( FGetHeader ) then begin
440                 tmp                     := FGetHeader( threadItem, PChar( inOptionalHeader ) );
441                 Result  := string( tmp );
442                 DisposeResultString( tmp );
443         end;
444
445 end;
446
447 // *************************************************************************
448 // \83X\83\8c\83b\83h\82Ì\83t\83b\83^ html \82ð\97v\8b\81
449 // *************************************************************************
450 function TBoardPlugIn.GetFooter(
451         threadItem                              : DWORD;        // \83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X
452         inOptionalFooter        : string        // \92Ç\89Á\82Ì\83t\83b\83^
453 ) : string;                                                                             // \90®\8c`\82³\82ê\82½ HTML
454 var
455         tmp                                                             : PChar;
456 begin
457
458         if Assigned( FGetFooter ) then begin
459                 tmp                     := FGetFooter( threadItem, PChar( inOptionalFooter ) );
460                 Result  := string( tmp );
461                 DisposeResultString( tmp );
462         end;
463
464 end;
465
466 // *************************************************************************
467 // \83v\83\89\83O\83C\83\93\82Ì API \82ð\8eæ\93¾
468 // *************************************************************************
469 procedure TBoardPlugIn.LoadPlugInAPI;
470 begin
471
472         try
473                 if Assigned( Pointer( FModule ) ) then begin
474                         FVersionInfo                            := GetProcAddress( FModule, 'OnVersionInfo' );
475                         FAcceptURL                                      := GetProcAddress( FModule, 'OnAcceptURL' );
476                         FCreateThreadItem               := GetProcAddress( FModule, 'ThreadItemCreate' );
477                         FDisposeThreadItem      := GetProcAddress( FModule, 'ThreadItemDispose' );
478                         FDownload                                               := GetProcAddress( FModule, 'ThreadItemOnDownload' );
479                         FGetRes                                                 := GetProcAddress( FModule, 'ThreadItemOnGetRes' );
480                         FGetHeader                                      := GetProcAddress( FModule, 'ThreadItemOnGetHeader' );
481                         FGetFooter                                      := GetProcAddress( FModule, 'ThreadItemOnGetFooter' );
482                 end;
483         except
484         end;
485
486 end;
487
488
489
490 // =========================================================================
491 // PlugInMain
492 // =========================================================================
493
494 // *************************************************************************
495 // \96ß\82è\92l\82ª PChar \82Å\82 \82é API \82Ì\83\81\83\82\83\8a\82ð\8am\95Û\82·\82é
496 // *************************************************************************
497 function CreateResultString(
498         resultStr : string
499 ) : PChar; stdcall;
500 var
501         tmp : PChar;
502 begin
503
504         tmp := PChar( resultStr );
505         GetMem( Result, Length( tmp ) + 1 );
506         Move( tmp^, Result^, Length( tmp ) + 1 );
507
508 end;
509
510 // *************************************************************************
511 // \96ß\82è\92l\82ª PChar \82Å\82 \82é API \82Ì\83\81\83\82\83\8a\82ð\8aJ\95ú\82·\82é
512 // *************************************************************************
513 procedure DisposeResultString(
514         resultStr : PChar
515 ); stdcall;
516 begin
517
518         FreeMem( resultStr );
519
520 end;
521
522 // *************************************************************************
523 // \83v\83\8d\83O\83\89\83\80\96{\91Ì\82Ì\83o\81[\83W\83\87\83\93\82ð\8eæ\93¾\82·\82é
524 // *************************************************************************
525 procedure VersionInfo(
526         var outAgent            : PChar;        // \83o\81[\83W\83\87\83\93\82ð\88ê\90Ø\8aÜ\82Ü\82È\82¢\8f\83\90\88\82È\96¼\8fÌ
527         var outMajor            : DWORD;        // \83\81\83W\83\83\81[\83o\81[\83W\83\87\83\93
528         var outMinor            : DWORD;        // \83}\83C\83i\81[\83o\81[\83W\83\87\83\93
529         var outRelease  : PChar;        // \83\8a\83\8a\81[\83X\92i\8aK\96¼
530         var outRevision : DWORD         // \83\8a\83r\83W\83\87\83\93\83i\83\93\83o\81[
531 ); stdcall;
532 begin
533
534         outAgent                := CreateResultString( PChar( APP_NAME ) );
535         outMajor                := 1;
536         outMinor                := 0;
537         outRelease      := CreateResultString( PChar( BETA_VERSION_NAME_E ) );
538         outRevision     := BETA_VERSION;
539
540 end;
541
542 // *************************************************************************
543 // \8ew\92è\82µ\82½ URL \82ð\83_\83E\83\93\83\8d\81[\83h\82µ\82Ä\95Ô\82·
544 // *************************************************************************
545 function InternalDownload(
546         inURL                                                   : PChar;        // \83_\83E\83\93\83\8d\81[\83h\82·\82é URL
547         var ioModified          : Double;       // \8dÅ\8cã\82É\8eæ\93¾\82µ\82½\93ú\8e\9e
548         var outResultData       : PChar;        // \83_\83E\83\93\83\8d\81[\83h\82³\82ê\82½\95\8e\9a\97ñ
549         inRangeStart                    : DWORD;        // \8aJ\8en\88Ê\92u
550         inRangeEnd                              : DWORD         // \8fI\97¹\88Ê\92u
551 ) : Longint; stdcall;                                   // \83\8c\83X\83|\83\93\83X\83R\81[\83h
552 var
553         httpSocket                              : TIdHTTP;
554         resStream                                       : TMemoryStream;
555         content                                         : string;
556 begin
557
558         Result := -1;
559
560         httpSocket := TIdHTTP.Create( nil );
561         try
562                 // \83C\83x\83\93\83g\82Ì\90Ý\92è
563                 if Assigned( OnWork ) then
564                         httpSocket.OnWork                               := OnWork;
565                 if Assigned( OnWorkBegin ) then
566                         httpSocket.OnWorkBegin  := OnWorkBegin;
567                 if Assigned( OnWorkEnd ) then
568                         httpSocket.OnWorkEnd            := OnWorkEnd;
569
570                 // \92Ê\90M\82É\8aÖ\82·\82é\90Ý\92è
571                 httpSocket.Request.CustomHeaders.Clear;
572                 httpSocket.Response.Clear;
573                 httpSocket.Request.Clear;
574
575                 httpSocket.Request.UserAgent    := GikoSys.GetUserAgent;
576                 httpSocket.RecvBufferSize                       := Gikosys.Setting.RecvBufferSize;
577                 httpSocket.ProxyParams.BasicAuthentication := False;
578                 {$IFDEF DEBUG}
579                 Writeln('------------------------------------------------------------');
580                 {$ENDIF}
581                 //httpSocket.AllowCookies := False;
582                 if GikoSys.Setting.ReadProxy then begin
583                         if GikoSys.Setting.ProxyProtocol then
584                                 httpSocket.ProtocolVersion := pv1_1
585                         else
586                                 httpSocket.ProtocolVersion := pv1_0;
587                         httpSocket.ProxyParams.ProxyServer              := GikoSys.Setting.ReadProxyAddress;
588                         httpSocket.ProxyParams.ProxyPort                        := GikoSys.Setting.ReadProxyPort;
589                         httpSocket.ProxyParams.ProxyUsername    := GikoSys.Setting.ReadProxyUserID;
590                         httpSocket.ProxyParams.ProxyPassword    := GikoSys.Setting.ReadProxyPassword;
591                         if GikoSys.Setting.ReadProxyUserID <> '' then
592                                 httpSocket.ProxyParams.BasicAuthentication := True;
593                         {$IFDEF DEBUG}
594                         Writeln('\83v\83\8d\83L\83V\90Ý\92è\82 \82è');
595                         Writeln('\83z\83X\83g: ' + GikoSys.Setting.ReadProxyAddress);
596                         Writeln('\83|\81[\83g: ' + IntToStr( GikoSys.Setting.ReadProxyPort ));
597                         {$ENDIF}
598                 end else begin
599                         if GikoSys.Setting.Protocol then
600                                 httpSocket.ProtocolVersion := pv1_1
601                         else
602                                 httpSocket.ProtocolVersion := pv1_0;
603                         httpSocket.ProxyParams.ProxyServer              := '';
604                         httpSocket.ProxyParams.ProxyPort                        := 80;
605                         httpSocket.ProxyParams.ProxyUsername    := '';
606                         httpSocket.ProxyParams.ProxyPassword    := '';
607                         {$IFDEF DEBUG}
608                         Writeln('\83v\83\8d\83L\83V\90Ý\92è\82È\82µ');
609                         {$ENDIF}
610                 end;
611
612                 httpSocket.Request.ContentRangeStart    := inRangeStart;
613                 httpSocket.Request.ContentRangeEnd              := inRangeEnd;
614                 if (ioModified <> 0) and (ioModified <> ZERO_DATE) then
615                         httpSocket.Request.LastModified := ioModified - OffsetFromUTC;
616                 if inRangeStart = 0 then
617                         httpSocket.Request.AcceptEncoding := 'gzip'
618                 else
619                         httpSocket.Request.AcceptEncoding := '';
620                 httpSocket.Request.Accept := 'text/html';
621
622                 resStream := TMemoryStream.Create;
623                 try
624                         try
625                                 resStream.Clear;
626
627                                 {$IFDEF DEBUG}
628                                 Writeln('URL: ' + inURL);
629                                 {$ENDIF}
630                                 httpSocket.Get( inURL, resStream );
631                                 {$IFDEF DEBUG}
632                                 Writeln('\8eæ\93¾\82Å\97á\8aO\82È\82µ');
633                                 {$ENDIF}
634
635                                 content                 := GikoSys.GzipDecompress( resStream, httpSocket.Response.ContentEncoding );
636                                 ioModified      := httpSocket.Response.LastModified;
637
638                                 Result := httpSocket.ResponseCode;
639                                 if (Length( content ) = 0) and (Result = 206) then
640                                         Result := 304;
641
642                                 outResultData := CreateResultString( content );
643                         except
644                                 on E: EIdSocketError do begin
645                                         ioModified              := ZERO_DATE;
646                                         outResultData   := nil;
647                                 end;
648                                 on E: EIdConnectException do begin
649                                         ioModified              := ZERO_DATE;
650                                         outResultData   := nil;
651                                         //Item.ErrText  := E.Message;
652                                 end;
653                                 on E: Exception do begin
654                                         {$IFDEF DEBUG}
655                                         Writeln('\8eæ\93¾\82Å\97á\8aO\82 \82è');
656                                         Writeln('E.Message: ' + E.Message);
657                                         {$ENDIF}
658                                         ioModified              := ZERO_DATE;
659                                         outResultData   := nil;
660                                         Result                          := httpSocket.ResponseCode;
661                                         //Item.ErrText  := E.Message;
662                                 end;
663                         end;
664                 finally
665                         resStream.Free;
666                 end;
667
668         finally
669                 httpSocket.Free;
670         end;
671
672 end;
673
674 // *************************************************************************
675 // \82Q\82¿\82á\82ñ\82Ë\82é\82Ì dat \8c`\8e®\82ð\83\8d\81[\83J\83\8b\82 \82Ú\81`\82ñ\82É\92Ê\82·
676 // *************************************************************************
677 function InternalAbon(
678         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
679 ) : PChar; stdcall;                             // \82 \82Ú\81`\82ñ\8dÏ\82Ý\82Ì dat \8c`\8e®\83e\83L\83X\83g
680 var
681         datList : TStringList;
682 begin
683
684         datList := TStringList.Create;
685         datList.Text := string( inDatText );
686         //GikoSys.FAbon.IndividualAbon( datList, ChangeFileExt(FileName,'.NG'));
687         GikoSys.FAbon.Execute( datList );
688         GikoSys.FSelectResFilter.Execute( datList );
689
690         Result := CreateResultString( datList.Text );
691
692 end;
693
694 // *************************************************************************
695 // \82Q\82¿\82á\82ñ\82Ë\82é\82Ì dat \8c`\8e® 1 \8ds\82ð HTML \82É\95Ï\8a·\82·\82é
696 // *************************************************************************
697 function InternalDat2HTML(
698         inDatRes        : PChar;                        // \96¼\91O<>\83\81\81[\83\8b<>\93ú\95tID<>\96{\95¶<> \82Å\8d\\90¬\82³\82ê\82½\83e\83L\83X\83g
699         inResNo         : DWORD;                        // \83\8c\83X\94Ô\8d\86
700         inIsNew         : Boolean                       // \90V\92\85\83\8c\83X\82È\82ç True
701 ) : PChar; stdcall;                             // \90®\8c`\82³\82ê\82½ HTML
702 var
703         board : TBoard;
704         threadItem : TThreadItem;
705 begin
706
707         // \83_\83~\81[\82Ì\83N\83\89\83X
708         board                           := TBoard.Create;
709         threadItem      := TThreadItem.Create;
710
711         try
712                 threadItem.ParentBoard := Board;
713
714                 Result := ThreadItemDat2HTML( DWORD( threadItem ), inDatRes, inResNo, inIsNew );
715         except
716                 Result := nil;
717         end;
718
719 end;
720
721
722
723 // =========================================================================
724 // FilePath
725 // =========================================================================
726
727 // *************************************************************************
728 // \83u\83\89\83E\83U\96{\91Ì\82ª\92u\82¢\82Ä\82 \82é\83t\83H\83\8b\83_
729 // *************************************************************************
730 function ApplicationFolder : PChar; stdcall;
731 begin
732
733         Result := CreateResultString( GikoSys.GetAppDir );
734
735 end;
736
737 // *************************************************************************
738 // \8f\89\8aú\90Ý\92è\83t\83H\83\8b\83_
739 // *************************************************************************
740 function PreferencesFolder : PChar; stdcall;
741 begin
742
743         Result := CreateResultString( GikoSys.GetConfigDir );
744
745 end;
746
747 // *************************************************************************
748 // \8f\89\8aú\90Ý\92è\83t\83@\83C\83\8b
749 // *************************************************************************
750 function PreferencesFile : PChar; stdcall;
751 begin
752
753         Result := CreateResultString( GikoSys.GetAppDir + 'gikoNavi.ini' );
754
755 end;
756
757 // *************************************************************************
758 // \83\8d\83O\83t\83H\83\8b\83_
759 // *************************************************************************
760 function LogFolder : PChar; stdcall;
761 begin
762
763         Result := CreateResultString( GikoSys.GetAppDir + 'Log\' );
764
765 end;
766
767 // *************************************************************************
768 // CSS \83t\83H\83\8b\83_
769 // *************************************************************************
770 function CSSFolder : PChar; stdcall;
771 begin
772
773         Result := CreateResultString( GikoSys.GetStyleSheetDir );
774
775 end;
776
777 // *************************************************************************
778 // \83X\83L\83\93\82ð\93ü\82ê\82Ä\82¨\82­\83t\83H\83\8b\83_
779 // *************************************************************************
780 function SkinFolder : PChar; stdcall;
781 begin
782
783         Result := CreateResultString( GikoSys.GetSkinDir );
784
785 end;
786
787 // *************************************************************************
788 // \8eg\97p\82µ\82Ä\82¢\82é CSS / \83X\83L\83\93
789 // *************************************************************************
790 function SkinFile : PChar; stdcall;
791 begin
792
793         Result := CreateResultString( GikoSys.Setting.CSSFileName );
794
795 end;
796
797 // *************************************************************************
798 // \82 \82Ú\81[\82ñ\8bK\91¥\82ª\92u\82¢\82Ä\82 \82é\83f\83B\83\8c\83N\83g\83\8a
799 // *************************************************************************
800 function AbonFolder : PChar; stdcall;
801 begin
802
803         Result := CreateResultString( GikoSys.Setting.GetNGWordsDir );
804
805 end;
806
807 // *************************************************************************
808 // \8eg\97p\82µ\82Ä\82¢\82é\82 \82Ú\81[\82ñ\8bK\91¥
809 // *************************************************************************
810 function AbonFile : PChar; stdcall;
811 begin
812
813         Result := CreateResultString( GikoSys.FAbon.GetNGwordpath );
814
815 end;
816
817
818
819 // =========================================================================
820 // ThreadItem
821 // =========================================================================
822
823 // *************************************************************************
824 // TThreadItem \83N\83\89\83X\82Ì\83v\83\8d\83p\83e\83B\82ð\8eæ\93¾\82·\82é
825 // *************************************************************************
826 function ThreadItemGetLong(
827         instance                : DWORD;
828         propertyID      : TThreadItemProperty
829 ) : DWORD; stdcall;
830 var
831         threadItem : TThreadItem;
832 begin
833
834         threadItem := TThreadItem( instance );
835         case propertyID of
836                 tipContext:                                                     // : DWORD                      // \8e©\97R\82É\90Ý\92è\82µ\82Ä\82¢\82¢\92l
837                         Result := threadItem.Context;
838                 tipNo:                                                                  // : Integer            // \94Ô\8d\86
839                         Result := threadItem.No;
840                 tipFileName:                                            // : string                     // \83X\83\8c\83b\83h\83t\83@\83C\83\8b\96¼
841                         Result := DWORD( CreateResultString( threadItem.FileName ) );
842                 tipTitle:                                                               // : string                     // \83X\83\8c\83b\83h\83^\83C\83g\83\8b
843                         Result := DWORD( CreateResultString( threadItem.Title ) );
844                 tipCount:                                                               // : Integer            // \83X\83\8c\83b\83h\83J\83E\83\93\83g\81i\83\8d\81[\83J\83\8b\81j
845                         Result := threadItem.Count;
846                 tipAllResCount:                                 // : Integer            // \83X\83\8c\83b\83h\83J\83E\83\93\83g\81i\83T\81[\83o\81j
847                         Result := threadItem.AllResCount;
848                 tipNewResCount:                                 // : Integer            // \83X\83\8c\83b\83h\90V\92\85\90\94
849                         Result := threadItem.NewResCount;
850                 tipSize:                                                                // : Integer            // \83X\83\8c\83b\83h\83T\83C\83Y
851                         Result := threadItem.Size;
852                 tipRound:                                                               // : Boolean            // \8f\84\89ñ\83t\83\89\83O
853                         Result := DWORD( threadItem.Round );
854                 tipRoundName:                                           // : string                     // \8f\84\89ñ\96¼
855                         Result := DWORD( CreateResultString( threadItem.RoundName ) );
856                 tipIsLogFile:                                           // : Boolean            // \83\8d\83O\91\8dÝ\83t\83\89\83O
857                         Result := DWORD( threadItem.IsLogFile );
858                 tipKokomade:                                            // : Integer            // \83R\83R\82Ü\82Å\93Ç\82ñ\82¾\94Ô\8d\86
859                         Result := threadItem.Kokomade;
860                 tipNewReceive:                                  // : Integer            // \83R\83R\82©\82ç\90V\8bK\8eó\90M
861                         Result := threadItem.NewReceive;
862                 tipNewArrival:                                  // : Boolean            // \90V\92\85
863                         Result := DWORD( threadItem.NewArrival );
864                 tipUnRead:                                                      // : Boolean            // \96¢\93Ç\83t\83\89\83O
865                         Result := DWORD( threadItem.UnRead );
866                 tipScrollTop:                                           // : Integer            // \83X\83N\83\8d\81[\83\8b\88Ê\92u
867                         Result := threadItem.ScrollTop;
868                 tipDownloadHost:                                // : string                     // \8d¡\82Ì\83z\83X\83g\82Æ\88á\82¤\8fê\8d\87\82Ì\83z\83X\83g
869                         Result := DWORD( CreateResultString( threadItem.DownloadHost ) );
870                 tipAgeSage:                                                     // : TThreadAgeSage     // \83A\83C\83e\83\80\82Ì\8fã\82°\89º\82°
871                         Result := DWORD( threadItem.AgeSage );
872                 tipURL:                                                                 // : string                     // \83X\83\8c\83b\83h\82ð\83u\83\89\83E\83U\82Å\95\\8e¦\82·\82é\8dÛ\82Ì URL
873                         Result := DWORD( CreateResultString( threadItem.URL ) );
874                 tipFilePath:                                                                                                            // \82±\82Ì\83X\83\8c\82ª\95Û\91\82³\82ê\82Ä\82¢\82é\83p\83X
875                         Result := DWORD( CreateResultString( threadItem.FilePath ) );
876         else
877                 Result := 0;
878         end;
879 end;
880
881 // *************************************************************************
882 // TThreadItem \83N\83\89\83X\82Ì\83v\83\8d\83p\83e\83B\82ð\90Ý\92è\82·\82é
883 // *************************************************************************
884 procedure ThreadItemSetLong(
885         instance                : DWORD;
886         propertyID      : TThreadItemProperty;
887         param : DWORD
888 ); stdcall;
889 var
890         threadItem      : TThreadItem;
891 begin
892
893         threadItem := TThreadItem( instance );
894         case propertyID of
895                 tipContext:                                                     // : DWORD                      // \8e©\97R\82É\90Ý\92è\82µ\82Ä\82¢\82¢\92l
896                         threadItem.Context                      := param;
897                 tipNo:                                                                  // : Integer            // \94Ô\8d\86
898                         threadItem.No                                           := param;
899                 tipFileName:                                            // : string                     // \83X\83\8c\83b\83h\83t\83@\83C\83\8b\96¼
900                         threadItem.FileName                     := string( PChar( param ) );
901                 tipTitle:                                                               // : string                     // \83X\83\8c\83b\83h\83^\83C\83g\83\8b
902                         threadItem.Title                                := string( PChar( param ) );
903                 tipCount:                                                               // : Integer            // \83X\83\8c\83b\83h\83J\83E\83\93\83g\81i\83\8d\81[\83J\83\8b\81j
904                         threadItem.Count                                := param;
905                 tipAllResCount:                                 // : Integer            // \83X\83\8c\83b\83h\83J\83E\83\93\83g\81i\83T\81[\83o\81j
906                         threadItem.AllResCount  := param;
907                 tipNewResCount:                                 // : Integer            // \83X\83\8c\83b\83h\90V\92\85\90\94
908                         threadItem.NewResCount  := param;
909                 tipSize:                                                                // : Integer            // \83X\83\8c\83b\83h\83T\83C\83Y
910                         threadItem.Size                                 := param;
911                 tipRound:                                                               // : Boolean            // \8f\84\89ñ\83t\83\89\83O
912                         threadItem.Round                                := Boolean( param );
913                 tipRoundName:                                           // : string                     // \8f\84\89ñ\96¼
914                         threadItem.RoundName            := string( PChar( param ) );
915                 tipIsLogFile:                                           // : Boolean            // \83\8d\83O\91\8dÝ\83t\83\89\83O
916                         threadItem.IsLogFile            := Boolean( param );
917                 tipKokomade:                                            // : Integer            // \83R\83R\82Ü\82Å\93Ç\82ñ\82¾\94Ô\8d\86
918                         threadItem.Kokomade                     := param;
919                 tipNewReceive:                                  // : Integer            // \83R\83R\82©\82ç\90V\8bK\8eó\90M
920                         threadItem.NewReceive           := param;
921                 tipNewArrival:                                  // : Boolean            // \90V\92\85
922                         threadItem.NewArrival           := Boolean( param );
923                 tipUnRead:                                                      // : Boolean            // \96¢\93Ç\83t\83\89\83O
924                         threadItem.UnRead                               := Boolean( param );
925                 tipScrollTop:                                           // : Integer            // \83X\83N\83\8d\81[\83\8b\88Ê\92u
926                         threadItem.ScrollTop             := param;
927                 tipDownloadHost:                                // : string                     // \8d¡\82Ì\83z\83X\83g\82Æ\88á\82¤\8fê\8d\87\82Ì\83z\83X\83g
928                         threadItem.DownloadHost := string( PChar( param ) );
929                 tipAgeSage:                                                     // : TThreadAgeSage     // \83A\83C\83e\83\80\82Ì\8fã\82°\89º\82°
930                         threadItem.AgeSage                      := TGikoAgeSage( param );
931                 tipURL:                                                                 // : string                     // \83X\83\8c\83b\83h\82ð\83u\83\89\83E\83U\82Å\95\\8e¦\82·\82é\8dÛ\82Ì URL
932                         threadItem.URL                                  := string( PChar( param ) );
933                 tipFilePath:                                            // : string                     // \82±\82Ì\83X\83\8c\82ª\95Û\91\82³\82ê\82Ä\82¢\82é\83p\83X
934                         threadItem.FilePath                     := string( PChar( param ) );
935         end;
936
937 end;
938
939 // *************************************************************************
940 // TThreadItem \83N\83\89\83X\82Ì\83v\83\8d\83p\83e\83B\82ð\8eæ\93¾\82·\82é
941 // *************************************************************************
942 function ThreadItemGetDouble(
943         instance                : DWORD;
944         propertyID      : TThreadItemProperty
945 ) : Double; stdcall;
946 var
947         threadItem : TThreadItem;
948 begin
949
950         threadItem := TThreadItem( instance );
951         case propertyID of
952                 tipRoundDate:                                           // : TDateTime  // \83X\83\8c\83b\83h\82ð\8eæ\93¾\82µ\82½\93ú\8e\9e\81i\8f\84\89ñ\93ú\8e\9e\81j
953                         Result := threadItem.RoundDate;
954                 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
955                         Result := threadItem.LastModified;
956         else
957                 Result := 0;
958         end;
959
960 end;
961
962 // *************************************************************************
963 // TThreadItem \83N\83\89\83X\82Ì\83v\83\8d\83p\83e\83B\82ð\90Ý\92è\82·\82é
964 // *************************************************************************
965 procedure ThreadItemSetDouble(
966         instance                : DWORD;
967         propertyID      : TThreadItemProperty;
968         param                           : Double
969 ); stdcall;
970 var
971         threadItem : TThreadItem;
972 begin
973
974         threadItem := TThreadItem( instance );
975         case propertyID of
976                 tipRoundDate:                                           // : TDateTime  // \83X\83\8c\83b\83h\82ð\8eæ\93¾\82µ\82½\93ú\8e\9e\81i\8f\84\89ñ\93ú\8e\9e\81j
977                         threadItem.RoundDate            := param;
978                 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
979                         threadItem.LastModified := param;
980         end;
981
982 end;
983
984 // *************************************************************************
985 // 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é
986 // *************************************************************************
987 function ThreadItemDat2HTML(
988         inInstance      : DWORD;                // \83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X
989         inDatRes                : PChar;                // \96¼\91O<>\83\81\81[\83\8b<>\93ú\95tID<>\96{\95¶<> \82Å\8d\\90¬\82³\82ê\82½\83e\83L\83X\83g
990         inResNo                 : DWORD;                // \83\8c\83X\94Ô\8d\86
991         inIsNew                 : Boolean               // \90V\92\85\83\8c\83X\82È\82ç True
992 ) : PChar; stdcall;                             // \90®\8c`\82³\82ê\82½ HTML
993 var
994         threadItem : TThreadItem;
995         res : TResRec;
996         no : string;
997 begin
998
999         threadItem      := TThreadItem( inInstance );
1000         // \88ø\90\94\82ð\95ª\89ð
1001         res                                     := GikoSys.DivideStrLine( string( inDatRes ) );
1002         no                                      := IntToStr( inResNo );
1003
1004         try
1005                 if GikoSys.Setting.UseSkin then begin
1006                         // \83X\83L\83\93
1007                         if inIsNew then
1008                                 Result := CreateResultString( GikoSys.SkinedRes(
1009                                         GikoSys.LoadFromSkin(
1010                                                 GikoSys.Setting.GetSkinNewResFileName, threadItem, threadItem.SizeByte
1011                                         ), res, no
1012                                 ) )
1013                         else
1014                                 Result := CreateResultString( GikoSys.SkinedRes(
1015                                         GikoSys.LoadFromSkin(
1016                                                 GikoSys.Setting.GetSkinResFileName, threadItem, threadItem.SizeByte
1017                                         ), res, no
1018                                 ) );
1019                 end else begin
1020                         // CSS or \83f\83t\83H\83\8b\83g
1021                         if res.FName = '' then
1022                                 res.FName := '&nbsp;';
1023                         if res.FMailTo = '' then
1024                                 Result := CreateResultString( '<a name="' + no + '"></a>'
1025                                                                 + '<div class="header"><span class="no"><a href="menu:' + No + '">' + no + '</a></span> '
1026                                                                 + '<span class="name_label">\96¼\91O\81F</span> '
1027                                                                 + '<span class="name"><b>' + res.FName + '</b></span> '
1028                                                                 + '<span class="date_label">\93\8a\8de\93ú\81F</span> '
1029                                                                 + '<span class="date">' + res.FDateTime+ '</span></div>'
1030                                                                 + '<div class="mes">' + res.FBody + ' </div>' )
1031                         else if GikoSys.Setting.ShowMail then
1032                                 Result := CreateResultString( '<a name="' + no + '"></a>'
1033                                                                 + '<div class="header"><span class="no"><a href="menu:' + no + '">' + no + '</a></span>'
1034                                                                 + '<span class="name_label"> \96¼\91O\81F </span>'
1035                                                                 + '<a class="name_mail" href="mailto:' + res.FMailTo + '">'
1036                                                                 + '<b>' + res.FName + '</b></a><span class="mail"> [' + res.FMailTo + ']</span>'
1037                                                                 + '<span class="date_label"> \93\8a\8de\93ú\81F</span>'
1038                                                                 + '<span class="date"> ' + res.FDateTime+ '</span></div>'
1039                                                                 + '<div class="mes">' + res.FBody + ' </div>' )
1040                         else
1041                                 Result := CreateResultString( '<a name="' + no + '"></a>'
1042                                                                 + '<div class="header"><span class="no"><a href="menu:' + no + '">' + no + '</a></span>'
1043                                                                 + '<span class="name_label"> \96¼\91O\81F </span>'
1044                                                                 + '<a class="name_mail" href="mailto:' + res.FMailTo + '">'
1045                                                                 + '<b>' + res.FName + '</b></a>'
1046                                                                 + '<span class="date_label"> \93\8a\8de\93ú\81F</span>'
1047                                                                 + '<span class="date"> ' + res.FDateTime+ '</span></div>'
1048                                                                 + '<div class="mes">' + res.FBody + ' </div>' );
1049                 end;
1050         except
1051                 Result := nil;
1052         end;
1053
1054 end;
1055
1056 // *************************************************************************
1057 // TThreadItem \83N\83\89\83X\82ð\8c³\82É\83X\83\8c\83b\83h\82Ì\83w\83b\83_\82ð\8eæ\93¾\82·\82é
1058 // *************************************************************************
1059 function ThreadItemGetHeader(
1060         inInstance                              : DWORD;        // \83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X
1061         inOptionalHeader        : PChar         // \92Ç\89Á\82Ì\83w\83b\83_
1062 ) : PChar; stdcall;                                             // \90®\8c`\82³\82ê\82½ HTML
1063 var
1064         threadItem                              : TThreadItem;
1065         skinHeader                              : string;
1066         optionalHeader          : string;
1067 begin
1068
1069         threadItem                      := TThreadItem( inInstance );
1070         optionalHeader  := string( inOptionalHeader );
1071
1072         try
1073                 if GikoSys.Setting.UseSkin then begin
1074                         // \83X\83L\83\93
1075                         skinHeader := GikoSys.LoadFromSkin( GikoSys.Setting.GetSkinHeaderFileName, threadItem, threadItem.SizeByte );
1076                         if Length( optionalHeader ) > 0 then
1077                                 skinHeader := StringReplace( skinHeader, '</head>',
1078                                         string( optionalHeader ) + '</head>', [] );
1079                 end else if GikoSys.Setting.UseCSS then begin
1080                         // CSS
1081                         skinHeader :=
1082                                 '<html><head>' +
1083                                 '<title>' + threadItem.Title + '</title>' +
1084                                 '<link rel="stylesheet" href="'+ GikoSys.Setting.GetStyleSheetDir + GikoSys.Setting.CSSFileName +'" type="text/css">' +
1085                                 optionalHeader +
1086                                 '</head>' +
1087                                 '<body>' +
1088                                 '<div class="title">' + threadItem.Title + '</div>';
1089                 end else begin
1090                         // \83f\83t\83H\83\8b\83g
1091                         skinHeader :=
1092                                 '<html><head>' +
1093                                 '<title>' + threadItem.Title + '</title>' +
1094                                 optionalHeader +
1095                                 '</head>' +
1096                                 '<body>' +
1097                                 '<div class="title">' + threadItem.Title + '</div>';
1098                 end;
1099         except
1100         end;
1101
1102         Result := CreateResultString( skinHeader );
1103
1104 end;
1105
1106 // *************************************************************************
1107 // TThreadItem \83N\83\89\83X\82ð\8c³\82É\83X\83\8c\83b\83h\82Ì\83t\83b\83^\82ð\8eæ\93¾\82·\82é
1108 // *************************************************************************
1109 function ThreadItemGetFooter(
1110         inInstance                              : DWORD;        // \83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X
1111         inOptionalFooter        : PChar         // \92Ç\89Á\82Ì\83t\83b\83^
1112 ) : PChar; stdcall;                                             // \90®\8c`\82³\82ê\82½ HTML
1113 var
1114         threadItem                              : TThreadItem;
1115         skinFooter                              : string;
1116         optionalFooter          : string;
1117 begin
1118
1119         threadItem                      := TThreadItem( inInstance );
1120         optionalFooter  := string( inOptionalFooter );
1121
1122         try
1123                 if GikoSys.Setting.UseSkin then begin
1124                         skinFooter := GikoSys.LoadFromSkin( GikoSys.Setting.GetSkinFooterFileName, threadItem, threadItem.SizeByte );
1125                         if Length( optionalFooter ) > 0 then
1126                                 skinFooter := StringReplace( skinFooter, '</body>',
1127                                         string( optionalFooter ) + '</body>', [] );
1128                 end else begin
1129                                 skinFooter := '<a name="bottom"></a>' +
1130                                         '</body></html>' +
1131                                         '<a name="last"></a>' +
1132                                         '</body></html>';
1133                 end;
1134         except
1135         end;
1136
1137         Result := CreateResultString( skinFooter );
1138
1139 end;
1140
1141 // *************************************************************************
1142 // \83_\83E\83\93\83\8d\81[\83h\82ª\90i\8ds\82µ\82½
1143 // *************************************************************************
1144 procedure ThreadItemWork(
1145         inInstance      : DWORD;                        // \83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X
1146         inWorkCount     : Integer                       // \8c»\8dÝ\82Ì\90i\95à\8fó\8bµ(\83J\83E\83\93\83g)
1147 ); stdcall;
1148 begin
1149
1150         if Assigned( OnWork ) then
1151                 OnWork( TObject( inInstance ), wmRead, inWorkCount );
1152
1153 end;
1154
1155 // *************************************************************************
1156 // \83_\83E\83\93\83\8d\81[\83h\82ª\8en\82Ü\82Á\82½
1157 // *************************************************************************
1158 procedure ThreadItemWorkBegin(
1159         inInstance                      : DWORD;        // \83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X
1160         inWorkCountMax  : Integer       // \92Ê\90M\82Ì\8fI\82í\82è\82ð\8e¦\82·\83J\83E\83\93\83g
1161 ); stdcall;
1162 begin
1163
1164         if Assigned( OnWorkBegin ) then
1165                 OnWorkBegin( TObject( inInstance ), wmRead, inWorkCountMax );
1166
1167 end;
1168
1169 // *************************************************************************
1170 // \83_\83E\83\93\83\8d\81[\83h\82ª\8fI\82í\82Á\82½
1171 // *************************************************************************
1172 procedure ThreadItemWorkEnd(
1173         inInstance      : DWORD                         // \83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X
1174 ); stdcall;
1175 begin
1176
1177         if Assigned( OnWorkEnd ) then
1178                 OnWorkEnd( TObject( inInstance ), wmRead );
1179
1180 end;
1181
1182 exports
1183         CreateResultString,
1184         DisposeResultString,
1185         VersionInfo,
1186         ApplicationFolder,
1187         PreferencesFolder,
1188         PreferencesFile,
1189         LogFolder,
1190         CSSFolder,
1191         SkinFolder,
1192         SkinFile,
1193         AbonFolder,
1194         AbonFile,
1195         InternalDownload,
1196         InternalAbon,
1197         InternalDat2HTML,
1198         ThreadItemGetLong,
1199         ThreadItemSetLong,
1200         ThreadItemGetDouble,
1201         ThreadItemSetDouble,
1202         ThreadItemDat2HTML,
1203         ThreadItemGetHeader,
1204         ThreadItemGetFooter,
1205         ThreadItemWork,
1206         ThreadItemWorkBegin,
1207         ThreadItemWorkEnd;
1208
1209 end.
1210