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 //
\82Æ
\82è
\82 \82¦
\82¸
\82Q
\82¿
\82á
\82ñ
\82Ë
\82é
\82Ì
\83\8b\81[
\83g
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;
83 function GetCategory(index: integer): TCategory;
84 procedure SetCategory(index: integer; value: TCategory);
85 procedure SetSelectText(s: string);
87 constructor Create(LogFolder: string);
88 destructor Destroy; override;
90 function Add(item: TCategory): integer;
91 procedure Delete(index: integer);
92 procedure Clear; override;
93 function Find(key: string): TCategory;
94 function FindBBSID(BBSID: string): TBoard;
95 function FindBoardFromTitle(Title: string): TBoard;
96 function FindBoardFromURL(inURL: string): TBoard;
97 function FindThreadFromURL( inURL : string ) : TThreadItem;
98 function FindThreadItem(BBSID: string; FileName: string): TThreadItem;
99 function FindCategoryFromTitle( inTitle : string ) : TCategory;
100 function GetLogFolder: string;
102 property Items[index: integer]: TCategory read GetCategory write SetCategory;
103 property Title: string read FTitle write FTitle;
104 property NodeExpand: Boolean read FExpand write FExpand;
106 property KubetsuChk: Boolean read FKubetsuChk write FKubetsuChk;
107 property SelectText: string read FSelectText write SetSelectText;
108 property ShortSelectText: string read FShortSelectText write FShortSelectText;
112 TCategory = class(TList)
119 function GetBoard(index: integer): TBoard;
120 procedure SetBoard(index: integer; value: TBoard);
123 destructor Destroy; override;
125 property No: Integer read FNo write FNo;
126 property Title: string read FTitle write FTitle;
127 property Items[index: integer]: TBoard read GetBoard write SetBoard;
128 property ParenTBBS: TBBS read FParenTBBS write FParenTBBS;
130 function Add(item: TBoard): integer;
131 procedure Delete(index: integer);
132 procedure Clear; override;
133 function FindName(key: string): TBoard;
134 function FindBBSID(BBSID: string): TBoard;
135 function FindBoardFromTitle(Title: string): TBoard;
136 function FindBoardFromURL(inURL: string): TBoard;
137 function FindThreadFromURL( inURL : string ) : TThreadItem;
138 function IsMidoku: Boolean;
140 property NodeExpand: Boolean read FExpand write FExpand;
144 TBoard = class(TList)
146 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é)
148 FNo: Integer; //
\94Ô
\8d\86
149 FTitle: string; //
\83{
\81[
\83h
\83^
\83C
\83g
\83\8b
150 FBBSID: string; //BBSID
151 FURL: string; //
\83{
\81[
\83hURL
152 FRound: Boolean; //
\83X
\83\8c\83b
\83h
\88ê
\97\97\8f\84\89ñ
\97\
\96ñ
153 FRoundName: string; //
\8f\84\89ñ
\96¼
154 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
155 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
156 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
157 FIsThreadDatRead: Boolean; //
\83X
\83\8c\83b
\83h
\83\8a\83X
\83g
\82Í
\93Ç
\82Ý
\8d\9e\82Ü
\82ê
\82Ä
\82¢
\82é
\82©
\81H
158 FUnRead: Integer; //
\83X
\83\8c\83b
\83h
\96¢
\93Ç
\90\94
159 FParentCategory: TCategory; //
\90e
\83J
\83e
\83S
\83\8a
160 FModified: Boolean; //
\8fC
\90³
\83t
\83\89\83O
161 FBoolData: Boolean; //
\82¢
\82ë
\82ñ
\82È
\97p
\93r
\82É
\8eg
\82¤yo
162 FSPID: string; //
\8f\91\82«
\8d\9e\82Ý
\97pSPID
163 FPON: string; //
\8f\91\82«
\8d\9e\82Ý
\97pPON
164 FKotehanName: string; //
\83R
\83e
\83n
\83\93\96¼
\91O
165 FKotehanMail: string; //
\83R
\83e
\83n
\83\93\83\81\81[
\83\8b
170 FBoardPlugIn : TBoardPlugIn; //
\82±
\82Ì
\94Â
\82ð
\83T
\83|
\81[
\83g
\82·
\82é
\83v
\83\89\83O
\83C
\83\93
171 FFilePath : string; //
\82±
\82Ì
\83X
\83\8c\88ê
\97\97\82ª
\95Û
\91¶
\82³
\82ê
\82Ä
\82¢
\82é
\83p
\83X
172 FIsLogFile : Boolean; //
\83\8d\83O
\91¶
\8dÝ
\83t
\83\89\83O
173 FIntData : Integer; //
\8dD
\82«
\82É
\82¢
\82¶
\82Á
\82Ä
\82æ
\82µ
\81B
\82¢
\82ë
\82ñ
\82È
\97p
\93r
\82É
\8eg
\82¤yo
174 FListData : TList; //
\8dD
\82«
\82É
\82¢
\82¶
\82Á
\82Ä
\82æ
\82µ
\81B
\82¢
\82ë
\82ñ
\82È
\97p
\93r
\82É
\8eg
\82¤yo
176 function GetThreadItem(index: integer): TThreadItem;
177 procedure SetThreadItem(index: integer; value: TThreadItem);
178 procedure SetRound(b: Boolean);
179 procedure SetRoundName(s: string);
180 procedure SetLastModified(d: TDateTime);
181 procedure SetLastGetTime(d: TDateTime);
182 procedure SetUnRead(i: Integer);
183 procedure SetKotehanName(s: string);
184 procedure SetKotehanMail(s: string);
187 constructor Create( inPlugIn : TBoardPlugIn; inURL : string );
188 destructor Destroy; override;
190 property Context: DWORD read FContext write FContext;
192 property Items[index: integer]: TThreadItem read GetThreadItem write SetThreadItem;
193 property No: Integer read FNo write FNo;
194 property Title: string read FTitle write FTitle;
195 property BBSID: string read FBBSID write FBBSID;
196 property URL: string read FURL write FURL;
197 property Round: Boolean read FRound write SetRound;
198 property RoundName: string read FRoundName write SetRoundName;
199 property RoundDate: TDateTime read FRoundDate write FRoundDate;
200 property LastModified: TDateTime read FLastModified write SetLastModified;
201 property LastGetTime: TDateTime read FLastGetTime write SetLastGetTime;
202 property UnRead: Integer read FUnRead write SetUnRead;
203 property Modified: Boolean read FModified write FModified;
204 property IsThreadDatRead: Boolean read FIsThreadDatRead write FIsThreadDatRead;
205 property ParentCategory: TCategory read FParentCategory write FParentCategory;
207 property BoardPlugIn : TBoardPlugIn read FBoardPlugIn;
208 property FilePath : string read FFilePath write FFilePath;
209 property IsLogFile : Boolean read FIsLogFile write FIsLogFile;
210 property IntData : Integer read FIntData write FIntData;
211 property ListData : TList read FListData write FListData;
212 function IsBoardPlugInAvailable : Boolean;
214 function Add(item: TThreadItem): integer;
215 procedure Insert(Index: Integer; Item: TThreadItem);
216 procedure Delete(index: integer);
217 procedure DeleteList(index: integer);
218 procedure Clear; override;
219 function Find(ItemFileName: string): TThreadItem;
220 function FindThreadFromURL( inURL : string ) : TThreadItem;
221 function GetIndex(ItemFileName: string): Integer;
222 function GetIndexFromURL(URL: string): Integer;
223 procedure LoadSettings;
224 procedure SaveSettings;
225 function GetReadCgiURL: string;
226 function GetSubjectFileName: string;
227 function GetFolderIndexFileName: string;
228 function GetSendURL: string;
230 function GetNewThreadCount: Integer;
231 function GetLogThreadCount: Integer;
232 function GetUserThreadCount: Integer;
233 function GetNewThread(Index: Integer): TThreadItem;
234 function GetLogThread(Index: Integer): TThreadItem;
235 function GetUserThread(Index: Integer): TThreadItem;
237 procedure BeginUpdate;
239 property NodeExpand: Boolean read FExpand write FExpand;
240 property BoolData: Boolean read FBoolData write FBoolData;
241 property SPID: string read FSPID write FSPID;
242 property PON: string read FPON write FPON;
243 property KotehanName: string read FKotehanName write SetKotehanName;
244 property KotehanMail: string read FKotehanMail write SetKotehanMail;
248 TThreadItem = class(TObject)
250 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é)
252 FNo: Integer; //
\94Ô
\8d\86
253 FFileName: string; //
\83X
\83\8c\83b
\83h
\83t
\83@
\83C
\83\8b\96¼
254 FTitle: string; //
\83X
\83\8c\83b
\83h
\83^
\83C
\83g
\83\8b
255 FShortTitle: string; //
\92Z
\82¢
\83X
\83\8c\83b
\83h
\83^
\83C
\83g
\83\8b\81i
\8c\9f\8dõ
\97p
\81j
256 FRoundDate: TDateTime; //
\83X
\83\8c\83b
\83h
\82ð
\8eæ
\93¾
\82µ
\82½
\93ú
\8e\9e\81i
\8f\84\89ñ
\93ú
\8e\9e\81j
257 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
258 FCount: Integer; //
\83X
\83\8c\83b
\83h
\83J
\83E
\83\93\83g
\81i
\83\8d\81[
\83J
\83\8b\81j
259 FAllResCount: Integer; //
\83X
\83\8c\83b
\83h
\83J
\83E
\83\93\83g
\81i
\83T
\81[
\83o
\81j
260 FNewResCount: Integer; //
\83X
\83\8c\83b
\83h
\90V
\92\85\90\94
261 FSize: Integer; //
\83X
\83\8c\83b
\83h
\83T
\83C
\83Y
262 FRound: Boolean; //
\8f\84\89ñ
\83t
\83\89\83O
263 FRoundName: string; //
\8f\84\89ñ
\96¼
264 FIsLogFile: Boolean; //
\83\8d\83O
\91¶
\8dÝ
\83t
\83\89\83O
265 FParentBoard: TBoard; //
\90e
\83{
\81[
\83h
266 FKokomade: Integer; //
\83R
\83R
\82Ü
\82Å
\93Ç
\82ñ
\82¾
\94Ô
\8d\86
267 FNewReceive: Integer; //
\83R
\83R
\82©
\82ç
\90V
\8bK
\8eó
\90M
268 FNewArrival: Boolean; //
\90V
\92\85
269 FUnRead: Boolean; //
\96¢
\93Ç
\83t
\83\89\83O
270 FScrollTop: Integer; //
\83X
\83N
\83\8d\81[
\83\8b\88Ê
\92u
271 FDownloadHost: string; //
\8d¡
\82Ì
\83z
\83X
\83g
\82Æ
\88á
\82¤
\8fê
\8d\87\82Ì
\83z
\83X
\83g
272 FAgeSage: TGikoAgeSage; //
\83A
\83C
\83e
\83\80\82Ì
\8fã
\82°
\89º
\82°
273 // FSPID: string; //
\8f\91\82«
\8d\9e\82Ý
\97pSPID
277 FURL : string; //
\82±
\82Ì
\83X
\83\8c\82ð
\83u
\83\89\83E
\83U
\82Å
\95\
\8e¦
\82·
\82é
\8dÛ
\82Ì URL
278 FBoardPlugIn : TBoardPlugIn; //
\82±
\82Ì
\83X
\83\8c\82ð
\83T
\83|
\81[
\83g
\82·
\82é
\83v
\83\89\83O
\83C
\83\93
279 FFilePath : string; //
\82±
\82Ì
\83X
\83\8c\82ª
\95Û
\91¶
\82³
\82ê
\82Ä
\82¢
\82é
\83p
\83X
280 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
282 procedure SetLastModified(d: TDateTime);
283 procedure SetRound(b: Boolean);
284 procedure SetRoundName(s: string);
285 procedure SetKokomade(i: Integer);
286 procedure SetUnRead(b: Boolean);
287 procedure SetScrollTop(i: Integer);
289 function GetCreateDate: TDateTime;
291 constructor Create( inPlugIn : TBoardPlugIn; inURL : string );
292 destructor Destroy; override;
294 function GetDatURL: string;
295 function GetDatgzURL: string;
296 // function GetOldDatgzURL: string;
297 function GetOfflawCgiURL(SessionID: string): string;
298 function GetSendURL: string;
299 procedure DeleteLogFile;
300 function GetThreadFileName: string;
301 procedure BeginUpdate;
304 property Context: DWORD read FContext write FContext;
306 property No: Integer read FNo write FNo;
307 property FileName: string read FFileName write FFileName;
308 property Title: string read FTitle write FTitle;
309 property ShortTitle: string read FShortTitle write FShortTitle;
310 property RoundDate: TDateTime read FRoundDate write FRoundDate;
311 property LastModified: TDateTime read FLastModified write SetLastModified;
312 property Count: Integer read FCount write FCount;
313 property AllResCount: Integer read FAllResCount write FAllResCount;
314 property NewResCount: Integer read FNewResCount write FNewResCount;
315 property Size: Integer read FSize write FSize;
316 property Round: Boolean read FRound write SetRound;
317 property RoundName: string read FRoundName write SetRoundName;
319 property IsLogFile: Boolean read FIsLogFile write FIsLogFile;
320 property ParentBoard: TBoard read FParentBoard write FParentBoard;
321 property Kokomade: Integer read FKokomade write SetKokomade;
322 property NewReceive: Integer read FNewReceive write FNewReceive;
323 property NewArrival: Boolean read FNewArrival write FNewArrival;
324 property UnRead: Boolean read FUnRead write SetUnRead;
325 property ScrollTop: Integer read FScrollTop write SetScrollTop;
326 property Expand: Boolean read FExpand write FExpand;
327 property DownloadHost: string read FDownloadHost write FDownloadHost;
328 property AgeSage: TGikoAgeSage read FAgeSage write FAgeSage;
329 // property SPID: string read FSPID write FSPID;
330 property CreateDate: TDateTime read GetCreateDate;
331 property URL : string read FURL write FURL;
332 property BoardPlugIn : TBoardPlugIn read FBoardPlugIn;
333 property FilePath : string read FFilePath write FFilePath;
334 property SizeByte : Integer read FSizeByte write FSizeByte;
335 function IsBoardPlugInAvailable : Boolean;
340 //
\8c\9f\8dõ
\8c\8b\89Ê
\83\8a\83X
\83g
341 { TSearchList = class(TList)
343 function GetThreadItem(index: integer): TThreadItem;
344 procedure SetThreadItem(index: integer; value: TThreadItem);
347 destructor Destroy; override;
349 property Items[index: integer]: TThreadItem read GetThreadItem write SetThreadItem;
351 function Add(item: TThreadItem): integer;
352 procedure Delete(index: integer);
353 procedure Clear; override;
356 function BBSsFindBoardFromBBSID( inBBSID : string ) : TBoard;
357 function BBSsFindBoardFromURL( inURL : string ) : TBoard;
358 function BBSsFindBoardFromTitle( inTitle : string ) : TBoard;
359 function BBSsFindThreadFromURL( inURL : string ) : TThreadItem;
360 function ConvertDateTimeString( inDateTimeString : string) : string;
363 BBSs : array of TBBS;
368 GikoSystem, RoundData;
371 BBS2CH_NAME: string = '
\82Q
\82¿
\82á
\82ñ
\82Ë
\82é';
372 BBS2CH_LOG_FOLDER: string = '2ch';
373 EXTERNAL_LOG_FOLDER: string = 'exboard';
375 FOLDER_INI_FILENAME: string = 'Folder.ini';
376 FOLDER_INDEX_FILENAME: string = 'Folder.idx';
377 SUBJECT_FILENAME: string = 'subject.txt';
378 PATH_DELIM: string = '\';
379 //DEFAULT_LIST_COUNT: Integer = 100;
381 // COLUMN_CATEGORY: array[0..0] of string = ('
\83J
\83e
\83S
\83\8a\96¼');
382 // 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');
383 // 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');
385 function BBSsFindBoardFromBBSID(
392 for i := Length( BBSs ) - 1 downto 0 do begin
393 Result := BBSs[ i ].FindBBSID( inBBSID );
394 if Result <> nil then
402 function BBSsFindBoardFromURL(
409 for i := Length( BBSs ) - 1 downto 0 do begin
410 Result := BBSs[ i ].FindBoardFromURL( inURL );
411 if Result <> nil then
419 function BBSsFindBoardFromTitle(
426 for i := Length( BBSs ) - 1 downto 0 do begin
427 Result := BBSs[ i ].FindBoardFromTitle( inTitle );
428 if Result <> nil then
436 function BBSsFindThreadFromURL(
444 boardURL := GikoSys.GetThreadURL2BoardURL( inURL );
445 board := BBSsFindBoardFromURL( boardURL );
449 Result := board.FindThreadFromURL( inURL );
453 (*************************************************************************
454 *
\8b@
\94\
\96¼
\81FTBBS
\83R
\83\93\83X
\83g
\83\89\83N
\83^
456 *************************************************************************)
457 constructor TBBS.Create(LogFolder: string);
460 Title := BBS2CH_NAME;
461 FLogFolder := LogFolder;
464 (*************************************************************************
465 *
\8b@
\94\
\96¼
\81FTBBS
\83f
\83X
\83g
\83\89\83N
\83^
467 *************************************************************************)
468 destructor TBBS.Destroy;
474 (*************************************************************************
477 *************************************************************************)
478 function TBBS.GetCategory(index: integer): TCategory;
480 Result := TCategory(inherited Items[index]);
483 procedure TBBS.SetCategory(index: integer; value: TCategory);
485 inherited Items[index] := value;
488 function TBBS.Add(item: TCategory): integer;
490 Item.ParenTBBS := self;
491 Result := inherited Add(item);
494 procedure TBBS.Delete(index: integer);
496 if Items[index] <> nil then
497 TCategory(Items[index]).Free;
499 inherited Delete(index);
502 procedure TBBS.Clear;
506 for i := Count - 1 downto 0 do
510 function TBBS.Find(key: string): TCategory;
515 function TBBS.FindBBSID(BBSID: string): TBoard;
519 for i := Count - 1 downto 0 do begin
520 Result := Items[ i ].FindBBSID(BBSID);
521 if Result <> nil then
527 //*************************************************************************
528 //
\83^
\83C
\83g
\83\8b\82Ì
\88ê
\92v
\82·
\82é
\94Â
\82ð
\92T
\82·
529 //*************************************************************************)
530 function TBBS.FindBoardFromTitle(Title: string): TBoard;
534 for i := Count - 1 downto 0 do begin
535 Result := Items[ i ].FindBoardFromTitle(Title);
536 if Result <> nil then
542 //*************************************************************************
543 // URL
\82ð
\8eó
\82¯
\95t
\82¯
\82é
\94Â
\82ð
\92T
\82·
544 //*************************************************************************)
545 function TBBS.FindBoardFromURL(inURL: string): TBoard;
549 for i := Count - 1 downto 0 do begin
550 Result := Items[ i ].FindBoardFromURL( inURL );
551 if Result <> nil then
557 //*************************************************************************
558 // URL
\82ð
\8eó
\82¯
\95t
\82¯
\82é
\83X
\83\8c\83b
\83h
\82ð
\92T
\82·
559 //*************************************************************************)
560 function TBBS.FindThreadFromURL(inURL: string): TThreadItem;
566 boardURL := GikoSys.GetThreadURL2BoardURL( inURL );
567 board := FindBoardFromURL( boardURL );
571 Result := board.FindThreadFromURL( inURL );
575 function TBBS.FindThreadItem(BBSID: string; FileName: string): TThreadItem;
580 Board := FindBBSID(BBSID);
583 Result := Board.Find(FileName);
586 function TBBS.FindCategoryFromTitle( inTitle : string ) : TCategory;
591 for i := Count - 1 downto 0 do begin
592 if AnsiCompareStr(Items[ i ].Title, inTitle) = 0 then begin
593 Result := Items[ i ];
602 (*************************************************************************
603 *
\83\8d\83O
\83t
\83H
\83\8b\83_
\8eæ
\93¾
605 *************************************************************************)
606 function TBBS.GetLogFolder: string;
608 Result := IncludeTrailingPathDelimiter(FLogFolder)
609 + BBS2CH_LOG_FOLDER + PATH_DELIM;
612 procedure TBBS.SetSelectText(s: string);
615 ShortSelectText := GikoSys.ZenToHan(s);
618 {class function TBBS.GetColumnName(Index: Integer): string;
620 Result := COLUMN_CATEGORY[Index];
623 class function TBBS.GetColumnCount: Integer;
625 Result := Length(COLUMN_CATEGORY);
628 //===================
630 //===================
631 constructor TCategory.Create;
636 destructor TCategory.Destroy;
642 function TCategory.GetBoard(index: integer): TBoard;
644 Result := TBoard(inherited Items[index]);
647 procedure TCategory.SetBoard(index: integer; value: TBoard);
649 inherited Items[index] := value;
652 function TCategory.Add(item: TBoard): integer;
654 Item.ParentCategory := self;
655 Result := inherited Add(item);
658 procedure TCategory.Delete(index: integer);
660 if Items[index] <> nil then
661 TBoard(Items[index]).Free;
663 inherited Delete(index);
666 procedure TCategory.Clear;
670 for i := Count - 1 downto 0 do
674 function TCategory.FindName(key: string): TBoard;
679 function TCategory.FindBBSID(BBSID: string): TBoard;
683 for i := Count - 1 downto 0 do begin
684 if AnsiCompareStr(Items[i].FBBSID, BBSID) = 0 then begin
692 //*************************************************************************
693 //
\83^
\83C
\83g
\83\8b\82Ì
\88ê
\92v
\82·
\82é
\94Â
\82ð
\92T
\82·
694 //*************************************************************************)
695 function TCategory.FindBoardFromTitle(Title: string): TBoard;
699 for i := Count - 1 downto 0 do begin
700 if AnsiCompareStr(Items[i].FTitle, Title) = 0 then begin
708 //*************************************************************************
709 // URL
\82ð
\8eó
\82¯
\95t
\82¯
\82é
\94Â
\82ð
\92T
\82·
710 //*************************************************************************)
711 function TCategory.FindBoardFromURL(inURL: string): TBoard;
715 for i := Count - 1 downto 0 do begin
716 if Pos( Items[i].URL, inURL ) = 1 then begin
724 //*************************************************************************
725 // URL
\82ð
\8eó
\82¯
\95t
\82¯
\82é
\83X
\83\8c\83b
\83h
\82ð
\92T
\82·
726 //*************************************************************************)
727 function TCategory.FindThreadFromURL(inURL: string): TThreadItem;
733 boardURL := GikoSys.GetThreadURL2BoardURL( inURL );
734 board := FindBoardFromURL( boardURL );
738 Result := board.FindThreadFromURL( inURL );
742 function TCategory.IsMidoku: Boolean;
748 for i := 0 to Count - 1 do begin
749 if Items[i] <> nil then begin
750 for j := 0 to Items[i].Count - 1 do begin
751 if Items[i].Items[j] <> nil then begin
752 // if (Items[i].Items[j].IsLogFile) and (Items[i].Items[j].Count > Items[i].Items[j].Kokomade) then begin
753 if (Items[i].Items[j].IsLogFile) and (Items[i].Items[j].UnRead) then begin
763 {class function TCategory.GetColumnName(Index: Integer): string;
765 Result := COLUMN_BOARD[Index];
768 class function TCategory.GetColumnCount: Integer;
770 Result := Length(COLUMN_BOARD);
773 //===================
775 //===================
776 procedure TBoard.Init;
783 FRoundDate := ZERO_DATE;
784 FLastModified := ZERO_DATE;
785 FLastGetTime := ZERO_DATE;
786 FIsThreadDatRead := False;
788 // FListStyle := vsReport;
789 // FItemNoVisible := True;
794 // *************************************************************************
795 //
\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^
796 // *************************************************************************
797 constructor TBoard.Create(
798 inPlugIn : TBoardPlugIn;
802 protocol, host, path, document, port, bookmark : string;
808 FBoardPlugIn := inPlugIn;
810 BBSID := GikoSys.UrlToID( inURL );
812 if inPlugIn = nil then begin
813 // subject.txt
\82Ì
\95Û
\91¶
\83p
\83X
\82ð
\90Ý
\92è
814 GikoSys.ParseURI( inURL, protocol, host, path, document, port, bookmark );
815 if GikoSys.Is2chHost( host ) then
817 IncludeTrailingPathDelimiter( GikoSys.Setting.LogFolder ) +
818 BBS2CH_LOG_FOLDER + PATH_DELIM + BBSID + PATH_DELIM + SUBJECT_FILENAME
821 IncludeTrailingPathDelimiter( GikoSys.Setting.LogFolder ) +
822 EXTERNAL_LOG_FOLDER + PATH_DELIM + host + PATH_DELIM + BBSID + PATH_DELIM + SUBJECT_FILENAME
824 //
\83v
\83\89\83O
\83C
\83\93\82É TBoardItem
\82ª
\8dì
\90¬
\82³
\82ê
\82½
\82±
\82Æ
\82ð
\93`
\82¦
\82é
825 inPlugIn.CreateBoardItem( DWORD( Self ) );
830 // *************************************************************************
831 //
\83f
\83X
\83g
\83\89\83N
\83^
832 // *************************************************************************
833 destructor TBoard.Destroy;
835 if FModified then begin
836 GikoSys.WriteThreadDat(Self);
840 //
\83v
\83\89\83O
\83C
\83\93\82É TBoardItem
\82ª
\94j
\8aü
\82³
\82ê
\82½
\82±
\82Æ
\82ð
\93`
\82¦
\82é
841 if IsBoardPlugInAvailable then
842 BoardPlugIn.DisposeBoardItem( DWORD( Self ) );
848 // *************************************************************************
849 //
\8aO
\95\94\94Â
\83v
\83\89\83O
\83C
\83\93\82ª
\8eg
\97p
\89Â
\94\
\82©
850 // *************************************************************************
851 function TBoard.IsBoardPlugInAvailable : Boolean;
855 if BoardPlugIn = nil then
858 if not Assigned( Pointer( BoardPlugIn.Module ) ) then
869 function TBoard.GetThreadItem(index: integer): TThreadItem;
871 Result := TThreadItem(inherited Items[index]);
874 procedure TBoard.SetThreadItem(index: integer; value: TThreadItem);
876 inherited Items[index] := value;
879 function TBoard.Add(Item: TThreadItem): Integer;
881 Item.ParentBoard := Self;
882 Result := inherited Add(Item);
885 procedure TBoard.Insert(Index: Integer; Item: TThreadItem);
887 Item.ParentBoard := Self;
888 inherited Insert(Index, Item);
891 //Index
\82Å
\8ew
\92è
\82³
\82ê
\82½
\83X
\83\8c\83b
\83h
\83I
\83u
\83W
\83F
\83N
\83g
\82ð
\94j
\8aü
892 procedure TBoard.Delete(index: Integer);
894 if Items[index] <> nil then
895 TThreadItem(Items[index]).Free;
897 inherited Delete(index);
900 //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
901 procedure TBoard.DeleteList(index: integer);
903 inherited Delete(index);
906 procedure TBoard.Clear;
911 for i := Count - 1 downto 0 do
915 function TBoard.Find(ItemFileName: string): TThreadItem;
920 for i := 0 to Count - 1 do begin
921 if AnsiCompareStr(Items[i].FileName, ItemFileName) = 0 then begin
928 function TBoard.GetIndex(ItemFileName: string): Integer;
933 for i := 0 to Count - 1 do begin
934 if Items[i].FileName = ItemFileName then begin
941 function TBoard.GetIndexFromURL(URL: string): Integer;
946 for i := 0 to Count - 1 do begin
947 if Pos( URL, Items[ i ].URL ) = 1 then begin
954 function TBoard.FindThreadFromURL( inURL : string ) : TThreadItem;
959 if not IsThreadDatRead then
960 GikoSys.ReadSubjectFile( Self );
962 for i := Count - 1 downto 0 do begin
963 if Pos( inURL, Items[ i ].URL ) = 1 then begin
964 Result := Items[ i ];
972 {function TBoard.GetMidokuCount: Integer;
977 for i := 0 to Count- 1 do begin
978 if Items[i] <> nil then begin
979 if (Items[i].IsLogFile) and (Items[i].Count > Items[i].Kokomade) then
986 procedure TBoard.LoadSettings;
992 if Length( FilePath ) > 0 then
993 FileName := ExtractFilePath( FilePath ) + FOLDER_INI_FILENAME
995 FileName := ParentCategory.ParenTBBS.GetLogFolder
996 + BBSID + PATH_DELIM + FOLDER_INI_FILENAME;
998 if not FileExists(FileName) then
1000 ini := TMemIniFile.Create(FileName);
1002 // Round := ini.ReadBool('Status', 'Round', False);
1003 tmp := ini.ReadString('Status', 'RoundDate', DateTimeToStr(ZERO_DATE));
1004 FRoundDate := StrToDateTime(ConvertDateTimeString(tmp));
1005 tmp := ini.ReadString('Status', 'LastModified', DateTimeToStr(ZERO_DATE));
1006 FLastModified := StrToDateTime(ConvertDateTimeString(tmp));
1007 tmp := ini.ReadString('Status', 'LastGetTime', DateTimeToStr(ZERO_DATE));
1008 FLastGetTime := StrToDateTime(ConvertDateTimeString(tmp));
1012 FRoundDate := ini.ReadDateTime('Status', 'RoundDate', ZERO_DATE);
1014 tmp := ini.ReadString('Status', 'RoundDate', DateTimeToStr(ZERO_DATE));
1015 FRoundDate := StrToDateTime(ConvertDateTimeString(tmp));
1018 FLastModified := ini.ReadDateTime('Status', 'LastModified', ZERO_DATE);
1020 tmp := ini.ReadString('Status', 'LastModified', DateTimeToStr(ZERO_DATE));
1021 FLastModified := StrToDateTime(ConvertDateTimeString(tmp));
1024 FLastGetTime := ini.ReadDateTime('Status', 'LastGetTime', ZERO_DATE);
1026 tmp := ini.ReadString('Status', 'LastGetTime', DateTimeToStr(ZERO_DATE));
1027 FLastGetTime := StrToDateTime(ConvertDateTimeString(tmp));
1030 FUnRead := ini.ReadInteger('Status', 'UnRead', 0);
1031 FSPID := ini.ReadString('Cookie', 'SPID', '');
1032 FPON := ini.ReadString('Cookie', 'PON', '');
1033 FKotehanName := ini.ReadString('Kotehan', 'Name', '');
1034 FKotehanMail := ini.ReadString('Kotehan', 'Mail', '');
1035 // ListStyle := TViewStyle(Ord(ini.ReadInteger('Status', 'ListStyle', 3)));
1036 // ItemNoVisible := ini.ReadBool('Status', 'ItemNoVisible', True);
1037 // ViewType := TGikoViewType(Ord(ini.ReadInteger('Status', 'ViewType', 0)));
1045 procedure TBoard.SaveSettings;
1050 if Length( FilePath ) > 0 then
1051 FileName := ExtractFilePath( FilePath )
1053 FileName := ParentCategory.ParenTBBS.GetLogFolder
1054 + BBSID + PATH_DELIM;
1055 if not GikoSys.DirectoryExistsEx(FileName) then
1056 GikoSys.ForceDirectoriesEx(FileName);
1057 FileName := FileName + FOLDER_INI_FILENAME;
1058 ini := TMemIniFile.Create(FileName);
1062 // ini.WriteBool('Status', 'Round', Round);
1063 ini.WriteDateTime('Status', 'RoundDate', FRoundDate);
1064 ini.WriteDateTime('Status', 'LastModified', FLastModified);
1065 ini.WriteDateTime('Status', 'LastGetTime', FLastGetTime);
1066 ini.WriteInteger('Status', 'UnRead', FUnRead);
1067 ini.WriteString('Cookie', 'SPID', FSPID);
1068 ini.WriteString('Cookie', 'PON', FPON);
1069 ini.WriteString('Kotehan', 'Name', FKotehanName);
1070 ini.WriteString('Kotehan', 'Mail', FKotehanMail);
1071 // ini.WriteInteger('Status', 'ListStyle', Ord(ListStyle));
1072 // ini.WriteBool('Status', 'ItemNoVisible', ItemNoVisible);
1073 // ini.WriteInteger('Status', 'ViewType', Ord(ViewType));
1079 //
\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ð
1080 // 2003/02/08 0:32:13
\82É
\95Ï
\8a·
\82·
\82é
1081 function ConvertDateTimeString( inDateTimeString : string) : string;
1085 if ( AnsiPos('/', inDateTimeString ) = 0 ) and
1086 ( AnsiCompareStr( DateTimeToStr(ZERO_DATE), inDateTimeString) <> 0 ) then begin
1087 for i := 0 to 1 do begin
1088 Insert('/',inDateTimeString, AnsiPos(' ', inDateTimeString) + 1 );
1089 Delete(inDateTimeString, AnsiPos(' ', inDateTimeString), 1);
1092 Result := inDateTimeString;
1094 //
\83T
\83u
\83W
\83F
\83N
\83gURL
\8eæ
\93¾
1095 function TBoard.GetReadCgiURL: string;
1097 //Result := URL + SUBJECT_FILENAME;
1098 //Result := GikoSys.UrlToServer(URL)
1099 // + 'test/read.cgi/' + BBSID + '/?raw=0.0';
1100 Result := URL + SUBJECT_FILENAME;
1104 //
\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
1105 function TBoard.GetSubjectFileName: string;
1107 if Length( FilePath ) > 0 then
1110 Result := ParentCategory.ParenTBBS.GetLogFolder
1111 + BBSID + PATH_DELIM + SUBJECT_FILENAME;
1114 //
\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
1115 function TBoard.GetFolderIndexFileName: string;
1117 if Length( FilePath ) > 0 then
1118 Result := ExtractFilePath( FilePath ) + FOLDER_INDEX_FILENAME
1120 Result := ParentCategory.ParenTBBS.GetLogFolder
1121 + BBSID + PATH_DELIM + FOLDER_INDEX_FILENAME;
1124 //
\83X
\83\8c\97§
\82Ä
\91\97\90MURL
1125 function TBoard.GetSendURL: string;
1127 Result := GikoSys.UrlToServer(URL) + 'test/subbbs.cgi';
1130 procedure TBoard.SetRound(b: Boolean);
1135 RoundList.Delete(Self);
1136 if FRound = b then Exit;
1142 procedure TBoard.SetRoundName(s: string);
1144 if FRoundName = s then Exit;
1150 procedure TBoard.SetLastModified(d: TDateTime);
1152 if FLastModified = d then Exit;
1158 procedure TBoard.SetLastGetTime(d: TDateTime);
1160 if FLastGetTime = d then Exit;
1166 procedure TBoard.SetUnRead(i: Integer);
1168 if FUnRead = i then Exit;
1169 if i < 0 then i := 0;
1175 procedure TBoard.SetKotehanName(s: string);
1177 if FKotehanName = s then Exit;
1183 procedure TBoard.SetKotehanMail(s: string);
1185 if FKotehanMail = s then Exit;
1191 function TBoard.GetNewThreadCount: Integer;
1196 if Length( ParentCategory.ParenTBBS.ShortSelectText ) = 0 then
1198 for i := 0 to Count - 1 do begin
1199 if Items[i].NewArrival then
1203 for i := 0 to Count - 1 do begin
1204 if Items[i].NewArrival then
1206 if Items[i].ShortTitle = '' then
1207 Items[i].ShortTitle := GikoSys.ZenToHan(Items[i].Title);
1208 if AnsiPos(ParentCategory.ParenTBBS.ShortSelectText, Items[i].ShortTitle) <> 0 then
1215 function TBoard.GetLogThreadCount: Integer;
1220 if Length( ParentCategory.ParenTBBS.ShortSelectText ) = 0 then
1222 for i := 0 to Count - 1 do begin
1223 if Items[i].IsLogFile then
1227 for i := 0 to Count - 1 do begin
1228 if Items[i].IsLogFile then
1230 if Items[i].ShortTitle = '' then
1231 Items[i].ShortTitle := GikoSys.ZenToHan(Items[i].Title);
1232 if AnsiPos(ParentCategory.ParenTBBS.ShortSelectText, Items[i].ShortTitle) <> 0 then
1239 function TBoard.GetUserThreadCount: Integer;
1244 if Length( ParentCategory.ParenTBBS.ShortSelectText ) = 0 then
1247 for i := 0 to Count - 1 do begin
1248 if Items[i].ShortTitle = '' then
1249 Items[i].ShortTitle := GikoSys.ZenToHan(Items[i].Title);
1250 if AnsiPos(ParentCategory.ParenTBBS.ShortSelectText, Items[i].ShortTitle) <> 0 then
1255 function TBoard.GetNewThread(Index: Integer): TThreadItem;
1262 if Length( ParentCategory.ParenTBBS.ShortSelectText ) = 0 then
1264 for i := 0 to Count - 1 do begin
1265 if Items[i].NewArrival then
1267 if Index = Cnt then begin
1275 for i := 0 to Count - 1 do begin
1276 if Items[i].NewArrival then
1278 if Items[i].ShortTitle = '' then
1279 Items[i].ShortTitle := GikoSys.ZenToHan(Items[i].Title);
1280 if AnsiPos(ParentCategory.ParenTBBS.ShortSelectText, Items[i].ShortTitle) <> 0 then begin
1281 if Index = Cnt then begin
1292 function TBoard.GetLogThread(Index: Integer): TThreadItem;
1298 if Length( ParentCategory.ParenTBBS.ShortSelectText ) = 0 then
1300 for i := 0 to Count - 1 do begin
1301 if Items[i].IsLogFile then
1303 if Index = Cnt then begin
1311 for i := 0 to Count - 1 do begin
1312 if Items[i].IsLogFile then
1314 if Items[i].ShortTitle = '' then
1315 Items[i].ShortTitle := GikoSys.ZenToHan(Items[i].Title);
1316 if AnsiPos(ParentCategory.ParenTBBS.ShortSelectText, Items[i].ShortTitle) <> 0 then begin
1317 if Index = Cnt then begin
1329 function TBoard.GetUserThread(Index: Integer): TThreadItem;
1336 if Length( ParentCategory.ParenTBBS.ShortSelectText ) = 0 then
1338 for i := 0 to Count - 1 do begin
1341 Result := Items[ i ];
1347 for i := 0 to Count - 1 do begin
1348 if Items[i].ShortTitle = '' then
1349 Items[i].ShortTitle := GikoSys.ZenToHan(Items[i].Title);
1350 if AnsiPos(ParentCategory.ParenTBBS.ShortSelectText, Items[i].ShortTitle) <> 0 then begin
1351 if Index = Cnt then begin
1361 procedure TBoard.BeginUpdate;
1366 procedure TBoard.EndUpdate;
1371 {class function TBoard.GetColumnName(Index: Integer): string;
1373 Result := COLUMN_THREADITEM[Index];
1376 class function TBoard.GetColumnCount: Integer;
1378 Result := Length(COLUMN_THREADITEM);
1381 //constructor TThreadItem.Create(AOwner: TComponent);
1382 procedure TThreadItem.Init;
1387 FRoundDate := ZERO_DATE;
1388 FLastModified := ZERO_DATE;
1394 FIsLogFile := False;
1395 FParentBoard := nil;
1398 FNewArrival := False;
1402 FBoardPlugIn := nil;
1405 // *************************************************************************
1406 //
\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^
1407 // *************************************************************************
1408 constructor TThreadItem.Create(
1409 inPlugIn : TBoardPlugIn;
1414 protocol, host, path, document, port, bookmark : string;
1415 BBSID, BBSKey : string;
1417 READ_PATH = '/test/read.cgi';
1423 FBoardPlugIn := inPlugIn;
1426 if inPlugIn = nil then begin
1427 foundPos := Pos( READ_PATH, inURL );
1428 if foundPos > 0 then begin
1429 // dat
\82Ì
\95Û
\91¶
\83p
\83X
\82ð
\90Ý
\92è
1430 GikoSys.ParseURI( inURL, protocol, host, path, document, port, bookmark );
1431 GikoSys.Parse2chURL( inURL, path, document, BBSID, BBSKey );
1432 if GikoSys.Is2chHost( host ) then
1434 IncludeTrailingPathDelimiter( GikoSys.Setting.LogFolder ) +
1435 BBS2CH_LOG_FOLDER + PATH_DELIM + BBSID + PATH_DELIM + BBSKey + '.dat'
1438 IncludeTrailingPathDelimiter( GikoSys.Setting.LogFolder ) +
1439 EXTERNAL_LOG_FOLDER + PATH_DELIM + host + PATH_DELIM + BBSID + PATH_DELIM + BBSKey + '.dat';
1440 FileName := BBSKey + '.dat';
1441 IsLogFile := FileExists( FilePath );
1442 URL := GikoSys.Get2chBrowsableThreadURL( inURL );
1445 //
\83v
\83\89\83O
\83C
\83\93\82É TThreadItem
\82ª
\8dì
\90¬
\82³
\82ê
\82½
\82±
\82Æ
\82ð
\93`
\82¦
\82é
1446 inPlugIn.CreateThreadItem( DWORD( Self ) );
1451 // *************************************************************************
1452 //
\83f
\83X
\83g
\83\89\83N
\83^
1453 // *************************************************************************
1454 destructor TThreadItem.Destroy;
1457 //
\83v
\83\89\83O
\83C
\83\93\82É TThreadItem
\82ª
\94j
\8aü
\82³
\82ê
\82½
\82±
\82Æ
\82ð
\93`
\82¦
\82é
1458 if IsBoardPlugInAvailable then
1459 FBoardPlugIn.DisposeThreadItem( DWORD( Self ) );
1465 // *************************************************************************
1466 //
\8aO
\95\94\94Â
\83v
\83\89\83O
\83C
\83\93\82ª
\8eg
\97p
\89Â
\94\
\82©
1467 // *************************************************************************
1468 function TThreadItem.IsBoardPlugInAvailable : Boolean;
1472 if BoardPlugIn = nil then
1475 if not Assigned( Pointer( BoardPlugIn.Module ) ) then
1486 function TThreadItem.GetDatURL: string;
1488 Protocol, Host, Path, Document, Port, Bookmark: string;
1490 Result := ParentBoard.URL
1493 if FDownloadHost <> '' then begin
1494 GikoSys.ParseURI(Result, Protocol, Host, Path, Document, Port, Bookmark);
1495 Result := Format('%s://%s%s%s', [Protocol,
1500 // Result := GikoSys.UrlToServer(ParentBoard.URL)
1501 // + 'test/read.cgi/' + ParentBoard.BBSID + '/'
1502 // + ChangeFileExt(FileName, '') + '/?raw='
1503 // + IntToStr(ResNum) + '.' + IntToStr(ResSize);
1506 function TThreadItem.GetDatgzURL: string;
1507 function isOldKako(s: string): Boolean;
1510 if AnsiPos('piza.', s) <> 0 then
1512 else if AnsiPos('www.bbspink.', s) <> 0 then
1514 else if AnsiPos('tako.', s) <> 0 then
1518 Protocol, Host, Path, Document, Port, Bookmark: string;
1521 if FDownloadHost = '' then begin
1522 DatNo := ChangeFileExt(FileName, '');
1523 if isOldKako(ParentBoard.URL) then begin
1524 Result := Format('%s%s/%.3s/%s.dat', [ParentBoard.URL, 'kako', DatNo, DatNo]);
1526 if Length(DatNo) > 9 then begin
1527 //http://xxx.2ch.net/xxx/kako/9999/99999/999999999.dat.gz
1528 Result := Format('%s%s/%.4s/%.5s/%s.dat.gz', [ParentBoard.URL, 'kako', DatNo, DatNo, DatNo]);
1530 //http://xxx.2ch.net/xxx/kako/999/999999999.dat.gz
1531 Result := Format('%s%s/%.3s/%s.dat.gz', [ParentBoard.URL, 'kako', DatNo, DatNo]);
1535 Gikosys.ParseURI(Result, Protocol, Host, Path, Document, Port, Bookmark);
1536 DatNo := ChangeFileExt(Document, '');
1537 if isOldKako(DownloadHost) then begin
1538 Result := Format('%s://%s/%s/kako/%.3s/%s.dat', [Protocol, DownloadHost, ParentBoard.FBBSID, DatNo, DatNo]);
1540 if Length(DatNo) > 9 then begin
1541 Result := Format('%s://%s/%s/kako/%.4s/%.5s/%s.dat.gz', [Protocol, DownloadHost, ParentBoard.FBBSID, DatNo, DatNo, DatNo]);
1543 Result := Format('%s://%s/%s/kako/%.3s/%s.dat.gz', [Protocol, DownloadHost, ParentBoard.FBBSID, DatNo, DatNo]);
1549 {function TThreadItem.GetOldDatgzURL: string;
1551 Protocol, Host, Path, Document, Port, Bookmark: string;
1553 Result := Format('%s%s/%.3s/%s.gz', [ParentBoard.URL,
1557 if FDownloadHost <> '' then begin
1558 ParseURI(Result, Protocol, Host, Path, Document, Port, Bookmark);
1559 Result := Format('%s://%s%s%s', [Protocol,
1567 function TThreadItem.GetOfflawCgiURL(SessionID: string): string;
1569 // Protocol, Host, Path, Document, Port, Bookmark: string;
1571 // Result := GikoSys.UrlToServer(ParentBoard.URL)
1572 // + 'test/offlaw.cgi/' + ParentBoard.BBSID + '/'
1573 // + ChangeFileExt(FileName, '') + '/?raw=.0&sid=' + HttpEncode(SessionID);
1574 if FDownloadHost = '' then begin
1575 Result := GikoSys.UrlToServer(ParentBoard.URL)
1576 + 'test/offlaw.cgi/' + ParentBoard.BBSID + '/'
1577 + ChangeFileExt(FileName, '') + '/?raw=.0&sid=' + HttpEncode(SessionID);
1579 //http://news.2ch.net/test/offlaw.cgi/newsplus/1014038577/?raw=.196928&sid=
1580 //GikoSys.ParseURI(Result, Protocol, Host, Path, Document, Port, Bookmark);
1581 Result := 'http://' + FDownloadHost
1582 + '/test/offlaw.cgi/' + ParentBoard.BBSID + '/'
1583 + ChangeFileExt(FileName, '') + '/?raw=.0&sid=' + HttpEncode(SessionID);
1584 // Result := Format('%s://%s%s%s', [Protocol,
1591 function TThreadItem.GetSendURL: string;
1593 Result := GikoSys.UrlToServer(ParentBoard.URL)
1597 procedure TThreadItem.DeleteLogFile;
1599 ParentBoard.BeginUpdate;
1601 DeleteFile(GetThreadFileName);
1602 if FileExists(ChangeFileExt(GetThreadFileName,'.NG')) = true then
1603 DeleteFile(ChangeFileExt(GetThreadFileName,'.NG'));
1604 FRoundDate := ZERO_DATE;
1605 FLastModified := ZERO_DATE;
1607 FIsLogFile := False;
1610 FNewArrival := False;
1614 FDownloadHost := '';
1615 FAgeSage := gasNone;
1621 ParentBoard.EndUpdate;
1622 ParentBoard.Modified := True;
1625 function TThreadItem.GetThreadFileName: string;
1627 if Length( FilePath ) > 0 then
1630 Result := ParentBoard.ParentCategory.ParenTBBS.GetLogFolder
1631 + ParentBoard.BBSID + PATH_DELIM + FileName;
1634 procedure TThreadItem.SetLastModified(d: TDateTime);
1636 if FLastModified = d then Exit;
1638 if FUpdate and (ParentBoard <> nil) then
1639 ParentBoard.FModified := True;
1642 {procedure TThreadItem.SetRoundNo(i: Integer);
1644 if FRoundNo = i then Exit;
1646 if FUpdate and (ParentBoard <> nil) then
1647 ParentBoard.FModified := True;
1650 procedure TThreadItem.SetRound(b: Boolean);
1655 RoundList.Delete(Self);
1656 if FRound = b then Exit;
1658 if FUpdate and (ParentBoard <> nil) then
1659 ParentBoard.FModified := True;
1662 procedure TThreadItem.SetRoundName(s: string);
1664 if FRoundName = s then Exit;
1666 if FUpdate and (ParentBoard <> nil) then
1667 ParentBoard.FModified := True;
1670 procedure TThreadItem.SetKokomade(i: Integer);
1672 if FKokomade = i then Exit;
1674 if FUpdate and (ParentBoard <> nil) then
1675 ParentBoard.FModified := True;
1678 procedure TThreadItem.SetUnRead(b: Boolean);
1680 if FUnRead = b then Exit;
1682 if FUpdate and (ParentBoard <> nil) then
1683 ParentBoard.FModified := True;
1686 procedure TThreadItem.SetScrollTop(i: Integer);
1688 if FScrollTop = i then Exit;
1690 if FUpdate and (ParentBoard <> nil) then
1691 ParentBoard.FModified := True;
1694 procedure TThreadItem.BeginUpdate;
1699 procedure TThreadItem.EndUpdate;
1705 BBS2ch := TBBS.Create;
1708 if BBS2ch <> nil then
1710 function TThreadItem.GetCreateDate: TDateTime;
1714 //
\83t
\83@
\83C
\83\8b\96¼
\82©
\82ç
\83X
\83\8c\8dì
\90¬
\93ú
\8e\9e\82ð
\8b\81\82ß
\82é
1716 //
\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
1717 unixtime := StrToInt(ChangeFileExt(FFileName, ''));
1718 if ( unixtime < 900000000 ) then
1719 unixtime := unixtime + 1000000000; // 2001
\94N
\96â
\91è
\89ñ
\94ð
1720 Result := UnixToDateTime(unixtime) + OffsetFromUTC;
1723 Result := ZERO_DATE;