OSDN Git Service

タスクトレイの右クリックで終了メニューを出すようにした。
[gikonavigoeson/gikonavi.git] / GikoSystem.pas
index ee8407b..3a7fcac 100644 (file)
@@ -116,8 +116,6 @@ type
                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);
-        //! \83C\83\93\83f\83b\83N\83X\82É\82È\82¢dat\81i\82Í\82®\82êdat\81j\82Ì\92Ç\89Á
-        procedure AddOutofIndexDat(Board: TBoard; DatList: TStringList);
        public
                { Public \90é\8c¾ }
                FAbon : TAbon;
@@ -129,13 +127,10 @@ type
                property ResRange : Longint read FResRange write FResRange;
                //! \83o\81[\83W\83\87\83\93\8fî\95ñ
                property Version : String read FVersion;
-//             function MsgBox(Msg: string; Title: string; Flags: Longint): integer; overload;
-//             function MsgBox(Handle: THandle; Msg: string; Title: string; Flags: Longint): integer; overload;
                function IsNumeric(s: string): boolean;
                function IsFloat(s: string): boolean;
                function DirectoryExistsEx(const Name: string): Boolean;
                function ForceDirectoriesEx(Dir: string): Boolean;
-//             function GetVersion: string;
 
                function GetBoardFileName: string;
                function GetCustomBoardFileName: string;
@@ -224,7 +219,7 @@ type
                procedure GetSameIDRes(AIDNum : Integer; ThreadItem: TThreadItem;var body: TStringList); overload;
                function GetSameIDResCount(const AID : string; ThreadItem: TThreadItem):Integer; overload;
                function GetSameIDResCount(AIDNum : Integer; ThreadItem: TThreadItem):Integer; overload;
-
+        function GetResID(AIDNum: Integer; ThreadItem: TThreadItem): String;
                //! \92P\8cê\89ð\90Í
                procedure SpamCountWord( const text : string; wordCount : TWordCount );
                //! \8aw\8fK\83N\83\8a\83A
@@ -257,6 +252,13 @@ type
         function GetOEIndentChar : string;
         //! \92u\8a·\90Ý\92è\83t\83@\83C\83\8b\8eæ\93¾
         function GetReplaceFileName: String;
+        //! \83C\83\93\83f\83b\83N\83X\82É\82È\82¢dat\81i\82Í\82®\82êdat\81j\82Ì\92Ç\89Á
+        procedure AddOutofIndexDat(Board: TBoard; DatList: TStringList; AllCreate: boolean = True);
+        //! \83t\83@\83C\83\8b\96¼\82©\82ç\82Ì\83X\83\8c\83b\83h\8dì\90¬\93ú\82Ì\8eæ\93¾
+        function GetCreateDateFromName(FileName: String): TDateTime;
+        function GetExtpreviewFileName: String;
+
+        procedure ShowRefCount(msg: String; unk: IUnknown);
        end;
 
 var
@@ -266,7 +268,7 @@ const
        ZERO_DATE: Integer      = 25569;
        BETA_VERSION_NAME_E = 'beta';
        BETA_VERSION_NAME_J = 'ÊÞÀ';
-       BETA_VERSION                            = 56;
+       BETA_VERSION                            = 58;
        BETA_VERSION_BUILD      = '';                           //!< debug\94Å\82È\82Ç
        APP_NAME                                                = 'gikoNavi';
        BE_PHP_URL = 'http://be.2ch.net/test/p.php?i=';
@@ -285,6 +287,7 @@ const
        NGWORDs_DIR_NAME : String               = 'NGwords';
 
        READ_PATH: string =                     '/test/read.cgi/';
+    HTML_READ_PATH: string =        '/test/read.html/';
        OLD_READ_PATH: string =         '/test/read.cgi?';
        KAKO_PATH: string =                     '/kako/';
 
@@ -307,6 +310,7 @@ const
 // *************************************************************************
 constructor TGikoSys.Create;
 begin
+    Inherited;
        FSetting := TSetting.Create;
        FDolib := TDolib.Create;
        FAWKStr := TAWKStr.Create(nil);
@@ -345,18 +349,6 @@ var
        i: Integer;
        FileList: TStringList;
 begin
