6 Windows, SysUtils, Classes, ComCtrls, IniFiles, {HTTPApp,} YofUtils, IdGlobal,
7 ExternalBoardManager, ExternalBoardPlugInMain, StrUtils, DateUtils;
10 //
\83\8a\83X
\83g
\82Ì
\95\
\8e¦
\83A
\83C
\83e
\83\80\91I
\91ð
11 TGikoViewType = (gvtAll, gvtLog, gvtNew, gvtUser);
12 //
\83\8a\83X
\83g
\82Ì
\8eæ
\93¾
\8c\8f\90\94
13 //TGikoListCount = (glc50, glc100, glc200, glc500, glc1000, glcAll);
14 //
\8f\84\89ñ
\94Ô
\8d\86
15 //TGikoRoundNo = (grnNone, grn1, grn2, grn3, grn4, grn5, grnOnce);
16 //
\83\8a\83X
\83g
\82Ì
\8fã
\82°
\89º
\82°
17 TGikoAgeSage = (gasNone, gasAge, gasSage, gasNew);
21 FItemList: TList; //
\8eq
\83A
\83C
\83e
\83\80\83\8a\83X
\83g
22 FLeaf: Boolean; //
\89º
\82É
\83t
\83H
\83\8b\83_
\82ð
\8e\9d\82Â
\82±
\82Æ
\82ª
\8fo
\97\88\82é
\82©
24 function Add(Item: TFolder): Integer;
26 procedure Delete(Index: Integer);
27 procedure Exchange(Index1, Index2: Integer);
28 procedure Insert(Index: Integer; Item: TFolder);
29 procedure Move(CurIndex, NewIndex: Integer);
30 function Remove(Item: TFolder): Integer;
31 procedure Sort(Compare: TListSortCompare);
32 property Capacity: Integer read FCapacity write SetCapacity;
33 property Count: Integer read FCount write SetCount;
34 property Items[Index: Integer]: TFolder read Get write Put; default;
36 property Leaf: Boolean read FLeaf;
41 TCategory class(TFolder)
43 TBoard = class(TFolder)
45 TThreadItem = class(TFolder)
52 TBoard2ch = class(TBoard)
54 TThreadItem2ch = class(TThreadItem)
62 // ICategory = interface
66 // IThreadItem = interface
73 // BBS
\82Ì
\83\8b\81[
\83g
77 FFilePath : string; //
\94Â
\83\8a\83X
\83g
\82Ì
\83p
\83X
79 FKubetsuChk: Boolean; //
\8di
\8d\9e\82Ý
\8e\9e\91å
\95¶
\8e\9a\8f¬
\95¶
\8e\9a\8bæ
\95Ê
80 FSelectText: string; //
\8di
\8d\9e\82Ý
\95¶
\8e\9a\97ñ
81 FShortSelectText: string;
82 FIsBoardFileRead : Boolean; //
\94Â
\83\8a\83X
\83g
\82Í
\93Ç
\82Ý
\8d\9e\82Ü
\82ê
\82Ä
\82¢
\82é
\82©
\81H
84 function GetCategory(index: integer): TCategory;
85 procedure SetCategory(index: integer; value: TCategory);
86 procedure SetSelectText(s: string);
88 constructor Create( boardFilePath : string );
89 destructor Destroy; override;
91 function Add(item: TCategory): integer;
92 procedure Delete(index: integer);
93 procedure Clear; override;
94 function Find(key: string): TCategory;
95 function FindBBSID(BBSID: string): TBoard;
96 function FindBoardFromTitle(Title: string): TBoard;
97 function FindBoardFromURL(inURL: string): TBoard;
98 function FindThreadFromURL( inURL : string ) : TThreadItem;
99 function FindThreadItem(BBSID: string; FileName: string): TThreadItem;
100 function FindCategoryFromTitle( inTitle : string ) : TCategory;
101 property FilePath : string read FFilePath write FFilePath;
103 property Items[index: integer]: TCategory read GetCategory write SetCategory;
104 property Title: string read FTitle write FTitle;
105 property NodeExpand: Boolean read FExpand write FExpand;
107 property KubetsuChk: Boolean read FKubetsuChk write FKubetsuChk;
108 property SelectText: string read FSelectText write SetSelectText;
109 property ShortSelectText: string read FShortSelectText write FShortSelectText;
111 property IsBoardFileRead : Boolean read FIsBoardFileRead write FIsBoardFileRead;
115 TCategory = class(TList)
122 function GetBoard(index: integer): TBoard;
123 procedure SetBoard(index: integer; value: TBoard);
126 destructor Destroy; override;
128 property No: Integer read FNo write FNo;
129 property Title: string read FTitle write FTitle;
130 property Items[index: integer]: TBoard read GetBoard write SetBoard;
131 property ParenTBBS: TBBS read FParenTBBS write FParenTBBS;
133 function Add(item: TBoard): integer;
134 procedure Delete(index: integer);
135 procedure Clear; override;
136 function FindName(key: string): TBoard;
137 function FindBBSID(BBSID: string): TBoard;
138 function FindBoardFromTitle(Title: string): TBoard;
139 function FindBoardFromURL(inURL: string): TBoard;
140 function FindThreadFromURL( inURL : string ) : TThreadItem;
141 function IsMidoku: Boolean;
143 property NodeExpand: Boolean read FExpand write FExpand;
147 TBoard = class(TList)
149 FContext: DWORD; //
\83v
\83\89\83O
\83C
\83\93\82ª
\8e©
\97R
\82É
\90Ý
\92è
\82µ
\82Ä
\82¢
\82¢
\92l(
\8eå
\82É
\83C
\83\93\83X
\83^
\83\93\83X
\82ª
\93ü
\82é)
151 FNo: Integer; //
\94Ô
\8d\86
152 FTitle: string; //
\83{
\81[
\83h
\83^
\83C
\83g
\83\8b
153 FBBSID: string; //BBSID
154 FURL: string; //
\83{
\81[
\83hURL
155 FRound: Boolean; //
\83X
\83\8c\83b
\83h
\88ê
\97\97\8f\84\89ñ
\97\
\96ñ
156 FRoundName: string; //
\8f\84\89ñ
\96¼
157 FRoundDate: TDateTime; //
\83X
\83\8c\83b
\83h
\88ê
\97\97\82ð
\8eæ
\93¾
\82µ
\82½
\93ú
\8e\9e\81i
\8f\84\89ñ
\93ú
\8e\9e\81j
158 FLastModified: TDateTime; //
\83X
\83\8c\83b
\83h
\88ê
\97\97\82ª
\8dX
\90V
\82³
\82ê
\82Ä
\82¢
\82é
\93ú
\8e\9e\81i
\83T
\81[
\83o
\91¤
\93ú
\8e\9e\81j
159 FLastGetTime: TDateTime; //
\83X
\83\8c\83b
\83h
\82Ü
\82½
\82Í
\83X
\83\8c\83b
\83h
\88ê
\97\97\82ð
\8dÅ
\8cã
\82É
\8dX
\90V
\82µ
\82½
\93ú
\8e\9e\81i
\83T
\81[
\83o
\91¤
\93ú
\8e\9e\81E
\8f\91\82«
\8d\9e\82Ý
\8e\9e\82É
\8eg
\97p
\82·
\82é
\81j
160 FIsThreadDatRead: Boolean; //
\83X
\83\8c\83b
\83h
\83\8a\83X
\83g
\82Í
\93Ç
\82Ý
\8d\9e\82Ü
\82ê
\82Ä
\82¢
\82é
\82©
\81H
161 FUnRead: Integer; //
\83X
\83\8c\83b
\83h
\96¢
\93Ç
\90\94
162 FParentCategory: TCategory; //
\90e
\83J
\83e
\83S
\83\8a
163 FModified: Boolean; //
\8fC
\90³
\83t
\83\89\83O
164 FBoolData: Boolean; //
\82¢
\82ë
\82ñ
\82È
\97p
\93r
\82É
\8eg
\82¤yo
165 FSPID: string; //
\8f\91\82«
\8d\9e\82Ý
\97pSPID
166 FPON: string; //
\8f\91\82«
\8d\9e\82Ý
\97pPON
167 FKotehanName: string; //
\83R
\83e
\83n
\83\93\96¼
\91O
168 FKotehanMail: string; //
\83R
\83e
\83n
\83\93\83\81\81[
\83\8b
173 FBoardPlugIn : TBoardPlugIn; //
\82±
\82Ì
\94Â
\82ð
\83T
\83|
\81[
\83g
\82·
\82é
\83v
\83\89\83O
\83C
\83\93
174 FFilePath : string; //
\82±
\82Ì
\83X
\83\8c\88ê
\97\97\82ª
\95Û
\91¶
\82³
\82ê
\82Ä
\82¢
\82é
\83p
\83X
175 FIsLogFile : Boolean; //
\83\8d\83O
\91¶
\8dÝ
\83t
\83\89\83O
176 FIntData : Integer; //
\8dD
\82«
\82É
\82¢
\82¶
\82Á
\82Ä
\82æ
\82µ
\81B
\82¢
\82ë
\82ñ
\82È
\97p
\93r
\82É
\8eg
\82¤yo
177 FListData : TList; //
\8dD
\82«
\82É
\82¢
\82¶
\82Á
\82Ä
\82æ
\82µ
\81B
\82¢
\82ë
\82ñ
\82È
\97p
\93r
\82É
\8eg
\82¤yo
179 function GetThreadItem(index: integer): TThreadItem;
180 procedure SetThreadItem(index: integer; value: TThreadItem);
181 procedure SetRound(b: Boolean);
182 procedure SetRoundName(s: string);
183 procedure SetLastModified(d: TDateTime);
184 procedure SetLastGetTime(d: TDateTime);
185 procedure SetUnRead(i: Integer);
186 procedure SetKotehanName(s: string);
187 procedure SetKotehanMail(s: string);
190 constructor Create( inPlugIn : TBoardPlugIn; inURL : string );
191 destructor Destroy; override;
193 property Context: DWORD read FContext write FContext;
195 property Items[index: integer]: TThreadItem read GetThreadItem write SetThreadItem;
196 property No: Integer read FNo write FNo;
197 property Title: string read FTitle write FTitle;
198 property BBSID: string read FBBSID write FBBSID;
199 property URL: string read FURL write FURL;
200 property Round: Boolean read FRound write SetRound;
201 property RoundName: string read FRoundName write SetRoundName;
202 property RoundDate: TDateTime read FRoundDate write FRoundDate;
203 property LastModified: TDateTime read FLastModified write SetLastModified;
204 property LastGetTime: TDateTime read FLastGetTime write SetLastGetTime;
205 property UnRead: Integer read FUnRead write SetUnRead;
206 property Modified: Boolean read FModified write FModified;
207 property IsThreadDatRead: Boolean read FIsThreadDatRead write FIsThreadDatRead;
208 property ParentCategory: TCategory read FParentCategory write FParentCategory;
210 property BoardPlugIn : TBoardPlugIn read FBoardPlugIn;
211 property FilePath : string read FFilePath write FFilePath;
212 property IsLogFile : Boolean read FIsLogFile write FIsLogFile;
213 property IntData : Integer read FIntData write FIntData;
214 property ListData : TList read FListData write FListData;
215 function IsBoardPlugInAvailable : Boolean;
217 function Add(item: TThreadItem): integer;
218 procedure Insert(Index: Integer; Item: TThreadItem);
219 procedure Delete(index: integer);
220 procedure DeleteList(index: integer);
221 procedure Clear; override;
222 function Find(ItemFileName: string): TThreadItem;
223 function FindThreadFromURL( inURL : string ) : TThreadItem;
224 function GetIndex(ItemFileName: string): Integer;
225 function GetIndexFromURL(URL: string): Integer;
226 procedure LoadSettings;
227 procedure SaveSettings;
228 function GetReadCgiURL: string;
229 function GetSubjectFileName: string;
230 function GetFolderIndexFileName: string;
231 function GetSendURL: string;
233 function GetNewThreadCount: Integer;
234 function GetLogThreadCount: Integer;
235 function GetUserThreadCount: Integer;
236 function GetNewThread(Index: Integer): TThreadItem;
237 function GetLogThread(Index: Integer): TThreadItem;
238 function GetUserThread(Index: Integer): TThreadItem;
240 procedure BeginUpdate;
242 property NodeExpand: Boolean read FExpand write FExpand;
243 property BoolData: Boolean read FBoolData write FBoolData;
244 property SPID: string read FSPID write FSPID;
245 property PON: string read FPON write FPON;
246 property KotehanName: string read FKotehanName write SetKotehanName;
247 property KotehanMail: string read FKotehanMail write SetKotehanMail;
251 TThreadItem = class(TObject)
253 FContext: DWORD; //
\83v
\83\89\83O
\83C
\83\93\82ª
\8e©
\97R
\82É
\90Ý
\92è
\82µ
\82Ä
\82¢
\82¢
\92l(
\8eå
\82É
\83C
\83\93\83X
\83^
\83\93\83X
\82ª
\93ü
\82é)
255 FNo: Integer; //
\94Ô
\8d\86
256 FFileName: string; //
\83X
\83\8c\83b
\83h
\83t
\83@
\83C
\83\8b\96¼
257 FTitle: string; //
\83X
\83\8c\83b
\83h
\83^
\83C
\83g
\83\8b
258 FShortTitle: string; //
\92Z
\82¢
\83X
\83\8c\83b
\83h
\83^
\83C
\83g
\83\8b\81i
\8c\9f\8dõ
\97p
\81j
259 FRoundDate: TDateTime; //
\83X
\83\8c\83b
\83h
\82ð
\8eæ
\93¾
\82µ
\82½
\93ú
\8e\9e\81i
\8f\84\89ñ
\93ú
\8e\9e\81j
260 FLastModified: 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
261 FCount: Integer; //
\83X
\83\8c\83b
\83h
\83J
\83E
\83\93\83g
\81i
\83\8d\81[
\83J
\83\8b\81j
262 FAllResCount: Integer; //
\83X
\83\8c\83b
\83h
\83J
\83E
\83\93\83g
\81i
\83T
\81[
\83o
\81j
263 FNewResCount: Integer; //
\83X
\83\8c\83b
\83h
\90V
\92\85\90\94
264 FSize: Integer; //
\83X
\83\8c\83b
\83h
\83T
\83C
\83Y
265 FRound: Boolean; //
\8f\84\89ñ
\83t
\83\89\83O
266 FRoundName: string; //
\8f\84\89ñ
\96¼
267 FIsLogFile: Boolean; //
\83\8d\83O
\91¶
\8dÝ
\83t
\83\89\83O
268 FParentBoard: TBoard; //
\90e
\83{
\81[
\83h
269 FKokomade: Integer; //
\83R
\83R
\82Ü
\82Å
\93Ç
\82ñ
\82¾
\94Ô
\8d\86
270 FNewReceive: Integer; //
\83R
\83R
\82©
\82ç
\90V
\8bK
\8eó
\90M
271 FNewArrival: Boolean; //
\90V
\92\85
272 FUnRead: Boolean; //
\96¢
\93Ç
\83t
\83\89\83O
273 FScrollTop: Integer; //
\83X
\83N
\83\8d\81[
\83\8b\88Ê
\92u
274 FDownloadHost: string; //
\8d¡
\82Ì
\83z
\83X
\83g
\82Æ
\88á
\82¤
\8fê
\8d\87\82Ì
\83z
\83X
\83g
275 FAgeSage: TGikoAgeSage; //
\83A
\83C
\83e
\83\80\82Ì
\8fã
\82°
\89º
\82°
276 // FSPID: string; //
\8f\91\82«
\8d\9e\82Ý
\97pSPID
280 FURL : string; //
\82±
\82Ì
\83X
\83\8c\82ð
\83u
\83\89\83E
\83U
\82Å
\95\
\8e¦
\82·
\82é
\8dÛ
\82Ì URL
281 FBoardPlugIn : TBoardPlugIn; //
\82±
\82Ì
\83X
\83\8c\82ð
\83T
\83|
\81[
\83g
\82·
\82é
\83v
\83\89\83O
\83C
\83\93
282 FFilePath : string; //
\82±
\82Ì
\83X
\83\8c\82ª
\95Û
\91¶
\82³
\82ê
\82Ä
\82¢
\82é
\83p
\83X
283 FSizeByte : Integer; // CreateHTML2
\82ð
\8eÀ
\8ds
\82µ
\82Ä
\82¢
\82é
\8dÅ
\92\86\82É
\88ê
\8e\9e\93I
\82É
\95Û
\91¶
\82³
\82ê
\82é
\92l
285 procedure SetLastModified(d: TDateTime);
286 procedure SetRound(b: Boolean);
287 procedure SetRoundName(s: string);
288 procedure SetKokomade(i: Integer);
289 procedure SetUnRead(b: Boolean);
290 procedure SetScrollTop(i: Integer);
292 function GetCreateDate: TDateTime;
294 constructor Create( inPlugIn : TBoardPlugIn; inURL : string );
295 destructor Destroy; override;
297 function GetDatURL: string;
298 function GetDatgzURL: string;
299 // function GetOldDatgzURL: string;
300 function GetOfflawCgiURL(SessionID: string): string;
301 function GetSendURL: string;
302 procedure DeleteLogFile;
303 function GetThreadFileName: string;
304 procedure BeginUpdate;
307 property Context: DWORD read FContext write FContext;
309 property No: Integer read FNo write FNo;
310 property FileName: string read FFileName write FFileName;
311 property Title: string read FTitle write FTitle;
312 property ShortTitle: string read FShortTitle write FShortTitle;
313 property RoundDate: TDateTime read FRoundDate write FRoundDate;
314 property LastModified: TDateTime read FLastModified write SetLastModified;
315 property Count: Integer read FCount write FCount;
316 property AllResCount: Integer read FAllResCount write FAllResCount;
317 property NewResCount: Integer read FNewResCount write FNewResCount;
318 property Size: Integer read FSize write FSize;
319 property Round: Boolean read FRound write SetRound;
320 property RoundName: string read FRoundName write SetRoundName;
322 property IsLogFile: Boolean read FIsLogFile write FIsLogFile;
323 property ParentBoard: TBoard read FParentBoard write FParentBoard;
324 property Kokomade: Integer read FKokomade write SetKokomade;
325 property NewReceive: Integer read FNewReceive write FNewReceive;
326 property NewArrival: Boolean read FNewArrival write FNewArrival;
327 property UnRead: Boolean read FUnRead write SetUnRead;
328 property ScrollTop: Integer read FScrollTop write SetScrollTop;
329 property Expand: Boolean read FExpand write FExpand;
330 property DownloadHost: string read FDownloadHost write FDownloadHost;
331 property AgeSage: TGikoAgeSage read FAgeSage write FAgeSage;
332 // property SPID: string read FSPID write FSPID;
333 property CreateDate: TDateTime read GetCreateDate;
334 property URL : string read FURL write FURL;
335 property BoardPlugIn : TBoardPlugIn read FBoardPlugIn;
336 property FilePath : string read FFilePath write FFilePath;
337 property SizeByte : Integer read FSizeByte write FSizeByte;
338 function IsBoardPlugInAvailable : Boolean;
343 //
\8c\9f\8dõ
\8c\8b\89Ê
\83\8a\83X
\83g
344 { TSearchList = class(TList)
346 function GetThreadItem(index: integer): TThreadItem;
347 procedure SetThreadItem(index: integer; value: TThreadItem);
350 destructor Destroy; override;
352 property Items[index: integer]: TThreadItem read GetThreadItem write SetThreadItem;
354 function Add(item: TThreadItem): integer;
355 procedure Delete(index: integer);
356 procedure Clear; override;
359 function BBSsFindBoardFromBBSID( inBBSID : string ) : TBoard;
360 function BBSsFindBoardFromURL( inURL : string ) : TBoard;
361 function BBSsFindBoardFromTitle( inTitle : string ) : TBoard;
362 function BBSsFindThreadFromURL( inURL : string ) : TThreadItem;
363 function ConvertDateTimeString( inDateTimeString : string) : TDateTime;
366 BBSs : array of TBBS;
371 GikoSystem, RoundData;
374 BBS2CH_NAME: string = '
\82Q
\82¿
\82á
\82ñ
\82Ë
\82é';
375 BBS2CH_LOG_FOLDER: string = '2ch';
376 EXTERNAL_LOG_FOLDER: string = 'exboard';
378 FOLDER_INI_FILENAME: string = 'Folder.ini';
379 FOLDER_INDEX_FILENAME: string = 'Folder.idx';
380 SUBJECT_FILENAME: string = 'subject.txt';
381 PATH_DELIM: string = '\';
382 //DEFAULT_LIST_COUNT: Integer = 100;
384 // COLUMN_CATEGORY: array[0..0] of string = ('
\83J
\83e
\83S
\83\8a\96¼');
385 // COLUMN_BOARD: array[0..3] of string = ('
\94Â
\96¼', '
\8eæ
\93¾
\90\94', '
\8f\84\89ñ
\97\
\96ñ', '
\91O
\89ñ
\8f\84\89ñ
\93ú
\8e\9e');
386 // COLUMN_THREADITEM: array[0..3] of string = ('
\83X
\83\8c\83b
\83h
\96¼', '
\83J
\83E
\83\93\83g', '
\8f\84\89ñ
\97\
\96ñ', '
\91O
\89ñ
\8f\84\89ñ
\93ú
\8e\9e');
388 // BBSID
\82ð
\97p
\82¢
\82é 2
\82¿
\82á
\82ñ
\82Ë
\82é
\82Ì
\82Ý
\92T
\82µ
\8fo
\82µ
\82Ü
\82·
389 // BBSID
\82Ì
\8eg
\97p
\82Í
\8bÉ
\97Í
\94ð
\82¯
\82Ä
\82
\82¾
\82³
\82¢
\81B
390 //
\89Â
\94\
\82È
\8fê
\8d\87\82Í URL
\82ð
\8eg
\97p
\82µ
\82Ä
\82
\82¾
\82³
\82¢
\81B
391 function BBSsFindBoardFromBBSID(
396 Result := BBSs[ 0 ].FindBBSID( inBBSID );
400 function BBSsFindBoardFromURL(
407 for i := Length( BBSs ) - 1 downto 0 do begin
408 Result := BBSs[ i ].FindBoardFromURL( inURL );
409 if Result <> nil then
417 function BBSsFindBoardFromTitle(
424 for i := Length( BBSs ) - 1 downto 0 do begin
425 Result := BBSs[ i ].FindBoardFromTitle( inTitle );
426 if Result <> nil then
434 function BBSsFindThreadFromURL(
442 boardURL := GikoSys.GetThreadURL2BoardURL( inURL );
443 board := BBSsFindBoardFromURL( boardURL );
447 Result := board.FindThreadFromURL( inURL );
451 (*************************************************************************
452 *
\8b@
\94\
\96¼
\81FTBBS
\83R
\83\93\83X
\83g
\83\89\83N
\83^
454 *************************************************************************)
455 constructor TBBS.Create( boardFilePath : string );
458 Title := BBS2CH_NAME;
459 FFilePath := boardFilePath;
462 (*************************************************************************
463 *
\8b@
\94\
\96¼
\81FTBBS
\83f
\83X
\83g
\83\89\83N
\83^
465 *************************************************************************)
466 destructor TBBS.Destroy;
472 (*************************************************************************
475 *************************************************************************)
476 function TBBS.GetCategory(index: integer): TCategory;
478 Result := TCategory(inherited Items[index]);
481 procedure TBBS.SetCategory(index: integer; value: TCategory);
483 inherited Items[index] := value;
486 function TBBS.Add(item: TCategory): integer;
488 Item.ParenTBBS := self;
489 Result := inherited Add(item);
492 procedure TBBS.Delete(index: integer);
494 if Items[index] <> nil then
495 TCategory(Items[index]).Free;
497 inherited Delete(index);
500 procedure TBBS.Clear;
504 for i := Count - 1 downto 0 do
509 function TBBS.Find(key: string): TCategory;
514 function TBBS.FindBBSID(BBSID: string): TBoard;
518 if not IsBoardFileRead then
519 GikoSys.ReadBoardFile( Self );
520 for i := Count - 1 downto 0 do begin
521 Result := Items[ i ].FindBBSID(BBSID);
522 if Result <> nil then
528 //*************************************************************************
529 //
\83^
\83C
\83g
\83\8b\82Ì
\88ê
\92v
\82·
\82é
\94Â
\82ð
\92T
\82·
530 //*************************************************************************)
531 function TBBS.FindBoardFromTitle(Title: string): TBoard;
535 if not IsBoardFileRead then
536 GikoSys.ReadBoardFile( Self );
537 for i := Count - 1 downto 0 do begin
538 Result := Items[ i ].FindBoardFromTitle(Title);
539 if Result <> nil then
545 //*************************************************************************
546 // URL
\82ð
\8eó
\82¯
\95t
\82¯
\82é
\94Â
\82ð
\92T
\82·
547 //*************************************************************************)
548 function TBBS.FindBoardFromURL(inURL: string): TBoard;
552 if not IsBoardFileRead then
553 GikoSys.ReadBoardFile( Self );
554 for i := Count - 1 downto 0 do begin
555 Result := Items[ i ].FindBoardFromURL( inURL );
556 if Result <> nil then
562 //*************************************************************************
563 // URL
\82ð
\8eó
\82¯
\95t
\82¯
\82é
\83X
\83\8c\83b
\83h
\82ð
\92T
\82·
564 //*************************************************************************)
565 function TBBS.FindThreadFromURL(inURL: string): TThreadItem;
571 boardURL := GikoSys.GetThreadURL2BoardURL( inURL );
572 board := FindBoardFromURL( boardURL );
576 Result := board.FindThreadFromURL( inURL );
580 function TBBS.FindThreadItem(BBSID: string; FileName: string): TThreadItem;
585 Board := FindBBSID(BBSID);
588 Result := Board.Find(FileName);
591 function TBBS.FindCategoryFromTitle( inTitle : string ) : TCategory;
596 for i := Count - 1 downto 0 do begin
597 if AnsiCompareStr(Items[ i ].Title, inTitle) = 0 then begin
598 Result := Items[ i ];
607 procedure TBBS.SetSelectText(s: string);
610 ShortSelectText := GikoSys.ZenToHan(s);
613 {class function TBBS.GetColumnName(Index: Integer): string;
615 Result := COLUMN_CATEGORY[Index];
618 class function TBBS.GetColumnCount: Integer;
620 Result := Length(COLUMN_CATEGORY);
623 //===================
625 //===================
626 constructor TCategory.Create;
631 destructor TCategory.Destroy;
637 function TCategory.GetBoard(index: integer): TBoard;
639 Result := TBoard(inherited Items[index]);
642 procedure TCategory.SetBoard(index: integer; value: TBoard);
644 inherited Items[index] := value;
647 function TCategory.Add(item: TBoard): integer;
649 Item.ParentCategory := self;
650 Result := inherited Add(item);
653 procedure TCategory.Delete(index: integer);
655 if Items[index] <> nil then
656 TBoard(Items[index]).Free;
658 inherited Delete(index);
661 procedure TCategory.Clear;
665 for i := Count - 1 downto 0 do
670 function TCategory.FindName(key: string): TBoard;
675 function TCategory.FindBBSID(BBSID: string): TBoard;
679 for i := Count - 1 downto 0 do begin
680 if AnsiCompareStr(Items[i].FBBSID, BBSID) = 0 then begin
688 //*************************************************************************
689 //
\83^
\83C
\83g
\83\8b\82Ì
\88ê
\92v
\82·
\82é
\94Â
\82ð
\92T
\82·
690 //*************************************************************************)
691 function TCategory.FindBoardFromTitle(Title: string): TBoard;
695 for i := Count - 1 downto 0 do begin
696 if AnsiCompareStr(Items[i].FTitle, Title) = 0 then begin
704 //*************************************************************************
705 // URL
\82ð
\8eó
\82¯
\95t
\82¯
\82é
\94Â
\82ð
\92T
\82·
706 //*************************************************************************)
707 function TCategory.FindBoardFromURL(inURL: string): TBoard;
711 for i := Count - 1 downto 0 do begin
712 if Pos( Items[i].URL, inURL ) = 1 then begin
720 //*************************************************************************
721 // URL
\82ð
\8eó
\82¯
\95t
\82¯
\82é
\83X
\83\8c\83b
\83h
\82ð
\92T
\82·
722 //*************************************************************************)
723 function TCategory.FindThreadFromURL(inURL: string): TThreadItem;
729 boardURL := GikoSys.GetThreadURL2BoardURL( inURL );
730 board := FindBoardFromURL( boardURL );
734 Result := board.FindThreadFromURL( inURL );
738 function TCategory.IsMidoku: Boolean;
744 for i := 0 to Count - 1 do begin
745 if Items[i] <> nil then begin
746 for j := 0 to Items[i].Count - 1 do begin
747 if Items[i].Items[j] <> nil then begin
748 // if (Items[i].Items[j].IsLogFile) and (Items[i].Items[j].Count > Items[i].Items[j].Kokomade) then begin
749 if (Items[i].Items[j].IsLogFile) and (Items[i].Items[j].UnRead) then begin
759 {class function TCategory.GetColumnName(Index: Integer): string;
761 Result := COLUMN_BOARD[Index];
764 class function TCategory.GetColumnCount: Integer;
766 Result := Length(COLUMN_BOARD);
769 //===================
771 //===================
772 procedure TBoard.Init;
779 FRoundDate := ZERO_DATE;
780 FLastModified := ZERO_DATE;
781 FLastGetTime := ZERO_DATE;
782 FIsThreadDatRead := False;
784 // FListStyle := vsReport;
785 // FItemNoVisible := True;
790 // *************************************************************************
791 //
\8aO
\95\94\94Â
\83v
\83\89\83O
\83C
\83\93\82ð
\8ew
\92è
\82µ
\82½
\83R
\83\93\83X
\83g
\83\89\83N
\83^
792 // *************************************************************************
793 constructor TBoard.Create(
794 inPlugIn : TBoardPlugIn;
798 protocol, host, path, document, port, bookmark : string;
804 FBoardPlugIn := inPlugIn;
806 BBSID := GikoSys.UrlToID( inURL );
808 if inPlugIn = nil then begin
809 // subject.txt
\82Ì
\95Û
\91¶
\83p
\83X
\82ð
\90Ý
\92è
810 GikoSys.ParseURI( inURL, protocol, host, path, document, port, bookmark );
811 if GikoSys.Is2chHost( host ) then
813 IncludeTrailingPathDelimiter( GikoSys.Setting.LogFolder ) +
814 BBS2CH_LOG_FOLDER + PATH_DELIM + BBSID + PATH_DELIM + SUBJECT_FILENAME
817 IncludeTrailingPathDelimiter( GikoSys.Setting.LogFolder ) +
818 EXTERNAL_LOG_FOLDER + PATH_DELIM + host + PATH_DELIM + BBSID + PATH_DELIM + SUBJECT_FILENAME
820 //
\83v
\83\89\83O
\83C
\83\93\82É TBoardItem
\82ª
\8dì
\90¬
\82³
\82ê
\82½
\82±
\82Æ
\82ð
\93`
\82¦
\82é
821 inPlugIn.CreateBoardItem( DWORD( Self ) );
826 // *************************************************************************
827 //
\83f
\83X
\83g
\83\89\83N
\83^
828 // *************************************************************************
829 destructor TBoard.Destroy;
831 if FModified then begin
832 GikoSys.WriteThreadDat(Self);
836 //
\83v
\83\89\83O
\83C
\83\93\82É TBoardItem
\82ª
\94j
\8aü
\82³
\82ê
\82½
\82±
\82Æ
\82ð
\93`
\82¦
\82é
837 if IsBoardPlugInAvailable then
838 BoardPlugIn.DisposeBoardItem( DWORD( Self ) );
844 // *************************************************************************
845 //
\8aO
\95\94\94Â
\83v
\83\89\83O
\83C
\83\93\82ª
\8eg
\97p
\89Â
\94\
\82©
846 // *************************************************************************
847 function TBoard.IsBoardPlugInAvailable : Boolean;
851 if BoardPlugIn = nil then
854 if not Assigned( Pointer( BoardPlugIn.Module ) ) then
865 function TBoard.GetThreadItem(index: integer): TThreadItem;
867 Result := TThreadItem(inherited Items[index]);
870 procedure TBoard.SetThreadItem(index: integer; value: TThreadItem);
872 inherited Items[index] := value;
875 function TBoard.Add(Item: TThreadItem): Integer;
877 Item.ParentBoard := Self;
878 Result := inherited Add(Item);
881 procedure TBoard.Insert(Index: Integer; Item: TThreadItem);
883 Item.ParentBoard := Self;
884 inherited Insert(Index, Item);
887 //Index
\82Å
\8ew
\92è
\82³
\82ê
\82½
\83X
\83\8c\83b
\83h
\83I
\83u
\83W
\83F
\83N
\83g
\82ð
\94j
\8aü
888 procedure TBoard.Delete(index: Integer);
890 if Items[index] <> nil then
891 TThreadItem(Items[index]).Free;
893 inherited Delete(index);
896 //Index
\82Å
\8ew
\92è
\82³
\82ê
\82½
\83X
\83\8c\83b
\83h
\82ð
\83\8a\83X
\83g
\82©
\82ç
\8dí
\8f\9c\81i
\83X
\83\8c\83I
\83u
\83W
\83F
\83N
\83g
\82Í
\82Ì
\82±
\82·
\81j
897 procedure TBoard.DeleteList(index: integer);
899 inherited Delete(index);
902 procedure TBoard.Clear;
907 for i := Count - 1 downto 0 do
912 function TBoard.Find(ItemFileName: string): TThreadItem;
917 for i := 0 to Count - 1 do begin
918 if AnsiCompareStr(Items[i].FileName, ItemFileName) = 0 then begin
925 function TBoard.GetIndex(ItemFileName: string): Integer;
930 for i := 0 to Count - 1 do begin
931 if Items[i].FileName = ItemFileName then begin
938 function TBoard.GetIndexFromURL(URL: string): Integer;
943 for i := 0 to Count - 1 do begin
944 if Pos( URL, Items[ i ].URL ) = 1 then begin
951 function TBoard.FindThreadFromURL( inURL : string ) : TThreadItem;
956 if not IsThreadDatRead then
957 GikoSys.ReadSubjectFile( Self );
959 for i := Count - 1 downto 0 do begin
960 if Pos( inURL, Items[ i ].URL ) = 1 then begin
961 Result := Items[ i ];
969 {function TBoard.GetMidokuCount: Integer;
974 for i := 0 to Count- 1 do begin
975 if Items[i] <> nil then begin
976 if (Items[i].IsLogFile) and (Items[i].Count > Items[i].Kokomade) then
983 procedure TBoard.LoadSettings;
989 if Length( FilePath ) > 0 then
990 FileName := ExtractFilePath( FilePath ) + FOLDER_INI_FILENAME
992 FileName := IncludeTrailingPathDelimiter( GikoSys.Setting.LogFolder )
993 + BBS2CH_LOG_FOLDER + BBSID + PATH_DELIM + FOLDER_INI_FILENAME;
995 if not FileExists(FileName) then
997 ini := TMemIniFile.Create(FileName);
999 // Round := ini.ReadBool('Status', 'Round', False);
1000 tmp := ini.ReadString('Status', 'RoundDate', DateTimeToStr(ZERO_DATE));
1001 FRoundDate := ConvertDateTimeString(tmp);
1002 tmp := ini.ReadString('Status', 'LastModified', DateTimeToStr(ZERO_DATE));
1003 FLastModified := ConvertDateTimeString(tmp);
1004 tmp := ini.ReadString('Status', 'LastGetTime', DateTimeToStr(ZERO_DATE));
1005 FLastGetTime := ConvertDateTimeString(tmp);
1009 FRoundDate := ini.ReadDateTime('Status', 'RoundDate', ZERO_DATE);
1011 tmp := ini.ReadString('Status', 'RoundDate', DateTimeToStr(ZERO_DATE));
1012 FRoundDate := StrToDateTime(ConvertDateTimeString(tmp));
1015 FLastModified := ini.ReadDateTime('Status', 'LastModified', ZERO_DATE);
1017 tmp := ini.ReadString('Status', 'LastModified', DateTimeToStr(ZERO_DATE));
1018 FLastModified := StrToDateTime(ConvertDateTimeString(tmp));
1021 FLastGetTime := ini.ReadDateTime('Status', 'LastGetTime', ZERO_DATE);
1023 tmp := ini.ReadString('Status', 'LastGetTime', DateTimeToStr(ZERO_DATE));
1024 FLastGetTime := StrToDateTime(ConvertDateTimeString(tmp));
1027 FUnRead := ini.ReadInteger('Status', 'UnRead', 0);
1028 FSPID := ini.ReadString('Cookie', 'SPID', '');
1029 FPON := ini.ReadString('Cookie', 'PON', '');
1030 FKotehanName := ini.ReadString('Kotehan', 'Name', '');
1031 FKotehanMail := ini.ReadString('Kotehan', 'Mail', '');
1032 // ListStyle := TViewStyle(Ord(ini.ReadInteger('Status', 'ListStyle', 3)));
1033 // ItemNoVisible := ini.ReadBool('Status', 'ItemNoVisible', True);
1034 // ViewType := TGikoViewType(Ord(ini.ReadInteger('Status', 'ViewType', 0)));
1042 procedure TBoard.SaveSettings;
1047 if Length( FilePath ) > 0 then
1048 FileName := ExtractFilePath( FilePath )
1050 FileName := IncludeTrailingPathDelimiter( GikoSys.Setting.LogFolder )
1051 + BBS2CH_LOG_FOLDER + BBSID + PATH_DELIM;
1052 if not GikoSys.DirectoryExistsEx(FileName) then
1053 GikoSys.ForceDirectoriesEx(FileName);
1054 FileName := FileName + FOLDER_INI_FILENAME;
1055 ini := TMemIniFile.Create(FileName);
1059 // ini.WriteBool('Status', 'Round', Round);
1060 ini.WriteDateTime('Status', 'RoundDate', FRoundDate);
1061 ini.WriteDateTime('Status', 'LastModified', FLastModified);
1062 ini.WriteDateTime('Status', 'LastGetTime', FLastGetTime);
1063 ini.WriteInteger('Status', 'UnRead', FUnRead);
1064 ini.WriteString('Cookie', 'SPID', FSPID);
1065 ini.WriteString('Cookie', 'PON', FPON);
1066 ini.WriteString('Kotehan', 'Name', FKotehanName);
1067 ini.WriteString('Kotehan', 'Mail', FKotehanMail);
1068 // ini.WriteInteger('Status', 'ListStyle', Ord(ListStyle));
1069 // ini.WriteBool('Status', 'ItemNoVisible', ItemNoVisible);
1070 // ini.WriteInteger('Status', 'ViewType', Ord(ViewType));
1076 //
\82Æ
\82«
\82½
\82Ü2003 02 08 0:32:13
\82±
\82ñ
\82È
\8c`
\8e®
\82Ì
\93ú
\95t
\82ª
\82 \82é
\82Ì
\82Å
\82»
\82ê
\82ð
1077 // 2003/02/08 0:32:13
\82É
\95Ï
\8a·
\82·
\82é
1078 function ConvertDateTimeString( inDateTimeString : string) : TDateTime;
1080 ZERO_DATE_STRING : string = '1970/01/01 0:00:00';
1090 if inDateTimeString = '' then
1091 inDateTimeString := ZERO_DATE_STRING;
1093 if ( AnsiPos('/', inDateTimeString ) = 0 ) and
1094 ( AnsiCompareStr( DateTimeToStr(ZERO_DATE), inDateTimeString) <> 0 ) then begin
1095 for i := 0 to 1 do begin
1096 Insert('/',inDateTimeString, AnsiPos(' ', inDateTimeString) + 1 );
1097 Delete(inDateTimeString, AnsiPos(' ', inDateTimeString), 1);
1101 Result := StrToDateTime( inDateTimeString );
1103 if( inDateTimeString[5] = '/' ) and ( inDateTimeString[8] = '/' ) then begin
1104 y := StrToIntDef( Copy(inDateTimeString, 1, 4), 1970 );
1105 m := StrToIntDef( Copy(inDateTimeString, 6, 2), 1 );
1106 d := StrToIntDef( Copy(inDateTimeString, 9, 2), 1 );
1107 hour := 0; min := 0; sec := 0;
1109 if Length(inDateTimeString) > 11 then begin
1110 if( inDateTimeString[13] = ':' ) and ( inDateTimeString[16] = ':' ) then begin
1111 hour := StrToIntDef( Copy(inDateTimeString, 12, 1), 0 );
1112 min := StrToIntDef( Copy(inDateTimeString, 14, 2), 0 );
1113 sec := StrToIntDef( Copy(inDateTimeString, 17, 2), 0 );
1114 end else if( inDateTimeString[14] = ':' ) and ( inDateTimeString[17] = ':' ) then begin
1115 hour := StrToIntDef( Copy(inDateTimeString, 12, 2), 0 );
1116 min := StrToIntDef( Copy(inDateTimeString, 15, 2), 0 );
1117 sec := StrToIntDef( Copy(inDateTimeString, 18, 2), 0 );
1121 Result := EncodeDateTime(y ,m, d, hour, min, sec, 0);
1123 Result := ZERO_DATE;
1126 Result := ZERO_DATE;
1130 // Result := inDateTimeString;
1132 //
\83T
\83u
\83W
\83F
\83N
\83gURL
\8eæ
\93¾
1133 function TBoard.GetReadCgiURL: string;
1135 //Result := URL + SUBJECT_FILENAME;
1136 //Result := GikoSys.UrlToServer(URL)
1137 // + 'test/read.cgi/' + BBSID + '/?raw=0.0';
1138 Result := URL + SUBJECT_FILENAME;
1142 //
\83T
\83u
\83W
\83F
\83N
\83g
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
1143 function TBoard.GetSubjectFileName: string;
1145 if Length( FilePath ) > 0 then
1148 Result := IncludeTrailingPathDelimiter( GikoSys.Setting.LogFolder )
1149 + BBS2CH_LOG_FOLDER + BBSID + PATH_DELIM + SUBJECT_FILENAME;
1152 //
\83C
\83\93\83f
\83b
\83N
\83X
\83t
\83@
\83C
\83\8b\96¼(folder.idx)
\8eæ
\93¾
\81i
\83p
\83X
\81{
\83t
\83@
\83C
\83\8b\96¼
\81j
1153 function TBoard.GetFolderIndexFileName: string;
1155 if Length( FilePath ) > 0 then
1156 Result := ExtractFilePath( FilePath ) + FOLDER_INDEX_FILENAME
1158 Result := IncludeTrailingPathDelimiter( GikoSys.Setting.LogFolder )
1159 + BBS2CH_LOG_FOLDER + BBSID + PATH_DELIM + FOLDER_INDEX_FILENAME;
1162 //
\83X
\83\8c\97§
\82Ä
\91\97\90MURL
1163 function TBoard.GetSendURL: string;
1165 Result := GikoSys.UrlToServer(URL) + 'test/subbbs.cgi';
1168 procedure TBoard.SetRound(b: Boolean);
1173 RoundList.Delete(Self);
1174 if FRound = b then Exit;
1180 procedure TBoard.SetRoundName(s: string);
1182 if FRoundName = s then Exit;
1188 procedure TBoard.SetLastModified(d: TDateTime);
1190 if FLastModified = d then Exit;
1196 procedure TBoard.SetLastGetTime(d: TDateTime);
1198 if FLastGetTime = d then Exit;
1204 procedure TBoard.SetUnRead(i: Integer);
1206 if FUnRead = i then Exit;
1207 if i < 0 then i := 0;
1213 procedure TBoard.SetKotehanName(s: string);
1215 if FKotehanName = s then Exit;
1221 procedure TBoard.SetKotehanMail(s: string);
1223 if FKotehanMail = s then Exit;
1229 function TBoard.GetNewThreadCount: Integer;
1234 if Length( ParentCategory.ParenTBBS.ShortSelectText ) = 0 then
1236 for i := 0 to Count - 1 do begin
1237 if Items[i].NewArrival then
1241 for i := 0 to Count - 1 do begin
1242 if Items[i].NewArrival then
1244 if Items[i].ShortTitle = '' then
1245 Items[i].ShortTitle := GikoSys.ZenToHan(Items[i].Title);
1246 if AnsiPos(ParentCategory.ParenTBBS.ShortSelectText, Items[i].ShortTitle) <> 0 then
1253 function TBoard.GetLogThreadCount: Integer;
1258 if Length( ParentCategory.ParenTBBS.ShortSelectText ) = 0 then
1260 for i := 0 to Count - 1 do begin
1261 if Items[i].IsLogFile then
1265 for i := 0 to Count - 1 do begin
1266 if Items[i].IsLogFile then
1268 if Items[i].ShortTitle = '' then
1269 Items[i].ShortTitle := GikoSys.ZenToHan(Items[i].Title);
1270 if AnsiPos(ParentCategory.ParenTBBS.ShortSelectText, Items[i].ShortTitle) <> 0 then
1277 function TBoard.GetUserThreadCount: Integer;
1282 if Length( ParentCategory.ParenTBBS.ShortSelectText ) = 0 then
1285 for i := 0 to Count - 1 do begin
1286 if Items[i].ShortTitle = '' then
1287 Items[i].ShortTitle := GikoSys.ZenToHan(Items[i].Title);
1288 if AnsiPos(ParentCategory.ParenTBBS.ShortSelectText, Items[i].ShortTitle) <> 0 then
1293 function TBoard.GetNewThread(Index: Integer): TThreadItem;
1300 if Length( ParentCategory.ParenTBBS.ShortSelectText ) = 0 then
1302 for i := 0 to Count - 1 do begin
1303 if Items[i].NewArrival then
1305 if Index = Cnt then begin
1313 for i := 0 to Count - 1 do begin
1314 if Items[i].NewArrival then
1316 if Items[i].ShortTitle = '' then
1317 Items[i].ShortTitle := GikoSys.ZenToHan(Items[i].Title);
1318 if AnsiPos(ParentCategory.ParenTBBS.ShortSelectText, Items[i].ShortTitle) <> 0 then begin
1319 if Index = Cnt then begin
1330 function TBoard.GetLogThread(Index: Integer): TThreadItem;
1336 if Length( ParentCategory.ParenTBBS.ShortSelectText ) = 0 then
1338 for i := 0 to Count - 1 do begin
1339 if Items[i].IsLogFile then
1341 if Index = Cnt then begin
1349 for i := 0 to Count - 1 do begin
1350 if Items[i].IsLogFile then
1352 if Items[i].ShortTitle = '' then
1353 Items[i].ShortTitle := GikoSys.ZenToHan(Items[i].Title);
1354 if AnsiPos(ParentCategory.ParenTBBS.ShortSelectText, Items[i].ShortTitle) <> 0 then begin
1355 if Index = Cnt then begin
1367 function TBoard.GetUserThread(Index: Integer): TThreadItem;
1374 if Length( ParentCategory.ParenTBBS.ShortSelectText ) = 0 then
1376 for i := 0 to Count - 1 do begin
1379 Result := Items[ i ];
1385 for i := 0 to Count - 1 do begin
1386 if Items[i].ShortTitle = '' then
1387 Items[i].ShortTitle := GikoSys.ZenToHan(Items[i].Title);
1388 if AnsiPos(ParentCategory.ParenTBBS.ShortSelectText, Items[i].ShortTitle) <> 0 then begin
1389 if Index = Cnt then begin
1399 procedure TBoard.BeginUpdate;
1404 procedure TBoard.EndUpdate;
1409 {class function TBoard.GetColumnName(Index: Integer): string;
1411 Result := COLUMN_THREADITEM[Index];
1414 class function TBoard.GetColumnCount: Integer;
1416 Result := Length(COLUMN_THREADITEM);
1419 //constructor TThreadItem.Create(AOwner: TComponent);
1420 procedure TThreadItem.Init;
1425 FRoundDate := ZERO_DATE;
1426 FLastModified := ZERO_DATE;
1432 FIsLogFile := False;
1433 FParentBoard := nil;
1436 FNewArrival := False;
1440 FBoardPlugIn := nil;
1443 // *************************************************************************
1444 //
\8aO
\95\94\94Â
\83v
\83\89\83O
\83C
\83\93\82ð
\8ew
\92è
\82µ
\82½
\83R
\83\93\83X
\83g
\83\89\83N
\83^
1445 // *************************************************************************
1446 constructor TThreadItem.Create(
1447 inPlugIn : TBoardPlugIn;
1452 protocol, host, path, document, port, bookmark : string;
1453 BBSID, BBSKey : string;
1455 READ_PATH = '/test/read.cgi';
1461 FBoardPlugIn := inPlugIn;
1464 if inPlugIn = nil then begin
1465 foundPos := Pos( READ_PATH, inURL );
1466 if foundPos > 0 then begin
1467 // dat
\82Ì
\95Û
\91¶
\83p
\83X
\82ð
\90Ý
\92è
1468 GikoSys.ParseURI( inURL, protocol, host, path, document, port, bookmark );
1469 GikoSys.Parse2chURL( inURL, path, document, BBSID, BBSKey );
1470 if GikoSys.Is2chHost( host ) then
1472 IncludeTrailingPathDelimiter( GikoSys.Setting.LogFolder ) +
1473 BBS2CH_LOG_FOLDER + PATH_DELIM + BBSID + PATH_DELIM + BBSKey + '.dat'
1476 IncludeTrailingPathDelimiter( GikoSys.Setting.LogFolder ) +
1477 EXTERNAL_LOG_FOLDER + PATH_DELIM + host + PATH_DELIM + BBSID + PATH_DELIM + BBSKey + '.dat';
1478 FileName := BBSKey + '.dat';
1479 IsLogFile := FileExists( FilePath );
1480 URL := GikoSys.Get2chBrowsableThreadURL( inURL );
1483 //
\83v
\83\89\83O
\83C
\83\93\82É TThreadItem
\82ª
\8dì
\90¬
\82³
\82ê
\82½
\82±
\82Æ
\82ð
\93`
\82¦
\82é
1484 inPlugIn.CreateThreadItem( DWORD( Self ) );
1489 // *************************************************************************
1490 //
\83f
\83X
\83g
\83\89\83N
\83^
1491 // *************************************************************************
1492 destructor TThreadItem.Destroy;
1495 //
\83v
\83\89\83O
\83C
\83\93\82É TThreadItem
\82ª
\94j
\8aü
\82³
\82ê
\82½
\82±
\82Æ
\82ð
\93`
\82¦
\82é
1496 if IsBoardPlugInAvailable then
1497 FBoardPlugIn.DisposeThreadItem( DWORD( Self ) );
1503 // *************************************************************************
1504 //
\8aO
\95\94\94Â
\83v
\83\89\83O
\83C
\83\93\82ª
\8eg
\97p
\89Â
\94\
\82©
1505 // *************************************************************************
1506 function TThreadItem.IsBoardPlugInAvailable : Boolean;
1510 if BoardPlugIn = nil then
1513 if not Assigned( Pointer( BoardPlugIn.Module ) ) then
1524 function TThreadItem.GetDatURL: string;
1526 Protocol, Host, Path, Document, Port, Bookmark: string;
1528 Result := ParentBoard.URL
1531 if FDownloadHost <> '' then begin
1532 GikoSys.ParseURI(Result, Protocol, Host, Path, Document, Port, Bookmark);
1533 Result := Format('%s://%s%s%s', [Protocol,
1538 // Result := GikoSys.UrlToServer(ParentBoard.URL)
1539 // + 'test/read.cgi/' + ParentBoard.BBSID + '/'
1540 // + ChangeFileExt(FileName, '') + '/?raw='
1541 // + IntToStr(ResNum) + '.' + IntToStr(ResSize);
1544 function TThreadItem.GetDatgzURL: string;
1545 function isOldKako(s: string): Boolean;
1548 if AnsiPos('piza.', s) <> 0 then
1550 else if AnsiPos('www.bbspink.', s) <> 0 then
1552 else if AnsiPos('tako.', s) <> 0 then
1556 Protocol, Host, Path, Document, Port, Bookmark: string;
1559 if FDownloadHost = '' then begin
1560 DatNo := ChangeFileExt(FileName, '');
1561 if isOldKako(ParentBoard.URL) then begin
1562 Result := Format('%s%s/%.3s/%s.dat', [ParentBoard.URL, 'kako', DatNo, DatNo]);
1564 if Length(DatNo) > 9 then begin
1565 //http://xxx.2ch.net/xxx/kako/9999/99999/999999999.dat.gz
1566 Result := Format('%s%s/%.4s/%.5s/%s.dat.gz', [ParentBoard.URL, 'kako', DatNo, DatNo, DatNo]);
1568 //http://xxx.2ch.net/xxx/kako/999/999999999.dat.gz
1569 Result := Format('%s%s/%.3s/%s.dat.gz', [ParentBoard.URL, 'kako', DatNo, DatNo]);
1573 Gikosys.ParseURI(Result, Protocol, Host, Path, Document, Port, Bookmark);
1574 DatNo := ChangeFileExt(Document, '');
1575 if isOldKako(DownloadHost) then begin
1576 Result := Format('%s://%s/%s/kako/%.3s/%s.dat', [Protocol, DownloadHost, ParentBoard.FBBSID, DatNo, DatNo]);
1578 if Length(DatNo) > 9 then begin
1579 Result := Format('%s://%s/%s/kako/%.4s/%.5s/%s.dat.gz', [Protocol, DownloadHost, ParentBoard.FBBSID, DatNo, DatNo, DatNo]);
1581 Result := Format('%s://%s/%s/kako/%.3s/%s.dat.gz', [Protocol, DownloadHost, ParentBoard.FBBSID, DatNo, DatNo]);
1587 {function TThreadItem.GetOldDatgzURL: string;
1589 Protocol, Host, Path, Document, Port, Bookmark: string;
1591 Result := Format('%s%s/%.3s/%s.gz', [ParentBoard.URL,
1595 if FDownloadHost <> '' then begin
1596 ParseURI(Result, Protocol, Host, Path, Document, Port, Bookmark);
1597 Result := Format('%s://%s%s%s', [Protocol,
1605 function TThreadItem.GetOfflawCgiURL(SessionID: string): string;
1607 // Protocol, Host, Path, Document, Port, Bookmark: string;
1609 // Result := GikoSys.UrlToServer(ParentBoard.URL)
1610 // + 'test/offlaw.cgi/' + ParentBoard.BBSID + '/'
1611 // + ChangeFileExt(FileName, '') + '/?raw=.0&sid=' + HttpEncode(SessionID);
1612 if FDownloadHost = '' then begin
1613 Result := GikoSys.UrlToServer(ParentBoard.URL)
1614 + 'test/offlaw.cgi/' + ParentBoard.BBSID + '/'
1615 + ChangeFileExt(FileName, '') + '/?raw=.0&sid=' + HttpEncode(SessionID);
1617 //http://news.2ch.net/test/offlaw.cgi/newsplus/1014038577/?raw=.196928&sid=
1618 //GikoSys.ParseURI(Result, Protocol, Host, Path, Document, Port, Bookmark);
1619 Result := 'http://' + FDownloadHost
1620 + '/test/offlaw.cgi/' + ParentBoard.BBSID + '/'
1621 + ChangeFileExt(FileName, '') + '/?raw=.0&sid=' + HttpEncode(SessionID);
1622 // Result := Format('%s://%s%s%s', [Protocol,
1629 function TThreadItem.GetSendURL: string;
1631 Result := GikoSys.UrlToServer(ParentBoard.URL)
1635 procedure TThreadItem.DeleteLogFile;
1637 ParentBoard.BeginUpdate;
1639 DeleteFile(GetThreadFileName);
1640 if FileExists(ChangeFileExt(GetThreadFileName,'.NG')) = true then
1641 DeleteFile(ChangeFileExt(GetThreadFileName,'.NG'));
1642 FRoundDate := ZERO_DATE;
1643 FLastModified := ZERO_DATE;
1645 FIsLogFile := False;
1648 FNewArrival := False;
1652 FDownloadHost := '';
1653 FAgeSage := gasNone;
1659 ParentBoard.EndUpdate;
1660 ParentBoard.Modified := True;
1663 function TThreadItem.GetThreadFileName: string;
1665 if Length( FilePath ) > 0 then
1668 Result := IncludeTrailingPathDelimiter( GikoSys.Setting.LogFolder )
1669 + BBS2CH_LOG_FOLDER + ParentBoard.BBSID + PATH_DELIM + FileName;
1672 procedure TThreadItem.SetLastModified(d: TDateTime);
1674 if FLastModified = d then Exit;
1676 if FUpdate and (ParentBoard <> nil) then
1677 ParentBoard.FModified := True;
1680 {procedure TThreadItem.SetRoundNo(i: Integer);
1682 if FRoundNo = i then Exit;
1684 if FUpdate and (ParentBoard <> nil) then
1685 ParentBoard.FModified := True;
1688 procedure TThreadItem.SetRound(b: Boolean);
1693 RoundList.Delete(Self);
1694 if FRound = b then Exit;
1696 if FUpdate and (ParentBoard <> nil) then
1697 ParentBoard.FModified := True;
1700 procedure TThreadItem.SetRoundName(s: string);
1702 if FRoundName = s then Exit;
1704 if FUpdate and (ParentBoard <> nil) then
1705 ParentBoard.FModified := True;
1708 procedure TThreadItem.SetKokomade(i: Integer);
1710 if FKokomade = i then Exit;
1712 if FUpdate and (ParentBoard <> nil) then
1713 ParentBoard.FModified := True;
1716 procedure TThreadItem.SetUnRead(b: Boolean);
1718 if FUnRead = b then Exit;
1720 if FUpdate and (ParentBoard <> nil) then
1721 ParentBoard.FModified := True;
1724 procedure TThreadItem.SetScrollTop(i: Integer);
1726 if FScrollTop = i then Exit;
1728 if FUpdate and (ParentBoard <> nil) then
1729 ParentBoard.FModified := True;
1732 procedure TThreadItem.BeginUpdate;
1737 procedure TThreadItem.EndUpdate;
1743 BBS2ch := TBBS.Create;
1746 if BBS2ch <> nil then
1748 function TThreadItem.GetCreateDate: TDateTime;
1753 //
\83t
\83@
\83C
\83\8b\96¼
\82©
\82ç
\83X
\83\8c\8dì
\90¬
\93ú
\8e\9e\82ð
\8b\81\82ß
\82é
1755 if ( GikoSys.Setting.CreationTimeLogs ) and not IsLogFile then
1758 //
\83\8d\83O
\83t
\83@
\83C
\83\8b\82Ì
\8ag
\92£
\8eq
\82ð
\82Í
\82¸
\82µ
\82½
\82à
\82Ì
\82ª
\83X
\83\8c\8dì
\90¬
\93ú
\8e\9e
1759 tmp := ChangeFileExt(FFileName, '');
1760 if ( Length(tmp) = 9) and ( tmp[1] = '0' ) then
1761 Insert('1', tmp, 1);
1762 unixtime := StrToInt64(tmp);
1763 Result := UnixToDateTime(unixtime) + OffsetFromUTC;
1764 if GikoSys.Setting.FutureThread then begin
1765 if CompareDateTime(Result, Now) = 1 then
1766 Result := ZERO_DATE;
1772 Result := ZERO_DATE;