//\8f\84\89ñ\94Ô\8d\86
//TGikoRoundNo = (grnNone, grn1, grn2, grn3, grn4, grn5, grnOnce);
//\83\8a\83X\83g\82Ì\8fã\82°\89º\82°
- TGikoAgeSage = (gasNone, gasAge, gasSage, gasNew);
+ TGikoAgeSage = (gasNone, gasAge, gasSage, gasNew, gasNull);
{ TFolder = class
private
end;
// \83J\83e\83S\83\8a(\94Â URL \82Ì\83\8a\83X\83g)
- TCategory = class(THashedStringList)
+// TCategory = class(THashedStringList)
+ TCategory = class(TStringList)
private
FNo: Integer;
FTitle: string;
end;
// \94Â(\83X\83\8c\83b\83h URL \82Ì\83\8a\83X\83g)
- TBoard = class(THashedStringList)
+// TBoard = class(THashedStringList)
+ TBoard = class(TStringList)
private
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é)
FIntData : Integer; // \8dD\82«\82É\82¢\82¶\82Á\82Ä\82æ\82µ\81B\82¢\82ë\82ñ\82È\97p\93r\82É\8eg\82¤yo
FListData : TList; // \8dD\82«\82É\82¢\82¶\82Á\82Ä\82æ\82µ\81B\82¢\82ë\82ñ\82È\97p\93r\82É\8eg\82¤yo
+ FSETTINGTXTTime: TDateTime; //SETTING.TXT\82ð\8eæ\93¾\82µ\82½\93ú\8e\9e
+ FIsSETTINGTXT: boolean; //SETTING.TXT\82ð\8eæ\93¾\82µ\82Ä\82¢\82é\82©
+ FHEADTXTTime: TDateTime; //HEAD.TXT\82ð\8eæ\93¾\82µ\82½\93ú\8e\9e
+ FIsHEADTXT: boolean; //HEAD.TXT\82ð\8eæ\93¾\82µ\82Ä\82¢\82é\82©
+ FTitlePictureURL: string; //top\8aG\82ÌURL
+ FMultiplicity : Integer; //\8fd\95¡\82µ\82Ä\82¢\82é\82©\82Ç\82¤\82©\81H
function GetThreadItem(index: integer): TThreadItem;
procedure SetThreadItem(index: integer; value: TThreadItem);
procedure SetRound(b: Boolean);
function GetReadCgiURL: string;
function GetSubjectFileName: string;
function GetFolderIndexFileName: string;
+ function GetSETTINGTXTFileName: string;
+ function GETHEADTXTFileName: string;
+ function GetTitlePictureFileName: string;
function GetSendURL: string;
function GetNewThreadCount: Integer;
property PON: string read FPON write FPON;
property KotehanName: string read FKotehanName write SetKotehanName;
property KotehanMail: string read FKotehanMail write SetKotehanMail;
+
+ property SETTINGTXTTime: TDateTime read FSETTINGTXTTime write FSETTINGTXTTime;
+ property IsSETTINGTXT: boolean read FIsSETTINGTXT write FIsSETTINGTXT;
+ property HEADTXTTime: TDateTime read FHEADTXTTime write FHEADTXTTime;
+ property IsHEADTXT: boolean read FIsHEADTXT write FIsHEADTXT;
+ property TitlePictureURL: string read FTitlePictureURL write FTitlePictureURL;
+ property Multiplicity: Integer read FMultiplicity write FMultiplicity;
end;
//\83X\83\8c
FURL : string; // \82±\82Ì\83X\83\8c\82ð\83u\83\89\83E\83U\82Å\95\\8e¦\82·\82é\8dÛ\82Ì URL
FBoardPlugIn : TBoardPlugIn; // \82±\82Ì\83X\83\8c\82ð\83T\83|\81[\83g\82·\82é\83v\83\89\83O\83C\83\93
FFilePath : string; // \82±\82Ì\83X\83\8c\82ª\95Û\91¶\82³\82ê\82Ä\82¢\82é\83p\83X
- 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
procedure SetLastModified(d: TDateTime);
procedure SetRound(b: Boolean);
procedure Init;
function GetCreateDate: TDateTime;
public
- constructor Create( inPlugIn : TBoardPlugIn; inURL : string );
+ constructor Create( inPlugIn : TBoardPlugIn; inURL : string ); overload;
+ constructor Create( is2ch : Boolean; const inURL, inHost, inBBSID, inBBSKey : string ); overload;
+
destructor Destroy; override;
function GetDatURL: string;
property URL : string read FURL write FURL;
property BoardPlugIn : TBoardPlugIn read FBoardPlugIn;
property FilePath : string read FFilePath write FFilePath;
- property SizeByte : Integer read FSizeByte write FSizeByte;
function IsBoardPlugInAvailable : Boolean;
end;
function BBSsFindBoardFromURL( inURL : string ) : TBoard;
function BBSsFindBoardFromTitle( inTitle : string ) : TBoard;
function BBSsFindThreadFromURL(const inURL : string ) : TThreadItem;
- function ConvertDateTimeString( inDateTimeString : string) : TDateTime;
-
+ function ConvertDateTimeString( inDateTimeString : string) : TDateTime;
+
var
BBSs : array of TBBS;
implementation
uses
- GikoSystem, RoundData;
+ GikoSystem, RoundData, MojuUtils;
const
BBS2CH_NAME: string = '\82Q\82¿\82á\82ñ\82Ë\82é';
FOLDER_INDEX_FILENAME: string = 'Folder.idx';
SUBJECT_FILENAME: string = 'subject.txt';
PATH_DELIM: string = '\';
+ SETTINGTXT_FILENAME: string = 'SETTING.TXT';
+ HEADTXT_FILENAME: string = 'head.html';
//DEFAULT_LIST_COUNT: Integer = 100;
// COLUMN_CATEGORY: array[0..0] of string = ('\83J\83e\83S\83\8a\96¼');
procedure TBBS.SetSelectText(s: string);
begin
FSelectText := s;
- ShortSelectText := GikoSys.ZenToHan(s);
+ ShortSelectText := CustomStringReplace(ZenToHan(s), ' ', '');
end;
{class function TBBS.GetColumnName(Index: Integer): string;
constructor TCategory.Create;
begin
inherited;
+
+ Duplicates := dupIgnore;
+ CaseSensitive := False;
+ //Sorted := True;
end;
destructor TCategory.Destroy;
procedure TCategory.Delete(index: integer);
begin
- if Items[index] <> nil then
- TBoard(Items[index]).Free;
+ if (Items[index] <> nil) then begin
+ try
+ if TBoard(Items[index]).Multiplicity = 0 then
+ TBoard(Items[index]).Free
+ else
+ TBoard(Items[index]).Multiplicity := TBoard(Items[index]).Multiplicity - 1;
+ except
+ end;
+ end;
inherited Delete(index);
end;
//===================
procedure TBoard.Init;
begin
+ Duplicates := dupIgnore;
+ CaseSensitive := False;
+ //Sorted := True;
+
FNo := 0;
FTitle := '';
FBBSID := '';
GikoSys.ParseURI( inURL, protocol, host, path, document, port, bookmark );
if GikoSys.Is2chHost( host ) then
FilePath :=
- IncludeTrailingPathDelimiter( GikoSys.Setting.LogFolder ) +
+ GikoSys.Setting.LogFolderP +
BBS2CH_LOG_FOLDER + PATH_DELIM + BBSID + PATH_DELIM + SUBJECT_FILENAME
else
FilePath :=
- IncludeTrailingPathDelimiter( GikoSys.Setting.LogFolder ) +
+ GikoSys.Setting.LogFolderP +
EXTERNAL_LOG_FOLDER + PATH_DELIM + host + PATH_DELIM + BBSID + PATH_DELIM + SUBJECT_FILENAME
end else begin
// \83v\83\89\83O\83C\83\93\82É TBoardItem \82ª\8dì\90¬\82³\82ê\82½\82±\82Æ\82ð\93`\82¦\82é
var
ini: TMemIniFile;
FileName: string;
- tmp: string;
+ tmp: string;
begin
if Length( FilePath ) > 0 then
FileName := ExtractFilePath( FilePath ) + FOLDER_INI_FILENAME
else
- FileName := IncludeTrailingPathDelimiter( GikoSys.Setting.LogFolder )
+ FileName := GikoSys.Setting.LogFolderP
+ BBS2CH_LOG_FOLDER + PATH_DELIM + BBSID + PATH_DELIM + FOLDER_INI_FILENAME;
if not FileExists(FileName) then
try
// Round := ini.ReadBool('Status', 'Round', False);
tmp := ini.ReadString('Status', 'RoundDate', DateTimeToStr(ZERO_DATE));
- FRoundDate := ConvertDateTimeString(tmp);
- tmp := ini.ReadString('Status', 'LastModified', DateTimeToStr(ZERO_DATE));
- FLastModified := ConvertDateTimeString(tmp);
- tmp := ini.ReadString('Status', 'LastGetTime', DateTimeToStr(ZERO_DATE));
- FLastGetTime := ConvertDateTimeString(tmp);
+ FRoundDate := ConvertDateTimeString(tmp);
+ tmp := ini.ReadString('Status', 'LastModified', DateTimeToStr(ZERO_DATE));
+ FLastModified := ConvertDateTimeString(tmp);
+ tmp := ini.ReadString('Status', 'LastGetTime', DateTimeToStr(ZERO_DATE));
+ FLastGetTime := ConvertDateTimeString(tmp);
+
+ tmp := ini.ReadString('BoardInformation', 'SETTINGTXTTime', DateTimeToStr(ZERO_DATE));
+ FSETTINGTXTTime := ConvertDateTimeString(tmp);
+ tmp := ini.ReadString('BoardInformation', 'HEADTXTTime', DateTimeToStr(ZERO_DATE));
+ FHEADTXTTime := ConvertDateTimeString(tmp);
+
+ FIsSETTINGTXT := ini.ReadBool('BoardInformation', 'IsSETTINGTXT', false);
+ FIsHEADTXT := ini.ReadBool('BoardInformation', 'IsHEADTXT', false);
+ FTitlePictureURL := ini.ReadString('BoardInformation', 'TitlePictureURL', '');
- {
- try
- FRoundDate := ini.ReadDateTime('Status', 'RoundDate', ZERO_DATE);
- except
- tmp := ini.ReadString('Status', 'RoundDate', DateTimeToStr(ZERO_DATE));
- FRoundDate := StrToDateTime(ConvertDateTimeString(tmp));
- end;
- try
- FLastModified := ini.ReadDateTime('Status', 'LastModified', ZERO_DATE);
- except
- tmp := ini.ReadString('Status', 'LastModified', DateTimeToStr(ZERO_DATE));
- FLastModified := StrToDateTime(ConvertDateTimeString(tmp));
- end;
- try
- FLastGetTime := ini.ReadDateTime('Status', 'LastGetTime', ZERO_DATE);
- except
- tmp := ini.ReadString('Status', 'LastGetTime', DateTimeToStr(ZERO_DATE));
- FLastGetTime := StrToDateTime(ConvertDateTimeString(tmp));
- end;
- }
FUnRead := ini.ReadInteger('Status', 'UnRead', 0);
FSPID := ini.ReadString('Cookie', 'SPID', '');
FPON := ini.ReadString('Cookie', 'PON', '');
FKotehanName := ini.ReadString('Kotehan', 'Name', '');
FKotehanMail := ini.ReadString('Kotehan', 'Mail', '');
-// ListStyle := TViewStyle(Ord(ini.ReadInteger('Status', 'ListStyle', 3)));
-// ItemNoVisible := ini.ReadBool('Status', 'ItemNoVisible', True);
-// ViewType := TGikoViewType(Ord(ini.ReadInteger('Status', 'ViewType', 0)));
+
if UnRead < 0 then
UnRead := 0;
finally
if Length( FilePath ) > 0 then
FileName := ExtractFilePath( FilePath )
else
- FileName := IncludeTrailingPathDelimiter( GikoSys.Setting.LogFolder )
+ FileName := GikoSys.Setting.LogFolderP
+ BBS2CH_LOG_FOLDER + PATH_DELIM + BBSID + PATH_DELIM;
if not GikoSys.DirectoryExistsEx(FileName) then
GikoSys.ForceDirectoriesEx(FileName);
ini.WriteString('Cookie', 'PON', FPON);
ini.WriteString('Kotehan', 'Name', FKotehanName);
ini.WriteString('Kotehan', 'Mail', FKotehanMail);
+
+ ini.WriteDateTime('BoardInformation', 'SETTINGTXTTime', FSETTINGTXTTime);
+ ini.WriteDateTime('BoardInformation', 'HEADTXTTime', FHEADTXTTime);
+
+ ini.WriteBool('BoardInformation', 'IsSETTINGTXT', FIsSETTINGTXT);
+ ini.WriteBool('BoardInformation', 'IsHEADTXT', FIsHEADTXT);
+ ini.WriteString('BoardInformation', 'TitlePictureURL', FTitlePictureURL);
// ini.WriteInteger('Status', 'ListStyle', Ord(ListStyle));
// ini.WriteBool('Status', 'ItemNoVisible', ItemNoVisible);
// ini.WriteInteger('Status', 'ViewType', Ord(ViewType));
except
if( inDateTimeString[5] = '/' ) and ( inDateTimeString[8] = '/' ) then begin
y := StrToIntDef( Copy(inDateTimeString, 1, 4), 1970 );
- m := StrToIntDef( Copy(inDateTimeString, 6, 2), 1 );
+ m := StrToIntDef( Copy(inDateTimeString, 6, 2), 1 );
d := StrToIntDef( Copy(inDateTimeString, 9, 2), 1 );
hour := 0; min := 0; sec := 0;
if Length( FilePath ) > 0 then
Result := FilePath
else
- Result := IncludeTrailingPathDelimiter( GikoSys.Setting.LogFolder )
+ Result := GikoSys.Setting.LogFolderP
+ BBS2CH_LOG_FOLDER + PATH_DELIM + BBSID + PATH_DELIM + SUBJECT_FILENAME;
end;
if Length( FilePath ) > 0 then
Result := ExtractFilePath( FilePath ) + FOLDER_INDEX_FILENAME
else
- Result := IncludeTrailingPathDelimiter( GikoSys.Setting.LogFolder )
+ Result := GikoSys.Setting.LogFolderP
+ BBS2CH_LOG_FOLDER + PATH_DELIM + BBSID + PATH_DELIM + FOLDER_INDEX_FILENAME;
end;
+//SETTING.TXT\82Ì\83t\83@\83C\83\8b\96¼\8eæ\93¾
+function TBoard.GetSETTINGTXTFileName: string;
+begin
+ if Length( FilePath ) > 0 then
+ Result := ExtractFilePath( FilePath ) + SETTINGTXT_FILENAME
+ else
+ Result := GikoSys.Setting.LogFolderP
+ + BBS2CH_LOG_FOLDER + PATH_DELIM + BBSID + PATH_DELIM + SETTINGTXT_FILENAME;
+end;
+
+function TBoard.GETHEADTXTFileName: string;
+begin
+ if Length( FilePath ) > 0 then
+ Result := ExtractFilePath( FilePath ) + HEADTXT_FILENAME
+ else
+ Result := GikoSys.Setting.LogFolderP
+ + BBS2CH_LOG_FOLDER + PATH_DELIM + BBSID + PATH_DELIM + HEADTXT_FILENAME;
+end;
+function TBoard.GetTitlePictureFileName: string;
+var
+ tmpName: string;
+begin
+ if FTitlePictureURL = '' then
+ Result := ''
+ else begin
+ tmpName := Copy(FTitlePictureURL, LastDelimiter('/', FTitlePictureURL) + 1, Length(FTitlePictureURL));
+ if Length( FilePath ) > 0 then
+ Result := ExtractFilePath( FilePath ) + tmpName
+ else
+ Result := GikoSys.Setting.LogFolderP
+ + BBS2CH_LOG_FOLDER + PATH_DELIM + BBSID + PATH_DELIM + tmpName;
+ end;
+end;
// \83X\83\8c\97§\82Ä\91\97\90MURL
function TBoard.GetSendURL: string;
+var
+ Protocol, Host, Path, Document, Port, Bookmark : string;
begin
- Result := GikoSys.UrlToServer(URL) + 'test/subbbs.cgi';
+ Result := GikoSys.UrlToServer(URL);
+ GikoSys.ParseURI( URL, Protocol,Host, Path, Document, Port, Bookmark );
+ if GikoSys.Is2chHost(Host) then
+ Result := Result + 'test/bbs.cgi'
+ else
+ Result := Result + 'test/subbbs.cgi';
+
end;
procedure TBoard.SetRound(b: Boolean);
if Items[i].NewArrival then
begin
if Items[i].ShortTitle = '' then
- Items[i].ShortTitle := GikoSys.ZenToHan(Items[i].Title);
+ Items[i].ShortTitle := CustomStringReplace(ZenToHan(Items[i].Title), ' ', '');
if AnsiPos(ParentCategory.ParenTBBS.ShortSelectText, Items[i].ShortTitle) <> 0 then
inc(Result);
end;
if Items[i].IsLogFile then
begin
if Items[i].ShortTitle = '' then
- Items[i].ShortTitle := GikoSys.ZenToHan(Items[i].Title);
+ Items[i].ShortTitle := CustomStringReplace(ZenToHan(Items[i].Title), ' ', '');
if AnsiPos(ParentCategory.ParenTBBS.ShortSelectText, Items[i].ShortTitle) <> 0 then
inc(Result);
end;
else
for i := 0 to Count - 1 do begin
if Items[i].ShortTitle = '' then
- Items[i].ShortTitle := GikoSys.ZenToHan(Items[i].Title);
+ Items[i].ShortTitle := CustomStringReplace(ZenToHan(Items[i].Title), ' ', '');
if AnsiPos(ParentCategory.ParenTBBS.ShortSelectText, Items[i].ShortTitle) <> 0 then
inc(Result);
end;
if Items[i].NewArrival then
begin
if Items[i].ShortTitle = '' then
- Items[i].ShortTitle := GikoSys.ZenToHan(Items[i].Title);
+ Items[i].ShortTitle := CustomStringReplace(ZenToHan(Items[i].Title), ' ', '');
if AnsiPos(ParentCategory.ParenTBBS.ShortSelectText, Items[i].ShortTitle) <> 0 then begin
if Index = Cnt then begin
Result := Items[i];
if Items[i].IsLogFile then
begin
if Items[i].ShortTitle = '' then
- Items[i].ShortTitle := GikoSys.ZenToHan(Items[i].Title);
+ Items[i].ShortTitle := ZenToHan(Items[i].Title);
if AnsiPos(ParentCategory.ParenTBBS.ShortSelectText, Items[i].ShortTitle) <> 0 then begin
if Index = Cnt then begin
Result := Items[i];
end else begin
for i := 0 to Count - 1 do begin
if Items[i].ShortTitle = '' then
- Items[i].ShortTitle := GikoSys.ZenToHan(Items[i].Title);
+ Items[i].ShortTitle := CustomStringReplace(ZenToHan(Items[i].Title), ' ', '');
if AnsiPos(ParentCategory.ParenTBBS.ShortSelectText, Items[i].ShortTitle) <> 0 then begin
if Index = Cnt then begin
Result := Items[i];
GikoSys.Parse2chURL( inURL, path, document, BBSID, BBSKey );
if GikoSys.Is2chHost( host ) then
FilePath :=
- IncludeTrailingPathDelimiter( GikoSys.Setting.LogFolder ) +
+ GikoSys.Setting.LogFolderP +
BBS2CH_LOG_FOLDER + PATH_DELIM + BBSID + PATH_DELIM + BBSKey + '.dat'
else
FilePath :=
- IncludeTrailingPathDelimiter( GikoSys.Setting.LogFolder ) +
+ GikoSys.Setting.LogFolderP +
EXTERNAL_LOG_FOLDER + PATH_DELIM + host + PATH_DELIM + BBSID + PATH_DELIM + BBSKey + '.dat';
FileName := BBSKey + '.dat';
IsLogFile := FileExists( FilePath );
end;
// *************************************************************************
+// \83v\83\89\83O\83C\83\93\82ð\97\98\97p\82µ\82È\82¢\83R\83\93\83X\83g\83\89\83N\83^
+// *************************************************************************
+constructor TThreadItem.Create(
+ is2ch : Boolean;
+ const inURL, inHost, inBBSID, inBBSKey : string
+);
+var
+ foundPos : Integer;
+const
+ READ_PATH = '/test/read.cgi';
+begin
+
+ inherited Create;
+ Init;
+
+ FBoardPlugIn := nil;
+
+ foundPos := Pos( READ_PATH, inURL );
+ if foundPos > 0 then begin
+ // dat \82Ì\95Û\91¶\83p\83X\82ð\90Ý\92è
+ if is2ch then
+ FilePath :=
+
+ GikoSys.Setting.LogFolderP +
+ BBS2CH_LOG_FOLDER + PATH_DELIM + inBBSID + PATH_DELIM + inBBSKey + '.dat'
+ else
+ FilePath :=
+ GikoSys.Setting.LogFolderP +
+ EXTERNAL_LOG_FOLDER + PATH_DELIM + inHost + PATH_DELIM + inBBSID + PATH_DELIM + inBBSKey + '.dat';
+ FileName := inBBSKey + '.dat';
+ IsLogFile := FileExists( FilePath );
+ URL := GikoSys.Get2chBrowsableThreadURL( inURL );
+ end else
+ URL := inURL;
+
+end;
+// *************************************************************************
// \83f\83X\83g\83\89\83N\83^
// *************************************************************************
destructor TThreadItem.Destroy;
begin
ParentBoard.BeginUpdate;
+ if FUnRead then
+ ParentBoard.UnRead := ParentBoard.UnRead - 1;
DeleteFile(GetThreadFileName);
- if FileExists(ChangeFileExt(GetThreadFileName,'.NG')) = true then
- DeleteFile(ChangeFileExt(GetThreadFileName,'.NG'));
+ if FileExists(ChangeFileExt(GetThreadFileName,'.NG')) = true then
+ DeleteFile(ChangeFileExt(GetThreadFileName,'.NG'));
FRoundDate := ZERO_DATE;
FLastModified := ZERO_DATE;
FSize := 0;
if Length( FilePath ) > 0 then
Result := FilePath
else
- Result := IncludeTrailingPathDelimiter( GikoSys.Setting.LogFolder )
+ Result := GikoSys.Setting.LogFolderP
+ BBS2CH_LOG_FOLDER + PATH_DELIM + ParentBoard.BBSID + PATH_DELIM + FileName;
end;
if ( Length(tmp) = 9) and ( tmp[1] = '0' ) then
Insert('1', tmp, 1);
-
- unixtime := StrToInt64(tmp);
- Result := UnixToDateTime(unixtime) + OffsetFromUTC;
+ unixtime := StrToInt64Def(tmp, ZERO_DATE);
+ Result := UnixToDateTime(unixtime) + OffsetFromUTC;
if GikoSys.Setting.FutureThread then begin
if CompareDateTime(Result, Now) = 1 then
Result := ZERO_DATE;