-       //\83X\83\8c\83b\83h\83f\81[\83^\83t\83@\83C\83\8b\82ð\8dX\90V
-//     FlashExitWrite;
-
-//     FExitWrite.Free;
-       FBayesian.Free;
-       FAWKStr.Free;
-       FSetting.Free;
-       FDolib.Free;
-       FAbon.Free;
-       FSelectResFilter.Free;
-    FGikoMessage.Free;
-       //FBoardURLList.Free;
        //\83e\83\93\83|\83\89\83\8aHTML\82ð\8dí\8f\9c
        FileList := TStringList.Create;
        try
@@ -369,6 +361,13 @@ begin
        finally
                FileList.Free;
        end;
+    FreeAndNil(FGikoMessage);
+       FreeAndNil(FBayesian);
+       FreeAndNil(FSelectResFilter);
+       FreeAndNil(FAbon);
+       FreeAndNil(FAWKStr);
+       FreeAndNil(FDolib);
+       FreeAndNil(FSetting);
        inherited;
 end;
 
@@ -572,11 +571,18 @@ var
        usePlugIn : Boolean;
        islog : Boolean;
     urlHead: String;
+    datFileCheck: Boolean;
        {*
        FavoThreadItem : TFavoriteThreadItem;
        Node: TTreeNode;
        *}
+{$IFDEF DEBUG}
+    st, rt: Cardinal;
+{$ENDIF}
 begin
+{$IFDEF DEBUG}
+       st := GetTickCount;
+{$ENDIF}
        if Board.IsThreadDatRead then
                Exit;
        Board.Clear;
@@ -592,12 +598,16 @@ begin
 
        FileName := Board.GetFolderIndexFileName;
 
-       FileList := TStringList.Create;
-       FileList.Sorted := True;
-       FileList.BeginUpdate;
-       //IsLogFile\97pDAT\83t\83@\83C\83\8b\83\8a\83X\83g
-       GetFileList(ExtractFileDir(Board.GetFolderIndexFileName), '*.dat', FileList, False);
-       FileList.EndUpdate;
+    //
+    datFileCheck := (Setting.CheckDatFile) or (not FileExists(FileName));
+    if (datFileCheck) then begin
+        FileList := TStringList.Create;
+        FileList.Sorted := True;
+        FileList.BeginUpdate;
+        //IsLogFile\97pDAT\83t\83@\83C\83\8b\83\8a\83X\83g
+        GetFileList(ExtractFileDir(Board.GetFolderIndexFileName), '*.dat', FileList, False);
+        FileList.EndUpdate;
+    end;
 
        // \8fd\95¡\82ð\96h\82®
        Board.BeginUpdate;
@@ -609,7 +619,11 @@ begin
                        //\82Q\8ds\96Ú\82©\82ç\81i\82P\8ds\96Ú\82Í\83o\81[\83W\83\87\83\93\81j
                        for i := sl.Count - 1 downto 1 do begin
                                Rec := ParseIndexLine(sl[i]);
