6 Windows, SysUtils, Classes, ComCtrls, {HTTPApp,} YofUtils, IdGlobal,
7 ExternalBoardManager, ExternalBoardPlugInMain, StrUtils;
10 //
\83\8a\83X
\83g
\82Ì
\95\
\8e¦
\83A
\83C
\83e
\83\80\91I
\91ð
11 TGikoViewType = (gvtAll, gvtLog, gvtNew, gvtLive, gvtArch, gvtUser);
12 //
\83\8a\83X
\83g
\82Ì
\8fã
\82°
\89º
\82°
13 TGikoAgeSage = (gasNone, gasAge, gasSage, gasNew, gasArch, gasNull);
20 // BBS
\82Ì
\83\8b\81[
\83g
24 FFilePath : string; //
\94Â
\83\8a\83X
\83g
\82Ì
\83p
\83X
26 FKubetsuChk: Boolean; //
\8di
\8d\9e\82Ý
\8e\9e\91å
\95¶
\8e\9a\8f¬
\95¶
\8e\9a\8bæ
\95Ê
27 FSelectText: string; //
\8di
\8d\9e\82Ý
\95¶
\8e\9a\97ñ
28 FShortSelectText: string;
29 FIsBoardFileRead : Boolean; //
\94Â
\83\8a\83X
\83g
\82Í
\93Ç
\82Ý
\8d\9e\82Ü
\82ê
\82Ä
\82¢
\82é
\82©
\81H
31 function GetCategory(index: integer): TCategory;
32 procedure SetCategory(index: integer; value: TCategory);
33 procedure SetSelectText(s: string);
35 constructor Create( boardFilePath : string );
36 destructor Destroy; override;
38 function Add(item: TCategory): integer;
39 procedure Delete(index: integer);
40 procedure Clear; override;
41 function Find(key: string): TCategory;
42 function FindBBSID(const BBSID: string): TBoard;
43 function FindBoardFromTitle(const Title: string): TBoard;
44 function FindBoardFromURL(const inURL: string): TBoard;
45 function FindThreadFromURL(const inURL : string ) : TThreadItem;
46 function FindThreadItem(const BBSID, FileName: string): TThreadItem;
47 function FindCategoryFromTitle(const inTitle : string ) : TCategory;
48 property FilePath : string read FFilePath write FFilePath;
50 property Items[index: integer]: TCategory read GetCategory write SetCategory;
51 property Title: string read FTitle write FTitle;
52 property NodeExpand: Boolean read FExpand write FExpand;
54 property KubetsuChk: Boolean read FKubetsuChk write FKubetsuChk;
55 property SelectText: string read FSelectText write SetSelectText;
56 property ShortSelectText: string read FShortSelectText write FShortSelectText;
58 property IsBoardFileRead : Boolean read FIsBoardFileRead write FIsBoardFileRead;
61 //
\83J
\83e
\83S
\83\8a(
\94Â URL
\82Ì
\83\8a\83X
\83g)
62 TCategory = class(TStringList)
69 function GetBoard(index: integer): TBoard;
70 procedure SetBoard(index: integer; value: TBoard);
73 destructor Destroy; override;
75 property No: Integer read FNo write FNo;
76 property Title: string read FTitle write FTitle;
77 property Items[index: integer]: TBoard read GetBoard write SetBoard;
78 property ParenTBBS: TBBS read FParenTBBS write FParenTBBS;
80 function Add(item: TBoard): integer;
81 procedure Delete(index: integer);
82 procedure Clear; override;
83 function FindName(const key: string): TBoard;
84 function FindBBSID(const BBSID: string): TBoard;
85 function FindBoardFromTitle(const Title: string): TBoard;
86 function FindBoardFromURL(const inURL: string): TBoard;
87 function FindThreadFromURL(const inURL : string ) : TThreadItem;
88 function IsMidoku: Boolean;
90 property NodeExpand: Boolean read FExpand write FExpand;
93 //!
\83X
\83\8c\83b
\83h
\90\94\83J
\83E
\83\93\83g
\8fð
\8c\8f\95¶
94 TThreadCount = function(Item : TThreadItem): Boolean;
96 //
\94Â(
\83X
\83\8c\83b
\83h URL
\82Ì
\83\8a\83X
\83g)
97 TBoard = class(TStringList)
99 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é)
101 FNo: Integer; //
\94Ô
\8d\86
102 FTitle: string; //
\83{
\81[
\83h
\83^
\83C
\83g
\83\8b
103 FBBSID: string; //BBSID
104 FURL: string; //
\83{
\81[
\83hURL
105 FRound: Boolean; //
\83X
\83\8c\83b
\83h
\88ê
\97\97\8f\84\89ñ
\97\
\96ñ
106 FRoundName: string; //
\8f\84\89ñ
\96¼
107 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
108 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
109 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
110 FIsThreadDatRead: Boolean; //
\83X
\83\8c\83b
\83h
\83\8a\83X
\83g
\82Í
\93Ç
\82Ý
\8d\9e\82Ü
\82ê
\82Ä
\82¢
\82é
\82©
\81H
111 FUnRead: Integer; //
\83X
\83\8c\83b
\83h
\96¢
\93Ç
\90\94
112 FParentCategory: TCategory; //
\90e
\83J
\83e
\83S
\83\8a
113 FModified: Boolean; //
\8fC
\90³
\83t
\83\89\83O
114 FBoolData: Boolean; //
\82¢
\82ë
\82ñ
\82È
\97p
\93r
\82É
\8eg
\82¤yo
115 FSPID: string; //
\8f\91\82«
\8d\9e\82Ý
\97pSPID
116 FPON: string; //
\8f\91\82«
\8d\9e\82Ý
\97pPON
117 FCookie: string; //
\8f\91\82«
\8d\9e\82Ý
\97pCookie
\95¶
\8e\9a\97ñ
118 FExpires: TDateTime; //Cookie
\82Ì
\97L
\8cø
\8aú
\8cÀ
119 FKotehanName: string; //
\83R
\83e
\83n
\83\93\96¼
\91O
120 FKotehanMail: string; //
\83R
\83e
\83n
\83\93\83\81\81[
\83\8b
125 FBoardPlugIn : TBoardPlugIn; //
\82±
\82Ì
\94Â
\82ð
\83T
\83|
\81[
\83g
\82·
\82é
\83v
\83\89\83O
\83C
\83\93
126 FFilePath : string; //
\82±
\82Ì
\83X
\83\8c\88ê
\97\97\82ª
\95Û
\91¶
\82³
\82ê
\82Ä
\82¢
\82é
\83p
\83X
127 FIsLogFile : Boolean; //
\83\8d\83O
\91¶
\8dÝ
\83t
\83\89\83O
128 FIntData : Integer; //
\8dD
\82«
\82É
\82¢
\82¶
\82Á
\82Ä
\82æ
\82µ
\81B
\82¢
\82ë
\82ñ
\82È
\97p
\93r
\82É
\8eg
\82¤yo
129 FListData : TList; //
\8dD
\82«
\82É
\82¢
\82¶
\82Á
\82Ä
\82æ
\82µ
\81B
\82¢
\82ë
\82ñ
\82È
\97p
\93r
\82É
\8eg
\82¤yo
131 FSETTINGTXTTime : TDateTime; //SETTING.TXT
\82ð
\8eæ
\93¾
\82µ
\82½
\93ú
\8e\9e
132 FIsSETTINGTXT : boolean; //SETTING.TXT
\82ð
\8eæ
\93¾
\82µ
\82Ä
\82¢
\82é
\82©
133 FHEADTXTTime : TDateTime; //HEAD.TXT
\82ð
\8eæ
\93¾
\82µ
\82½
\93ú
\8e\9e
134 FIsHEADTXT : boolean; //HEAD.TXT
\82ð
\8eæ
\93¾
\82µ
\82Ä
\82¢
\82é
\82©
135 FTitlePictureURL: string; //top
\8aG
\82ÌURL
136 FMultiplicity : Integer; //
\8fd
\95¡
\82µ
\82Ä
\82¢
\82é
\82©
\82Ç
\82¤
\82©
\81H
137 FIs2ch : Boolean; //host
\82ª2ch
\82©
\82Ç
\82¤
\82©
138 FNewThreadCount: Integer; //
\90V
\92\85\83X
\83\8c\83b
\83h
\82Ì
\90\94
139 FLogThreadCount: Integer; //
\83\8d\83O
\97L
\82è
\83X
\83\8c\83b
\83h
\82Ì
\90\94
140 FUserThreadCount: Integer; //
\81H
141 FLiveThreadCount: Integer; //
\90¶
\91¶
\83X
\83\8c\83b
\83h
\90\94
142 FArchiveThreadCount: Integer; //DAT
\97\8e\82¿
\83X
\83\8c\83b
\83h
\90\94
143 function GetThreadItem(index: integer): TThreadItem;
144 procedure SetThreadItem(index: integer; value: TThreadItem);
145 procedure SetRound(b: Boolean);
146 procedure SetRoundName(s: string);
147 //procedure SetRoundName(s: PChar);
148 procedure SetLastModified(d: TDateTime);
149 procedure SetLastGetTime(d: TDateTime);
150 procedure SetUnRead(i: Integer);
151 procedure SetKotehanName(s: string);
152 procedure SetKotehanMail(s: string);
155 constructor Create( inPlugIn : TBoardPlugIn; inURL : string );
156 destructor Destroy; override;
158 property Context: DWORD read FContext write FContext;
160 property Items[index: integer]: TThreadItem read GetThreadItem write SetThreadItem;
161 property No: Integer read FNo write FNo;
162 property Title: string read FTitle write FTitle;
163 property BBSID: string read FBBSID write FBBSID;
164 property URL: string read FURL write FURL;
165 property Round: Boolean read FRound write SetRound;
166 //property RoundName: PChar read FRoundName write SetRoundName;
167 property RoundName: string read FRoundName write SetRoundName;
168 property RoundDate: TDateTime read FRoundDate write FRoundDate;
169 property LastModified: TDateTime read FLastModified write SetLastModified;
170 property LastGetTime: TDateTime read FLastGetTime write SetLastGetTime;
171 property UnRead: Integer read FUnRead write SetUnRead;
172 property Modified: Boolean read FModified write FModified;
173 property IsThreadDatRead: Boolean read FIsThreadDatRead write FIsThreadDatRead;
174 property ParentCategory: TCategory read FParentCategory write FParentCategory;
176 property BoardPlugIn : TBoardPlugIn read FBoardPlugIn;
177 property FilePath : string read FFilePath write FFilePath;
178 property IsLogFile : Boolean read FIsLogFile write FIsLogFile;
179 property IntData : Integer read FIntData write FIntData;
180 property ListData : TList read FListData write FListData;
181 function IsBoardPlugInAvailable : Boolean;
183 function Add(item: TThreadItem): integer;
184 procedure Insert(Index: Integer; Item: TThreadItem);
185 procedure Delete(index: integer);
186 procedure DeleteList(index: integer);
187 procedure Clear; override;
188 function FindThreadFromFileName(const ItemFileName: string): TThreadItem;
189 function FindThreadFromURL(const inURL : string ) : TThreadItem;
190 function GetIndexFromFileName(const ItemFileName: string): Integer;
191 function GetIndexFromURL(const URL: string; reverse : Boolean = False): Integer;
192 procedure LoadSettings;
193 procedure SaveSettings;
194 function GetReadCgiURL: string;
195 function GetSubjectFileName: string;
196 function GetFolderIndexFileName: string;
197 function GetSETTINGTXTFileName: string;
198 function GETHEADTXTFileName: string;
199 function GetTitlePictureFileName: string;
200 function GetSendURL: string;
202 function GetNewThreadCount: Integer;
203 function GetLogThreadCount: Integer;
204 function GetArchiveThreadCount: Integer;
205 function GetLiveThreadCount: Integer;
206 function GetUserThreadCount: Integer;
207 function GetNewThread(Index: Integer): TThreadItem;
208 function GetLogThread(Index: Integer): TThreadItem; overload;
209 function GetArchiveThread(Index: Integer): TThreadItem;
210 function GetLiveThread(Index: Integer): TThreadItem;
211 function GetUserThread(Index: Integer): TThreadItem;
212 function GetThreadCount(func :TThreadCount ): Integer;
213 function GetThread(func :TThreadCount;const Index :Integer ): TThreadItem;
214 procedure BeginUpdate;
216 property NodeExpand: Boolean read FExpand write FExpand;
217 property BoolData: Boolean read FBoolData write FBoolData;
218 property SPID: string read FSPID write FSPID;
219 property PON: string read FPON write FPON;
220 property KotehanName: string read FKotehanName write SetKotehanName;
221 property KotehanMail: string read FKotehanMail write SetKotehanMail;
223 property SETTINGTXTTime: TDateTime read FSETTINGTXTTime write FSETTINGTXTTime;
224 property IsSETTINGTXT: boolean read FIsSETTINGTXT write FIsSETTINGTXT;
225 property HEADTXTTime: TDateTime read FHEADTXTTime write FHEADTXTTime;
226 property IsHEADTXT: boolean read FIsHEADTXT write FIsHEADTXT;
227 property TitlePictureURL: string read FTitlePictureURL write FTitlePictureURL;
228 property Multiplicity: Integer read FMultiplicity write FMultiplicity;
229 property Is2ch : boolean read FIs2ch write FIs2ch;
230 property NewThreadCount: Integer read FNewThreadCount write FNewThreadCount; //
\90V
\92\85\83X
\83\8c\83b
\83h
\82Ì
\90\94
231 property LogThreadCount: Integer read FLogThreadCount write FLogThreadCount; //
\83\8d\83O
\97L
\82è
\83X
\83\8c\83b
\83h
\82Ì
\90\94
232 property UserThreadCount: Integer read FUserThreadCount write FUserThreadCount; //
\81H
233 property LiveThreadCount: Integer read FLiveThreadCount write FLiveThreadCount;
234 property ArchiveThreadCount: Integer read FArchiveThreadCount write FArchiveThreadCount;
236 property Cookie: string read FCookie write FCookie;
237 property Expires: TDateTime read FExpires write FExpires;
241 TThreadItem = class(TObject)
243 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é)
244 FNo: Integer; //
\94Ô
\8d\86
245 FFileName: string; //
\83X
\83\8c\83b
\83h
\83t
\83@
\83C
\83\8b\96¼
246 FTitle: string; //
\83X
\83\8c\83b
\83h
\83^
\83C
\83g
\83\8b
247 FShortTitle: string; //
\92Z
\82¢
\83X
\83\8c\83b
\83h
\83^
\83C
\83g
\83\8b\81i
\8c\9f\8dõ
\97p
\81j
248 FRoundDate: TDateTime; //
\83X
\83\8c\83b
\83h
\82ð
\8eæ
\93¾
\82µ
\82½
\93ú
\8e\9e\81i
\8f\84\89ñ
\93ú
\8e\9e\81j
249 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
250 FCount: Integer; //
\83X
\83\8c\83b
\83h
\83J
\83E
\83\93\83g
\81i
\83\8d\81[
\83J
\83\8b\81j
251 FAllResCount: Integer; //
\83X
\83\8c\83b
\83h
\83J
\83E
\83\93\83g
\81i
\83T
\81[
\83o
\81j
252 FNewResCount: Integer; //
\83X
\83\8c\83b
\83h
\90V
\92\85\90\94
253 FSize: Integer; //
\83X
\83\8c\83b
\83h
\83T
\83C
\83Y
254 FRound: Boolean; //
\8f\84\89ñ
\83t
\83\89\83O
255 FRoundName: string; //
\8f\84\89ñ
\96¼
256 FIsLogFile: Boolean; //
\83\8d\83O
\91¶
\8dÝ
\83t
\83\89\83O
257 FParentBoard: TBoard; //
\90e
\83{
\81[
\83h
258 FKokomade: Integer; //
\83R
\83R
\82Ü
\82Å
\93Ç
\82ñ
\82¾
\94Ô
\8d\86
259 FNewReceive: Integer; //
\83R
\83R
\82©
\82ç
\90V
\8bK
\8eó
\90M
260 FNewArrival: Boolean; //
\90V
\92\85
261 FUnRead: Boolean; //
\96¢
\93Ç
\83t
\83\89\83O
262 FScrollTop: Integer; //
\83X
\83N
\83\8d\81[
\83\8b\88Ê
\92u
263 FDownloadHost: string; //
\8d¡
\82Ì
\83z
\83X
\83g
\82Æ
\88á
\82¤
\8fê
\8d\87\82Ì
\83z
\83X
\83g
264 FAgeSage: TGikoAgeSage; //
\83A
\83C
\83e
\83\80\82Ì
\8fã
\82°
\89º
\82°
267 FURL : string; //
\82±
\82Ì
\83X
\83\8c\82ð
\83u
\83\89\83E
\83U
\82Å
\95\
\8e¦
\82·
\82é
\8dÛ
\82Ì URL
268 FJumpAddress : Integer; //
\83\8c\83X
\94Ô
\8d\86\8ew
\92èURL
\82ð
\93¥
\82ñ
\82¾
\82Æ
\82«
\82É
\8ew
\92è
\82³
\82ê
\82é
\83\8c\83X
\82Ì
\94Ô
\8d\86\82ª
\93ü
\82é
269 procedure SetLastModified(d: TDateTime);
270 procedure SetRound(b: Boolean);
271 procedure SetRoundName(const s: string);
272 //procedure SetRoundName(const s: PChar);
273 procedure SetKokomade(i: Integer);
274 procedure SetUnRead(b: Boolean);
275 procedure SetScrollTop(i: Integer);
277 function GetCreateDate: TDateTime;
278 function GetFilePath: String;
280 constructor Create(const inPlugIn : TBoardPlugIn; const inBoard : TBoard; inURL : string ); overload;
281 constructor Create(const inPlugIn : TBoardPlugIn; const inBoard : TBoard;
282 inURL : string; inExist: Boolean; const inFilename: string ); overload;
284 destructor Destroy; override;
286 function GetDatURL: string;
287 function GetDatgzURL: string;
288 // function GetOldDatgzURL: string;
289 function GetOfflawCgiURL(const SessionID: string): string;
290 function GetSendURL: string;
291 procedure DeleteLogFile;
292 function GetThreadFileName: string;
293 procedure BeginUpdate;
296 property Context: DWORD read FContext write FContext;
298 property No: Integer read FNo write FNo;
299 property FileName: string read FFileName write FFileName;
300 property Title: string read FTitle write FTitle;
301 property ShortTitle: string read FShortTitle write FShortTitle;
302 property RoundDate: TDateTime read FRoundDate write FRoundDate;
303 property LastModified: TDateTime read FLastModified write SetLastModified;
304 property Count: Integer read FCount write FCount;
305 property AllResCount: Integer read FAllResCount write FAllResCount;
306 property NewResCount: Integer read FNewResCount write FNewResCount;
307 property Size: Integer read FSize write FSize;
308 property Round: Boolean read FRound write SetRound;
309 property RoundName: string read FRoundName write SetRoundName;
310 //property RoundName: PChar read FRoundName write SetRoundName;
312 property IsLogFile: Boolean read FIsLogFile write FIsLogFile;
313 property ParentBoard: TBoard read FParentBoard write FParentBoard;
314 property Kokomade: Integer read FKokomade write SetKokomade;
315 property NewReceive: Integer read FNewReceive write FNewReceive;
316 property NewArrival: Boolean read FNewArrival write FNewArrival;
317 property UnRead: Boolean read FUnRead write SetUnRead;
318 property ScrollTop: Integer read FScrollTop write SetScrollTop;
319 property Expand: Boolean read FExpand write FExpand;
320 property DownloadHost: string read FDownloadHost write FDownloadHost;
321 property AgeSage: TGikoAgeSage read FAgeSage write FAgeSage;
322 property CreateDate: TDateTime read GetCreateDate;
323 property URL : string read FURL write FURL;
324 property FilePath : string read GetFilePath;
325 property JumpAddress : Integer read FJumpAddress write FJumpAddress;
328 TBoardGroup = class(TStringList)
330 FBoardPlugIn : TBoardPlugIn; //
\82±
\82Ì
\94Â
\82ð
\83T
\83|
\81[
\83g
\82·
\82é
\83v
\83\89\83O
\83C
\83\93
332 destructor Destroy; override;
333 procedure Clear ; override;
334 property BoardPlugIn : TBoardPlugIn read FBoardPlugIn write FBoardPlugIn;
337 //
\93Á
\8eê
\97p
\93r
\97pTBoard
338 TSpecialBoard = class(TBoard)
340 function Add(item: TThreadItem): integer; overload;
341 procedure Clear; overload;
344 function BBSsFindBoardFromBBSID( inBBSID : string ) : TBoard;
345 function BBSsFindBoardFromURL( inURL : string ) : TBoard;
346 function BBSsFindBoardFromTitle( inTitle : string ) : TBoard;
347 function BBSsFindThreadFromURL(const inURL : string ) : TThreadItem;
348 function ConvertDateTimeString( inDateTimeString : string) : TDateTime;
350 procedure DestorySpecialBBS( inBBS : TBBS );
353 BBSs : array of TBBS;
354 BoardGroups : array of TBoardGroup;
360 GikoSystem, RoundData, MojuUtils, DateUtils, IniFiles;
363 BBS2CH_NAME: string = '
\82Q
\82¿
\82á
\82ñ
\82Ë
\82é';
364 BBS2CH_LOG_FOLDER: string = '2ch';
365 EXTERNAL_LOG_FOLDER: string = 'exboard';
367 FOLDER_INI_FILENAME: string = 'Folder.ini';
368 FOLDER_INDEX_FILENAME: string = 'Folder.idx';
369 SUBJECT_FILENAME: string = 'subject.txt';
370 PATH_DELIM: string = '\';
371 SETTINGTXT_FILENAME: string = 'SETTING.TXT';
372 HEADTXT_FILENAME: string = 'head.html';
373 //DEFAULT_LIST_COUNT: Integer = 100;
375 //!
\83\8d\83O
\82ð
\8e\9d\82Á
\82Ä
\82¢
\82é
\82È
\82ç
\90^
\82ð
\95Ô
\82·
376 function CountLog(Item: TThreadItem): Boolean;
378 Result := Item.IsLogFile;
380 //!
\90V
\92\85\82È
\82ç
\90^
\82ð
\95Ô
\82·
381 function CountNew(Item: TThreadItem): Boolean;
383 Result := Item.NewArrival;
385 //! DAT
\97\8e\82¿
\82È
\82ç
\90^
\82ð
\95Ô
\82·
386 function CountDat(Item: TThreadItem): Boolean;
388 Result := (Item.AgeSage = gasArch);
390 //!
\90¶
\91¶
\83X
\83\8c\82È
\82ç
\90^
\82ð
\95Ô
\82·
391 function CountLive(Item: TThreadItem): Boolean;
393 Result := (Item.AgeSage <> gasArch);
397 function CountAll(Item: TThreadItem): Boolean;
404 // BBSID
\82ð
\97p
\82¢
\82é 2
\82¿
\82á
\82ñ
\82Ë
\82é
\82Ì
\82Ý
\92T
\82µ
\8fo
\82µ
\82Ü
\82·
405 // BBSID
\82Ì
\8eg
\97p
\82Í
\8bÉ
\97Í
\94ð
\82¯
\82Ä
\82
\82¾
\82³
\82¢
\81B
406 //
\89Â
\94\
\82È
\8fê
\8d\87\82Í URL
\82ð
\8eg
\97p
\82µ
\82Ä
\82
\82¾
\82³
\82¢
\81B
407 function BBSsFindBoardFromBBSID(
415 // Result := BBSs[ 0 ].FindBBSID( inBBSID );
417 if Length(BoardGroups) > 0 then begin
418 for i := BoardGroups[0].Count - 1 downto 0 do begin
419 tmpBoard := TBoard(BoardGroups[0].Objects[i]);
420 if tmpBoard.Is2ch then begin
421 if AnsiCompareStr(tmpBoard.BBSID, inBBSID) = 0 then begin
430 {**********************************************
431 \82±
\82Ì
\8aÖ
\90\94\82Í
\95K
\82¸
\94Â
\82ÌURL
\82Ì
\8c`
\8e®
\82Å
\93n
\82µ
\82Ä
\82
\82¾
\82³
\82¢
\81B
432 plugin
\82ð
\8eg
\97p
\82·
\82é
\82È
\82ç
\82Î
\81AExtractBoardURL( inURL )
433 2ch
\82È
\82ç
\82Î
\81AGikoSys.Get2chThreadURL2BoardURL( inURL );
434 \82Å
\95Ï
\8a·
\82µ
\82Ä
\82©
\82ç
\8cÄ
\82Ñ
\8fo
\82µ
\82Ä
\82
\82¾
\82³
\82¢
\81B
435 **********************************************}
436 function BBSsFindBoardFromURL(
441 accept : TAcceptType;
442 protocol, host, path, document, port, bookmark : string;
445 for i := Length(BoardGroups) - 1 downto 1 do begin
446 accept := BoardGroups[i].BoardPlugIn.AcceptURL(inURL);
447 if (accept = atBoard) or (accept = atThread) then begin
448 if BoardGroups[i].Find(inURL, p) then begin
449 Result := TBoard(BoardGroups[i].Objects[p]);
452 inURL := BoardGroups[i].BoardPlugIn.ExtractBoardURL(inURL);
453 if BoardGroups[i].Find(inURL, p) then begin
454 Result := TBoard(BoardGroups[i].Objects[p]);
460 //
\82±
\82±
\82É
\82«
\82½
\82ç
\81Aplugin
\82ð
\8eg
\82í
\82È
\82¢
\82â
\82Â
\82ç
\82ð
\92²
\82×
\82é
461 if BoardGroups[0].Find(inURL, p) then
462 Result := TBoard(BoardGroups[0].Objects[p]);
464 if (Result = nil) then begin
465 GikoSys.ParseURI( inURL, protocol, host, path, document, port, bookmark );
466 //
\83z
\83X
\83g
\82ª2ch
\82È
\82çBBSID
\82Å
\92²
\82×
\82é
467 if GikoSys.Is2chHost(host) then begin
468 Result := BBSsFindBoardFromBBSID(GikoSys.URLToID( inURL ));
474 function BBSsFindBoardFromTitle(
482 for i := Length( BBSs ) - 1 downto 0 do begin
483 for j := BoardGroups[i].Count - 1 downto 0 do begin
484 tmpBoard := TBoard(BoardGroups[i].Objects[j]);
485 if ( AnsiCompareStr(tmpBoard.Title, inTitle) = 0) then begin
494 function BBSsFindThreadFromURL(
499 tmpThread : TThreadItem;
501 protocol, host, path, document, port, bookmark : string;
502 BBSID, BBSKey : string;
506 boardURL := GikoSys.GetThreadURL2BoardURL( inURL );
507 board := BBSsFindBoardFromURL( boardURL );
511 Result := board.FindThreadFromURL( inURL );
512 //
\82à
\82µ
\82à2ch
\82Ì
\94Â
\82È
\82ç
513 if (Result = nil) and (board.Is2ch) then begin
514 GikoSys.ParseURI( inURL, protocol, host, path, document, port, bookmark );
515 GikoSys.Parse2chURL( inURL, path, document, BBSID, BBSKey );
516 Result := board.FindThreadFromFileName(BBSKey + '.dat');
517 end else if (Result = nil) and not (board.Is2ch) then begin
518 //
\83v
\83\89\83O
\83C
\83\93\8cn
\82Ì
\92T
\8dõ
\81i
\8eå
\82ÉURL
\82ª
\93r
\92\86\82Å
\95Ï
\8dX
\82É
\82È
\82Á
\82½
\97Þ)
520 bi := Length(BoardGroups) - 1;
521 for i := 1 to bi do begin
522 if (BoardGroups[i].BoardPlugIn <> nil) and (Assigned(Pointer(BoardGroups[i].BoardPlugIn.Module))) then begin
523 if BoardGroups[i].BoardPlugIn.AcceptURL( inURL ) = atThread then begin
524 tmpThread := TThreadItem.Create( BoardGroups[i].BoardPlugIn, Board, inURL );
525 if not board.IsThreadDatRead then begin
526 GikoSys.ReadSubjectFile( board );
528 Result := Board.FindThreadFromFileName( tmpThread.FileName );
542 \brief
\93Á
\8eê
\97p
\93rBBS
\8dí
\8f\9c
543 \param bbs
\8dí
\8f\9c\82·
\82é
\93Á
\8eê
\97p
\93rBBS
545 procedure DestorySpecialBBS( inBBS : TBBS );
547 sCategory : TCategory;
548 sBoard : TSpecialBoard;
550 if inBBS <> nil then begin
551 sCategory := inBBS.Items[0];
552 if sCategory <> nil then begin
553 sBoard := TSpecialBoard(sCategory.Items[0]);
554 if sBoard <> nil then begin
555 sBoard.Modified := False;
564 (*************************************************************************
565 *
\8b@
\94\
\96¼
\81FTBBS
\83R
\83\93\83X
\83g
\83\89\83N
\83^
567 *************************************************************************)
568 constructor TBBS.Create( boardFilePath : string );
571 Title := BBS2CH_NAME;
572 FFilePath := boardFilePath;
575 (*************************************************************************
576 *
\8b@
\94\
\96¼
\81FTBBS
\83f
\83X
\83g
\83\89\83N
\83^
578 *************************************************************************)
579 destructor TBBS.Destroy;
585 (*************************************************************************
588 *************************************************************************)
589 function TBBS.GetCategory(index: integer): TCategory;
591 Result := TCategory(inherited Items[index]);
594 procedure TBBS.SetCategory(index: integer; value: TCategory);
596 inherited Items[index] := value;
599 function TBBS.Add(item: TCategory): integer;
601 Item.ParenTBBS := self;
602 Result := inherited Add(item);
605 procedure TBBS.Delete(index: integer);
607 if Items[index] <> nil then
608 TCategory(Items[index]).Free;
610 inherited Delete(index);
613 procedure TBBS.Clear;
617 for i := Count - 1 downto 0 do
622 function TBBS.Find(key: string): TCategory;
627 function TBBS.FindBBSID(const BBSID: string): TBoard;
631 if not IsBoardFileRead then
632 GikoSys.ReadBoardFile( Self );
633 for i := Count - 1 downto 0 do begin
634 Result := Items[ i ].FindBBSID(BBSID);
635 if Result <> nil then
641 //*************************************************************************
642 //
\83^
\83C
\83g
\83\8b\82Ì
\88ê
\92v
\82·
\82é
\94Â
\82ð
\92T
\82·
643 //*************************************************************************)
644 function TBBS.FindBoardFromTitle(const Title: string): TBoard;
648 if not IsBoardFileRead then
649 GikoSys.ReadBoardFile( Self );
650 for i := Count - 1 downto 0 do begin
651 Result := Items[ i ].FindBoardFromTitle(Title);
652 if Result <> nil then
658 //*************************************************************************
659 // URL
\82ð
\8eó
\82¯
\95t
\82¯
\82é
\94Â
\82ð
\92T
\82·
660 //*************************************************************************)
661 function TBBS.FindBoardFromURL(const inURL: string): TBoard;
665 if not IsBoardFileRead then
666 GikoSys.ReadBoardFile( Self );
667 for i := Count - 1 downto 0 do begin
668 Result := Items[ i ].FindBoardFromURL( inURL );
669 if Result <> nil then
675 //*************************************************************************
676 // URL
\82ð
\8eó
\82¯
\95t
\82¯
\82é
\83X
\83\8c\83b
\83h
\82ð
\92T
\82·
677 //*************************************************************************)
678 function TBBS.FindThreadFromURL(const inURL: string): TThreadItem;
684 boardURL := GikoSys.GetThreadURL2BoardURL( inURL );
685 board := FindBoardFromURL( boardURL );
689 Result := board.FindThreadFromURL( inURL );
693 function TBBS.FindThreadItem(const BBSID, FileName: string): TThreadItem;
698 Board := FindBBSID(BBSID);
701 Result := Board.FindThreadFromFileName(FileName);
704 function TBBS.FindCategoryFromTitle(const inTitle : string ) : TCategory;
709 for i := Count - 1 downto 0 do begin
710 if AnsiCompareStr(Items[ i ].Title, inTitle) = 0 then begin
711 Result := Items[ i ];
720 procedure TBBS.SetSelectText(s: string);
723 ShortSelectText := CustomStringReplace(ZenToHan(s), ' ', '');
726 {class function TBBS.GetColumnName(Index: Integer): string;
728 Result := COLUMN_CATEGORY[Index];
731 class function TBBS.GetColumnCount: Integer;
733 Result := Length(COLUMN_CATEGORY);
736 //===================
738 //===================
739 constructor TCategory.Create;
743 Duplicates := dupIgnore;
744 CaseSensitive := False;
748 destructor TCategory.Destroy;
754 function TCategory.GetBoard(index: integer): TBoard;
756 Result := TBoard( Objects[index] );
759 procedure TCategory.SetBoard(index: integer; value: TBoard);
761 Objects[index] := value;
762 Strings[index] := value.URL
765 function TCategory.Add(item: TBoard): integer;
767 Item.ParentCategory := self;
768 Result := AddObject( item.URL, item );
771 procedure TCategory.Delete(index: integer);
773 inherited Delete(index);
776 procedure TCategory.Clear;
780 for i := Count - 1 downto 0 do
785 function TCategory.FindName(const key: string): TBoard;
790 function TCategory.FindBBSID(const BBSID: string): TBoard;
794 for i := Count - 1 downto 0 do begin
795 if AnsiCompareStr(Items[i].FBBSID, BBSID) = 0 then begin
803 //*************************************************************************
804 //
\83^
\83C
\83g
\83\8b\82Ì
\88ê
\92v
\82·
\82é
\94Â
\82ð
\92T
\82·
805 //*************************************************************************)
806 function TCategory.FindBoardFromTitle(const Title: string): TBoard;
810 for i := Count - 1 downto 0 do begin
811 if AnsiCompareStr(Items[i].FTitle, Title) = 0 then begin
819 //*************************************************************************
820 // URL
\82ð
\8eó
\82¯
\95t
\82¯
\82é
\94Â
\82ð
\92T
\82·
821 //*************************************************************************)
822 function TCategory.FindBoardFromURL(const inURL: string): TBoard;
826 i := IndexOf( inURL );
828 Result := TBoard( Objects[ i ] )
833 //*************************************************************************
834 // URL
\82ð
\8eó
\82¯
\95t
\82¯
\82é
\83X
\83\8c\83b
\83h
\82ð
\92T
\82·
835 //*************************************************************************)
836 function TCategory.FindThreadFromURL(const inURL: string): TThreadItem;
842 boardURL := GikoSys.GetThreadURL2BoardURL( inURL );
843 board := FindBoardFromURL( boardURL );
847 Result := board.FindThreadFromURL( inURL );
851 function TCategory.IsMidoku: Boolean;
857 for i := 0 to Count - 1 do begin
858 if Items[i] <> nil then begin
859 for j := 0 to Items[i].Count - 1 do begin
860 if Items[i].Items[j] <> nil then begin
861 // if (Items[i].Items[j].IsLogFile) and (Items[i].Items[j].Count > Items[i].Items[j].Kokomade) then begin
862 if (Items[i].Items[j].IsLogFile) and (Items[i].Items[j].UnRead) then begin
872 {class function TCategory.GetColumnName(Index: Integer): string;
874 Result := COLUMN_BOARD[Index];
877 class function TCategory.GetColumnCount: Integer;
879 Result := Length(COLUMN_BOARD);
882 //===================
884 //===================
885 procedure TBoard.Init;
887 Duplicates := dupIgnore;
888 CaseSensitive := False;
896 FRoundDate := ZERO_DATE;
897 FLastModified := ZERO_DATE;
898 FLastGetTime := ZERO_DATE;
899 FIsThreadDatRead := False;
902 // FListStyle := vsReport;
903 // FItemNoVisible := True;
908 // *************************************************************************
909 //
\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^
910 // *************************************************************************
911 constructor TBoard.Create(
912 inPlugIn : TBoardPlugIn;
916 protocol, host, path, document, port, bookmark : string;
922 FBoardPlugIn := inPlugIn;
924 BBSID := GikoSys.UrlToID( inURL );
926 if inPlugIn = nil then begin
927 // subject.txt
\82Ì
\95Û
\91¶
\83p
\83X
\82ð
\90Ý
\92è
928 GikoSys.ParseURI( inURL, protocol, host, path, document, port, bookmark );
929 if GikoSys.Is2chHost( host ) then begin
932 GikoSys.Setting.LogFolderP +
933 BBS2CH_LOG_FOLDER + PATH_DELIM + BBSID + PATH_DELIM + SUBJECT_FILENAME
937 GikoSys.Setting.LogFolderP +
938 EXTERNAL_LOG_FOLDER + PATH_DELIM + host + PATH_DELIM + BBSID + PATH_DELIM + SUBJECT_FILENAME
941 //
\83v
\83\89\83O
\83C
\83\93\82É TBoardItem
\82ª
\8dì
\90¬
\82³
\82ê
\82½
\82±
\82Æ
\82ð
\93`
\82¦
\82é
942 inPlugIn.CreateBoardItem( DWORD( Self ) );
943 //Self.Is2ch := False; //plugin
\91¤
\82Å
\90Ý
\92è
\82·
\82é
948 // *************************************************************************
949 //
\83f
\83X
\83g
\83\89\83N
\83^
950 // *************************************************************************
951 destructor TBoard.Destroy;
953 if FModified then begin
954 GikoSys.WriteThreadDat(Self);
958 //
\83v
\83\89\83O
\83C
\83\93\82É TBoardItem
\82ª
\94j
\8aü
\82³
\82ê
\82½
\82±
\82Æ
\82ð
\93`
\82¦
\82é
959 if IsBoardPlugInAvailable then
960 BoardPlugIn.DisposeBoardItem( DWORD( Self ) );
966 // *************************************************************************
967 //
\8aO
\95\94\94Â
\83v
\83\89\83O
\83C
\83\93\82ª
\8eg
\97p
\89Â
\94\
\82©
968 // *************************************************************************
969 function TBoard.IsBoardPlugInAvailable : Boolean;
973 if BoardPlugIn = nil then
976 if not Assigned( Pointer( BoardPlugIn.Module ) ) then
987 function TBoard.GetThreadItem(index: integer): TThreadItem;
989 Result := TThreadItem( Objects[index] );
992 procedure TBoard.SetThreadItem(index: integer; value: TThreadItem);
994 Objects[index] := value;
995 Strings[index] := value.URL;
998 function TBoard.Add(Item: TThreadItem): Integer;
1000 Item.ParentBoard := Self;
1001 Result := inherited AddObject(Item.URL, Item);
1004 procedure TBoard.Insert(Index: Integer; Item: TThreadItem);
1006 Item.ParentBoard := Self;
1007 inherited InsertObject(Index, Item.URL, Item);
1011 //Index
\82Å
\8ew
\92è
\82³
\82ê
\82½
\83X
\83\8c\83b
\83h
\83I
\83u
\83W
\83F
\83N
\83g
\82ð
\94j
\8aü
1012 procedure TBoard.Delete(index: Integer);
1014 if Items[index] <> nil then
1015 TThreadItem(Items[index]).Free;
1016 inherited Delete(index);
1019 //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
1020 procedure TBoard.DeleteList(index: integer);
1022 inherited Delete(index);
1025 procedure TBoard.Clear;
1030 for i := Count - 1 downto 0 do
1035 function TBoard.FindThreadFromFileName(const ItemFileName: string): TThreadItem;
1040 for i := 0 to Count - 1 do begin
1041 if AnsiCompareStr(Items[i].FileName, ItemFileName) = 0 then begin
1048 function TBoard.GetIndexFromFileName(const ItemFileName: string): Integer;
1053 for i := 0 to Count - 1 do begin
1054 if Items[i].FileName = ItemFileName then begin
1061 function TBoard.GetIndexFromURL(const URL: string; reverse : Boolean = False): Integer;
1066 Result := IndexOf( URL )
1069 for i := Self.Count - 1 downto 0 do begin
1070 if Strings[i] = URL then begin
1078 function TBoard.FindThreadFromURL(const inURL : string ) : TThreadItem;
1083 if not IsThreadDatRead then
1084 GikoSys.ReadSubjectFile( Self );
1086 i := IndexOf( inURL );
1088 Result := TThreadItem( Objects[ i ] )
1094 {function TBoard.GetMidokuCount: Integer;
1099 for i := 0 to Count- 1 do begin
1100 if Items[i] <> nil then begin
1101 if (Items[i].IsLogFile) and (Items[i].Count > Items[i].Kokomade) then
1108 procedure TBoard.LoadSettings;
1114 if Length( FilePath ) > 0 then
1115 FileName := ExtractFilePath( FilePath ) + FOLDER_INI_FILENAME
1117 FileName := GikoSys.Setting.LogFolderP
1118 + BBS2CH_LOG_FOLDER + PATH_DELIM + BBSID + PATH_DELIM + FOLDER_INI_FILENAME;
1120 if not FileExists(FileName) then
1122 ini := TMemIniFile.Create(FileName);
1124 // Round := ini.ReadBool('Status', 'Round', False);
1125 tmp := ini.ReadString('Status', 'RoundDate', DateTimeToStr(ZERO_DATE));
1126 FRoundDate := ConvertDateTimeString(tmp);
1127 tmp := ini.ReadString('Status', 'LastModified', DateTimeToStr(ZERO_DATE));
1128 FLastModified := ConvertDateTimeString(tmp);
1129 tmp := ini.ReadString('Status', 'LastGetTime', DateTimeToStr(ZERO_DATE));
1130 FLastGetTime := ConvertDateTimeString(tmp);
1132 tmp := ini.ReadString('BoardInformation', 'SETTINGTXTTime', DateTimeToStr(ZERO_DATE));
1133 FSETTINGTXTTime := ConvertDateTimeString(tmp);
1134 tmp := ini.ReadString('BoardInformation', 'HEADTXTTime', DateTimeToStr(ZERO_DATE));
1135 FHEADTXTTime := ConvertDateTimeString(tmp);
1137 FIsSETTINGTXT := ini.ReadBool('BoardInformation', 'IsSETTINGTXT', false);
1138 FIsHEADTXT := ini.ReadBool('BoardInformation', 'IsHEADTXT', false);
1139 FTitlePictureURL := ini.ReadString('BoardInformation', 'TitlePictureURL', '');
1141 FUnRead := ini.ReadInteger('Status', 'UnRead', 0);
1142 FSPID := ini.ReadString('Cookie', 'SPID', '');
1143 FPON := ini.ReadString('Cookie', 'PON', '');
1144 FCookie := ini.ReadString('Cookie', 'Cookie', '');
1145 tmp := ini.ReadString('Cookie', 'Expires', DateTimeToStr(ZERO_DATE));
1146 FExpires := ConvertDateTimeString(tmp);
1147 FKotehanName := ini.ReadString('Kotehan', 'Name', '');
1148 FKotehanMail := ini.ReadString('Kotehan', 'Mail', '');
1157 procedure TBoard.SaveSettings;
1162 if Length( FilePath ) > 0 then
1163 FileName := ExtractFilePath( FilePath )
1165 FileName := GikoSys.Setting.LogFolderP
1166 + BBS2CH_LOG_FOLDER + PATH_DELIM + BBSID + PATH_DELIM;
1167 if not GikoSys.DirectoryExistsEx(FileName) then
1168 GikoSys.ForceDirectoriesEx(FileName);
1169 FileName := FileName + FOLDER_INI_FILENAME;
1170 ini := TMemIniFile.Create(FileName);
1174 // ini.WriteBool('Status', 'Round', Round);
1175 ini.WriteDateTime('Status', 'RoundDate', FRoundDate);
1176 ini.WriteDateTime('Status', 'LastModified', FLastModified);
1177 ini.WriteDateTime('Status', 'LastGetTime', FLastGetTime);
1178 ini.WriteInteger('Status', 'UnRead', FUnRead);
1179 ini.WriteString('Cookie', 'SPID', FSPID);
1180 ini.WriteString('Cookie', 'PON', FPON);
1181 ini.WriteString('Cookie', 'Cookie', FCookie);
1182 ini.WriteDateTime('Cookie', 'Expires', FExpires);
1183 ini.WriteString('Kotehan', 'Name', FKotehanName);
1184 ini.WriteString('Kotehan', 'Mail', FKotehanMail);
1186 ini.WriteDateTime('BoardInformation', 'SETTINGTXTTime', FSETTINGTXTTime);
1187 ini.WriteDateTime('BoardInformation', 'HEADTXTTime', FHEADTXTTime);
1189 ini.WriteBool('BoardInformation', 'IsSETTINGTXT', FIsSETTINGTXT);
1190 ini.WriteBool('BoardInformation', 'IsHEADTXT', FIsHEADTXT);
1191 ini.WriteString('BoardInformation', 'TitlePictureURL', FTitlePictureURL);
1192 // ini.WriteInteger('Status', 'ListStyle', Ord(ListStyle));
1193 // ini.WriteBool('Status', 'ItemNoVisible', ItemNoVisible);
1194 // ini.WriteInteger('Status', 'ViewType', Ord(ViewType));
1200 //
\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ð
1201 // 2003/02/08 0:32:13
\82É
\95Ï
\8a·
\82·
\82é
1202 function ConvertDateTimeString( inDateTimeString : string) : TDateTime;
1204 ZERO_DATE_STRING : string = '1970/01/01 0:00:00';
1214 if inDateTimeString = '' then
1215 inDateTimeString := ZERO_DATE_STRING;
1217 if ( AnsiPos('/', inDateTimeString ) = 0 ) and
1218 ( AnsiCompareStr( DateTimeToStr(ZERO_DATE), inDateTimeString) <> 0 ) then begin
1219 for i := 0 to 1 do begin
1220 Insert('/',inDateTimeString, AnsiPos(' ', inDateTimeString) + 1 );
1221 Delete(inDateTimeString, AnsiPos(' ', inDateTimeString), 1);
1225 Result := StrToDateTime( inDateTimeString );
1227 if( inDateTimeString[5] = '/' ) and ( inDateTimeString[8] = '/' ) then begin
1228 y := StrToIntDef( Copy(inDateTimeString, 1, 4), 1970 );
1229 m := StrToIntDef( Copy(inDateTimeString, 6, 2), 1 );
1230 d := StrToIntDef( Copy(inDateTimeString, 9, 2), 1 );
1231 hour := 0; min := 0; sec := 0;
1233 if Length(inDateTimeString) > 11 then begin
1234 if( inDateTimeString[13] = ':' ) and ( inDateTimeString[16] = ':' ) then begin
1235 hour := StrToIntDef( Copy(inDateTimeString, 12, 1), 0 );
1236 min := StrToIntDef( Copy(inDateTimeString, 14, 2), 0 );
1237 sec := StrToIntDef( Copy(inDateTimeString, 17, 2), 0 );
1238 end else if( inDateTimeString[14] = ':' ) and ( inDateTimeString[17] = ':' ) then begin
1239 hour := StrToIntDef( Copy(inDateTimeString, 12, 2), 0 );
1240 min := StrToIntDef( Copy(inDateTimeString, 15, 2), 0 );
1241 sec := StrToIntDef( Copy(inDateTimeString, 18, 2), 0 );
1245 Result := EncodeDateTime(y ,m, d, hour, min, sec, 0);
1247 Result := ZERO_DATE;
1250 Result := ZERO_DATE;
1254 // Result := inDateTimeString;
1256 //!
\83T
\83u
\83W
\83F
\83N
\83gURL
\8eæ
\93¾
1257 function TBoard.GetReadCgiURL: string;
1259 Result := URL + SUBJECT_FILENAME;
1263 //!
\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
1264 function TBoard.GetSubjectFileName: string;
1266 if Length( FilePath ) > 0 then
1269 Result := GikoSys.Setting.LogFolderP
1270 + BBS2CH_LOG_FOLDER + PATH_DELIM + BBSID + PATH_DELIM + SUBJECT_FILENAME;
1273 //!
\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
1274 function TBoard.GetFolderIndexFileName: string;
1276 if Length( FilePath ) > 0 then
1277 Result := ExtractFilePath( FilePath ) + FOLDER_INDEX_FILENAME
1279 Result := GikoSys.Setting.LogFolderP
1280 + BBS2CH_LOG_FOLDER + PATH_DELIM + BBSID + PATH_DELIM + FOLDER_INDEX_FILENAME;
1282 //! SETTING.TXT
\82Ì
\83t
\83@
\83C
\83\8b\96¼
\8eæ
\93¾
1283 function TBoard.GetSETTINGTXTFileName: string;
1285 if Length( FilePath ) > 0 then
1286 Result := ExtractFilePath( FilePath ) + SETTINGTXT_FILENAME
1288 Result := GikoSys.Setting.LogFolderP
1289 + BBS2CH_LOG_FOLDER + PATH_DELIM + BBSID + PATH_DELIM + SETTINGTXT_FILENAME;
1292 function TBoard.GETHEADTXTFileName: string;
1294 if Length( FilePath ) > 0 then
1295 Result := ExtractFilePath( FilePath ) + HEADTXT_FILENAME
1297 Result := GikoSys.Setting.LogFolderP
1298 + BBS2CH_LOG_FOLDER + PATH_DELIM + BBSID + PATH_DELIM + HEADTXT_FILENAME;
1300 function TBoard.GetTitlePictureFileName: string;
1304 if FTitlePictureURL = '' then
1307 tmpName := Copy(FTitlePictureURL, LastDelimiter('/', FTitlePictureURL) + 1, Length(FTitlePictureURL));
1308 if Length( FilePath ) > 0 then
1309 Result := ExtractFilePath( FilePath ) + tmpName
1311 Result := GikoSys.Setting.LogFolderP
1312 + BBS2CH_LOG_FOLDER + PATH_DELIM + BBSID + PATH_DELIM + tmpName;
1316 //
\83X
\83\8c\97§
\82Ä
\91\97\90MURL
1317 function TBoard.GetSendURL: string;
1319 Result := GikoSys.UrlToServer(URL);
1321 Result := Result + 'test/bbs.cgi'
1323 Result := Result + 'test/subbbs.cgi';
1327 procedure TBoard.SetRound(b: Boolean);
1332 RoundList.Delete(Self);
1333 if FRound = b then Exit;
1339 procedure TBoard.SetRoundName(s: string);
1341 if FRoundName = s then Exit;
1347 procedure TBoard.SetLastModified(d: TDateTime);
1349 if FLastModified = d then Exit;
1355 procedure TBoard.SetLastGetTime(d: TDateTime);
1357 if FLastGetTime = d then Exit;
1363 procedure TBoard.SetUnRead(i: Integer);
1365 if FUnRead = i then Exit;
1366 if i < 0 then i := 0;
1372 procedure TBoard.SetKotehanName(s: string);
1374 if FKotehanName = s then Exit;
1380 procedure TBoard.SetKotehanMail(s: string);
1382 if FKotehanMail = s then Exit;
1387 //! func
\82Ì
\8fð
\8c\8f\82É
\88ê
\92v
\82·
\82é
\83X
\83\8c\83b
\83h
\82Ì
\90\94\82ð
\95Ô
\82·
1388 function TBoard.GetThreadCount(func :TThreadCount ): Integer;
1393 if Length( ParentCategory.ParenTBBS.ShortSelectText ) = 0 then
1395 for i := 0 to Count - 1 do begin
1396 if func(Items[i]) then
1400 for i := 0 to Count - 1 do begin
1401 if func(Items[i]) then
1403 if Items[i].ShortTitle = '' then
1404 Items[i].ShortTitle := CustomStringReplace(ZenToHan(Items[i].Title), ' ', '');
1405 if AnsiPos(ParentCategory.ParenTBBS.ShortSelectText, Items[i].ShortTitle) <> 0 then
1411 //!
\90V
\92\85\83X
\83\8c\83b
\83h
\82Ì
\90\94\82ð
\8eæ
\93¾
\82·
\82é
1412 function TBoard.GetNewThreadCount: Integer;
1414 Result := GetThreadCount(CountNew);
1416 //!
\83\8d\83O
\97L
\82è
\83X
\83\8c\83b
\83h
\82Ì
\90\94\82ð
\8eæ
\93¾
\82·
\82é
1417 function TBoard.GetLogThreadCount: Integer;
1419 Result := GetThreadCount(CountLog);
1421 //!
\8di
\8d\9e\82Ý
\8fð
\8c\8f\82É
\88ê
\92v
\82·
\82é
\83X
\83\8c\83b
\83h
\82Ì
\90\94\82ð
\8eæ
\93¾
\82·
\82é
1422 function TBoard.GetUserThreadCount: Integer;
1424 Result := GetThreadCount(CountAll);
1426 //! DAT
\97\8e\82¿
\83X
\83\8c\83b
\83h
\82Ì
\90\94\82ð
\8eæ
\93¾
\82·
\82é
1427 function TBoard.GetArchiveThreadCount: Integer;
1429 Result := GetThreadCount(CountDat);
1431 //!
\90¶
\91¶
\83X
\83\8c\83b
\83h
\82Ì
\90\94\82ð
\8eæ
\93¾
\82·
\82é
1432 function TBoard.GetLiveThreadCount: Integer;
1434 Result := GetThreadCount(CountLive);
1436 //! func
\82Ì
\8fð
\8c\8f\82É
\93K
\8d\87\82·
\82éIndex
\94Ô
\96Ú
\82Ì
\83X
\83\8c\83b
\83h
\82ð
\8eæ
\93¾
\82·
\82é
1437 function TBoard.GetThread(func :TThreadCount;const Index :Integer ): TThreadItem;
1444 if Length( ParentCategory.ParenTBBS.ShortSelectText ) = 0 then
1446 for i := 0 to Count - 1 do begin
1447 if func(Items[i]) then begin
1448 if Index = Cnt then begin
1456 for i := 0 to Count - 1 do begin
1457 if func(Items[i]) then begin
1458 if Length(Items[i].ShortTitle) = 0 then
1459 Items[i].ShortTitle := CustomStringReplace(ZenToHan(Items[i].Title), ' ', '');
1460 if AnsiPos(ParentCategory.ParenTBBS.ShortSelectText, Items[i].ShortTitle) <> 0 then begin
1461 if Index = Cnt then begin
1471 //! DAT
\97\8e\82¿
\83X
\83\8c\83b
\83h
\82ÅIndex
\94Ô
\96Ú
\82Ì
\83X
\83\8c\83b
\83h
\82ð
\8eæ
\93¾
\82·
\82é
1472 function TBoard.GetArchiveThread(Index: Integer): TThreadItem;
1474 Result := GetThread(CountDat, Index);
1476 //!
\90¶
\91¶
\83X
\83\8c\83b
\83h
\82ÅIndex
\94Ô
\96Ú
\82Ì
\83X
\83\8c\83b
\83h
\82ð
\8eæ
\93¾
\82·
\82é
1477 function TBoard.GetLiveThread(Index: Integer): TThreadItem;
1479 Result := GetThread(CountLive, Index);
1481 //!
\90V
\92\85\83X
\83\8c\83b
\83h
\82ÅIndex
\94Ô
\96Ú
\82Ì
\83X
\83\8c\83b
\83h
\82ð
\8eæ
\93¾
\82·
\82é
1482 function TBoard.GetNewThread(Index: Integer): TThreadItem;
1484 Result := GetThread(CountNew, Index);
1486 //! Log
\82 \82è
\83X
\83\8c\83b
\83h
\82ÌIndex
\94Ô
\96Ú
\82Ì
\83X
\83\8c\83b
\83h
\82ð
\8eæ
\93¾
\82·
\82é
1487 function TBoard.GetLogThread(Index: Integer): TThreadItem;
1489 Result := GetThread(CountLog, Index);
1491 //!
\8di
\8d\9e\82Ý
\82ÅIndex
\94Ô
\96Ú
\82Ì
\83X
\83\8c\83b
\83h
\82ð
\8eæ
\93¾
\82·
\82é
1492 function TBoard.GetUserThread(Index: Integer): TThreadItem;
1494 Result := GetThread(CountAll, Index);
1497 procedure TBoard.BeginUpdate;
1502 procedure TBoard.EndUpdate;
1507 //constructor TThreadItem.Create(AOwner: TComponent);
1508 procedure TThreadItem.Init;
1513 FRoundDate := ZERO_DATE;
1514 FLastModified := ZERO_DATE;
1520 FIsLogFile := False;
1521 FParentBoard := nil;
1524 FNewArrival := False;
1531 // *************************************************************************
1532 //
\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^
1533 // *************************************************************************
1534 constructor TThreadItem.Create(
1535 const inPlugIn : TBoardPlugIn;
1536 const inBoard : TBoard;
1541 protocol, host, path, document, port, bookmark : string;
1542 BBSID, BBSKey : string;
1544 READ_PATH = '/test/read.cgi';
1549 FParentBoard := inBoard;
1550 //FBoardPlugIn := inPlugIn;
1553 if inPlugIn = nil then begin
1554 foundPos := Pos( READ_PATH, inURL );
1555 if foundPos > 0 then begin
1556 // dat
\82Ì
\95Û
\91¶
\83p
\83X
\82ð
\90Ý
\92è
1557 GikoSys.ParseURI( inURL, protocol, host, path, document, port, bookmark );
1558 GikoSys.Parse2chURL( inURL, path, document, BBSID, BBSKey );
1559 FileName := BBSKey + '.dat';
1560 IsLogFile := FileExists( FilePath );
1561 URL := GikoSys.Get2chBrowsableThreadURL( inURL );
1564 //
\83v
\83\89\83O
\83C
\83\93\82É TThreadItem
\82ª
\8dì
\90¬
\82³
\82ê
\82½
\82±
\82Æ
\82ð
\93`
\82¦
\82é
1565 inPlugIn.CreateThreadItem( DWORD( Self ) );
1569 // *************************************************************************
1570 //
\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^ Log
\97L
\82è
\82©
\82Ç
\82¤
\82©
\94»
\92f
\8dÏ
\82Ý
1571 // FileName
\82à
\8eæ
\93¾
\8dÏ
\82Ý
\81@
\81¨
\81@ReadSubject
\97p
1572 // *************************************************************************
1573 constructor TThreadItem.Create(
1574 const inPlugIn : TBoardPlugIn;
1575 const inBoard : TBoard;
1578 const inFilename: string
1584 FParentBoard := inBoard;
1587 if inPlugIn = nil then begin
1588 // dat
\82Ì
\95Û
\91¶
\83p
\83X
\82ð
\90Ý
\92è
1589 FileName := inFilename;
1590 IsLogFile := inExist;
1591 URL := GikoSys.Get2chBrowsableThreadURL( inURL );
1593 //
\83v
\83\89\83O
\83C
\83\93\82É TThreadItem
\82ª
\8dì
\90¬
\82³
\82ê
\82½
\82±
\82Æ
\82ð
\93`
\82¦
\82é
1594 inPlugIn.CreateThreadItem( DWORD( Self ) );
1598 // *************************************************************************
1599 //
\83f
\83X
\83g
\83\89\83N
\83^
1600 // *************************************************************************
1601 destructor TThreadItem.Destroy;
1604 //
\83v
\83\89\83O
\83C
\83\93\82É TThreadItem
\82ª
\94j
\8aü
\82³
\82ê
\82½
\82±
\82Æ
\82ð
\93`
\82¦
\82é
1605 if Self.ParentBoard.IsBoardPlugInAvailable then
1606 Self.ParentBoard.BoardPlugIn.DisposeThreadItem( DWORD( Self ) );
1612 function TThreadItem.GetDatURL: string;
1614 Protocol, Host, Path, Document, Port, Bookmark: string;
1616 Result := ParentBoard.URL
1619 if FDownloadHost <> '' then begin
1620 GikoSys.ParseURI(Result, Protocol, Host, Path, Document, Port, Bookmark);
1621 Result := Format('%s://%s%s%s', [Protocol,
1626 // Result := GikoSys.UrlToServer(ParentBoard.URL)
1627 // + 'test/read.cgi/' + ParentBoard.BBSID + '/'
1628 // + ChangeFileExt(FileName, '') + '/?raw='
1629 // + IntToStr(ResNum) + '.' + IntToStr(ResSize);
1632 function TThreadItem.GetDatgzURL: string;
1633 function isOldKako(s: string): Boolean;
1636 if AnsiPos('piza.', s) <> 0 then
1638 else if AnsiPos('www.bbspink.', s) <> 0 then
1640 else if AnsiPos('tako.', s) <> 0 then
1644 Protocol, Host, Path, Document, Port, Bookmark: string;
1647 if FDownloadHost = '' then begin
1648 DatNo := ChangeFileExt(FileName, '');
1649 if isOldKako(ParentBoard.URL) then begin
1650 Result := Format('%s%s/%.3s/%s.dat', [ParentBoard.URL, 'kako', DatNo, DatNo]);
1652 if Length(DatNo) > 9 then begin
1653 //http://xxx.2ch.net/xxx/kako/9999/99999/999999999.dat.gz
1654 Result := Format('%s%s/%.4s/%.5s/%s.dat.gz', [ParentBoard.URL, 'kako', DatNo, DatNo, DatNo]);
1656 //http://xxx.2ch.net/xxx/kako/999/999999999.dat.gz
1657 Result := Format('%s%s/%.3s/%s.dat.gz', [ParentBoard.URL, 'kako', DatNo, DatNo]);
1661 Gikosys.ParseURI(Result, Protocol, Host, Path, Document, Port, Bookmark);
1662 DatNo := ChangeFileExt(Document, '');
1663 if isOldKako(DownloadHost) then begin
1664 Result := Format('%s://%s/%s/kako/%.3s/%s.dat', [Protocol, DownloadHost, ParentBoard.FBBSID, DatNo, DatNo]);
1666 if Length(DatNo) > 9 then begin
1667 Result := Format('%s://%s/%s/kako/%.4s/%.5s/%s.dat.gz', [Protocol, DownloadHost, ParentBoard.FBBSID, DatNo, DatNo, DatNo]);
1669 Result := Format('%s://%s/%s/kako/%.3s/%s.dat.gz', [Protocol, DownloadHost, ParentBoard.FBBSID, DatNo, DatNo]);
1675 function TThreadItem.GetOfflawCgiURL(const SessionID: string): string;
1677 if FDownloadHost = '' then begin
1678 Result := GikoSys.UrlToServer(ParentBoard.URL)
1679 + 'test/offlaw.cgi/' + ParentBoard.BBSID + '/'
1680 + ChangeFileExt(FileName, '') + '/?raw=.0&sid=' + HttpEncode(SessionID);
1682 //http://news.2ch.net/test/offlaw.cgi/newsplus/1014038577/?raw=.196928&sid=
1683 //GikoSys.ParseURI(Result, Protocol, Host, Path, Document, Port, Bookmark);
1684 Result := 'http://' + FDownloadHost
1685 + '/test/offlaw.cgi/' + ParentBoard.BBSID + '/'
1686 + ChangeFileExt(FileName, '') + '/?raw=.0&sid=' + HttpEncode(SessionID);
1690 function TThreadItem.GetSendURL: string;
1692 Result := GikoSys.UrlToServer(ParentBoard.URL)
1696 procedure TThreadItem.DeleteLogFile;
1698 tmpFileName: String;
1700 ParentBoard.BeginUpdate;
1703 ParentBoard.UnRead := ParentBoard.UnRead - 1;
1704 DeleteFile(GetThreadFileName);
1705 //
\8e\8e\8c±
\93I
\82Étmp
\82à
\8dí
\8f\9c\82µ
\82Ä
\82Ý
\82é
1706 tmpFileName := StringReplace(GetThreadFileName, 'dat', 'tmp', [rfReplaceAll]);
1707 DeleteFile(tmpFileName);
1709 if FileExists(ChangeFileExt(GetThreadFileName,'.NG')) = true then
1710 DeleteFile(ChangeFileExt(GetThreadFileName,'.NG'));
1711 FRoundDate := ZERO_DATE;
1712 FLastModified := ZERO_DATE;
1714 FIsLogFile := False;
1717 FNewArrival := False;
1721 FDownloadHost := '';
1722 FAgeSage := gasNone;
1728 ParentBoard.EndUpdate;
1729 ParentBoard.Modified := True;
1732 function TThreadItem.GetThreadFileName: string;
1734 if Length( FilePath ) > 0 then
1737 Result := GikoSys.Setting.LogFolderP
1738 + BBS2CH_LOG_FOLDER + PATH_DELIM + ParentBoard.BBSID + PATH_DELIM + FileName;
1741 procedure TThreadItem.SetLastModified(d: TDateTime);
1743 if FLastModified = d then Exit;
1745 if FUpdate and (ParentBoard <> nil) then
1746 ParentBoard.FModified := True;
1749 procedure TThreadItem.SetRound(b: Boolean);
1754 RoundList.Delete(Self);
1755 if FRound = b then Exit;
1757 if FUpdate and (ParentBoard <> nil) then
1758 ParentBoard.FModified := True;
1761 procedure TThreadItem.SetRoundName(const s: string);
1763 if FRoundName = s then Exit;
1765 if FUpdate and (ParentBoard <> nil) then
1766 ParentBoard.FModified := True;
1770 procedure TThreadItem.SetKokomade(i: Integer);
1772 if FKokomade = i then Exit;
1774 if FUpdate and (ParentBoard <> nil) then
1775 ParentBoard.FModified := True;
1778 procedure TThreadItem.SetUnRead(b: Boolean);
1780 if FUnRead = b then Exit;
1782 if FUpdate and (ParentBoard <> nil) then begin
1783 ParentBoard.FModified := True;
1784 if FUnRead then begin
1785 ParentBoard.UnRead := ParentBoard.UnRead + 1;
1787 ParentBoard.UnRead := ParentBoard.UnRead - 1;
1792 procedure TThreadItem.SetScrollTop(i: Integer);
1794 if FScrollTop = i then Exit;
1796 if FUpdate and (ParentBoard <> nil) then
1797 ParentBoard.FModified := True;
1800 procedure TThreadItem.BeginUpdate;
1805 procedure TThreadItem.EndUpdate;
1810 function TThreadItem.GetCreateDate: TDateTime;
1812 //
\83t
\83@
\83C
\83\8b\96¼
\82©
\82ç
\83X
\83\8c\8dì
\90¬
\93ú
\8e\9e\82ð
\8b\81\82ß
\82é
1814 if ( GikoSys.Setting.CreationTimeLogs ) and not IsLogFile then
1817 //
\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
1818 Result := GikoSys.GetCreateDateFromName(FFileName);
1819 if GikoSys.Setting.FutureThread then begin
1820 if CompareDateTime(Result, Now) = 1 then
1821 Result := ZERO_DATE;
1827 Result := ZERO_DATE;
1830 function TThreadItem.GetFilePath: String;
1834 path := ExtractFilePath(Self.ParentBoard.FilePath) + Self.FileName;
1838 destructor TBoardGroup.Destroy;
1843 procedure TBoardGroup.Clear;
1847 for i := Self.Count - 1 downto 0 do begin
1849 TBoard(Self.Objects[i]).Free;
1856 if FBoardPlugIn <> nil then
1858 FBoardPlugIn := nil;
1864 function TSpecialBoard.Add(item: TThreadItem): integer;
1866 Result := inherited AddObject(Item.URL, Item);
1869 procedure TSpecialBoard.Clear;
1873 for i := Count - 1 downto 0 do