OSDN Git Service

・VersionInfo を追加。
[gikonavigoeson/gikonavi.git] / ExternalBoardManager.pas
1 unit ExternalBoardManager;
2
3 interface
4
5 uses
6         Windows, Classes, SysUtils,
7         IdHTTP, IdComponent, IdGlobal, IdException,
8         GikoSystem, BoardGroup, 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         );
35
36 var
37         OnWork                  : TWorkEvent;
38         OnWorkBegin     : TWorkBeginEvent;
39         OnWorkEnd               : TWorkEndEvent;
40
41 function ThreadItemDat2HTML(
42         inInstance      : DWORD;                // \83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X
43         inDatRes                : PChar;                // \96¼\91O<>\83\81\81[\83\8b<>\93ú\95tID<>\96{\95¶<> \82Å\8d\\90¬\82³\82ê\82½\83e\83L\83X\83g
44         inResNo                 : DWORD;                // \83\8c\83X\94Ô\8d\86
45         inIsNew                 : Boolean               // \90V\92\85\83\8c\83X\82È\82ç True
46 ) : PChar; stdcall;                             // \90®\8c`\82³\82ê\82½ HTML
47
48 implementation
49
50 // =========================================================================
51 // PlugInMain
52 // =========================================================================
53
54 // *************************************************************************
55 // \96ß\82è\92l\82ª PChar \82Å\82 \82é API \82Ì\83\81\83\82\83\8a\82ð\8am\95Û\82·\82é
56 // *************************************************************************
57 function CreateResultString(
58         resultStr : string
59 ) : PChar; stdcall;
60 var
61         tmp : PChar;
62 begin
63
64         tmp := PChar( resultStr );
65         GetMem( Result, Length( resultStr ) + 1 );
66         Move( tmp, Result, Length( resultStr ) + 1 );
67
68 end;
69
70 // *************************************************************************
71 // \96ß\82è\92l\82ª PChar \82Å\82 \82é API \82Ì\83\81\83\82\83\8a\82ð\8aJ\95ú\82·\82é
72 // *************************************************************************
73 procedure DisposeResultString(
74         resultStr : PChar
75 ); stdcall;
76 begin
77
78         FreeMem( resultStr );
79
80 end;
81
82 // *************************************************************************
83 // \83v\83\8d\83O\83\89\83\80\96{\91Ì\82Ì\83o\81[\83W\83\87\83\93\82ð\8eæ\93¾\82·\82é
84 // *************************************************************************
85 procedure VersionInfo(
86         var outAgent            : PChar;        // \83o\81[\83W\83\87\83\93\82ð\88ê\90Ø\8aÜ\82Ü\82È\82¢\8f\83\90\88\82È\96¼\8fÌ
87         var outMajor            : DWORD;        // \83\81\83W\83\83\81[\83o\81[\83W\83\87\83\93
88         var outMinor            : DWORD;        // \83}\83C\83i\81[\83o\81[\83W\83\87\83\93
89         var outRelease  : PChar;        // \83\8a\83\8a\81[\83X\92i\8aK\96¼
90         var outRevision : DWORD         // \83\8a\83r\83W\83\87\83\93\83i\83\93\83o\81[
91 ); stdcall;
92 begin
93
94         outAgent                := CreateResultString( PChar( APP_NAME ) );
95         outMajor                := 1;
96         outMinor                := 0;
97         outRelease      := CreateResultString( PChar( BETA_VERSION_NAME_E ) );
98         outRevision     := BETA_VERSION;
99
100 end;
101
102 // *************************************************************************
103 // \8ew\92è\82µ\82½ URL \82ð\83_\83E\83\93\83\8d\81[\83h\82µ\82Ä\95Ô\82·
104 // *************************************************************************
105 function InternalDownload(
106         inURL                                                   : PChar;        // \83_\83E\83\93\83\8d\81[\83h\82·\82é URL
107         var ioModified          : Double;       // \8dÅ\8cã\82É\8eæ\93¾\82µ\82½\93ú\8e\9e
108         var outResultData       : PChar;        // \83_\83E\83\93\83\8d\81[\83h\82³\82ê\82½\95\8e\9a\97ñ
109         inRangeStart                    : DWORD;        // \8aJ\8en\88Ê\92u
110         inRangeEnd                              : DWORD         // \8fI\97¹\88Ê\92u
111 ) : Longint; stdcall;                                   // \83\8c\83X\83|\83\93\83X\83R\81[\83h
112 var
113         httpSocket                              : TIdHTTP;
114         resStream                                       : TMemoryStream;
115         content                                         : string;
116 begin
117
118         Result := -1;
119
120         httpSocket := TIdHTTP.Create( nil );
121         try
122
123                 // \83C\83x\83\93\83g\82Ì\90Ý\92è
124                 if Assigned( OnWork ) then
125                         httpSocket.OnWork                               := OnWork;
126                 if Assigned( OnWorkBegin ) then
127                         httpSocket.OnWorkBegin  := OnWorkBegin;
128                 if Assigned( OnWorkEnd ) then
129                         httpSocket.OnWorkEnd            := OnWorkEnd;
130
131                 httpSocket.Request.CustomHeaders.Clear;
132                 httpSocket.Request.ContentRangeStart    := inRangeStart;
133                 httpSocket.Request.ContentRangeEnd              := inRangeEnd;
134                 if (ioModified <> 0) and (ioModified <> ZERO_DATE) then
135                         httpSocket.Request.LastModified := ioModified - OffsetFromUTC;
136                 if inRangeStart = 0 then
137                         httpSocket.Request.AcceptEncoding := 'gzip'
138                 else
139                         httpSocket.Request.AcceptEncoding := '';
140                 httpSocket.Request.Accept := 'text/html';
141
142                 resStream := TMemoryStream.Create;
143                 try
144                         try
145                                 resStream.Clear;
146
147                                 {$IFDEF DEBUG}
148                                 Writeln('URL: ' + inURL);
149                                 {$ENDIF}
150                                 httpSocket.Get( inURL, resStream );
151                                 {$IFDEF DEBUG}
152                                 Writeln('\8eæ\93¾\82Å\97á\8aO\82È\82µ');
153                                 {$ENDIF}
154
155                                 content                 := GikoSys.GzipDecompress( resStream, httpSocket.Response.ContentEncoding );
156                                 ioModified      := httpSocket.Response.LastModified;
157
158                                 Result := httpSocket.ResponseCode;
159                                 if (Length( content ) = 0) and (Result = 206) then
160                                         Result := 304;
161
162                                 outResultData := CreateResultString( content );
163                         except
164                                 on E: EIdSocketError do begin
165                                         ioModified              := ZERO_DATE;
166                                         outResultData   := nil;
167                                 end;
168                                 on E: EIdConnectException do begin
169                                         ioModified              := ZERO_DATE;
170                                         outResultData   := nil;
171                                         //Item.ErrText  := E.Message;
172                                 end;
173                                 on E: Exception do begin
174                                         {$IFDEF DEBUG}
175                                         Writeln('\8eæ\93¾\82Å\97á\8aO\82 \82è');
176                                         Writeln('E.Message: ' + E.Message);
177                                         {$ENDIF}
178                                         ioModified              := ZERO_DATE;
179                                         outResultData   := nil;
180                                         Result                          := httpSocket.ResponseCode;
181                                         //Item.ErrText  := E.Message;
182                                 end;
183                         end;
184                 finally
185                         resStream.Free;
186                 end;
187
188         finally
189                 httpSocket.Free;
190         end;
191
192 end;
193
194 // *************************************************************************
195 // \82Q\82¿\82á\82ñ\82Ë\82é\82Ì dat \8c`\8e®\82ð\83\8d\81[\83J\83\8b\82 \82Ú\81`\82ñ\82É\92Ê\82·
196 // *************************************************************************
197 function InternalAbon(
198         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
199 ) : PChar; stdcall;                             // \82 \82Ú\81`\82ñ\8dÏ\82Ý\82Ì dat \8c`\8e®\83e\83L\83X\83g
200 var
201         datList : TStringList;
202         dat : PChar;
203 begin
204
205         datList := TStringList.Create;
206         datList.Text := string( inDatText );
207         //GikoSys.FAbon.IndividualAbon( datList, ChangeFileExt(FileName,'.NG'));
208         GikoSys.FAbon.Execute( datList );
209         GikoSys.FSelectResFilter.Execute( datList );
210
211         Result := CreateResultString( datList.Text );
212
213 end;
214
215 // *************************************************************************
216 // \82Q\82¿\82á\82ñ\82Ë\82é\82Ì dat \8c`\8e® 1 \8ds\82ð HTML \82É\95Ï\8a·\82·\82é
217 // *************************************************************************
218 function InternalDat2HTML(
219         inDatRes        : PChar;                        // \96¼\91O<>\83\81\81[\83\8b<>\93ú\95tID<>\96{\95¶<> \82Å\8d\\90¬\82³\82ê\82½\83e\83L\83X\83g
220         inResNo         : DWORD;                        // \83\8c\83X\94Ô\8d\86
221         inIsNew         : Boolean                       // \90V\92\85\83\8c\83X\82È\82ç True
222 ) : PChar; stdcall;                             // \90®\8c`\82³\82ê\82½ HTML
223 var
224         board : TBoard;
225         threadItem : TThreadItem;
226 begin
227
228         // \83_\83~\81[\82Ì\83N\83\89\83X
229         board                           := TBoard.Create;
230         threadItem      := TThreadItem.Create;
231
232         try
233                 threadItem.ParentBoard := Board;
234
235                 Result := ThreadItemDat2HTML( DWORD( threadItem ), inDatRes, inResNo, inIsNew );
236         except
237         end;
238
239 end;
240
241
242
243 // =========================================================================
244 // FilePath
245 // =========================================================================
246
247 // *************************************************************************
248 // \83u\83\89\83E\83U\96{\91Ì\82ª\92u\82¢\82Ä\82 \82é\83t\83H\83\8b\83_
249 // *************************************************************************
250 function ApplicationFolder : PChar; stdcall;
251 begin
252
253         Result := CreateResultString( GikoSys.GetAppDir );
254
255 end;
256
257 // *************************************************************************
258 // \8f\89\8aú\90Ý\92è\83t\83H\83\8b\83_
259 // *************************************************************************
260 function PreferencesFolder : PChar; stdcall;
261 begin
262
263         Result := CreateResultString( GikoSys.GetConfigDir );
264
265 end;
266
267 // *************************************************************************
268 // \8f\89\8aú\90Ý\92è\83t\83@\83C\83\8b
269 // *************************************************************************
270 function PreferencesFile : PChar; stdcall;
271 begin
272
273         Result := CreateResultString( GikoSys.GetAppDir + 'gikoNavi.ini' );
274
275 end;
276
277 // *************************************************************************
278 // \83\8d\83O\83t\83H\83\8b\83_
279 // *************************************************************************
280 function LogFolder : PChar; stdcall;
281 begin
282
283         Result := CreateResultString( GikoSys.GetAppDir + 'Log\' );
284
285 end;
286
287 // *************************************************************************
288 // CSS \83t\83H\83\8b\83_
289 // *************************************************************************
290 function CSSFolder : PChar; stdcall;
291 begin
292
293         Result := CreateResultString( GikoSys.GetStyleSheetDir );
294
295 end;
296
297 // *************************************************************************
298 // \83X\83L\83\93\82ð\93ü\82ê\82Ä\82¨\82­\83t\83H\83\8b\83_
299 // *************************************************************************
300 function SkinFolder : PChar; stdcall;
301 begin
302
303         Result := CreateResultString( GikoSys.GetSkinDir );
304
305 end;
306
307 // *************************************************************************
308 // \8eg\97p\82µ\82Ä\82¢\82é CSS / \83X\83L\83\93
309 // *************************************************************************
310 function SkinFile : PChar; stdcall;
311 begin
312
313         Result := CreateResultString( GikoSys.Setting.CSSFileName );
314
315 end;
316
317 // *************************************************************************
318 // \82 \82Ú\81[\82ñ\8bK\91¥\82ª\92u\82¢\82Ä\82 \82é\83f\83B\83\8c\83N\83g\83\8a
319 // *************************************************************************
320 function AbonFolder : PChar; stdcall;
321 begin
322
323         Result := CreateResultString( GikoSys.Setting.GetNGWordsDir );
324
325 end;
326
327 // *************************************************************************
328 // \8eg\97p\82µ\82Ä\82¢\82é\82 \82Ú\81[\82ñ\8bK\91¥
329 // *************************************************************************
330 function AbonFile : PChar; stdcall;
331 begin
332
333         Result := CreateResultString( GikoSys.FAbon.GetNGwordpath );
334
335 end;
336
337
338
339 // =========================================================================
340 // ThreadItem
341 // =========================================================================
342
343 // *************************************************************************
344 // TThreadItem \83N\83\89\83X\82Ì\83v\83\8d\83p\83e\83B\82ð\8eæ\93¾\82·\82é
345 // *************************************************************************
346 function ThreadItemGetLong(
347         instance                : DWORD;
348         propertyID      : TThreadItemProperty
349 ) : DWORD; stdcall;
350 var
351         threadItem : TThreadItem;
352 begin
353
354         threadItem := TThreadItem( instance );
355         case propertyID of
356                 tipContext:                                                     // : DWORD                      // \8e©\97R\82É\90Ý\92è\82µ\82Ä\82¢\82¢\92l
357                         Result := threadItem.Context;
358                 tipNo:                                                                  // : Integer            // \94Ô\8d\86
359                         Result := threadItem.No;
360                 tipFileName:                                            // : string                     // \83X\83\8c\83b\83h\83t\83@\83C\83\8b\96¼
361                         Result := DWORD( CreateResultString( threadItem.FileName ) );
362                 tipTitle:                                                               // : string                     // \83X\83\8c\83b\83h\83^\83C\83g\83\8b
363                         Result := DWORD( CreateResultString( threadItem.Title ) );
364                 tipCount:                                                               // : Integer            // \83X\83\8c\83b\83h\83J\83E\83\93\83g\81i\83\8d\81[\83J\83\8b\81j
365                         Result := threadItem.Count;
366                 tipAllResCount:                                 // : Integer            // \83X\83\8c\83b\83h\83J\83E\83\93\83g\81i\83T\81[\83o\81j
367                         Result := threadItem.AllResCount;
368                 tipNewResCount:                                 // : Integer            // \83X\83\8c\83b\83h\90V\92\85\90\94
369                         Result := threadItem.NewResCount;
370                 tipSize:                                                                // : Integer            // \83X\83\8c\83b\83h\83T\83C\83Y
371                         Result := threadItem.Size;
372                 tipRound:                                                               // : Boolean            // \8f\84\89ñ\83t\83\89\83O
373                         Result := DWORD( threadItem.Round );
374                 tipRoundName:                                           // : string                     // \8f\84\89ñ\96¼
375                         Result := DWORD( CreateResultString( threadItem.RoundName ) );
376                 tipIsLogFile:                                           // : Boolean            // \83\8d\83O\91\8dÝ\83t\83\89\83O
377                         Result := DWORD( threadItem.IsLogFile );
378                 tipKokomade:                                            // : Integer            // \83R\83R\82Ü\82Å\93Ç\82ñ\82¾\94Ô\8d\86
379                         Result := threadItem.Kokomade;
380                 tipNewReceive:                                  // : Integer            // \83R\83R\82©\82ç\90V\8bK\8eó\90M
381                         Result := threadItem.NewReceive;
382                 tipNewArrival:                                  // : Boolean            // \90V\92\85
383                         Result := DWORD( threadItem.NewArrival );
384                 tipUnRead:                                                      // : Boolean            // \96¢\93Ç\83t\83\89\83O
385                         Result := DWORD( threadItem.UnRead );
386                 tipScrollTop:                                           // : Integer            // \83X\83N\83\8d\81[\83\8b\88Ê\92u
387                         Result := threadItem.ScrollTop;
388                 tipDownloadHost:                                // : string                     // \8d¡\82Ì\83z\83X\83g\82Æ\88á\82¤\8fê\8d\87\82Ì\83z\83X\83g
389                         Result := DWORD( CreateResultString( threadItem.DownloadHost ) );
390                 tipAgeSage:                                                     // : TThreadAgeSage     // \83A\83C\83e\83\80\82Ì\8fã\82°\89º\82°
391                         Result := DWORD( threadItem.AgeSage );
392                 tipURL:                                                                 // : string                     // \83X\83\8c\83b\83h\82ð\83u\83\89\83E\83U\82Å\95\\8e¦\82·\82é\8dÛ\82Ì URL
393                         Result := DWORD( CreateResultString( threadItem.URL ) );
394         end;
395 end;
396
397 // *************************************************************************
398 // TThreadItem \83N\83\89\83X\82Ì\83v\83\8d\83p\83e\83B\82ð\90Ý\92è\82·\82é
399 // *************************************************************************
400 procedure ThreadItemSetLong(
401         instance                : DWORD;
402         propertyID      : TThreadItemProperty;
403         param : DWORD
404 ); stdcall;
405 var
406         threadItem      : TThreadItem;
407 begin
408
409         threadItem := TThreadItem( instance );
410         case propertyID of
411                 tipContext:                                                     // : DWORD                      // \8e©\97R\82É\90Ý\92è\82µ\82Ä\82¢\82¢\92l
412                         threadItem.Context                      := param;
413                 tipNo:                                                                  // : Integer            // \94Ô\8d\86
414                         threadItem.No                                           := param;
415                 tipFileName:                                            // : string                     // \83X\83\8c\83b\83h\83t\83@\83C\83\8b\96¼
416                 begin
417                         threadItem.FileName                     := string( PChar( param ) );
418                         DisposeResultString( PChar( param ) );
419                 end;
420                 tipTitle:                                                               // : string                     // \83X\83\8c\83b\83h\83^\83C\83g\83\8b
421                 begin
422                         threadItem.Title                                := string( PChar( param ) );
423                         DisposeResultString( PChar( param ) );
424                 end;
425                 tipCount:                                                               // : Integer            // \83X\83\8c\83b\83h\83J\83E\83\93\83g\81i\83\8d\81[\83J\83\8b\81j
426                         threadItem.Count                                := param;
427                 tipAllResCount:                                 // : Integer            // \83X\83\8c\83b\83h\83J\83E\83\93\83g\81i\83T\81[\83o\81j
428                         threadItem.AllResCount  := param;
429                 tipNewResCount:                                 // : Integer            // \83X\83\8c\83b\83h\90V\92\85\90\94
430                         threadItem.NewResCount  := param;
431                 tipSize:                                                                // : Integer            // \83X\83\8c\83b\83h\83T\83C\83Y
432                         threadItem.Size                                 := param;
433                 tipRound:                                                               // : Boolean            // \8f\84\89ñ\83t\83\89\83O
434                         threadItem.Round                                := Boolean( param );
435                 tipRoundName:                                           // : string                     // \8f\84\89ñ\96¼
436                 begin
437                         threadItem.RoundName            := string( PChar( param ) );
438                         DisposeResultString( PChar( param ) );
439                 end;
440                 tipIsLogFile:                                           // : Boolean            // \83\8d\83O\91\8dÝ\83t\83\89\83O
441                         threadItem.IsLogFile            := Boolean( param );
442                 tipKokomade:                                            // : Integer            // \83R\83R\82Ü\82Å\93Ç\82ñ\82¾\94Ô\8d\86
443                         threadItem.Kokomade                     := param;
444                 tipNewReceive:                                  // : Integer            // \83R\83R\82©\82ç\90V\8bK\8eó\90M
445                         threadItem.NewReceive           := param;
446                 tipNewArrival:                                  // : Boolean            // \90V\92\85
447                         threadItem.NewArrival           := Boolean( param );
448                 tipUnRead:                                                      // : Boolean            // \96¢\93Ç\83t\83\89\83O
449                         threadItem.UnRead                               := Boolean( param );
450                 tipScrollTop:                                           // : Integer            // \83X\83N\83\8d\81[\83\8b\88Ê\92u
451                         threadItem.ScrollTop             := param;
452                 tipDownloadHost:                                // : string                     // \8d¡\82Ì\83z\83X\83g\82Æ\88á\82¤\8fê\8d\87\82Ì\83z\83X\83g
453                 begin
454                         threadItem.DownloadHost := string( PChar( param ) );
455                         DisposeResultString( PChar( param ) );
456                 end;
457                 tipAgeSage:                                                     // : TThreadAgeSage     // \83A\83C\83e\83\80\82Ì\8fã\82°\89º\82°
458                         threadItem.AgeSage                      := TGikoAgeSage( param );
459                 tipURL:                                                                 // : string                     // \83X\83\8c\83b\83h\82ð\83u\83\89\83E\83U\82Å\95\\8e¦\82·\82é\8dÛ\82Ì URL
460                 begin
461                         threadItem.URL                                  := string( PChar( param ) );
462                         DisposeResultString( PChar( param ) );
463                 end;
464         end;
465
466 end;
467
468 // *************************************************************************
469 // TThreadItem \83N\83\89\83X\82Ì\83v\83\8d\83p\83e\83B\82ð\8eæ\93¾\82·\82é
470 // *************************************************************************
471 function ThreadItemGetDouble(
472         instance                : DWORD;
473         propertyID      : TThreadItemProperty
474 ) : Double; stdcall;
475 var
476         threadItem : TThreadItem;
477 begin
478
479         threadItem := TThreadItem( instance );
480         case propertyID of
481                 tipRoundDate:                                           // : TDateTime  // \83X\83\8c\83b\83h\82ð\8eæ\93¾\82µ\82½\93ú\8e\9e\81i\8f\84\89ñ\93ú\8e\9e\81j
482                         Result := threadItem.RoundDate;
483                 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
484                         Result := threadItem.LastModified;
485         end;
486
487 end;
488
489 // *************************************************************************
490 // TThreadItem \83N\83\89\83X\82Ì\83v\83\8d\83p\83e\83B\82ð\90Ý\92è\82·\82é
491 // *************************************************************************
492 procedure ThreadItemSetDouble(
493         instance                : DWORD;
494         propertyID      : TThreadItemProperty;
495         param                           : Double
496 ); stdcall;
497 var
498         threadItem : TThreadItem;
499 begin
500
501         threadItem := TThreadItem( instance );
502         case propertyID of
503                 tipRoundDate:                                           // : TDateTime  // \83X\83\8c\83b\83h\82ð\8eæ\93¾\82µ\82½\93ú\8e\9e\81i\8f\84\89ñ\93ú\8e\9e\81j
504                         threadItem.RoundDate            := param;
505                 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
506                         threadItem.LastModified := param;
507         end;
508
509 end;
510
511 // *************************************************************************
512 // 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é
513 // *************************************************************************
514 function ThreadItemDat2HTML(
515         inInstance      : DWORD;                // \83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X
516         inDatRes                : PChar;                // \96¼\91O<>\83\81\81[\83\8b<>\93ú\95tID<>\96{\95¶<> \82Å\8d\\90¬\82³\82ê\82½\83e\83L\83X\83g
517         inResNo                 : DWORD;                // \83\8c\83X\94Ô\8d\86
518         inIsNew                 : Boolean               // \90V\92\85\83\8c\83X\82È\82ç True
519 ) : PChar; stdcall;                             // \90®\8c`\82³\82ê\82½ HTML
520 var
521         threadItem : TThreadItem;
522         res : TResRec;
523         no : string;
524 begin
525
526         threadItem      := TThreadItem( inInstance );
527         // \88ø\90\94\82ð\95ª\89ð
528         res                                     := GikoSys.DivideStrLine( string( inDatRes ) );
529         no                                      := IntToStr( inResNo );
530
531         try
532                 if GikoSys.Setting.UseSkin then begin
533                         // \83X\83L\83\93
534                         if inIsNew then
535                                 Result := CreateResultString( GikoSys.SkinedRes(
536                                         GikoSys.LoadFromSkin(
537                                                 GikoSys.Setting.GetSkinNewResFileName, threadItem, 0
538                                         ), res, no
539                                 ) )
540                         else
541                                 Result := CreateResultString( GikoSys.SkinedRes(
542                                         GikoSys.LoadFromSkin(
543                                                 GikoSys.Setting.GetSkinResFileName, threadItem, 0
544                                         ), res, no
545                                 ) );
546                 end else begin
547                         // CSS or \83f\83t\83H\83\8b\83g
548                         if res.FName = '' then
549                                 res.FName := '&nbsp;';
550                         if res.FMailTo = '' then
551                                 Result := CreateResultString( '<a name="' + no + '"></a>'
552                                                                 + '<div class="header"><span class="no"><a href="menu:' + No + '">' + no + '</a></span> '
553                                                                 + '<span class="name_label">\96¼\91O\81F</span> '
554                                                                 + '<span class="name"><b>' + res.FName + '</b></span> '
555                                                                 + '<span class="date_label">\93\8a\8de\93ú\81F</span> '
556                                                                 + '<span class="date">' + res.FDateTime+ '</span></div>'
557                                                                 + '<div class="mes">' + res.FBody + ' </div>' )
558                         else if GikoSys.Setting.ShowMail then
559                                 Result := CreateResultString( '<a name="' + no + '"></a>'
560                                                                 + '<div class="header"><span class="no"><a href="menu:' + no + '">' + no + '</a></span>'
561                                                                 + '<span class="name_label"> \96¼\91O\81F </span>'
562                                                                 + '<a class="name_mail" href="mailto:' + res.FMailTo + '">'
563                                                                 + '<b>' + res.FName + '</b></a><span class="mail"> [' + res.FMailTo + ']</span>'
564                                                                 + '<span class="date_label"> \93\8a\8de\93ú\81F</span>'
565                                                                 + '<span class="date"> ' + res.FDateTime+ '</span></div>'
566                                                                 + '<div class="mes">' + res.FBody + ' </div>' )
567                         else
568                                 Result := CreateResultString( '<a name="' + no + '"></a>'
569                                                                 + '<div class="header"><span class="no"><a href="menu:' + no + '">' + no + '</a></span>'
570                                                                 + '<span class="name_label"> \96¼\91O\81F </span>'
571                                                                 + '<a class="name_mail" href="mailto:' + res.FMailTo + '">'
572                                                                 + '<b>' + res.FName + '</b></a>'
573                                                                 + '<span class="date_label"> \93\8a\8de\93ú\81F</span>'
574                                                                 + '<span class="date"> ' + res.FDateTime+ '</span></div>'
575                                                                 + '<div class="mes">' + res.FBody + ' </div>' );
576                 end;
577         except
578         end;
579
580 end;
581
582 // *************************************************************************
583 // TThreadItem \83N\83\89\83X\82ð\8c³\82É\83X\83\8c\83b\83h\82Ì\83w\83b\83_\82ð\8eæ\93¾\82·\82é
584 // *************************************************************************
585 function ThreadItemGetHeader(
586         inInstance                              : DWORD;        // \83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X
587         inOptionalHeader        : PChar         // \92Ç\89Á\82Ì\83w\83b\83_
588 ) : PChar; stdcall;                                             // \90®\8c`\82³\82ê\82½ HTML
589 var
590         threadItem                              : TThreadItem;
591         skinHeader                              : string;
592         optionalHeader          : string;
593 begin
594
595         threadItem                      := TThreadItem( inInstance );
596         optionalHeader  := string( inOptionalHeader );
597         skinHeader                      := GikoSys.LoadFromSkin( GikoSys.Setting.GetSkinHeaderFileName, threadItem, 0 );
598         if Length( optionalHeader ) > 0 then
599                 skinHeader := StringReplace( skinHeader, '</head>',
600                         string( optionalHeader ) + '</head>', [rfReplaceAll] );
601
602         Result := CreateResultString( skinHeader );
603
604 end;
605
606 // *************************************************************************
607 // TThreadItem \83N\83\89\83X\82ð\8c³\82É\83X\83\8c\83b\83h\82Ì\83t\83b\83^\82ð\8eæ\93¾\82·\82é
608 // *************************************************************************
609 function ThreadItemGetFooter(
610         inInstance                              : DWORD;        // \83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X
611         inOptionalFooter        : PChar         // \92Ç\89Á\82Ì\83t\83b\83^
612 ) : PChar; stdcall;                                             // \90®\8c`\82³\82ê\82½ HTML
613 var
614         threadItem                              : TThreadItem;
615         skinFooter                              : string;
616         optionalFooter          : string;
617 begin
618
619         threadItem                      := TThreadItem( inInstance );
620         optionalFooter  := string( inOptionalFooter );
621         skinFooter                      := GikoSys.LoadFromSkin( GikoSys.Setting.GetSkinFooterFileName, threadItem, 0 );
622         if Length( optionalFooter ) > 0 then
623                 skinFooter := StringReplace( skinFooter, '</body>',
624                         string( optionalFooter ) + '</body>', [rfReplaceAll] );
625
626         Result := CreateResultString( skinFooter );
627
628 end;
629
630 // *************************************************************************
631 // \83_\83E\83\93\83\8d\81[\83h\82ª\90i\8ds\82µ\82½
632 // *************************************************************************
633 procedure ThreadItemWork(
634         inInstance      : DWORD;                        // \83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X
635         inWorkCount     : Integer                       // \8c»\8dÝ\82Ì\90i\95à\8fó\8bµ(\83J\83E\83\93\83g)
636 ); stdcall;
637 begin
638
639         if Assigned( OnWork ) then
640                 OnWork( TObject( inInstance ), wmRead, inWorkCount );
641
642 end;
643
644 // *************************************************************************
645 // \83_\83E\83\93\83\8d\81[\83h\82ª\8en\82Ü\82Á\82½
646 // *************************************************************************
647 procedure ThreadItemWorkBegin(
648         inInstance                      : DWORD;        // \83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X
649         inWorkCountMax  : Integer       // \92Ê\90M\82Ì\8fI\82í\82è\82ð\8e¦\82·\83J\83E\83\93\83g
650 ); stdcall;
651 begin
652
653         if Assigned( OnWorkBegin ) then
654                 OnWorkBegin( TObject( inInstance ), wmRead, inWorkCountMax );
655
656 end;
657
658 // *************************************************************************
659 // \83_\83E\83\93\83\8d\81[\83h\82ª\8fI\82í\82Á\82½
660 // *************************************************************************
661 procedure ThreadItemWorkEnd(
662         inInstance      : DWORD                         // \83N\83\89\83X\82Ì\83C\83\93\83X\83^\83\93\83X
663 ); stdcall;
664 begin
665
666         if Assigned( OnWorkEnd ) then
667                 OnWorkEnd( TObject( inInstance ), wmRead );
668
669 end;
670
671 exports
672         CreateResultString,
673         DisposeResultString,
674         VersionInfo,
675         ApplicationFolder,
676         PreferencesFolder,
677         PreferencesFile,
678         LogFolder,
679         CSSFolder,
680         SkinFolder,
681         SkinFile,
682         AbonFolder,
683         AbonFile,
684         InternalDownload,
685         InternalAbon,
686         InternalDat2HTML,
687         ThreadItemGetLong,
688         ThreadItemSetLong,
689         ThreadItemGetDouble,
690         ThreadItemSetDouble,
691         ThreadItemDat2HTML,
692         ThreadItemGetHeader,
693         ThreadItemGetFooter,
694         ThreadItemWork,
695         ThreadItemWorkBegin,
696         ThreadItemWorkEnd;
697
698 end.
699