-                               islog := FileList.Find( Rec.FFileName, Index );
+                if (datFileCheck) then begin
+                               islog := FileList.Find( Rec.FFileName, Index );
+                end else begin
+                    islog := (Rec.FSize <> 0) and (Rec.FCount <> 0);
+                end;
                                if usePlugIn then
                                        ThreadItem := TThreadItem.Create(
                                                        Board.BoardPlugIn,
@@ -636,7 +650,7 @@ begin
                                end;
 
                                ThreadItem.BeginUpdate;
-                               if islog then
+                               if (datFileCheck) and (islog) then
                                        FileList.Delete( Index );
 
                                ThreadItem.No := Rec.FNo;
@@ -671,50 +685,75 @@ begin
                if UnRead <> Board.UnRead then
                        Board.UnRead := UnRead;
 
-               //\83C\83\93\83f\83b\83N\83X\82É\96³\82©\82Á\82½\83\8d\83O\82ð\92Ç\89Á\81i\95\85\82ê\83C\83\93\83f\83b\83N\83X\91Î\89\9e\81j
-        AddOutofIndexDat(Board, FileList);
+        if (datFileCheck) then begin
+                   //\83C\83\93\83f\83b\83N\83X\82É\96³\82©\82Á\82½\83\8d\83O\82ð\92Ç\89Á\81i\95\85\82ê\83C\83\93\83f\83b\83N\83X\91Î\89\9e\81j
+            AddOutofIndexDat(Board, FileList);
+        end;
                Board.EndUpdate;
 
         //\91O\89ñ\88Ù\8fí\8fI\97¹\8e\9e\83`\83F\83b\83N
         RestoreThreadData( Board );
        finally
                sl.Free;
-               FileList.Free;
+        if (datFileCheck) then begin
+               FileList.Free;
+        end;
                Board.Sorted := False;
        end;
        Board.IsThreadDatRead := True;
+{$IFDEF DEBUG}
+       rt := GetTickCount - st;
+       Writeln('Read Done.' + IntToStr(rt) + ' ms');
+{$ENDIF}
 end;
 {!
 \brief \83C\83\93\83f\83b\83N\83X\82É\82È\82¢dat\81i\82Í\82®\82êdat\81j\82Ì\92Ç\89Á
 \param Board \92Ç\89Á\82·\82é\94Â
 \param DatList  dat\83t\83@\83C\83\8b\96¼
 }
-procedure TGikoSys.AddOutofIndexDat(Board: TBoard; DatList: TStringList);
+procedure TGikoSys.AddOutofIndexDat(Board: TBoard; DatList: TStringList; AllCreate: Boolean = True);
 var
     i : Integer;
     Boardpath,FileName : String;
     ResRec: TResRec;
     ThreadItem: TThreadItem;
+    create: Boolean;
 begin
+    create := False;
     Boardpath := ExtractFilePath(Board.GetFolderIndexFileName);
     //\83C\83\93\83f\83b\83N\83X\82É\96³\82©\82Á\82½\83\8d\83O\82ð\92Ç\89Á\81i\95\85\82ê\83C\83\93\83f\83b\83N\83X\91Î\89\9e\81j
     for i := 0 to DatList.Count - 1 do begin
         FileName := Boardpath + DatList[i];
-
-        //ResRec := DivideStrLine(ReadThreadFile(FileName, 1));
-        if Board.IsBoardPlugInAvailable then begin
-            ThreadItem := TThreadItem.Create(
-                Board.BoardPlugIn,
-                Board,
-                Board.BoardPlugIn.FileName2ThreadURL( DWORD( Board ), DatList[i] ) );
-            THTMLCreate.DivideStrLine(Board.BoardPlugIn.GetDat( DWORD( ThreadItem ), 1 ), @ResRec);
-        end else begin
-            ThreadItem := TThreadItem.Create(
-                nil,
-                Board,
-                Get2chBoard2ThreadURL( Board, ChangeFileExt( DatList[i], '' ) ) );
-            THTMLCreate.DivideStrLine(ReadThreadFile(FileName, 1), @ResRec);
+        ThreadItem := nil;
+        if (not AllCreate) then begin
+            create := False;
+            ThreadItem := Board.FindThreadFromFileName(DatList[i]);
+            if (ThreadItem = nil) then begin
+                create := True;
+            end else begin
+                if Board.IsBoardPlugInAvailable then begin
+                    THTMLCreate.DivideStrLine(Board.BoardPlugIn.GetDat( DWORD( ThreadItem ), 1 ), @ResRec);
+                end else begin
+                    THTMLCreate.DivideStrLine(ReadThreadFile(FileName, 1), @ResRec);
+                end;
+            end;
+        end;
+        if (ThreadItem = nil) then begin
+            if Board.IsBoardPlugInAvailable then begin
+                ThreadItem := TThreadItem.Create(
+                    Board.BoardPlugIn,
+                    Board,
+                    Board.BoardPlugIn.FileName2ThreadURL( DWORD( Board ), DatList[i] ) );
+                THTMLCreate.DivideStrLine(Board.BoardPlugIn.GetDat( DWORD( ThreadItem ), 1 ), @ResRec);
+            end else begin
+                ThreadItem := TThreadItem.Create(
+                    nil,
+                    Board,
+                    Get2chBoard2ThreadURL( Board, ChangeFileExt( DatList[i], '' ) ) );
+                THTMLCreate.DivideStrLine(ReadThreadFile(FileName, 1), @ResRec);
+            end;
         end;
+        
 
         ThreadItem.BeginUpdate;
         ThreadItem.FileName := DatList[i];
@@ -736,7 +775,9 @@ begin
         ThreadItem.ScrollTop := 0;
         ThreadItem.AgeSage := gasNone;
         ThreadItem.EndUpdate;
-        Board.Add(ThreadItem);
+        if (AllCreate) or (create) then begin
+            Board.Add(ThreadItem);
+        end;
     end;
 end;
 {!
@@ -1149,10 +1190,10 @@ end;
 }
 function TGikoSys.DirectoryExistsEx(const Name: string): Boolean;
 var
-       Code: Integer;
+       Code: Cardinal;
 begin
        Code := GetFileAttributes(PChar(Name));
-       Result := (Code <> -1) and (FILE_ATTRIBUTE_DIRECTORY and Code <> 0);
+       Result := (Code <> Cardinal(-1)) and (FILE_ATTRIBUTE_DIRECTORY and Code <> 0);
 end;
 
 {!
@@ -1307,17 +1348,15 @@ var
        nm: NONCLIENTMETRICS;
 begin
        nm.cbSize := sizeof(NONCLIENTMETRICS);
-
-       SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, @nm, 0);
-       lf := nm.lfMenuFont;
-
-       Font.Name := lf.lfFaceName;
-       Font.Height := lf.lfHeight;
-       Font.Style := [];
-       if lf.lfWeight >= 700 then
-               Font.Style := Font.Style + [fsBold];
-       if lf.lfItalic = 1 then
-               Font.Style := Font.Style + [fsItalic];
+    SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, @nm, 0);
+    lf := nm.lfMenuFont;
+    Font.Name := lf.lfFaceName;
+    Font.Height := lf.lfHeight;
+    Font.Style := [];
+    if lf.lfWeight >= 700 then
+        Font.Style := Font.Style + [fsBold];
+    if lf.lfItalic = 1 then
+        Font.Style := Font.Style + [fsItalic];
 end;
 
 {!
@@ -1800,7 +1839,13 @@ begin
        Index := AnsiPos(READ_PATH, path);
        if Index <> 0 then begin
                s := Copy(path, Index + Length(READ_PATH), Length(path));
-
+    end else begin
+        Index := AnsiPos(HTML_READ_PATH, path);
+        if Index <> 0 then begin
+            s := Copy(path, Index + Length(HTML_READ_PATH), Length(path));
+        end;
+    end;
+    if Index <> 0 then begin
                if (Length(s) > 0) and (s[1] = '/') then
                        Delete(s, 1, 1);
                BBSID := GetTokenIndex(s, '/', 0);
@@ -2029,7 +2074,7 @@ begin
                //\95W\8f\80\8f\91\8e®
                //\8dÅ\8cã\82Íl50, 10, 10-20, 10n, 10-20n, -10, 10-, 10n- \82È\82Ç
                //http://xxx.2ch.net/test/read.cgi/bbsid/1000000000/
-               FAWKStr.RegExp := '/test/read.cgi/.+/[0-9]+/?.*';
+               FAWKStr.RegExp := '/test/read.(cgi|html)/.+/[0-9]+/?.*';
                if FAWKStr.Match(FAWKStr.ProcessEscSeq(s), RStart, RLength) > 0 then begin
                        s := Copy(s, 15, Length(s));
 
@@ -2849,12 +2894,27 @@ end;
 }
 procedure TGikoSys.GetSameIDRes(AIDNum : Integer; ThreadItem: TThreadItem;var body: TStringList);
 var
