OSDN Git Service

This commit was manufactured by cvs2svn to create branch 'Bb55'.
[gikonavigoeson/gikonavi.git] / GikoSystem.pas
index a096d1a..ebc0727 100644 (file)
@@ -114,6 +114,8 @@ type
                FGikoMessage: TGikoMessage;
                //! \82 \82é\83Z\83p\83\8c\81[\83^\82Å\8bæ\90Ø\82ç\82ê\82½\95\8e\9a\97ñ\82©\82ç\82\8e\94Ô\96Ú\82Ì\95\8e\9a\97ñ\82ð\8eæ\82è\8fo\82·
                function ChooseString(const Text, Separator: string; Index: integer): string;
+        //! \88ê\8e\9e\83t\83@\83C\83\8b\82©\82ç\82Ì\95\9c\8b\8c
+        procedure RestoreThreadData(Board: TBoard);
        public
                { Public \90é\8c¾ }
                FAbon : TAbon;
@@ -214,8 +216,8 @@ type
                procedure GetPopupResNumber(URL : string; var stRes, endRes : Int64);
 
                property Bayesian : TGikoBayesian read FBayesian write FBayesian;
-               function GetSameIDResAnchor(const AID : string; ThreadItem: TThreadItem; limited: boolean):string; overload;
-               function GetSameIDResAnchor(AIDNum : Integer; ThreadItem: TThreadItem; limited: boolean):string; overload;
+               function GetSameIDResAnchor(const AID : string; ThreadItem: TThreadItem; limited: Integer):string; overload;
+               function GetSameIDResAnchor(AIDNum : Integer; ThreadItem: TThreadItem; limited: Integer):string; overload;
                procedure GetSameIDRes(const AID : string; ThreadItem: TThreadItem;var body: TStringList); overload;
                procedure GetSameIDRes(AIDNum : Integer; ThreadItem: TThreadItem;var body: TStringList); overload;
                function GetSameIDResCount(const AID : string; ThreadItem: TThreadItem):Integer; overload;
@@ -247,6 +249,12 @@ type
                function GetGikoMessage(MesType: TGikoMessageListType): String;
                //! GMT\82Ì\8e\9e\8d\8f\82ðTDateTime\82É\95Ï\8a·\82·\82é
                function  DateStrToDateTime(const DateStr: string): TDateTime;
+        //! User32.dll\82ª\97\98\97p\82Å\82«\82é\82©
+        function CanUser32DLL: Boolean;
+        //! OE\88ø\97p\95\84\8eæ\93¾
+        function GetOEIndentChar : string;
+        //! \92u\8a·\90Ý\92è\83t\83@\83C\83\8b\8eæ\93¾
+        function GetReplaceFileName: String;
        end;
 
 var
@@ -256,7 +264,7 @@ const
        ZERO_DATE: Integer      = 25569;
        BETA_VERSION_NAME_E = 'beta';
        BETA_VERSION_NAME_J = 'ÊÞÀ';
-       BETA_VERSION                            = 54;
+       BETA_VERSION                            = 55;
        BETA_VERSION_BUILD      = '';                           //!< debug\94Å\82È\82Ç
        APP_NAME                                                = 'gikoNavi';
        BE_PHP_URL = 'http://be.2ch.net/test/p.php?i=';
@@ -554,24 +562,17 @@ var
        ThreadItem: TThreadItem;
        FileName: string;
        FileList: TStringList;
-       TmpFileList: TStringList;
        Index: Integer;
        sl: TStringList;
        i: Integer;
        Rec: TIndexRec;
        UnRead: Integer;
-       ini: TMemIniFile;
        ResRec: TResRec;
-//     RoundItem: TRoundItem;
-//     idx: Integer;
        usePlugIn : Boolean;
-       tmpStr: string;
        BoardPath : String;
        server : String;
        islog : Boolean;
     urlHead: String;
