OSDN Git Service

LogFolderPプロパティ追加による変更。
[gikonavigoeson/gikonavi.git] / BoardGroup.pas
index 763e7fe..80a3a4b 100644 (file)
@@ -112,7 +112,8 @@ type
        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;
@@ -144,7 +145,8 @@ type
        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é)
 
@@ -176,6 +178,12 @@ type
                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);
@@ -228,6 +236,9 @@ type
                function GetReadCgiURL: string;
                function GetSubjectFileName: string;
                function GetFolderIndexFileName: string;
+               function GetSETTINGTXTFileName: string;
+               function GETHEADTXTFileName: string;
+               function GetTitlePictureFileName: string;
                function GetSendURL: string;
 
                function GetNewThreadCount: Integer;
@@ -245,6 +256,13 @@ type
                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
@@ -290,7 +308,9 @@ type
                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;
@@ -377,6 +397,8 @@ const
        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¼');
@@ -605,7 +627,7 @@ end;
 procedure TBBS.SetSelectText(s: string);
 begin
        FSelectText := s;
-       ShortSelectText := ZenToHan(s);
+       ShortSelectText := CustomStringReplace(ZenToHan(s), ' ', '');
 end;
 
 {class function TBBS.GetColumnName(Index: Integer): string;
@@ -624,6 +646,10 @@ end;}
 constructor TCategory.Create;
 begin
        inherited;
+
+       Duplicates              := dupIgnore;
+       CaseSensitive   := False;
+       //Sorted                                := True;
 end;
 
 destructor TCategory.Destroy;
@@ -651,8 +677,15 @@ end;
 
 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;
 
@@ -767,6 +800,10 @@ end;}
 //===================
 procedure TBoard.Init;
 begin
+       Duplicates              := dupIgnore;
+       CaseSensitive   := False;
+       //Sorted                                := True;
+
        FNo := 0;
        FTitle := '';
        FBBSID := '';
@@ -806,11 +843,11 @@ begin
                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é
@@ -971,12 +1008,12 @@ procedure TBoard.LoadSettings;
 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
@@ -985,40 +1022,27 @@ begin
        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
@@ -1034,7 +1058,7 @@ begin
        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);
@@ -1052,6 +1076,13 @@ begin
                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));
@@ -1089,7 +1120,7 @@ begin
     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;
 
@@ -1132,7 +1163,7 @@ begin
        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;
 
@@ -1142,14 +1173,55 @@ begin
        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);
@@ -1229,7 +1301,7 @@ begin
                        if Items[i].NewArrival then
                        begin
                                if Items[i].ShortTitle = '' then
-                                       Items[i].ShortTitle := 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;
@@ -1253,7 +1325,7 @@ begin
                        if Items[i].IsLogFile then
                        begin
                                if Items[i].ShortTitle = '' then
-                                       Items[i].ShortTitle := 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;
@@ -1271,7 +1343,7 @@ begin
        else
                for i := 0 to Count - 1 do begin
                        if Items[i].ShortTitle = '' then
-                               Items[i].ShortTitle := 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;
@@ -1301,7 +1373,7 @@ begin
                        if Items[i].NewArrival then
                        begin
                                if Items[i].ShortTitle = '' then
-                                       Items[i].ShortTitle := 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];
@@ -1371,7 +1443,7 @@ begin
        end else begin
                for i := 0 to Count - 1 do begin
                        if Items[i].ShortTitle = '' then
-                               Items[i].ShortTitle := 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];
@@ -1456,11 +1528,11 @@ begin
                        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 );
@@ -1474,6 +1546,43 @@ begin
 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;
@@ -1623,9 +1732,11 @@ procedure TThreadItem.DeleteLogFile;
 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;
@@ -1652,7 +1763,7 @@ begin
        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;
 
@@ -1753,9 +1864,8 @@ begin
                        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;