+       AID : String;
+begin
+    AID := GetResID(AIDNum, ThreadItem);
+    if not IsNoValidID(AID) then begin
+           GetSameIDRes(AID, ThreadItem, body);
+       end;
+end;
+{!
+\brief \93\8a\8de ID \8eæ\93¾
+\param AIDNum     \93\8a\8d\83\8c\83X\94Ô\8d\86
+\param ThreadItem \93\8a\8de\83X\83\8c\83b\83h
+\param body       OUT:\93\8a\8deID
+}
+function TGikoSys.GetResID(AIDNum: Integer; ThreadItem: TThreadItem): String;
+var
        Res: TResRec;
        boardPlugIn : TBoardPlugIn;
-       AID : String;
        stList: TStringList;
        i : Integer;
 begin
+    Result := '';
        if (ThreadItem <> nil) and (ThreadItem.IsLogFile)
                and (AIDNum > 0) and (AIDNum <= ThreadItem.Count) then begin
                //if ThreadItem.IsBoardPlugInAvailable then begin
@@ -2866,21 +2926,21 @@ begin
                end else begin
                        THTMLCreate.DivideStrLine( ReadThreadFile(ThreadItem.GetThreadFileName, AIDNum), @Res);
                end;
-               AID := Res.FDateTime;
-               if AnsiPos('id', AnsiLowerCase(AID)) > 0 then begin
-                       AID := Copy(AID, AnsiPos('id', AnsiLowerCase(AID)) - 1, 11);
-            if AnsiPos(' be:', AnsiLowerCase(AID)) > 0 then begin
-               AID := Copy(AID, 1, AnsiPos(' BE:', AnsiLowerCase(AID)) - 1)
+               Result := Res.FDateTime;
+               if AnsiPos('id', AnsiLowerCase(Result)) > 0 then begin
+                       Result := Copy(Result, AnsiPos('id', AnsiLowerCase(Result)) - 1, 11);
+            if AnsiPos(' be:', AnsiLowerCase(Result)) > 0 then begin
+               Result := Copy(Result, 1, AnsiPos(' BE:', AnsiLowerCase(Result)) - 1)
             end;
                end else begin
                        stlist := TStringList.Create;
                        try
