6 Windows, SysUtils, Classes, ComCtrls, IniFiles, {HTTPApp,} YofUtils, IdGlobal,
7 ExternalBoardManager, ExternalBoardPlugInMain;
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 GetLogFolder: string;
101 property Items[index: integer]: TCategory read GetCategory write SetCategory;
102 property Title: string read FTitle write FTitle;
103 property NodeExpand: Boolean read FExpand write FExpand;
105 property KubetsuChk: Boolean read FKubetsuChk write FKubetsuChk;
106 property SelectText: string read FSelectText write SetSelectText;
107 property ShortSelectText: string read FShortSelectText write FShortSelectText;
111 TCategory = class(TList)
118 function GetBoard(index: integer): TBoard;
119 procedure SetBoard(index: integer; value: TBoard);
122 destructor Destroy; override;
124 property No: Integer read FNo write FNo;
125 property Title: string read FTitle write FTitle;
126 property Items[index: integer]: TBoard read GetBoard write SetBoard;
127 property ParenTBBS: TBBS read FParenTBBS write FParenTBBS;
129 function Add(item: TBoard): integer;
130 procedure Delete(index: integer);
131 procedure Clear; override;
132 function FindName(key: string): TBoard;
133 function FindBBSID(BBSID: string): TBoard;
134 function FindBoardFromTitle(Title: string): TBoard;
135 function FindBoardFromURL(inURL: string): TBoard;
136 function FindThreadFromURL( inURL : string ) : TThreadItem;
137 function IsMidoku: Boolean;
139 property NodeExpand: Boolean read FExpand write FExpand;
143 TBoard = class(TList)
145 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é)
147 FNo: Integer; //
\94Ô
\8d\86
148 FTitle: string; //
\83{
\81[
\83h
\83^
\83C
\83g
\83\8b
149 FBBSID: string; //BBSID
150 FURL: string; //
\83{
\81[
\83hURL
151 FRound: Boolean; //
\83X
\83\8c\83b
\83h
\88ê
\97\97\8f\84\89ñ
\97\
\96ñ
152 FRoundName: string; //
\8f\84\89ñ
\96¼
153 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
154 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
155 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
156 FIsThreadDatRead: Boolean; //
\83X
\83\8c\83b
\83h
\83\8a\83X
\83g
\82Í
\93Ç
\82Ý
\8d\9e\82Ü
\82ê
\82Ä
\82¢
\82é
\82©
\81H
157 FUnRead: Integer; //
\83X
\83\8c\83b
\83h
\96¢
\93Ç
\90\94
158 FParentCategory: TCategory; //
\90e
\83J
\83e
\83S
\83\8a
159 FModified: Boolean; //
\8fC
\90³
\83t
\83\89\83O
160 FBoolData: Boolean; //
\82¢
\82ë
\82ñ
\82È
\97p
\93r
\82É
\8eg
\82¤yo
161 FSPID: string; //
\8f\91\82«
\8d\9e\82Ý
\97pSPID
162 FPON: string; //
\8f\91\82«
\8d\9e\82Ý
\97pPON
163 FKotehanName: string; //
\83R
\83e
\83n
\83\93\96¼
\91O
164 FKotehanMail: string; //
\83R
\83e
\83n
\83\93\83\81\81[
\83\8b
169 FBoardPlugIn : TBoardPlugIn; //
\82±
\82Ì
\94Â
\82ð
\83T
\83|
\81[
\83g
\82·
\82é
\83v
\83\89\83O
\83C
\83\93
170 FFilePath : string; //
\82±
\82Ì
\83X
\83\8c\88ê
\97\97\82ª
\95Û
\91¶
\82³
\82ê
\82Ä
\82¢
\82é
\83p
\83X
171 FIsLogFile : Boolean; //
\83\8d\83O
\91¶
\8dÝ
\83t
\83\89\83O
172 FIntData : Integer; //
\8dD
\82«
\82É
\82¢
\82¶
\82Á
\82Ä
\82æ
\82µ
\81B
\82¢
\82ë
\82ñ
\82È
\97p
\93r
\82É
\8eg
\82¤yo
173 FListData : TList; //
\8dD
\82«
\82É
\82¢
\82¶
\82Á
\82Ä
\82æ
\82µ
\81B
\82¢
\82ë
\82ñ
\82È
\97p
\93r
\82É
\8eg
\82¤yo
175 function GetThreadItem(index: integer): TThreadItem;
176 procedure SetThreadItem(index: integer; value: TThreadItem);
177 procedure SetRound(b: Boolean);
178 procedure SetRoundName(s: string);
179 procedure SetLastModified(d: TDateTime);
180 procedure SetLastGetTime(d: TDateTime);
181 procedure SetUnRead(i: Integer);
182 procedure SetKotehanName(s: string);
183 procedure SetKotehanMail(s: string);
186 constructor Create( inPlugIn : TBoardPlugIn; inURL : string );
187 destructor Destroy; override;
189 property Context: DWORD read FContext write FContext;
191 property Items[index: integer]: TThreadItem read GetThreadItem write SetThreadItem;
192 property No: Integer read FNo write FNo;
193 property Title: string read FTitle write FTitle;
194 property BBSID: string read FBBSID write FBBSID;
195 property URL: string read FURL write FURL;
196 property Round: Boolean read FRound write SetRound;
197 property RoundName: string read FRoundName write SetRoundName;
198 property RoundDate: TDateTime read FRoundDate write FRoundDate;
199 property LastModified: TDateTime read FLastModified write SetLastModified;
200 property LastGetTime: TDateTime read FLastGetTime write SetLastGetTime;
201 property UnRead: Integer read FUnRead write SetUnRead;
202 property Modified: Boolean read FModified write FModified;
203 property IsThreadDatRead: Boolean read FIsThreadDatRead write FIsThreadDatRead;
204 property ParentCategory: TCategory read FParentCategory write FParentCategory;
206 property BoardPlugIn : TBoardPlugIn read FBoardPlugIn;
207 property FilePath : string read FFilePath write FFilePath;
208 property IsLogFile : Boolean read FIsLogFile write FIsLogFile;
209 property IntData : Integer read FIntData write FIntData;
210 property ListData : TList read FListData write FListData;
211 function IsBoardPlugInAvailable : Boolean;
213 function Add(item: TThreadItem): integer;
214 procedure Insert(Index: Integer; Item: TThreadItem);
215 procedure Delete(index: integer);
216 procedure DeleteList(index: integer);
217 procedure Clear; override;
218 function Find(ItemFileName: string): TThreadItem;
219 function FindThreadFromURL( inURL : string ) : TThreadItem;
220 function GetIndex(ItemFileName: string): Integer;
221 function GetIndexFromURL(URL: string): Integer;
222 procedure LoadSettings;
223 procedure SaveSettings;
224 function GetReadCgiURL: string;
225 function GetSubjectFileName: string;
226 function GetFolderIndexFileName: string;
227 function GetSendURL: string;
229 function GetNewThreadCount: Integer;
230 function GetLogThreadCount: Integer;
231 function GetUserThreadCount: Integer;
232 function GetNewThread(Index: Integer): TThreadItem;
233 function GetLogThread(Index: Integer): TThreadItem;
234 function GetUserThread(Index: Integer): TThreadItem;
236 procedure BeginUpdate;
238 property NodeExpand: Boolean read FExpand write FExpand;
239 property BoolData: Boolean read FBoolData write FBoolData;
240 property SPID: string read FSPID write FSPID;
241 property PON: string read FPON write FPON;
242 property KotehanName: string read FKotehanName write SetKotehanName;
243 property KotehanMail: string read FKotehanMail write SetKotehanMail;
247 TThreadItem = class(TObject)
249 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é)
251 FNo: Integer; //
\94Ô
\8d\86
252 FFileName: string; //
\83X
\83\8c\83b
\83h
\83t
\83@
\83C
\83\8b\96¼
253 FTitle: string; //
\83X
\83\8c\83b
\83h
\83^
\83C
\83g
\83\8b
254 FShortTitle: string; //
\92Z
\82¢
\83X
\83\8c\83b
\83h
\83^
\83C
\83g
\83\8b\81i
\8c\9f\8dõ
\97p
\81j
255 FRoundDate: TDateTime; //
\83X
\83\8c\83b
\83h
\82ð
\8eæ
\93¾
\82µ
\82½
\93ú
\8e\9e\81i
\8f\84\89ñ
\93ú
\8e\9e\81j
256 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
257 FCount: Integer; //
\83X
\83\8c\83b
\83h
\83J
\83E
\83\93\83g
\81i
\83\8d\81[
\83J
\83\8b\81j
258 FAllResCount: Integer; //
\83X
\83\8c\83b
\83h
\83J
\83E
\83\93\83g
\81i
\83T
\81[
\83o
\81j
259 FNewResCount: Integer; //
\83X
\83\8c\83b
\83h
\90V
\92\85\90\94
260 FSize: Integer; //
\83X
\83\8c\83b
\83h
\83T
\83C
\83Y
261 FRound: Boolean; //
\8f\84\89ñ
\83t
\83\89\83O
262 FRoundName: string; //
\8f\84\89ñ
\96¼
263 FIsLogFile: Boolean; //
\83\8d\83O
\91¶
\8dÝ
\83t
\83\89\83O
264 FParentBoard: TBoard; //
\90e
\83{
\81[
\83h
265 FKokomade: Integer; //
\83R
\83R
\82Ü
\82Å
\93Ç
\82ñ
\82¾
\94Ô
\8d\86
266 FNewReceive: Integer; //
\83R
\83R
\82©
\82ç
\90V
\8bK
\8eó
\90M
267 FNewArrival: Boolean; //
\90V
\92\85
268 FUnRead: Boolean; //
\96¢
\93Ç
\83t
\83\89\83O
269 FScrollTop: Integer; //
\83X
\83N
\83\8d\81[
\83\8b\88Ê
\92u
270 FDownloadHost: string; //
\8d¡
\82Ì
\83z
\83X
\83g
\82Æ
\88á
\82¤
\8fê
\8d\87\82Ì
\83z
\83X
\83g
271 FAgeSage: TGikoAgeSage; //
\83A
\83C
\83e
\83\80\82Ì
\8fã
\82°
\89º
\82°
272 // FSPID: string; //
\8f\91\82«
\8d\9e\82Ý
\97pSPID
276 FURL : string; //
\82±
\82Ì
\83X
\83\8c\82ð
\83u
\83\89\83E
\83U
\82Å
\95\
\8e¦
\82·
\82é
\8dÛ
\82Ì URL
277 FBoardPlugIn : TBoardPlugIn; //
\82±
\82Ì
\83X
\83\8c\82ð
\83T
\83|
\81[
\83g
\82·
\82é
\83v
\83\89\83O
\83C
\83\93
278 FFilePath : string; //
\82±
\82Ì
\83X
\83\8c\82ª
\95Û
\91¶
\82³
\82ê
\82Ä
\82¢
\82é
\83p
\83X
279 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
281 procedure SetLastModified(d: TDateTime);
282 procedure SetRound(b: Boolean);
283 procedure SetRoundName(s: string);
284 procedure SetKokomade(i: Integer);
285 procedure SetUnRead(b: Boolean);
286 procedure SetScrollTop(i: Integer);
289 constructor Create( inPlugIn : TBoardPlugIn; inURL : string );
290 destructor Destroy; override;
292 function GetDatURL: string;
293 function GetDatgzURL: string;
294 // function GetOldDatgzURL: string;
295 function GetOfflawCgiURL(SessionID: string): string;
296 function GetSendURL: string;
297 procedure DeleteLogFile;
298 function GetThreadFileName: string;
299 procedure BeginUpdate;
302 property Context: DWORD read FContext write FContext;
304 property No: Integer read FNo write FNo;
305 property FileName: string read FFileName write FFileName;
306 property Title: string read FTitle write FTitle;
307 property ShortTitle: string read FShortTitle write FShortTitle;
308 property RoundDate: TDateTime read FRoundDate write FRoundDate;
309 property LastModified: TDateTime read FLastModified write SetLastModified;
310 property Count: Integer read FCount write FCount;
311 property AllResCount: Integer read FAllResCount write FAllResCount;
312 property NewResCount: Integer read FNewResCount write FNewResCount;
313 property Size: Integer read FSize write FSize;
314 property Round: Boolean read FRound write SetRound;
315 property RoundName: string read FRoundName write SetRoundName;
317 property IsLogFile: Boolean read FIsLogFile write FIsLogFile;
318 property ParentBoard: TBoard read FParentBoard write FParentBoard;
319 property Kokomade: Integer read FKokomade write SetKokomade;
320 property NewReceive: Integer read FNewReceive write FNewReceive;
321 property NewArrival: Boolean read FNewArrival write FNewArrival;
322 property UnRead: Boolean read FUnRead write SetUnRead;
323 property ScrollTop: Integer read FScrollTop write SetScrollTop;
324 property Expand: Boolean read FExpand write FExpand;
325 property DownloadHost: string read FDownloadHost write FDownloadHost;
326 property AgeSage: TGikoAgeSage read FAgeSage write FAgeSage;
327 // property SPID: string read FSPID write FSPID;
329 property URL : string read FURL write FURL;
330 property BoardPlugIn : TBoardPlugIn read FBoardPlugIn;
331 property FilePath : string read FFilePath write FFilePath;
332 property SizeByte : Integer read FSizeByte write FSizeByte;
333 function IsBoardPlugInAvailable : Boolean;
338 //
\8c\9f\8dõ
\8c\8b\89Ê
\83\8a\83X
\83g
339 { TSearchList = class(TList)
341 function GetThreadItem(index: integer): TThreadItem;
342 procedure SetThreadItem(index: integer; value: TThreadItem);
345 destructor Destroy; override;
347 property Items[index: integer]: TThreadItem read GetThreadItem write SetThreadItem;
349 function Add(item: TThreadItem): integer;
350 procedure Delete(index: integer);
351 procedure Clear; override;
354 function BBSsFindBoardFromBBSID( inBBSID : string ) : TBoard;
355 function BBSsFindBoardFromURL( inURL : string ) : TBoard;
356 function BBSsFindBoardFromTitle( inTitle : string ) : TBoard;
357 function BBSsFindThreadFromURL( inURL : string ) : TThreadItem;
360 BBSs : array of TBBS;
365 GikoSystem, RoundData;
368 BBS2CH_NAME: string = '
\82Q
\82¿
\82á
\82ñ
\82Ë
\82é';
369 BBS2CH_LOG_FOLDER: string = '2ch';
370 EXTERNAL_LOG_FOLDER: string = 'exboard';
372 FOLDER_INI_FILENAME: string = 'Folder.ini';
373 FOLDER_INDEX_FILENAME: string = 'Folder.idx';
374 SUBJECT_FILENAME: string = 'subject.txt';
375 PATH_DELIM: string = '\';
376 //DEFAULT_LIST_COUNT: Integer = 100;
378 // COLUMN_CATEGORY: array[0..0] of string = ('
\83J
\83e
\83S
\83\8a\96¼');
379 // 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');
380 // 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');
382 function BBSsFindBoardFromBBSID(
389 for i := Length( BBSs ) - 1 downto 0 do begin
390 Result := BBSs[ i ].FindBBSID( inBBSID );
391 if Result <> nil then
399 function BBSsFindBoardFromURL(
406 for i := Length( BBSs ) - 1 downto 0 do begin
407 Result := BBSs[ i ].FindBoardFromURL( inURL );
408 if Result <> nil then
416 function BBSsFindBoardFromTitle(
423 for i := Length( BBSs ) - 1 downto 0 do begin
424 Result := BBSs[ i ].FindBoardFromTitle( inTitle );
425 if Result <> nil then
433 function BBSsFindThreadFromURL(
441 boardURL := GikoSys.GetThreadURL2BoardURL( inURL );
442 board := BBSsFindBoardFromURL( boardURL );
446 Result := board.FindThreadFromURL( inURL );
450 (*************************************************************************
451 *
\8b@
\94\
\96¼
\81FTBBS
\83R
\83\93\83X
\83g
\83\89\83N
\83^
453 *************************************************************************)
454 constructor TBBS.Create(LogFolder: string);
457 Title := BBS2CH_NAME;
458 FLogFolder := LogFolder;
461 (*************************************************************************
462 *
\8b@
\94\
\96¼
\81FTBBS
\83f
\83X
\83g
\83\89\83N
\83^
464 *************************************************************************)
465 destructor TBBS.Destroy;
471 (*************************************************************************
474 *************************************************************************)
475 function TBBS.GetCategory(index: integer): TCategory;
477 Result := TCategory(inherited Items[index]);
480 procedure TBBS.SetCategory(index: integer; value: TCategory);
482 inherited Items[index] := value;
485 function TBBS.Add(item: TCategory): integer;
487 Item.ParenTBBS := self;
488 Result := inherited Add(item);
491 procedure TBBS.Delete(index: integer);
493 if Items[index] <> nil then
494 TCategory(Items[index]).Free;
496 inherited Delete(index);
499 procedure TBBS.Clear;
503 for i := Count - 1 downto 0 do
507 function TBBS.Find(key: string): TCategory;
512 function TBBS.FindBBSID(BBSID: string): TBoard;
516 for i := Count - 1 downto 0 do begin
517 Result := Items[ i ].FindBBSID(BBSID);
518 if Result <> nil then
524 //*************************************************************************
525 //
\83^
\83C
\83g
\83\8b\82Ì
\88ê
\92v
\82·
\82é
\94Â
\82ð
\92T
\82·
526 //*************************************************************************)
527 function TBBS.FindBoardFromTitle(Title: string): TBoard;
531 for i := Count - 1 downto 0 do begin
532 Result := Items[ i ].FindBoardFromTitle(Title);
533 if Result <> nil then
539 //*************************************************************************
540 // URL
\82ð
\8eó
\82¯
\95t
\82¯
\82é
\94Â
\82ð
\92T
\82·
541 //*************************************************************************)
542 function TBBS.FindBoardFromURL(inURL: string): TBoard;
546 for i := Count - 1 downto 0 do begin
547 Result := Items[ i ].FindBoardFromURL( inURL );
548 if Result <> nil then
554 //*************************************************************************
555 // URL
\82ð
\8eó
\82¯
\95t
\82¯
\82é
\83X
\83\8c\83b
\83h
\82ð
\92T
\82·
556 //*************************************************************************)
557 function TBBS.FindThreadFromURL(inURL: string): TThreadItem;
563 boardURL := GikoSys.GetThreadURL2BoardURL( inURL );
564 board := FindBoardFromURL( boardURL );
568 Result := board.FindThreadFromURL( inURL );
572 function TBBS.FindThreadItem(BBSID: string; FileName: string): TThreadItem;
577 Board := FindBBSID(BBSID);
580 Result := Board.Find(FileName);
583 (*************************************************************************
584 *
\83\8d\83O
\83t
\83H
\83\8b\83_
\8eæ
\93¾
586 *************************************************************************)
587 function TBBS.GetLogFolder: string;
589 Result := IncludeTrailingPathDelimiter(FLogFolder)
590 + BBS2CH_LOG_FOLDER + PATH_DELIM;
593 procedure TBBS.SetSelectText(s: string);
596 ShortSelectText := GikoSys.ZenToHan(s);
599 {class function TBBS.GetColumnName(Index: Integer): string;
601 Result := COLUMN_CATEGORY[Index];
604 class function TBBS.GetColumnCount: Integer;
606 Result := Length(COLUMN_CATEGORY);
609 //===================
611 //===================
612 constructor TCategory.Create;
617 destructor TCategory.Destroy;
623 function TCategory.GetBoard(index: integer): TBoard;
625 Result := TBoard(inherited Items[index]);
628 procedure TCategory.SetBoard(index: integer; value: TBoard);
630 inherited Items[index] := value;
633 function TCategory.Add(item: TBoard): integer;
635 Item.ParentCategory := self;
636 Result := inherited Add(item);
639 procedure TCategory.Delete(index: integer);
641 if Items[index] <> nil then
642 TBoard(Items[index]).Free;
644 inherited Delete(index);
647 procedure TCategory.Clear;
651 for i := Count - 1 downto 0 do
655 function TCategory.FindName(key: string): TBoard;
660 function TCategory.FindBBSID(BBSID: string): TBoard;
664 for i := Count - 1 downto 0 do begin
665 if Items[i].FBBSID = BBSID then begin
673 //*************************************************************************
674 //
\83^
\83C
\83g
\83\8b\82Ì
\88ê
\92v
\82·
\82é
\94Â
\82ð
\92T
\82·
675 //*************************************************************************)
676 function TCategory.FindBoardFromTitle(Title: string): TBoard;
680 for i := Count - 1 downto 0 do begin
681 if Items[i].FTitle = Title then begin
689 //*************************************************************************
690 // URL
\82ð
\8eó
\82¯
\95t
\82¯
\82é
\94Â
\82ð
\92T
\82·
691 //*************************************************************************)
692 function TCategory.FindBoardFromURL(inURL: string): TBoard;
696 for i := Count - 1 downto 0 do begin
697 if Pos( Items[i].URL, inURL ) = 1 then begin
705 //*************************************************************************
706 // URL
\82ð
\8eó
\82¯
\95t
\82¯
\82é
\83X
\83\8c\83b
\83h
\82ð
\92T
\82·
707 //*************************************************************************)
708 function TCategory.FindThreadFromURL(inURL: string): TThreadItem;
714 boardURL := GikoSys.GetThreadURL2BoardURL( inURL );
715 board := FindBoardFromURL( boardURL );
719 Result := board.FindThreadFromURL( inURL );
723 function TCategory.IsMidoku: Boolean;
729 for i := 0 to Count - 1 do begin
730 if Items[i] <> nil then begin
731 for j := 0 to Items[i].Count - 1 do begin
732 if Items[i].Items[j] <> nil then begin
733 // if (Items[i].Items[j].IsLogFile) and (Items[i].Items[j].Count > Items[i].Items[j].Kokomade) then begin
734 if (Items[i].Items[j].IsLogFile) and (Items[i].Items[j].UnRead) then begin
744 {class function TCategory.GetColumnName(Index: Integer): string;
746 Result := COLUMN_BOARD[Index];
749 class function TCategory.GetColumnCount: Integer;
751 Result := Length(COLUMN_BOARD);
754 //===================
756 //===================
757 procedure TBoard.Init;
764 FRoundDate := ZERO_DATE;
765 FLastModified := ZERO_DATE;
766 FLastGetTime := ZERO_DATE;
767 FIsThreadDatRead := False;
769 // FListStyle := vsReport;
770 // FItemNoVisible := True;
775 // *************************************************************************
776 //
\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^
777 // *************************************************************************
778 constructor TBoard.Create(
779 inPlugIn : TBoardPlugIn;
783 protocol, host, path, document, port, bookmark : string;
790 FBoardPlugIn := inPlugIn;
792 BBSID := GikoSys.UrlToID( inURL );
794 if inPlugIn = nil then begin
795 // subject.txt
\82Ì
\95Û
\91¶
\83p
\83X
\82ð
\90Ý
\92è
796 GikoSys.ParseURI( inURL, protocol, host, path, document, port, bookmark );
797 if GikoSys.Is2chHost( host ) then
799 IncludeTrailingPathDelimiter( GikoSys.Setting.LogFolder ) +
800 BBS2CH_LOG_FOLDER + PATH_DELIM + BBSID + PATH_DELIM + SUBJECT_FILENAME
803 IncludeTrailingPathDelimiter( GikoSys.Setting.LogFolder ) +
804 EXTERNAL_LOG_FOLDER + PATH_DELIM + host + PATH_DELIM + BBSID + PATH_DELIM + SUBJECT_FILENAME
806 //
\83v
\83\89\83O
\83C
\83\93\82É TBoardItem
\82ª
\8dì
\90¬
\82³
\82ê
\82½
\82±
\82Æ
\82ð
\93`
\82¦
\82é
807 inPlugIn.CreateBoardItem( DWORD( Self ) );
812 // *************************************************************************
813 //
\83f
\83X
\83g
\83\89\83N
\83^
814 // *************************************************************************
815 destructor TBoard.Destroy;
817 if FModified then begin
818 GikoSys.WriteThreadDat(Self);
822 //
\83v
\83\89\83O
\83C
\83\93\82É TBoardItem
\82ª
\94j
\8aü
\82³
\82ê
\82½
\82±
\82Æ
\82ð
\93`
\82¦
\82é
823 if IsBoardPlugInAvailable then
824 BoardPlugIn.DisposeBoardItem( DWORD( Self ) );
830 // *************************************************************************
831 //
\8aO
\95\94\94Â
\83v
\83\89\83O
\83C
\83\93\82ª
\8eg
\97p
\89Â
\94\
\82©
832 // *************************************************************************
833 function TBoard.IsBoardPlugInAvailable : Boolean;
837 if BoardPlugIn = nil then
840 if not Assigned( Pointer( BoardPlugIn.Module ) ) then
851 function TBoard.GetThreadItem(index: integer): TThreadItem;
853 Result := TThreadItem(inherited Items[index]);
856 procedure TBoard.SetThreadItem(index: integer; value: TThreadItem);
858 inherited Items[index] := value;
861 function TBoard.Add(Item: TThreadItem): Integer;
863 Item.ParentBoard := Self;
864 Result := inherited Add(Item);
867 procedure TBoard.Insert(Index: Integer; Item: TThreadItem);
869 Item.ParentBoard := Self;
870 inherited Insert(Index, Item);
873 //Index
\82Å
\8ew
\92è
\82³
\82ê
\82½
\83X
\83\8c\83b
\83h
\83I
\83u
\83W
\83F
\83N
\83g
\82ð
\94j
\8aü
874 procedure TBoard.Delete(index: Integer);
876 if Items[index] <> nil then
877 TThreadItem(Items[index]).Free;
879 inherited Delete(index);
882 //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
883 procedure TBoard.DeleteList(index: integer);
885 inherited Delete(index);
888 procedure TBoard.Clear;
893 for i := Count - 1 downto 0 do
897 function TBoard.Find(ItemFileName: string): TThreadItem;
902 for i := 0 to Count - 1 do begin
903 if Items[i].FileName = ItemFileName then begin
910 function TBoard.GetIndex(ItemFileName: string): Integer;
915 for i := 0 to Count - 1 do begin
916 if Items[i].FileName = ItemFileName then begin
923 function TBoard.GetIndexFromURL(URL: string): Integer;
928 for i := 0 to Count - 1 do begin
929 if Items[i].URL = URL then begin
936 function TBoard.FindThreadFromURL( inURL : string ) : TThreadItem;
941 if not IsThreadDatRead then
942 GikoSys.ReadSubjectFile( Self );
944 for i := Count - 1 downto 0 do begin
945 if Pos( Items[ i ].URL, inURL ) = 1 then begin
946 Result := Items[ i ];
954 {function TBoard.GetMidokuCount: Integer;
959 for i := 0 to Count- 1 do begin
960 if Items[i] <> nil then begin
961 if (Items[i].IsLogFile) and (Items[i].Count > Items[i].Kokomade) then
968 procedure TBoard.LoadSettings;
973 if Length( FilePath ) > 0 then
974 FileName := ExtractFilePath( FilePath ) + FOLDER_INI_FILENAME
976 FileName := ParentCategory.ParenTBBS.GetLogFolder
977 + BBSID + PATH_DELIM + FOLDER_INI_FILENAME;
979 if not FileExists(FileName) then
981 ini := TMemIniFile.Create(FileName);
983 // Round := ini.ReadBool('Status', 'Round', False);
984 FRoundDate := ini.ReadDateTime('Status', 'RoundDate', ZERO_DATE);
985 FLastModified := ini.ReadDateTime('Status', 'LastModified', ZERO_DATE);
986 FLastGetTime := ini.ReadDateTime('Status', 'LastGetTime', ZERO_DATE);
987 FUnRead := ini.ReadInteger('Status', 'UnRead', 0);
988 FSPID := ini.ReadString('Cookie', 'SPID', '');
989 FPON := ini.ReadString('Cookie', 'PON', '');
990 FKotehanName := ini.ReadString('Kotehan', 'Name', '');
991 FKotehanMail := ini.ReadString('Kotehan', 'Mail', '');
992 // ListStyle := TViewStyle(Ord(ini.ReadInteger('Status', 'ListStyle', 3)));
993 // ItemNoVisible := ini.ReadBool('Status', 'ItemNoVisible', True);
994 // ViewType := TGikoViewType(Ord(ini.ReadInteger('Status', 'ViewType', 0)));
1002 procedure TBoard.SaveSettings;
1007 if Length( FilePath ) > 0 then
1008 FileName := ExtractFilePath( FilePath )
1010 FileName := ParentCategory.ParenTBBS.GetLogFolder
1011 + BBSID + PATH_DELIM;
1012 if not GikoSys.DirectoryExistsEx(FileName) then
1013 GikoSys.ForceDirectoriesEx(FileName);
1014 FileName := FileName + FOLDER_INI_FILENAME;
1015 ini := TMemIniFile.Create(FileName);
1019 // ini.WriteBool('Status', 'Round', Round);
1020 ini.WriteDateTime('Status', 'RoundDate', FRoundDate);
1021 ini.WriteDateTime('Status', 'LastModified', FLastModified);
1022 ini.WriteDateTime('Status', 'LastGetTime', FLastGetTime);
1023 ini.WriteInteger('Status', 'UnRead', FUnRead);
1024 ini.WriteString('Cookie', 'SPID', FSPID);
1025 ini.WriteString('Cookie', 'PON', FPON);
1026 ini.WriteString('Kotehan', 'Name', FKotehanName);
1027 ini.WriteString('Kotehan', 'Mail', FKotehanMail);
1028 // ini.WriteInteger('Status', 'ListStyle', Ord(ListStyle));
1029 // ini.WriteBool('Status', 'ItemNoVisible', ItemNoVisible);
1030 // ini.WriteInteger('Status', 'ViewType', Ord(ViewType));
1037 //
\83T
\83u
\83W
\83F
\83N
\83gURL
\8eæ
\93¾
1038 function TBoard.GetReadCgiURL: string;
1040 //Result := URL + SUBJECT_FILENAME;
1041 //Result := GikoSys.UrlToServer(URL)
1042 // + 'test/read.cgi/' + BBSID + '/?raw=0.0';
1043 Result := URL + SUBJECT_FILENAME;
1047 //
\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
1048 function TBoard.GetSubjectFileName: string;
1050 if Length( FilePath ) > 0 then
1053 Result := ParentCategory.ParenTBBS.GetLogFolder
1054 + BBSID + PATH_DELIM + SUBJECT_FILENAME;
1057 //
\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
1058 function TBoard.GetFolderIndexFileName: string;
1060 if Length( FilePath ) > 0 then
1061 Result := ExtractFilePath( FilePath ) + FOLDER_INDEX_FILENAME
1063 Result := ParentCategory.ParenTBBS.GetLogFolder
1064 + BBSID + PATH_DELIM + FOLDER_INDEX_FILENAME;
1067 //
\83X
\83\8c\97§
\82Ä
\91\97\90MURL
1068 function TBoard.GetSendURL: string;
1070 Result := GikoSys.UrlToServer(URL) + 'test/subbbs.cgi';
1073 procedure TBoard.SetRound(b: Boolean);
1078 RoundList.Delete(Self);
1079 if FRound = b then Exit;
1085 procedure TBoard.SetRoundName(s: string);
1087 if FRoundName = s then Exit;
1093 procedure TBoard.SetLastModified(d: TDateTime);
1095 if FLastModified = d then Exit;
1101 procedure TBoard.SetLastGetTime(d: TDateTime);
1103 if FLastGetTime = d then Exit;
1109 procedure TBoard.SetUnRead(i: Integer);
1111 if FUnRead = i then Exit;
1112 if i < 0 then i := 0;
1118 procedure TBoard.SetKotehanName(s: string);
1120 if FKotehanName = s then Exit;
1126 procedure TBoard.SetKotehanMail(s: string);
1128 if FKotehanMail = s then Exit;
1134 function TBoard.GetNewThreadCount: Integer;
1139 if Length( ParentCategory.ParenTBBS.ShortSelectText ) = 0 then
1141 for i := 0 to Count - 1 do begin
1142 if Items[i].NewArrival then
1146 for i := 0 to Count - 1 do begin
1147 if Items[i].NewArrival then
1149 if Items[i].ShortTitle = '' then
1150 Items[i].ShortTitle := GikoSys.ZenToHan(Items[i].Title);
1151 if AnsiPos(ParentCategory.ParenTBBS.ShortSelectText, Items[i].ShortTitle) <> 0 then
1158 function TBoard.GetLogThreadCount: Integer;
1163 if Length( ParentCategory.ParenTBBS.ShortSelectText ) = 0 then
1165 for i := 0 to Count - 1 do begin
1166 if Items[i].IsLogFile then
1170 for i := 0 to Count - 1 do begin
1171 if Items[i].IsLogFile then
1173 if Items[i].ShortTitle = '' then
1174 Items[i].ShortTitle := GikoSys.ZenToHan(Items[i].Title);
1175 if AnsiPos(ParentCategory.ParenTBBS.ShortSelectText, Items[i].ShortTitle) <> 0 then
1182 function TBoard.GetUserThreadCount: Integer;
1187 if Length( ParentCategory.ParenTBBS.ShortSelectText ) = 0 then
1190 for i := 0 to Count - 1 do begin
1191 if Items[i].ShortTitle = '' then
1192 Items[i].ShortTitle := GikoSys.ZenToHan(Items[i].Title);
1193 if AnsiPos(ParentCategory.ParenTBBS.ShortSelectText, Items[i].ShortTitle) <> 0 then
1198 function TBoard.GetNewThread(Index: Integer): TThreadItem;
1205 if Length( ParentCategory.ParenTBBS.ShortSelectText ) = 0 then
1207 for i := 0 to Count - 1 do begin
1208 if Items[i].NewArrival then
1210 if Index = Cnt then begin
1218 for i := 0 to Count - 1 do begin
1219 if Items[i].NewArrival then
1221 if Items[i].ShortTitle = '' then
1222 Items[i].ShortTitle := GikoSys.ZenToHan(Items[i].Title);
1223 if AnsiPos(ParentCategory.ParenTBBS.ShortSelectText, Items[i].ShortTitle) <> 0 then begin
1224 if Index = Cnt then begin
1235 function TBoard.GetLogThread(Index: Integer): TThreadItem;
1241 if Length( ParentCategory.ParenTBBS.ShortSelectText ) = 0 then
1243 for i := 0 to Count - 1 do begin
1244 if Items[i].IsLogFile then
1246 if Index = Cnt then begin
1254 for i := 0 to Count - 1 do begin
1255 if Items[i].IsLogFile then
1257 if Items[i].ShortTitle = '' then
1258 Items[i].ShortTitle := GikoSys.ZenToHan(Items[i].Title);
1259 if AnsiPos(ParentCategory.ParenTBBS.ShortSelectText, Items[i].ShortTitle) <> 0 then begin
1260 if Index = Cnt then begin
1272 function TBoard.GetUserThread(Index: Integer): TThreadItem;
1279 if Length( ParentCategory.ParenTBBS.ShortSelectText ) = 0 then
1281 for i := 0 to Count - 1 do begin
1284 Result := Items[ i ];
1290 for i := 0 to Count - 1 do begin
1291 if Items[i].ShortTitle = '' then
1292 Items[i].ShortTitle := GikoSys.ZenToHan(Items[i].Title);
1293 if AnsiPos(ParentCategory.ParenTBBS.ShortSelectText, Items[i].ShortTitle) <> 0 then begin
1294 if Index = Cnt then begin
1304 procedure TBoard.BeginUpdate;
1309 procedure TBoard.EndUpdate;
1314 {class function TBoard.GetColumnName(Index: Integer): string;
1316 Result := COLUMN_THREADITEM[Index];
1319 class function TBoard.GetColumnCount: Integer;
1321 Result := Length(COLUMN_THREADITEM);
1324 //constructor TThreadItem.Create(AOwner: TComponent);
1325 procedure TThreadItem.Init;
1330 FRoundDate := ZERO_DATE;
1331 FLastModified := ZERO_DATE;
1337 FIsLogFile := False;
1338 FParentBoard := nil;
1341 FNewArrival := False;
1345 FBoardPlugIn := nil;
1348 // *************************************************************************
1349 //
\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^
1350 // *************************************************************************
1351 constructor TThreadItem.Create(
1352 inPlugIn : TBoardPlugIn;
1357 protocol, host, path, document, port, bookmark : string;
1358 BBSID, BBSKey : string;
1360 READ_PATH = '/test/read.cgi';
1366 FBoardPlugIn := inPlugIn;
1369 if inPlugIn = nil then begin
1370 foundPos := Pos( READ_PATH, inURL );
1371 if foundPos > 0 then begin
1372 // dat
\82Ì
\95Û
\91¶
\83p
\83X
\82ð
\90Ý
\92è
1373 GikoSys.ParseURI( inURL, protocol, host, path, document, port, bookmark );
1374 GikoSys.Parse2chURL( inURL, path, document, BBSID, BBSKey );
1375 if GikoSys.Is2chHost( host ) then
1377 IncludeTrailingPathDelimiter( GikoSys.Setting.LogFolder ) +
1378 BBS2CH_LOG_FOLDER + PATH_DELIM + BBSID + PATH_DELIM + BBSKey + '.dat'
1381 IncludeTrailingPathDelimiter( GikoSys.Setting.LogFolder ) +
1382 EXTERNAL_LOG_FOLDER + PATH_DELIM + host + PATH_DELIM + BBSID + PATH_DELIM + BBSKey + '.dat';
1383 FileName := BBSKey + '.dat';
1384 IsLogFile := FileExists( FilePath );
1387 //
\83v
\83\89\83O
\83C
\83\93\82É TThreadItem
\82ª
\8dì
\90¬
\82³
\82ê
\82½
\82±
\82Æ
\82ð
\93`
\82¦
\82é
1388 inPlugIn.CreateThreadItem( DWORD( Self ) );
1393 // *************************************************************************
1394 //
\83f
\83X
\83g
\83\89\83N
\83^
1395 // *************************************************************************
1396 destructor TThreadItem.Destroy;
1399 //
\83v
\83\89\83O
\83C
\83\93\82É TThreadItem
\82ª
\94j
\8aü
\82³
\82ê
\82½
\82±
\82Æ
\82ð
\93`
\82¦
\82é
1400 if IsBoardPlugInAvailable then
1401 FBoardPlugIn.DisposeThreadItem( DWORD( Self ) );
1407 // *************************************************************************
1408 //
\8aO
\95\94\94Â
\83v
\83\89\83O
\83C
\83\93\82ª
\8eg
\97p
\89Â
\94\
\82©
1409 // *************************************************************************
1410 function TThreadItem.IsBoardPlugInAvailable : Boolean;
1414 if BoardPlugIn = nil then
1417 if not Assigned( Pointer( BoardPlugIn.Module ) ) then
1428 function TThreadItem.GetDatURL: string;
1430 Protocol, Host, Path, Document, Port, Bookmark: string;
1432 Result := ParentBoard.URL
1435 if FDownloadHost <> '' then begin
1436 GikoSys.ParseURI(Result, Protocol, Host, Path, Document, Port, Bookmark);
1437 Result := Format('%s://%s%s%s', [Protocol,
1442 // Result := GikoSys.UrlToServer(ParentBoard.URL)
1443 // + 'test/read.cgi/' + ParentBoard.BBSID + '/'
1444 // + ChangeFileExt(FileName, '') + '/?raw='
1445 // + IntToStr(ResNum) + '.' + IntToStr(ResSize);
1448 function TThreadItem.GetDatgzURL: string;
1449 function isOldKako(s: string): Boolean;
1452 if AnsiPos('piza.', s) <> 0 then
1454 else if AnsiPos('www.bbspink.', s) <> 0 then
1456 else if AnsiPos('tako.', s) <> 0 then
1460 Protocol, Host, Path, Document, Port, Bookmark: string;
1463 if FDownloadHost = '' then begin
1464 DatNo := ChangeFileExt(FileName, '');
1465 if isOldKako(ParentBoard.URL) then begin
1466 Result := Format('%s%s/%.3s/%s.dat', [ParentBoard.URL, 'kako', DatNo, DatNo]);
1468 if Length(DatNo) > 9 then begin
1469 //http://xxx.2ch.net/xxx/kako/9999/99999/999999999.dat.gz
1470 Result := Format('%s%s/%.4s/%.5s/%s.dat.gz', [ParentBoard.URL, 'kako', DatNo, DatNo, DatNo]);
1472 //http://xxx.2ch.net/xxx/kako/999/999999999.dat.gz
1473 Result := Format('%s%s/%.3s/%s.dat.gz', [ParentBoard.URL, 'kako', DatNo, DatNo]);
1477 Gikosys.ParseURI(Result, Protocol, Host, Path, Document, Port, Bookmark);
1478 DatNo := ChangeFileExt(Document, '');
1479 if isOldKako(DownloadHost) then begin
1480 Result := Format('%s://%s/%s/kako/%.3s/%s.dat', [Protocol, DownloadHost, ParentBoard.FBBSID, DatNo, DatNo]);
1482 if Length(DatNo) > 9 then begin
1483 Result := Format('%s://%s/%s/kako/%.4s/%.5s/%s.dat.gz', [Protocol, DownloadHost, ParentBoard.FBBSID, DatNo, DatNo, DatNo]);
1485 Result := Format('%s://%s/%s/kako/%.3s/%s.dat.gz', [Protocol, DownloadHost, ParentBoard.FBBSID, DatNo, DatNo]);
1491 {function TThreadItem.GetOldDatgzURL: string;
1493 Protocol, Host, Path, Document, Port, Bookmark: string;
1495 Result := Format('%s%s/%.3s/%s.gz', [ParentBoard.URL,
1499 if FDownloadHost <> '' then begin
1500 ParseURI(Result, Protocol, Host, Path, Document, Port, Bookmark);
1501 Result := Format('%s://%s%s%s', [Protocol,
1509 function TThreadItem.GetOfflawCgiURL(SessionID: string): string;
1511 // Protocol, Host, Path, Document, Port, Bookmark: string;
1513 // Result := GikoSys.UrlToServer(ParentBoard.URL)
1514 // + 'test/offlaw.cgi/' + ParentBoard.BBSID + '/'
1515 // + ChangeFileExt(FileName, '') + '/?raw=.0&sid=' + HttpEncode(SessionID);
1516 if FDownloadHost = '' then begin
1517 Result := GikoSys.UrlToServer(ParentBoard.URL)
1518 + 'test/offlaw.cgi/' + ParentBoard.BBSID + '/'
1519 + ChangeFileExt(FileName, '') + '/?raw=.0&sid=' + HttpEncode(SessionID);
1521 //http://news.2ch.net/test/offlaw.cgi/newsplus/1014038577/?raw=.196928&sid=
1522 //GikoSys.ParseURI(Result, Protocol, Host, Path, Document, Port, Bookmark);
1523 Result := 'http://' + FDownloadHost
1524 + '/test/offlaw.cgi/' + ParentBoard.BBSID + '/'
1525 + ChangeFileExt(FileName, '') + '/?raw=.0&sid=' + HttpEncode(SessionID);
1526 // Result := Format('%s://%s%s%s', [Protocol,
1533 function TThreadItem.GetSendURL: string;
1535 Result := GikoSys.UrlToServer(ParentBoard.URL)
1539 procedure TThreadItem.DeleteLogFile;
1541 DeleteFile(GetThreadFileName);
1542 if FileExists(ChangeFileExt(GetThreadFileName,'.NG')) = true then
1543 DeleteFile(ChangeFileExt(GetThreadFileName,'.NG'));
1544 FRoundDate := ZERO_DATE;
1545 FLastModified := ZERO_DATE;
1547 FIsLogFile := False;
1550 FNewArrival := False;
1554 FDownloadHost := '';
1555 FAgeSage := gasNone;
1562 function TThreadItem.GetThreadFileName: string;
1564 if Length( FilePath ) > 0 then
1567 Result := ParentBoard.ParentCategory.ParenTBBS.GetLogFolder
1568 + ParentBoard.BBSID + PATH_DELIM + FileName;
1571 procedure TThreadItem.SetLastModified(d: TDateTime);
1573 if FLastModified = d then Exit;
1575 if FUpdate and (ParentBoard <> nil) then
1576 ParentBoard.FModified := True;
1579 {procedure TThreadItem.SetRoundNo(i: Integer);
1581 if FRoundNo = i then Exit;
1583 if FUpdate and (ParentBoard <> nil) then
1584 ParentBoard.FModified := True;
1587 procedure TThreadItem.SetRound(b: Boolean);
1592 RoundList.Delete(Self);
1593 if FRound = b then Exit;
1595 if FUpdate and (ParentBoard <> nil) then
1596 ParentBoard.FModified := True;
1599 procedure TThreadItem.SetRoundName(s: string);
1601 if FRoundName = s then Exit;
1603 if FUpdate and (ParentBoard <> nil) then
1604 ParentBoard.FModified := True;
1607 procedure TThreadItem.SetKokomade(i: Integer);
1609 if FKokomade = i then Exit;
1611 if FUpdate and (ParentBoard <> nil) then
1612 ParentBoard.FModified := True;
1615 procedure TThreadItem.SetUnRead(b: Boolean);
1617 if FUnRead = b then Exit;
1619 if FUpdate and (ParentBoard <> nil) then
1620 ParentBoard.FModified := True;
1623 procedure TThreadItem.SetScrollTop(i: Integer);
1625 if FScrollTop = i then Exit;
1627 if FUpdate and (ParentBoard <> nil) then
1628 ParentBoard.FModified := True;
1631 procedure TThreadItem.BeginUpdate;
1636 procedure TThreadItem.EndUpdate;
1642 BBS2ch := TBBS.Create;
1645 if BBS2ch <> nil then