-       //protocol, host, path, document, port, bookmark        : string;
-       //is2ch : Boolean;
        {*
        FavoThreadItem : TFavoriteThreadItem;
        Node: TTreeNode;
@@ -581,25 +582,17 @@ begin
                Exit;
        Board.Clear;
        UnRead := 0;
-       //is2ch := false;
        usePlugIn := Board.IsBoardPlugInAvailable;
        server :=  UrlToServer( Board.URL );
-       //is2ch := Is2chHost(server);
 
        FileName := Board.GetFolderIndexFileName;
 
        FileList := TStringList.Create;
        FileList.Sorted := True;
        FileList.BeginUpdate;
-       TmpFileList := TStringList.Create;
-       TmpFileList.Sorted := True;
-       TmpFileList.BeginUpdate;
        //IsLogFile\97pDAT\83t\83@\83C\83\8b\83\8a\83X\83g
        GetFileList(ExtractFileDir(Board.GetFolderIndexFileName), '*.dat', FileList, False);
        FileList.EndUpdate;
-       //\91O\89ñ\88Ù\8fí\8fI\97¹\8e\9e\97pTmp\83t\83@\83C\83\8b\83\8a\83X\83g
-       GetFileList(ExtractFileDir(Board.GetFolderIndexFileName), '*.tmp', TmpFileList, False);
-       TmpFileList.EndUpdate;
 
        // \8fd\95¡\82ð\96h\82®
        Board.BeginUpdate;
@@ -650,8 +643,7 @@ begin
 
                                ThreadItem.No := Rec.FNo;
                                ThreadItem.FileName := Rec.FFileName;
-                               ThreadItem.Title := Rec.FTitle;
-                               //ThreadItem.ShortTitle := CustomStringReplace(ZenToHan(ThreadItem.Title), ' ', '');
+                               ThreadItem.Title := MojuUtils.UnSanitize(Rec.FTitle);
                                ThreadItem.Count := Rec.FCount;
                                ThreadItem.Size := Rec.FSize;
                                ThreadItem.RoundDate := Rec.FRoundDate;
@@ -724,50 +716,12 @@ begin
                        Board.Add(ThreadItem);
                end;
                Board.EndUpdate;
-
-               //\91O\89ñ\88Ù\8fí\8fI\97¹\8e\9e\83`\83F\83b\83N
-               for i := TmpFileList.Count - 1 downto 0 do begin
-               //if TmpFileList.Count <> 0 then begin
-                       ThreadItem := Board.FindThreadFromFileName(ChangeFileExt(TmpFileList[i], '.dat'));
-                       if ThreadItem <> nil then begin
-                       //if TmpFileList.Find(ChangeFileExt(ThreadItem.FileName, '.tmp'), Index) then begin
-                               ini := TMemIniFile.Create(Boardpath + TmpFileList[i]);
-                               try
-                                       tmpStr := ini.ReadString('Setting', 'RoundDate', DateTimeToStr(ZERO_DATE));
-                                       ThreadItem.RoundDate := ConvertDateTimeString(tmpStr);
-
-                                       tmpStr := ini.ReadString('Setting', 'LastModified', DateTimeToStr(ZERO_DATE));
-                                       ThreadItem.LastModified := ConvertDateTimeString(tmpStr);
-                                       ThreadItem.Count := ini.ReadInteger('Setting', 'Count', 0);
-                                       ThreadItem.NewReceive := ini.ReadInteger('Setting', 'NewReceive', 0);
-
-                                       ThreadItem.Size := ini.ReadInteger('Setting', 'Size', 0);
-                                       if(ThreadItem.Size = 0) and (FileExists(ThreadItem.GetThreadFileName)) then begin
-                                               try
-                                                       ThreadItem.Size := GetFileSize(ThreadItem.GetThreadFileName) - ThreadItem.Count;
-                                               except
-                                               end;
-                                       end;
-
-                    //\8f\84\89ñ\82Ì\90Ý\92è\82ÍRoundData\82Ì\95û\82ª\82â\82é\82©\82ç\8f\9f\8eè\82É\90Ý\92è\82µ\82Ä\82Í\83_\83\81\81I\81@by \82à\82\82ã
-                                       //ThreadItem.Round := ini.ReadBool('Setting', 'Round', False);
-                                       //ThreadItem.RoundName := ini.ReadString('Setting', 'RoundName', ThreadItem.RoundName);
-                                       ThreadItem.UnRead := False;//ini.ReadBool('Setting', 'UnRead', False);
-                                       ThreadItem.ScrollTop := ini.ReadInteger('Setting', 'ScrollTop', 0);
-                                       ThreadItem.AllResCount := ini.ReadInteger('Setting', 'AllResCount', ThreadItem.Count);
-                                       ThreadItem.NewResCount := ini.ReadInteger('Setting', 'NewResCount', 0);
-                                       ThreadItem.AgeSage := TGikoAgeSage(ini.ReadInteger('Setting', 'AgeSage', Ord(gasNone)));
-                               finally
-                                       ini.Free;
-                               end;
-                               DeleteFile(Boardpath + TmpFileList[i]);
-                       end;
-               end;
-
+        
+        //\91O\89ñ\88Ù\8fí\8fI\97¹\8e\9e\83`\83F\83b\83N
+        RestoreThreadData( Board );
        finally
                sl.Free;
                FileList.Free;
-               TmpFileList.Free;
                Board.Sorted := False;
        end;
        Board.IsThreadDatRead := True;
@@ -824,7 +778,7 @@ begin
                                                        '%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x',
                                        [cnt,                   //\94Ô\8d\86
                                         Rec.FFileName, //\83t\83@\83C\83\8b\96¼
-                                        Rec.FTitle,    //\83^\83C\83g\83\8b
+                                        MojuUtils.Sanitize(Rec.FTitle),    //\83^\83C\83g\83\8b
                                         Rec.FCount,     //\83J\83E\83\93\83g
                                         0,             //size
                                         0,             //RoundDate
@@ -894,7 +848,7 @@ begin
                                                        '%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x',
                                        [Board.Items[i].No,                     //\94Ô\8d\86
                                         Board.Items[i].FileName, //\83t\83@\83C\83\8b\96¼
-                                        Board.Items[i].Title,    //\83^\83C\83g\83\8b
+                     MojuUtils.Sanitize(Board.Items[i].Title),    //\83^\83C\83g\83\8b
                                         Board.Items[i].Count,     //\83J\83E\83\93\83g
                                         Board.Items[i].Size,             //size
                                         DateTimeToInt(Board.Items[i].RoundDate),             //RoundDate
@@ -933,7 +887,7 @@ function TGikoSys.ParseIndexLine(Line: string): TIndexRec;
 begin
        Result.FNo := StrToIntDef('$' + RemoveToken(Line, #1), 0);
        Result.FFileName := RemoveToken(Line, #1);
-       Result.FTitle := RemoveToken(Line, #1);
+       Result.FTitle := MojuUtils.UnSanitize(RemoveToken(Line, #1));
        Result.FCount := StrToIntDef('$' + RemoveToken(Line, #1), 0);
        Result.FSize := StrToIntDef('$' + RemoveToken(Line, #1), 0);
        Result.FRoundDate := IntToDateTime(StrToIntDef('$' + RemoveToken(Line, #1), ZERO_DATE));
@@ -2745,11 +2699,12 @@ end;
 \brief \93¯\82\93\8a\8de ID \82ð\8e\9d\82Â\83\8c\83X\82ð\83A\83\93\83J\81[\82É\82µ\82Ä\97ñ\8b\93
 \param AID        \8cÂ\90l\82ð\93Á\92è\82·\82é\93\8a\8de ID
 \param ThreadItem \97ñ\8b\93\82·\82é\83X\83\8c\83b\83h
-\param limited    \97ñ\8b\93\82·\82é\90\94\82ð\90§\8cÀ\82·\82é\82È\82ç True
+\param limited    \97ñ\8b\93\82·\82é\90\94\82ð\90§\8cÀ\82·\82é\82È\82ç1\88È\8fã
 \return           \97ñ\8b\93\82³\82ê\82½\83\8c\83X\83A\83\93\83J\81[
-\todo limited \82ð Integer \82É\82·\82é\82©\81A20 \82ð\8aO\82É\8fo\82·
 }
-function TGikoSys.GetSameIDResAnchor(const AID : string; ThreadItem: TThreadItem; limited: boolean):string;
+function TGikoSys.GetSameIDResAnchor(
+    const AID : string; ThreadItem: TThreadItem;
+    limited: Integer):string;
 var
        i: integer;
        body: TStringList;
@@ -2766,8 +2721,8 @@ begin
                                body := TStringList.Create;
                                try
                                                GetSameIDRes(AID, ThreadItem, body);
-                                               if (limited) and (body.Count > 20) then begin
-                                                               for i := body.Count - 20 to body.Count - 1 do begin
+                                               if (limited > 0) and (body.Count > limited) then begin
+                                                               for i := body.Count - limited to body.Count - 1 do begin
                                                                                Res.FBody := Res.FBody + '&gt;' + body[i] + ' ';
                                                                end;
                                                end else begin
@@ -2834,11 +2789,12 @@ end;
 \brief \93¯\82\93\8a\8de ID \82ð\8e\9d\82Â\83\8c\83X\82ð\97ñ\8b\93
 \param AIDNum     \8cÂ\90l\82ð\93Á\92è\82·\82é\93\8a\8de ID
 \param ThreadItem \97ñ\8b\93\82·\82é\83X\83\8c\83b\83h
-\param limited    \97ñ\8b\93\82·\82é\90\94\82ð\90§\8cÀ\82·\82é\82È\82ç True
+\param limited    \97ñ\8b\93\82·\82é\90\94\82ð\90§\8cÀ\82·\82é\82È\82ç1\88È\8fã
 \return
-\todo limited \82ð Integer \82É\82·\82é\82©\81A20 \82ð\8aO\82É\8fo\82·
 }
-function TGikoSys.GetSameIDResAnchor(AIDNum : Integer; ThreadItem: TThreadItem; limited: boolean):string;
+function TGikoSys.GetSameIDResAnchor(AIDNum : Integer;
+     ThreadItem: TThreadItem;
+     limited: Integer):string;
 var
        i: integer;
        body: TStringList;
@@ -2854,10 +2810,10 @@ begin
                body := TStringList.Create;
                try
                        GetSameIDRes(AIDNum, ThreadItem, body);
-            if (limited) and (body.Count > 20) then begin
-                       for i := body.Count - 20 to body.Count - 1 do begin
-                               Res.FBody := Res.FBody + '&gt;' + body[i] + ' ';
-                       end;
+            if (limited > 0) and ( body.Count > limited) then begin
+                for i := body.Count - 20 to body.Count - 1 do begin
+                    Res.FBody := Res.FBody + '&gt;' + body[i] + ' ';
+                end;
             end else begin
                        for i := 0 to body.Count - 1 do begin
                                Res.FBody := Res.FBody + '&gt;' + body[i] + ' ';
@@ -3306,6 +3262,131 @@ begin
        p :=  AnsiPos(Separator, S);
        if  (p > 0) then  Result  :=  Copy(S, 1, p - 1) else Result :=  S;
 end;
+//! \88ê\8e\9e\83t\83@\83C\83\8b\82©\82ç\82Ì\95\9c\8b\8c
+procedure TGikoSys.RestoreThreadData(Board : TBoard);
+const
+    SECTION = 'Setting';
+var
+    TmpFileList : TStringList;
+    i : Integer;
+    ini : TMemIniFile;
+    ThreadItem : TThreadItem;
+    Boardpath, tmpStr : string;
+begin
+    Boardpath := ExtractFilePath(Board.GetFolderIndexFileName);
+
+       TmpFileList := TStringList.Create;
+       TmpFileList.Sorted := True;
+       TmpFileList.BeginUpdate;
+    try
+       //\91O\89ñ\88Ù\8fí\8fI\97¹\8e\9e\97pTmp\83t\83@\83C\83\8b\83\8a\83X\83g
+           GetFileList(Boardpath, '*.tmp', TmpFileList, False);
+           TmpFileList.EndUpdate;
+               //\91O\89ñ\88Ù\8fí\8fI\97¹\8e\9e\83`\83F\83b\83N
+               for i := TmpFileList.Count - 1 downto 0 do begin
+                       ThreadItem := Board.FindThreadFromFileName(ChangeFileExt(TmpFileList[i], '.dat'));
+                       if ThreadItem <> nil then begin
+                               ini := TMemIniFile.Create(Boardpath + TmpFileList[i]);
+                               try
+                                       tmpStr := ini.ReadString(SECTION, 'RoundDate', DateTimeToStr(ZERO_DATE));
+                                       ThreadItem.RoundDate := ConvertDateTimeString(tmpStr);
+
+                                       tmpStr := ini.ReadString(SECTION, 'LastModified', DateTimeToStr(ZERO_DATE));
+                                       ThreadItem.LastModified := ConvertDateTimeString(tmpStr);
+                                       ThreadItem.Count := ini.ReadInteger(SECTION, 'Count', 0);
+                                       ThreadItem.NewReceive := ini.ReadInteger(SECTION, 'NewReceive', 0);
+
+                                       ThreadItem.Size := ini.ReadInteger(SECTION, 'Size', 0);
+                                       if(ThreadItem.Size = 0) and (FileExists(ThreadItem.GetThreadFileName)) then begin
+                                               try
+                                                       ThreadItem.Size := GetFileSize(ThreadItem.GetThreadFileName) - ThreadItem.Count;
+                                               except
+                                               end;
+                                       end;
+
+                    //\8f\84\89ñ\82Ì\90Ý\92è\82ÍRoundData\82Ì\95û\82ª\82â\82é\82©\82ç\8f\9f\8eè\82É\90Ý\92è\82µ\82Ä\82Í\83_\83\81\81I\81@by \82à\82\82ã
+                                       //ThreadItem.Round := ini.ReadBool('Setting', 'Round', False);
+                                       //ThreadItem.RoundName := ini.ReadString('Setting', 'RoundName', ThreadItem.RoundName);
+                                       ThreadItem.UnRead := False;//ini.ReadBool('Setting', 'UnRead', False);
+                                       ThreadItem.ScrollTop := ini.ReadInteger(SECTION, 'ScrollTop', 0);
+                                       ThreadItem.AllResCount := ini.ReadInteger(SECTION, 'AllResCount', ThreadItem.Count);
+                                       ThreadItem.NewResCount := ini.ReadInteger(SECTION, 'NewResCount', 0);
+                                       ThreadItem.AgeSage := TGikoAgeSage(ini.ReadInteger(SECTION, 'AgeSage', Ord(gasNone)));
+                               finally
+                                       ini.Free;
+                               end;
+                               DeleteFile(Boardpath + TmpFileList[i]);
+                       end;
+               end;
+    finally
+        TmpFileList.Clear;
+        TmpFileList.Free;
+    end;
+end;
+{
+\brief User32.dll\82ª\97\98\97p\82Å\82«\82é\82©
+\return Boolean \97\98\97p\82Å\82«\82é\8fê\8d\87\82ÍTrue
+}
+function TGikoSys.CanUser32DLL: Boolean;
+var
+    hUser32 : HINST;
+begin
+    Result := False;
+       hUser32 := 0;
+       try
+               try
+                       hUser32 := LoadLibrary('User32.dll');
+                       if hUser32 <> 0 then begin
+                               Result := True;
+            end;
+               except
+               Result := false;
+               end;
+       finally
+               FreeLibrary(hUser32);
+       end;
+end;
+{
+\brief  OE\88ø\97p\95\84\8eæ\93¾
+\return OE\82Ì\88ø\97p\95\84\81i\90Ý\92è\82³\82ê\82Ä\82¢\82È\82¢\8fê\8d\87\82Í'>')
+}
+function TGikoSys.GetOEIndentChar : string;
+var
+       regKey                  : TRegistry;
+       Identities      : string;
+       IndentChar      : DWORD;
+const
+       DEFAULT_CHAR    = '> ';
+       OE_MAIL_PATH    = '\Software\Microsoft\Outlook Express\5.0\Mail';
+       INDENT_CHAR             = 'Indent Char';
+begin
+
+       Result  := DEFAULT_CHAR;
+       regKey  := TRegistry.Create;
+       try
+               try
+                       regKey.RootKey  := HKEY_CURRENT_USER;
+                       if not regKey.OpenKey( 'Identities', False ) then
+                               Exit;
+                       Identities                      := regKey.ReadString( 'Default User ID' );
+                       if Identities = '' then
+                               Exit;
+                       if not regKey.OpenKey( Identities + OE_MAIL_PATH, False ) then
+                               Exit;
+                       IndentChar := regKey.ReadInteger( INDENT_CHAR );
+                       Result := Char( IndentChar ) + ' ';
+               except
+               end;
+       finally
+               regKey.Free;
+       end;
+
+end;
+//! \92u\8a·\90Ý\92è\83t\83@\83C\83\8b\8eæ\93¾
+function TGikoSys.GetReplaceFileName: String;
+begin
+    Result := Setting.GetReplaceFileName;
+end;
 
 initialization
        GikoSys := TGikoSys.Create;