-                               stList.DelimitedText := AID;
-                AID := '';
+                               stList.DelimitedText := Result;
+                Result := '';
                                for i := 0 to stList.Count - 1 do
                                        if Length(WideString(stList[i])) = 8 then begin
                                                if NotDateorTimeString(stList[i]) then begin
-                                                       AID := stList[i];
+                                                       Result := stList[i];
                                                        break;
                                                end;
                                        end;
@@ -2888,11 +2948,8 @@ begin
                                stList.Free;
                        end;
                end;
-        if not IsNoValidID(AID) then
-                       GetSameIDRes(AID, ThreadItem, body);
        end;
 end;
-
 {!
 \brief \93¯\82\93\8a\8de ID \82ð\8e\9d\82Â\83\8c\83X\82ð\83J\83E\83\93\83g
 \param AID        \8cÂ\90l\82ð\93Á\92è\82·\82é\93\8a\8de ID
@@ -3309,7 +3366,8 @@ begin
                                        ThreadItem.NewReceive := ini.ReadInteger(SECTION, 'NewReceive', 0);
 
                                        ThreadItem.Size := ini.ReadInteger(SECTION, 'Size', 0);
-                                       if(ThreadItem.Size = 0) and (FileExists(ThreadItem.GetThreadFileName)) then begin
+                    ThreadItem.IsLogFile := FileExists(ThreadItem.GetThreadFileName);
+                                       if(ThreadItem.Size = 0) and (ThreadItem.IsLogFile) then begin
                                                try
                                                        ThreadItem.Size := GetFileSize(ThreadItem.GetThreadFileName) - ThreadItem.Count;
                                                except
@@ -3399,13 +3457,57 @@ function TGikoSys.GetReplaceFileName: String;
 begin
     Result := Setting.GetReplaceFileName;
 end;
+//! \83v\83\8c\83r\83\85\81[\8ag\92£\82Ì\90Ý\92è\83t\83@\83C\83\8b\8eæ\93¾
+function TGikoSys.GetExtpreviewFileName: String;
+begin
+    Result := Setting.GetExtprevieFileName;
+end;
+
+//! \83t\83@\83C\83\8b\96¼\82©\82ç\82Ì\83X\83\8c\83b\83h\8dì\90¬\93ú\82Ì\8eæ\93¾
+function TGikoSys.GetCreateDateFromName(FileName: String): TDateTime;
+var
+    tmp : String;
+    unixtime: Int64;  
+begin
+    // \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
+    tmp := ChangeFileExt(FileName, '');
+    if AnsiPos('_', tmp) <> 0 then
+        if AnsiPos('_', tmp) > 9 then
+            tmp := Copy(tmp, 1, AnsiPos('_', tmp)-1)
+        else
+            Delete(tmp, AnsiPos('_', tmp), 1);
+
+    if ( Length(tmp) = 9) and ( tmp[1] = '0' ) then
+        Insert('1', tmp, 1);
+
+    unixtime := StrToInt64Def(tmp, ZERO_DATE);
+    Result := UnixToDateTime(unixtime) + OffsetFromUTC;
+end;
+
+procedure TGikoSys.ShowRefCount(msg: String; unk: IUnknown);
+var
+    count : integer;
+begin
+    if not Assigned(unk) then
+        Exit;
+
+{$IFDEF DEBUG}
+    try
+        unk._AddRef;
+        count := unk._Release;
+
+               Writeln(msg + ' RefCount=' + IntToStr(count));
+    except
+               Writeln(msg + ' RefCount=exception!!');
+       end;
+{$ENDIF}
+end;
 
 initialization
        GikoSys := TGikoSys.Create;
 
 finalization
        if GikoSys <> nil then begin
-               GikoSys.Free;
-               GikoSys := nil;
+               FreeAndNil(GikoSys);
        end;
 end.