OSDN Git Service

This commit was manufactured by cvs2svn to create branch 'Bb51'.
[gikonavigoeson/gikonavi.git] / ExternalThreadItem.pas
1 unit ExternalThreadItem;
2
3 interface
4
5 uses
6         Windows, Classes, SysUtils,
7         IdComponent,
8         ExternalBoardPlugInMain;
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         // TThreadItem \82ª\90\90¬\82³\82ê\82½
39         // *************************************************************************
40         TThreadItemCreate = procedure(
41                 inInstance : DWORD
42         ); stdcall;
43
44         // *************************************************************************
45         // TThreadItem \82ª\94j\8aü\82³\82ê\82½
46         // *************************************************************************
47         TThreadItemDispose = procedure(
48                 inInstance : DWORD
49         ); stdcall;
50
51         // *************************************************************************
52         // \83_\83E\83\93\83\8d\81[\83h\82ð\8ew\8e¦
53         // *************************************************************************
54         TThreadItemOnDownload = function(
55                 inInstance      : DWORD                                 // \83C\83\93\83X\83^\83\93\83X
56         ) : TDownloadState; stdcall;    // \83_\83E\83\93\83\8d\81[\83h\82ª\90¬\8c÷\82µ\82½\82©\82Ç\82¤\82©
57
58         // *************************************************************************
59         // \8f\91\82«\8d\9e\82Ý\82ð\8ew\8e¦
60         // *************************************************************************
61         TThreadItemOnWrite = function(
62                 inInstance      : DWORD;                                // ThreadItem \82Ì\83C\83\93\83X\83^\83\93\83X
63                 inName                  : PChar;                                // \96¼\91O(\83n\83\93\83h\83\8b)
64                 inMail                  : PChar;                                // \83\81\81[\83\8b\83A\83h\83\8c\83X
65                 inMessage               : PChar                                 // \96{\95
66         ) : TDownloadState; stdcall;    // \8f\91\82«\8d\9e\82Ý\82ª\90¬\8c÷\82µ\82½\82©\82Ç\82¤\82©
67
68         // *************************************************************************
69         // \83\8c\83X\94Ô\8d\86 n \82É\91Î\82·\82é html \82ð\97v\8b\81
70         // *************************************************************************
71         TThreadItemOnGetRes = function(
72                 inInstance      : DWORD;                // \83C\83\93\83X\83^\83\93\83X
73                 inNo                            : DWORD                 // \95\\8e¦\82·\82é\83\8c\83X\94Ô\8d\86
74         ) : PChar; stdcall;                             // \95\\8e¦\82·\82é HTML
75
76         // *************************************************************************
77         // \83\8c\83X\94Ô\8d\86 n \82É\91Î\82·\82é Dat \82ð\97v\8b\81
78         // *************************************************************************
79         TThreadItemOnGetDat = 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;                             // \82Q\82¿\82á\82ñ\82Ë\82é\8c`\8e®\82ÌDat
83
84         // *************************************************************************
85         // \83X\83\8c\83b\83h\82Ì\83w\83b\83_ html \82ð\97v\8b\81
86         // *************************************************************************
87         TThreadItemOnGetHeader = function(
88                 inInstance                              : DWORD;        // ThreadItem \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
94         // *************************************************************************
95         TThreadItemOnGetFooter = function(
96                 inInstance                              : DWORD;        // ThreadItem \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         // \82±\82Ì ThreadItem \82ª\91®\82·\82é\94Â\82Ì URL \82ð\97v\8b\81
102         // *************************************************************************
103         TThreadItemOnGetBoardURL = function(
104                 inInstance      : DWORD                                 // ThreadItem \82Ì\83C\83\93\83X\83^\83\93\83X
105         ) : PChar; stdcall;                                             // \94Â\82Ì URL
106
107 function ThreadItemDat2HTML(
108         inInstance      : DWORD;                // ThreadItem \82Ì\83C\83\93\83X\83^\83\93\83X
109         inDatRes                : PChar;                // \96¼\91O<>\83\81\81[\83\8b<>\93ú\95tID<>\96{\95¶<> \82Å\8d\\90¬\82³\82ê\82½\83e\83L\83X\83g
110         inResNo                 : DWORD;                // \83\8c\83X\94Ô\8d\86
111         inIsNew                 : Boolean               // \90V\92\85\83\8c\83X\82È\82ç True
112 ) : PChar; stdcall;                             // \90®\8c`\82³\82ê\82½ HTML
113
114 implementation
115
116 uses ExternalBoardManager, GikoSystem, BoardGroup, HTMLCreate, MojuUtils;
117
118 // *************************************************************************
119 // TThreadItem \83N\83\89\83X\82Ì\83v\83\8d\83p\83e\83B\82ð\8eæ\93¾\82·\82é
120 // *************************************************************************
121 function ThreadItemGetLong(
122         instance                : DWORD;
123         propertyID      : TThreadItemProperty
124 ) : DWORD; stdcall;
125 var
126         threadItem : TThreadItem;
127 begin
128
129         threadItem := TThreadItem( instance );
130         case propertyID of
131                 tipContext:                                                     // : DWORD                      // \8e©\97R\82É\90Ý\92è\82µ\82Ä\82¢\82¢\92l
132                         Result := threadItem.Context;
133                 tipNo:                                                                  // : Integer            // \94Ô\8d\86
134                         Result := threadItem.No;
135                 tipFileName:                                            // : string                     // \83X\83\8c\83b\83h\83t\83@\83C\83\8b\96¼
136                         Result := DWORD( CreateResultString( threadItem.FileName ) );
137                 tipTitle:                                                               // : string                     // \83X\83\8c\83b\83h\83^\83C\83g\83\8b
138                         Result := DWORD( CreateResultString( threadItem.Title ) );
139                 tipCount:                                                               // : Integer            // \83X\83\8c\83b\83h\83J\83E\83\93\83g\81i\83\8d\81[\83J\83\8b\81j
140                         Result := threadItem.Count;
141                 tipAllResCount:                                 // : Integer            // \83X\83\8c\83b\83h\83J\83E\83\93\83g\81i\83T\81[\83o\81j
142                         Result := threadItem.AllResCount;
143                 tipNewResCount:                                 // : Integer            // \83X\83\8c\83b\83h\90V\92\85\90\94
144                         Result := threadItem.NewResCount;
145                 tipSize:                                                                // : Integer            // \83X\83\8c\83b\83h\83T\83C\83Y
146                         Result := threadItem.Size;
147                 tipRound:                                                               // : Boolean            // \8f\84\89ñ\83t\83\89\83O
148                         Result := DWORD( threadItem.Round );
149                 tipRoundName:                                           // : string                     // \8f\84\89ñ\96¼
150                         Result := DWORD( CreateResultString( threadItem.RoundName ) );
151                 tipIsLogFile:                                           // : Boolean            // \83\8d\83O\91\8dÝ\83t\83\89\83O
152                         Result := DWORD( threadItem.IsLogFile );
153                 tipKokomade:                                            // : Integer            // \83R\83R\82Ü\82Å\93Ç\82ñ\82¾\94Ô\8d\86
154                         Result := threadItem.Kokomade;
155                 tipNewReceive:                                  // : Integer            // \83R\83R\82©\82ç\90V\8bK\8eó\90M
156                         Result := threadItem.NewReceive;
157                 tipNewArrival:                                  // : Boolean            // \90V\92\85
158                         Result := DWORD( threadItem.NewArrival );
159                 tipUnRead:                                                      // : Boolean            // \96¢\93Ç\83t\83\89\83O
160                         Result := DWORD( threadItem.UnRead );
161                 tipScrollTop:                                           // : Integer            // \83X\83N\83\8d\81[\83\8b\88Ê\92u
162                         Result := threadItem.ScrollTop;
163                 tipDownloadHost:                                // : string                     // \8d¡\82Ì\83z\83X\83g\82Æ\88á\82¤\8fê\8d\87\82Ì\83z\83X\83g
164                         Result := DWORD( CreateResultString( threadItem.DownloadHost ) );
165                 tipAgeSage:                                                     // : TThreadAgeSage     // \83A\83C\83e\83\80\82Ì\8fã\82°\89º\82°
166                         Result := DWORD( threadItem.AgeSage );
167                 tipURL:                                                                 // : string                     // \83X\83\8c\83b\83h\82ð\83u\83\89\83E\83U\82Å\95\\8e¦\82·\82é\8dÛ\82Ì URL
168                         Result := DWORD( CreateResultString( threadItem.URL ) );
169                 tipFilePath:                                                                                                            // \82±\82Ì\83X\83\8c\82ª\95Û\91\82³\82ê\82Ä\82¢\82é\83p\83X
170                         Result := DWORD( CreateResultString( threadItem.FilePath ) );
171         else
172                 Result := 0;
173         end;
174 end;
175
176 // *************************************************************************
177 // TThreadItem \83N\83\89\83X\82Ì\83v\83\8d\83p\83e\83B\82ð\90Ý\92è\82·\82é
178 // *************************************************************************
179 procedure ThreadItemSetLong(
180         instance                : DWORD;
181         propertyID      : TThreadItemProperty;
182         param : DWORD
183 ); stdcall;
184 var
185         threadItem      : TThreadItem;
186 begin
187
188         threadItem := TThreadItem( instance );
189         case propertyID of
190                 tipContext:                                                     // : DWORD                      // \8e©\97R\82É\90Ý\92è\82µ\82Ä\82¢\82¢\92l
191                         threadItem.Context                      := param;
192                 tipNo:                                                                  // : Integer            // \94Ô\8d\86
193                         threadItem.No                                           := param;
194                 tipFileName:                                            // : string                     // \83X\83\8c\83b\83h\83t\83@\83C\83\8b\96¼
195                         threadItem.FileName                     := string( PChar( param ) );
196                 tipTitle:                                                               // : string                     // \83X\83\8c\83b\83h\83^\83C\83g\83\8b
197                         threadItem.Title                                := string( PChar( param ) );
198                 tipCount:                                                               // : Integer            // \83X\83\8c\83b\83h\83J\83E\83\93\83g\81i\83\8d\81[\83J\83\8b\81j
199                         threadItem.Count                                := param;
200                 tipAllResCount:                                 // : Integer            // \83X\83\8c\83b\83h\83J\83E\83\93\83g\81i\83T\81[\83o\81j
201                         threadItem.AllResCount  := param;
202                 tipNewResCount:                                 // : Integer            // \83X\83\8c\83b\83h\90V\92\85\90\94
203                         threadItem.NewResCount  := param;
204                 tipSize:                                                                // : Integer            // \83X\83\8c\83b\83h\83T\83C\83Y
205                         threadItem.Size                                 := param;
206                 tipRound:                                                               // : Boolean            // \8f\84\89ñ\83t\83\89\83O
207                         threadItem.Round                                := Boolean( param );
208                 tipRoundName:                                           // : string                     // \8f\84\89ñ\96¼
209                         //threadItem.RoundName          := string( PChar( param ) );
210                         threadItem.RoundName            := PChar( param );
211                 tipIsLogFile:                                           // : Boolean            // \83\8d\83O\91\8dÝ\83t\83\89\83O
212                         threadItem.IsLogFile            := Boolean( param );
213                 tipKokomade:                                            // : Integer            // \83R\83R\82Ü\82Å\93Ç\82ñ\82¾\94Ô\8d\86
214                         threadItem.Kokomade                     := param;
215                 tipNewReceive:                                  // : Integer            // \83R\83R\82©\82ç\90V\8bK\8eó\90M
216                         threadItem.NewReceive           := param;
217                 tipNewArrival:                                  // : Boolean            // \90V\92\85
218                         threadItem.NewArrival           := Boolean( param );
219                 tipUnRead:                                                      // : Boolean            // \96¢\93Ç\83t\83\89\83O
220                         threadItem.UnRead                               := Boolean( param );
221                 tipScrollTop:                                           // : Integer            // \83X\83N\83\8d\81[\83\8b\88Ê\92u
222                         threadItem.ScrollTop             := param;
223                 tipDownloadHost:                                // : string                     // \8d¡\82Ì\83z\83X\83g\82Æ\88á\82¤\8fê\8d\87\82Ì\83z\83X\83g
224                         threadItem.DownloadHost := string( PChar( param ) );
225                 tipAgeSage:                                                     // : TThreadAgeSage     // \83A\83C\83e\83\80\82Ì\8fã\82°\89º\82°
226                         threadItem.AgeSage                      := TGikoAgeSage( param );
227                 tipURL:                                                                 // : string                     // \83X\83\8c\83b\83h\82ð\83u\83\89\83E\83U\82Å\95\\8e¦\82·\82é\8dÛ\82Ì URL
228                         threadItem.URL                                  := string( PChar( param ) );
229                 //tipFilePath:                                          // : string                     // \82±\82Ì\83X\83\8c\82ª\95Û\91\82³\82ê\82Ä\82¢\82é\83p\83X
230                 //      threadItem.FilePath                     := string( PChar( param ) );
231         end;
232
233 end;
234
235 // *************************************************************************
236 // TThreadItem \83N\83\89\83X\82Ì\83v\83\8d\83p\83e\83B\82ð\8eæ\93¾\82·\82é
237 // *************************************************************************
238 function ThreadItemGetDouble(
239         instance                : DWORD;
240         propertyID      : TThreadItemProperty
241 ) : Double; stdcall;
242 var
243         threadItem : TThreadItem;
244 begin
245
246         threadItem := TThreadItem( instance );
247         case propertyID of
248                 tipRoundDate:                                           // : TDateTime  // \83X\83\8c\83b\83h\82ð\8eæ\93¾\82µ\82½\93ú\8e\9e\81i\8f\84\89ñ\93ú\8e\9e\81j
249                         Result := threadItem.RoundDate;
250                 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
251                         Result := threadItem.LastModified;
252         else
253                 Result := 0;
254         end;
255
256 end;
257
258 // *************************************************************************
259 // TThreadItem \83N\83\89\83X\82Ì\83v\83\8d\83p\83e\83B\82ð\90Ý\92è\82·\82é
260 // *************************************************************************
261 procedure ThreadItemSetDouble(
262         instance                : DWORD;
263         propertyID      : TThreadItemProperty;
264         param                           : Double
265 ); stdcall;
266 var
267         threadItem : TThreadItem;
268 begin
269
270         threadItem := TThreadItem( instance );
271         case propertyID of
272                 tipRoundDate:                                           // : TDateTime  // \83X\83\8c\83b\83h\82ð\8eæ\93¾\82µ\82½\93ú\8e\9e\81i\8f\84\89ñ\93ú\8e\9e\81j
273                         threadItem.RoundDate            := param;
274                 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
275                         threadItem.LastModified := param;
276         end;
277
278 end;
279
280 // *************************************************************************
281 // 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é
282 // *************************************************************************
283 function ThreadItemDat2HTML(
284         inInstance      : DWORD;                // ThreadItem \82Ì\83C\83\93\83X\83^\83\93\83X
285         inDatRes                : PChar;                // \96¼\91O<>\83\81\81[\83\8b<>\93ú\95tID<>\96{\95¶<> \82Å\8d\\90¬\82³\82ê\82½\83e\83L\83X\83g
286         inResNo                 : DWORD;                // \83\8c\83X\94Ô\8d\86
287         inIsNew                 : Boolean               // \90V\92\85\83\8c\83X\82È\82ç True
288 ) : PChar; stdcall;                             // \90®\8c`\82³\82ê\82½ HTML
289 var
290         threadItem : TThreadItem;
291         res : TResRec;
292         no : string;
293         resLink : TResLinkRec;
294 begin
295
296         threadItem      := TThreadItem( inInstance );
297         // \88ø\90\94\82ð\95ª\89ð
298         THTMLCreate.DivideStrLine( string( inDatRes ) , @res);
299         if AnsiCompareStr( string( inDatRes ) , '' ) <> 0 then begin
300                 res.FBody               := THTMLCreate.DeleteLink(res.FBody);
301                 resLink.FBbs    := threadItem.ParentBoard.BBSID;
302                 resLink.FKey    := ChangeFileExt( threadItem.FileName, '' );
303                 HTMLCreater.AddAnchorTag( @res );
304                 HTMLCreater.ConvRes( @res, @resLink );
305
306                 no                                      := IntToStr( inResNo );
307
308                 try
309                         if GikoSys.Setting.UseSkin then begin
310                                 // \83X\83L\83\93
311                                 if inIsNew then
312                                         Result := CreateResultString( HTMLCreater.SkinedRes(
313                                                 HTMLCreater.LoadFromSkin(
314                             GikoSys.Setting.GetSkinNewResFileName, threadItem, threadItem.Size
315                                                 ), @res, no
316                     ) )
317                 else
318                                         Result := CreateResultString( HTMLCreater.SkinedRes(
319                                                 HTMLCreater.LoadFromSkin(
320                             GikoSys.Setting.GetSkinResFileName, threadItem, threadItem.Size
321                         ), @res, no
322                     ) );
323             end else if GikoSys.Setting.UseCSS then begin
324                 // CSS
325                 if res.FName = '' then
326                     res.FName := '&nbsp;';
327                 if res.FMailTo = '' then
328                     Result := CreateResultString( '<a name="' + no + '"></a>'
329                                     + '<div class="header"><span class="no"><a href="menu:' + No + '">' + no + '</a></span> '
330                                     + '<span class="name_label">\96¼\91O\81F</span> '
331                                     + '<span class="name"><b>' + res.FName + '</b></span> '
332                                     + '<span class="date_label">\93\8a\8de\93ú\81F</span> '
333                                     + '<span class="date">' + res.FDateTime+ '</span></div>'
334                                     + '<div class="mes">' + res.FBody + ' </div>' )
335                 else if GikoSys.Setting.ShowMail then
336                     Result := CreateResultString( '<a name="' + no + '"></a>'
337                                     + '<div class="header"><span class="no"><a href="menu:' + no + '">' + no + '</a></span>'
338                                     + '<span class="name_label"> \96¼\91O\81F </span>'
339                                     + '<a class="name_mail" href="mailto:' + res.FMailTo + '">'
340                                     + '<b>' + res.FName + '</b></a><span class="mail"> [' + res.FMailTo + ']</span>'
341                                     + '<span class="date_label"> \93\8a\8de\93ú\81F</span>'
342                                     + '<span class="date"> ' + res.FDateTime+ '</span></div>'
343                                     + '<div class="mes">' + res.FBody + ' </div>' )
344                 else
345                     Result := CreateResultString( '<a name="' + no + '"></a>'
346                                     + '<div class="header"><span class="no"><a href="menu:' + no + '">' + no + '</a></span>'
347                                     + '<span class="name_label"> \96¼\91O\81F </span>'
348                                     + '<a class="name_mail" href="mailto:' + res.FMailTo + '">'
349                                     + '<b>' + res.FName + '</b></a>'
350                                     + '<span class="date_label"> \93\8a\8de\93ú\81F</span>'
351                                     + '<span class="date"> ' + res.FDateTime+ '</span></div>'
352                                     + '<div class="mes">' + res.FBody + ' </div>' );
353             end else begin
354                 // \83f\83t\83H\83\8b\83g
355                 if res.FMailTo = '' then
356                     Result := CreateResultString( '<a name="' + no + '"></a><dt><a href="menu:' + no + '">' + no + '</a> \96¼\91O\81F<font color="forestgreen"><b> ' + res.FName + ' </b></font> \93\8a\8de\93ú\81F ' + res.FDateTime+ '<br><dd>' + res.Fbody + ' <br><br><br>' )
357                 else if GikoSys.Setting.ShowMail then
358                     Result := CreateResultString( '<a name="' + no + '"></a><dt><a href="menu:' + no + '">' + no + '</a> \96¼\91O\81F<a href="mailto:' + res.FMailTo + '"><b> ' + res.FName + ' </B></a> [' + res.FMailTo + '] \93\8a\8de\93ú\81F ' + res.FDateTime+ '<br><dd>' + res.Fbody + ' <br><br><br>' )
359                 else
360                     Result := CreateResultString( '<a name="' + no + '"></a><dt><a href="menu:' + no + '">' + no + '</a> \96¼\91O\81F<a href="mailto:' + res.FMailTo + '"><b> ' + res.FName + ' </B></a> \93\8a\8de\93ú\81F ' + res.FDateTime+ '<br><dd>' + res.Fbody + ' <br><br><br>' );
361             end;
362         except
363             Result := nil;
364         end;
365     end else begin
366         Result := nil;
367     end;
368
369 end;
370
371 // *************************************************************************
372 // TThreadItem \83N\83\89\83X\82ð\8c³\82É\83X\83\8c\83b\83h\82Ì\83w\83b\83_\82ð\8eæ\93¾\82·\82é
373 // *************************************************************************
374 function ThreadItemGetHeader(
375         inInstance                              : DWORD;        // ThreadItem \82Ì\83C\83\93\83X\83^\83\93\83X
376         inOptionalHeader        : PChar         // \92Ç\89Á\82Ì\83w\83b\83_
377 ) : PChar; stdcall;                                             // \90®\8c`\82³\82ê\82½ HTML
378 var
379         threadItem                              : TThreadItem;
380         skinHeader                              : string;
381         optionalHeader          : string;
382 begin
383
384         {$IFDEF DEBUG}
385         Writeln('ExternalBoardManager.ThreadItemGetHeader');
386         {$ENDIF}
387         threadItem                      := TThreadItem( inInstance );
388         optionalHeader  := string( inOptionalHeader );
389
390         try
391                 if GikoSys.Setting.UseSkin then begin
392                         // \83X\83L\83\93
393                         skinHeader := HTMLCreater.LoadFromSkin( GikoSys.Setting.GetSkinHeaderFileName, threadItem, threadItem.Size );
394                         if Length( optionalHeader ) > 0 then
395                                 skinHeader :=
396                                         StringReplace( skinHeader, '</head>', optionalHeader + '</head><a name="top"></a>', [] );
397                 end else if GikoSys.Setting.UseCSS then begin
398                         // CSS
399                         skinHeader :=
400                                 '<html><head>' +
401                                 '<title>' + threadItem.Title + '</title>' +
402                                 '<link rel="stylesheet" href="'+ GikoSys.Setting.GetStyleSheetDir + GikoSys.Setting.CSSFileName +'" type="text/css">' +
403                                 optionalHeader +
404                                 '</head>' +
405                                 '<body>' +
406                                 '<a name="top"></a>' +
407                                 '<div class="title">' + threadItem.Title + '</div>';
408                 end else begin
409                         // \83f\83t\83H\83\8b\83g
410                         skinHeader :=
411                                 '<html><head>' +
412                                 '<title>' + threadItem.Title + '</title>' +
413                                 optionalHeader +
414                                 '</head>' +
415                                 '<body TEXT="#000000" BGCOLOR="#EFEFEF" link="#0000FF" alink="#FF0000" vlink="#660099">' +
416                                 '<a name="top"></a>' +
417                                 '<font size=+1 color="#FF0000">' + threadItem.Title + '</font>' +
418                                 '<dl>';
419                 end;
420         except
421         end;
422
423         Result := CreateResultString( skinHeader );
424
425 end;
426
427 // *************************************************************************
428 // TThreadItem \83N\83\89\83X\82ð\8c³\82É\83X\83\8c\83b\83h\82Ì\83t\83b\83^\82ð\8eæ\93¾\82·\82é
429 // *************************************************************************
430 function ThreadItemGetFooter(
431         inInstance                              : DWORD;        // ThreadItem \82Ì\83C\83\93\83X\83^\83\93\83X
432         inOptionalFooter        : PChar         // \92Ç\89Á\82Ì\83t\83b\83^
433 ) : PChar; stdcall;                                             // \90®\8c`\82³\82ê\82½ HTML
434 var
435         threadItem                              : TThreadItem;
436         skinFooter                              : string;
437         optionalFooter          : string;
438 begin
439
440         {$IFDEF DEBUG}
441         Writeln('ExternalBoardManager.ThreadItemGetFooter');
442         {$ENDIF}
443         threadItem                      := TThreadItem( inInstance );
444         optionalFooter  := string( inOptionalFooter );
445
446         try
447                 if GikoSys.Setting.UseSkin then begin
448                         // \83X\83L\83\93
449                         skinFooter := HTMLCreater.LoadFromSkin( GikoSys.Setting.GetSkinFooterFileName, threadItem, threadItem.Size );
450                         if Length( optionalFooter ) > 0 then
451                                 skinFooter :=
452                                         StringReplace( skinFooter, '</body>', optionalFooter + '</body>', [] );
453                 end else if GikoSys.Setting.UseCSS then begin
454                         // CSS
455                         skinFooter :=
456                                 optionalFooter +
457                                 '</body></html>' +
458                                 '<a name="last"></a>' +
459                                 '</body></html>';
460                 end else begin
461                         // \83f\83t\83H\83\8b\83g
462                         skinFooter :=
463                                 '</dl>' +
464                                 optionalFooter +
465                                 '</body></html>' +
466                                 '<a name="last"></a>' +
467                                 '</body></html>';
468                 end;
469         except
470         end;
471
472         Result := CreateResultString( skinFooter );
473
474 end;
475
476 // *************************************************************************
477 // \83X\83\8c\83b\83h\82Ì\83_\83E\83\93\83\8d\81[\83h\82ª\90i\8ds\82µ\82½
478 // *************************************************************************
479 procedure ThreadItemWork(
480         inInstance      : DWORD;                        // ThreadItem \82Ì\83C\83\93\83X\83^\83\93\83X
481         inWorkCount     : Integer                       // \8c»\8dÝ\82Ì\90i\95à\8fó\8bµ(\83J\83E\83\93\83g)
482 ); stdcall;
483 begin
484
485         if Assigned( OnWork ) then
486                 OnWork( TObject( inInstance ), wmRead, inWorkCount );
487
488 end;
489
490 // *************************************************************************
491 // \83X\83\8c\83b\83h\82Ì\83_\83E\83\93\83\8d\81[\83h\82ª\8en\82Ü\82Á\82½
492 // *************************************************************************
493 procedure ThreadItemWorkBegin(
494         inInstance                      : DWORD;        // ThreadItem \82Ì\83C\83\93\83X\83^\83\93\83X
495         inWorkCountMax  : Integer       // \92Ê\90M\82Ì\8fI\82í\82è\82ð\8e¦\82·\83J\83E\83\93\83g
496 ); stdcall;
497 begin
498
499         if Assigned( OnWorkBegin ) then
500                 OnWorkBegin( TObject( inInstance ), wmRead, inWorkCountMax );
501
502 end;
503
504 // *************************************************************************
505 // \83X\83\8c\83b\83h\82Ì\83_\83E\83\93\83\8d\81[\83h\82ª\8fI\82í\82Á\82½
506 // *************************************************************************
507 procedure ThreadItemWorkEnd(
508         inInstance      : DWORD                         // ThreadItem \82Ì\83C\83\93\83X\83^\83\93\83X
509 ); stdcall;
510 begin
511
512         if Assigned( OnWorkEnd ) then
513                 OnWorkEnd( TObject( inInstance ), wmRead );
514
515 end;
516
517 exports
518         ThreadItemGetLong,
519         ThreadItemSetLong,
520         ThreadItemGetDouble,
521         ThreadItemSetDouble,
522         ThreadItemDat2HTML,
523         ThreadItemGetHeader,
524         ThreadItemGetFooter,
525         ThreadItemWork,
526         ThreadItemWorkBegin,
527         ThreadItemWorkEnd;
528
529 end.
530