OSDN Git Service

・r1.263 で消し忘れのゴミが残っていたので削除。
[gikonavigoeson/gikonavi.git] / GikoSystem.pas
index 5d6600b..24ac1f1 100644 (file)
@@ -75,8 +75,8 @@ type
        TPathRec = record
                FBBS: string;                           //BBSID
                FKey: string;                           //ThreadID
-               FSt: Integer;                           //\8aJ\8en\83\8c\83X\94Ô
-               FTo: Integer;                           //\8fI\97¹\83\8c\83X\94Ô
+               FSt: Int64;                             //\8aJ\8en\83\8c\83X\94Ô
+               FTo: Int64;                             //\8fI\97¹\83\8c\83X\94Ô
                FFirst: Boolean;                //>>1\82Ì\95\\8e¦
                FStBegin: Boolean;      //1\81`\95\\8e¦
                FToEnd: Boolean;                //\81`\8dÅ\8cã\82Ü\82Å\95\\8e¦
@@ -126,6 +126,7 @@ type
                function GetStyleSheetDir: string;
                function GetOutBoxFileName: string;
                function GetUserAgent: string;
+        function GetSambaFileName : string;
 
                procedure ReadSubjectFile(Board: TBoard);
                procedure CreateThreadDat(Board: TBoard);
@@ -153,7 +154,7 @@ type
                function GetFileLineCount(FileName : string): longint;
                function Get2chDate(aDate: TDateTime): string;
                function IntToDateTime(val: Int64): TDateTime;
-               function DateTimeToInt(ADate: TDateTime): Integer;
+               function DateTimeToInt(ADate: TDateTime): Int64;
 
                function ReadThreadFile(FileName: string; Line: Integer): string;
 
@@ -175,6 +176,9 @@ type
                function GzipDecompress(ResStream: TStream; ContentEncoding: string): string;
                procedure LoadKeySetting(ActionList: TActionList);
                procedure SaveKeySetting(ActionList: TActionList);
+               procedure LoadEditorKeySetting(ActionList: TActionList);
+               procedure SaveEditorKeySetting(ActionList: TActionList);
+
                procedure CreateProcess(const AppPath: string; const Param: string);
                procedure OpenBrowser(URL: string; BrowserType: TGikoBrowserType);
                function HTMLDecode(const AStr: String): String;
@@ -189,28 +193,31 @@ type
                function        Get2chThreadURL2BoardURL( inURL : string ) : string;
                function        Get2chBrowsableThreadURL( inURL : string ) : string;
                function        Get2chBoard2ThreadURL( inBoard : TBoard; inKey : string ) : string;
-               procedure ReadBoardFile;
+               procedure ListBoardFile;
+               procedure ReadBoardFile( bbs : TBBS );
 
                function        GetUnknownCategory : TCategory;
                function        GetUnknownBoard( inPlugIn : TBoardPlugIn; inURL : string ) : TBoard;
 
-        procedure GetPopupResNumber(URL : string; var stRes, endRes : Integer);
+        procedure GetPopupResNumber(URL : string; var stRes, endRes : Int64);
 
                // \83X\83L\83\93\82ð\93Ç\82Ý\8d\9e\82Ý\81A\92l\82ð\92u\8a·\82·\82é
                function LoadFromSkin( fileName: string; ThreadItem: TThreadItem; SizeByte: Integer ): string;
        // \83\8c\83X\82Ì\92l\82ð\92u\8a·\82·\82é
                function SkinedRes( skin: string; Res: TResRec; No: string ): string;
 
+        //Samba24\82Ì\83t\83@\83C\83\8b\82ª\91\8dÝ\82·\82é\82©\81B\91\8dÝ\82µ\82È\82¢\8fê\8d\87\81Adefault\83t\83@\83C\83\8b\82ðrename\82·\82é
+        procedure SambaFileExists();
        end;
 
 var
        GikoSys: TGikoSys;
 const
-       LENGTH_RESTITLE                 = 40;
+       //LENGTH_RESTITLE                       = 40;
        ZERO_DATE: Integer      = 25569;
        BETA_VERSION_NAME_E = 'beta';
        BETA_VERSION_NAME_J = 'ÊÞÀ';
-       BETA_VERSION                            = 44;
+       BETA_VERSION                            = 47;
        BETA_VERSION_BUILD      = '';                           //debug\94Å\82È\82Ç
        APP_NAME                                                = 'gikoNavi';
 
@@ -245,6 +252,7 @@ begin
        FAbon.GoHome;
        FAbon.ReturnNGwordLineNum := FSetting.ShowNGLinesNum;
        FAbon.SetNGResAnchor := FSetting.AddResAnchor;
+    FAbon.DeleteSyria := FSetting.DeleteSyria;
        FAbon.Deleterlo := FSetting.AbonDeleterlo;
        FAbon.Replaceul := FSetting.AbonReplaceul;
        FAbon.AbonPopupRes := FSetting.PopUpAbon;
@@ -460,17 +468,17 @@ var
        d2: tdatetime;
 begin
        d1 := EncodeDate(1970, 1, 1);
-       d2 := (val * 1000) / (24 * 60 * 60 * 1000);
+       d2 := val / 86400.0;//(val * 1000) / (24 * 60 * 60 * 1000);
        Result := d1 + d2;
 end;
 
-function TGikoSys.DateTimeToInt(ADate: TDateTime): Integer;
+function TGikoSys.DateTimeToInt(ADate: TDateTime): Int64;
 var
        d: TDateTime;
        c: Currency;
 begin
        d := EncodeDate(1970, 1, 1);
-       c := (ADate - d) * 24 * 60 * 60;
+       c := (ADate - d) * 86400; //(ADate - d) * 24 * 60 * 60;
        Result := Trunc(c);
 end;
 
@@ -497,7 +505,10 @@ var
        RoundItem: TRoundItem;
        idx: Integer;
        usePlugIn : Boolean;
+    tmpStr: string;
 begin
+    if Board.IsThreadDatRead then
+       Exit;
        Board.Clear;
        UnRead := 0;
 //     TmpUpdate := False;
@@ -528,85 +539,94 @@ begin
 
        sl := TStringList.Create;
        try
-               if FileExists(FileName) then
+               if FileExists(FileName) then begin
                        sl.LoadFromFile(FileName);
 
-               //\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]);
-
-                       if usePlugIn then
-                               ThreadItem := TThreadItem.Create(
-                                       Board.BoardPlugIn,
-                                       Board.BoardPlugIn.FileName2ThreadURL( DWORD( Board ), Rec.FFileName ) )
-                       else
-                               ThreadItem := TThreadItem.Create(
-                                       nil,
-                                       Get2chBoard2ThreadURL( Board, ChangeFileExt( Rec.FFileName, '' ) ) );
-
-                       if FileList.Count <> 0 then
-                               if FileList.Find( ThreadItem.FileName, Index ) then
-                                       //ThreadItem.IsLogFile := True;
-                                       FileList.Delete( Index );
-
-                       ThreadItem.BeginUpdate;
-                       ThreadItem.No := Rec.FNo;
-                       ThreadItem.FileName := Rec.FFileName;
-                       ThreadItem.Title := Rec.FTitle;
-                       ThreadItem.Count := Rec.FCount;
-                       ThreadItem.Size := Rec.FSize;
-//                     ThreadItem.RoundNo := Rec.FRoundNo;
-                       ThreadItem.RoundDate := Rec.FRoundDate;
-                       ThreadItem.LastModified := Rec.FLastModified;
-                       ThreadItem.Kokomade := Rec.FKokomade;
-                       ThreadItem.NewReceive := Rec.FNewReceive;
-//                     ThreadItem.Round := Rec.FRound;
-                       ThreadItem.UnRead := Rec.FUnRead;
-                       ThreadItem.ScrollTop := Rec.FScrollTop;
-                       ThreadItem.AllResCount := Rec.FAllResCount;
-                       ThreadItem.NewResCount := Rec.FNewResCount;
-                       ThreadItem.AgeSage := Rec.FAgeSage;
-                       ThreadItem.ParentBoard := Board;
-
-                       //\8f\84\89ñ\83\8a\83X\83g\82É\91\8dÝ\82µ\82½\82ç\8f\84\89ñ\83t\83\89\83O\83Z\83b\83g
-                       if ThreadItem.IsLogFile then begin
-                               idx := RoundList.Find(ThreadItem);
-                               if idx <> -1 then begin
-                                       RoundItem := RoundList.Items[idx, grtItem];
-                                       ThreadItem.RoundName := RoundItem.RoundName;
-                                       ThreadItem.Round := True;
-                               end;
-                       end;
+            //\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]);
+                if usePlugIn then
+                    ThreadItem := TThreadItem.Create(
+                        Board.BoardPlugIn,
+                        Board.BoardPlugIn.FileName2ThreadURL( DWORD( Board ), Rec.FFileName ) )
+                else
+                    ThreadItem := TThreadItem.Create(
+                        nil,
+                        Get2chBoard2ThreadURL( Board, ChangeFileExt( Rec.FFileName, '' ) ) );
+
+                if FileList.Count <> 0 then
+                    if FileList.Find( ThreadItem.FileName, Index ) then
+                        //ThreadItem.IsLogFile := True;
+                        FileList.Delete( Index );
+
+                ThreadItem.BeginUpdate;
+                ThreadItem.No := Rec.FNo;
+                ThreadItem.FileName := Rec.FFileName;
+                ThreadItem.Title := Rec.FTitle;
+                ThreadItem.Count := Rec.FCount;
+                ThreadItem.Size := Rec.FSize;
+    //                 ThreadItem.RoundNo := Rec.FRoundNo;
+                ThreadItem.RoundDate := Rec.FRoundDate;
+                ThreadItem.LastModified := Rec.FLastModified;
+                ThreadItem.Kokomade := Rec.FKokomade;
+                ThreadItem.NewReceive := Rec.FNewReceive;
+    //                 ThreadItem.Round := Rec.FRound;
+                ThreadItem.UnRead := Rec.FUnRead;
+                ThreadItem.ScrollTop := Rec.FScrollTop;
+                ThreadItem.AllResCount := Rec.FAllResCount;
+                ThreadItem.NewResCount := Rec.FNewResCount;
+                ThreadItem.AgeSage := Rec.FAgeSage;
+                ThreadItem.ParentBoard := Board;
+
+                //\8f\84\89ñ\83\8a\83X\83g\82É\91\8dÝ\82µ\82½\82ç\8f\84\89ñ\83t\83\89\83O\83Z\83b\83g
+                if ThreadItem.IsLogFile then begin
+                    idx := RoundList.Find(ThreadItem);
+                    if idx <> -1 then begin
+                        RoundItem := RoundList.Items[idx, grtItem];
+                        ThreadItem.RoundName := RoundItem.RoundName;
+                        ThreadItem.Round := True;
+                    end;
+                end;
 
-                       //\91O\89ñ\88Ù\8fí\8fI\97¹\8e\9e\83`\83F\83b\83N
-                       if TmpFileList.Count <> 0 then begin
-                               if TmpFileList.Find(ChangeFileExt(ThreadItem.FileName, '.tmp'), Index) then begin
-                                       ini := TMemIniFile.Create(ChangeFileExt(ThreadItem.GetThreadFileName, '.tmp'));
-                                       try
-                                               ThreadItem.RoundDate := ini.ReadDateTime('Setting', 'RoundDate', ZERO_DATE);
-                                               ThreadItem.LastModified := ini.ReadDateTime('Setting', 'LastModified', ZERO_DATE);
-                                               ThreadItem.Size := ini.ReadInteger('Setting', 'Size', 0);
-                                               ThreadItem.Count := ini.ReadInteger('Setting', 'Count', 0);
-                                               ThreadItem.NewReceive := ini.ReadInteger('Setting', 'NewReceive', 0);
-                                               ThreadItem.Round := ini.ReadBool('Setting', 'Round', False);
-                                               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;
-                                       TmpFileList.Delete(Index);
-                               end;
-                       end;
+                //\91O\89ñ\88Ù\8fí\8fI\97¹\8e\9e\83`\83F\83b\83N
+                if TmpFileList.Count <> 0 then begin
+                    if TmpFileList.Find(ChangeFileExt(ThreadItem.FileName, '.tmp'), Index) then begin
+                        ini := TMemIniFile.Create(ChangeFileExt(ThreadItem.GetThreadFileName, '.tmp'));
+                        try
+                            //ThreadItem.RoundDate := ini.ReadDateTime('Setting', 'RoundDate', ZERO_DATE);
+                            tmpStr := ini.ReadString('Setting', 'RoundDate', DateTimeToStr(ZERO_DATE));
+                            ThreadItem.RoundDate := ConvertDateTimeString(tmpStr);
+
+                            //ThreadItem.LastModified := ini.ReadDateTime('Setting', 'LastModified', ZERO_DATE);
+                            tmpStr := ini.ReadString('Setting', 'LastModified', DateTimeToStr(ZERO_DATE));
+                            ThreadItem.LastModified := ConvertDateTimeString(tmpStr);
+
+                            ThreadItem.Size := ini.ReadInteger('Setting', 'Size', 0);
+                            if ThreadItem.Size = 0 then begin
+                                ThreadItem.Size := FileSizeByName(ThreadItem.FileName) - ThreadItem.Count;
+                            end;
+                            ThreadItem.Count := ini.ReadInteger('Setting', 'Count', 0);
+                            ThreadItem.NewReceive := ini.ReadInteger('Setting', 'NewReceive', 0);
+                            ThreadItem.Round := ini.ReadBool('Setting', 'Round', False);
+                            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;
+                        TmpFileList.Delete(Index);
+                    end;
+                end;
 
-                       ThreadItem.EndUpdate;
-                       Board.Add(ThreadItem);
+                ThreadItem.EndUpdate;
+                Board.Add(ThreadItem);
 
-//                     if (ThreadItem.IsLogFile) and (ThreadItem.Count > ThreadItem.Kokomade) then
-                       if (ThreadItem.IsLogFile) and (ThreadItem.UnRead) then
-                               Inc(UnRead);
+    //                 if (ThreadItem.IsLogFile) and (ThreadItem.Count > ThreadItem.Kokomade) then
+                if (ThreadItem.IsLogFile) and (ThreadItem.UnRead) then
+                    Inc(UnRead);
+            end;
                end;
 
                if UnRead <> Board.UnRead then
@@ -620,34 +640,38 @@ begin
                        if usePlugIn then
                                ThreadItem := TThreadItem.Create(
                                        Board.BoardPlugIn,
-                                       Board.BoardPlugIn.FileName2ThreadURL( DWORD( Board ), Rec.FFileName ) )
+                                       Board.BoardPlugIn.FileName2ThreadURL( DWORD( Board ), FileList[i] ) )
                        else
                                ThreadItem := TThreadItem.Create(
-                                       nil, Get2chBoard2ThreadURL( Board, ChangeFileExt( Rec.FFileName, '' ) ) );
+                                       nil, Get2chBoard2ThreadURL( Board, ChangeFileExt( FileList[i], '' ) ) );
+
+            ThreadItem.BeginUpdate;
+            ThreadItem.FilePath := FileName;
                        ThreadItem.No := Board.Count + 1;
                        ThreadItem.FileName := FileList[i];
                        ThreadItem.Title := ResRec.FTitle;
                        ThreadItem.Count := GetFileLineCount(FileName);
                        ThreadItem.AllResCount := ThreadItem.Count;
-                       ThreadItem.NewResCount := 0;
-                       ThreadItem.Size := 0;
+                       ThreadItem.NewResCount := ThreadItem.Count;
+                       ThreadItem.Size := FileSizeByName(FileName) - ThreadItem.Count;//1byte\82¸\82ê\82é\82Æ\82«\82ª\82 \82é\82¯\82Ç\82»\82ê\82Í\82 \82«\82ç\82ß\82é
                        ThreadItem.RoundDate := ZERO_DATE;
                        ThreadItem.LastModified := ZERO_DATE;
                        ThreadItem.Kokomade := -1;
-                       ThreadItem.NewReceive := 0;
+                       ThreadItem.NewReceive := ThreadItem.Count;
                        ThreadItem.ParentBoard := Board;
                        ThreadItem.IsLogFile := True;
                        ThreadItem.Round := False;
                        ThreadItem.UnRead := False;
                        ThreadItem.ScrollTop := 0;
                        ThreadItem.AgeSage := gasNone;
+            ThreadItem.EndUpdate;
                        Board.Add(ThreadItem);
                end;
        finally
                sl.Free;
+               FileList.Free;
+               TmpFileList.Free;
        end;
-       FileList.Free;
-       TmpFileList.Free;
        Board.IsThreadDatRead := True;
 end;
 
@@ -733,7 +757,7 @@ begin
        sl := TStringList.Create;
     TmpFileList := TStringList.Create;
        try
-       GetFileList(ExtractFileDir(Board.GetFolderIndexFileName), '*.tmp', TmpFileList, False, False);
+       GetFileList(ExtractFileDir(Board.GetFolderIndexFileName), '*.tmp', TmpFileList, False, true);
 
         sl.BeginUpdate;
                sl.Add(FOLDER_INDEX_VERSION);
@@ -1002,11 +1026,11 @@ var
        SkinHeader: string;
        SkinNewRes: string;
        SkinRes: string;
-       SizeByte: Integer;
+//     SizeByte: Integer;
 
        function LoadSkin( fileName: string ): string;
        begin
-               Result := LoadFromSkin( fileName, ThreadItem, SizeByte );
+               Result := LoadFromSkin( fileName, ThreadItem, ThreadItem.Size );
        end;
        function ReplaceRes( skin: string ): string;
        begin
@@ -1018,7 +1042,6 @@ begin
                        //===== \83v\83\89\83O\83C\83\93\82É\82æ\82é\95\\8e¦
                        boardPlugIn             := ThreadItem.BoardPlugIn;
                        NewReceiveNo    := ThreadItem.NewReceive;
-
                        // \83t\83H\83\93\83g\82â\83T\83C\83Y\82Ì\90Ý\92è
                        if Length( GikoSys.Setting.BrowserFontName ) > 0 then
                                UserOptionalStyle := UserOptionalStyle +
@@ -1124,7 +1147,7 @@ begin
        ShortDayNames[3] := '\89Î';               ShortDayNames[4] := '\90\85';
        ShortDayNames[5] := '\96Ø';               ShortDayNames[6] := '\8bà';
        ShortDayNames[7] := '\93y';
-       SizeByte := 0;
+//     SizeByte := 0;
        BBSID := ThreadItem.ParentBoard.BBSID;
        NewReceiveNo := ThreadItem.NewReceive;
        ReadList := TStringList.Create;
@@ -1243,12 +1266,12 @@ begin
                                                        end;
                                                end;
                                        end;
-                                       SizeByte := SizeByte + Length( SaveList.Text );
+//                                     SizeByte := SizeByte + Length( SaveList.Text );
                                        doc.Write(SaveList.Text);
                                        SaveList.Clear;
                                end;
                                SaveList.Add('<a name="bottom"></a>');
-                               SizeByte := SizeByte + Length( SaveList.Text );
+//                             SizeByte := SizeByte + Length( SaveList.Text );
                                // \83X\83L\83\93(\83t\83b\83^)
                                try
                                        SaveList.Add( LoadSkin( GetSkinFooterFileName ) );
@@ -1409,7 +1432,7 @@ var
        wkIdx: array[0..9] of Integer;
        url: string;
        href: string;
-       i: Integer;
+       i, b: Integer;
        idx: Integer;
        anchorLen : Integer;
 begin
@@ -1454,11 +1477,15 @@ begin
 
                s := Copy(s, idx, length(s));
 
-               for i := 0 to Length(s) do begin
-                       idx := AnsiPos(s[i + 1], URL_CHAR);
-                       if (idx = 0) or (i = (Length(s))) then begin
+               b := Length( s ) + 1;
+               for i := 1 to b do begin
+                       if i = b then
+       idx := 0
+      else
+                               idx := AnsiPos(s[i], URL_CHAR);
+                       if idx = 0 then begin
                                //URL\82\82á\82È\82¢\95\8e\9a\94­\8c©\81I\82Æ\82©\81A\95\8e\9a\82ª\82È\82­\82È\82Á\82½\81B
-                               url := Copy(s, 0, i);
+                               url := Copy(s, 0, i - 1);
 
                                if AnsiPos('ttp://', url) = 1 then
                                        href := 'h' + url
@@ -1471,7 +1498,7 @@ begin
                                else
                                        href := url;
                                Result := Result + '<a href="' + href + '" target="_blank">' + url + '</a>';
-                               s := Copy(s, i + 1, Length(s));
+                               s := Copy(s, i, MaxInt);
                                Break;
                        end;
                end;
@@ -2275,7 +2302,7 @@ end;
  *************************************************************************)
 function TGikoSys.VaguePos(const Substr, S: string): Integer;
 begin
-       Result := Pos(ZenToHan(Substr), ZenToHan(S));
+       Result := AnsiPos(ZenToHan(Substr), ZenToHan(S));
 end;
 
 function TGikoSys.BoolToInt(b: Boolean): Integer;
@@ -2399,6 +2426,59 @@ begin
        end;
 end;
 
+procedure TGikoSys.LoadEditorKeySetting(ActionList: TActionList);
+const
+       STD_SEC = 'KeySetting';
+var
+       i: Integer;
+       ini: TMemIniFile;
+       ActionName: string;
+       ActionKey: Integer;
+       SecList: TStringList;
+       Component: TComponent;
+begin
+       if not FileExists(GetConfigDir + EKEY_SETTING_FILE_NAME) then
+               Exit;
+       SecList := TStringList.Create;
+       ini := TMemIniFile.Create(GetConfigDir + EKEY_SETTING_FILE_NAME);
+       try
+               ini.ReadSection(STD_SEC, SecList);
+               for i := 0 to SecList.Count - 1 do begin
+                       ActionName := SecList[i];
+                       ActionKey := ini.ReadInteger(STD_SEC, ActionName, -1);
+                       if ActionKey <> -1 then begin
+                               Component := ActionList.Owner.FindComponent(ActionName);
+                               if TObject(Component) is TAction then begin
+                                       TAction(Component).ShortCut := ActionKey;
+                               end;
+                       end;
+               end;
+       finally
+               ini.Free;
+               SecList.Free;
+       end;
+end;
+
+procedure TGikoSys.SaveEditorKeySetting(ActionList: TActionList);
+const
+       STD_SEC = 'KeySetting';
+var
+       i: Integer;
+       ini: TMemIniFile;
+begin
+       ini := TMemIniFile.Create(GetConfigDir + EKEY_SETTING_FILE_NAME);
+       try
+               for i := 0 to ActionList.ActionCount - 1 do begin
+                       if ActionList.Actions[i].Tag = -1 then
+                               Continue;
+                       ini.WriteInteger(STD_SEC, ActionList.Actions[i].Name, TAction(ActionList.Actions[i]).ShortCut);
+               end;
+               ini.UpdateFile;
+       finally
+               ini.Free;
+       end;
+end;
+
 //
 procedure TGikoSys.CreateProcess(const AppPath: string; const Param: string);
 var
@@ -2628,17 +2708,17 @@ begin
                end;
        end;
 end;
-procedure TGikoSys.GetPopupResNumber(URL : string; var stRes, endRes : integer);
+procedure TGikoSys.GetPopupResNumber(URL : string; var stRes, endRes : Int64);
 var
     buf : String;
     convBuf : String;
-    ps : Integer;
+    ps : Int64;
     pch : PChar;
 begin
        URL := Trim(LowerCase(URL));
     if (AnsiPos('&st=', URL ) <> 0) and ( AnsiPos( '&to=',URL) <> 0 ) then begin
         try
-            stRes := StrToInt( Copy( URL, AnsiPos('&st=', URL ) + 4, AnsiPos( '&to=',URL) - AnsiPos('&st=', URL ) - 4 ) );
+            stRes := StrToInt64( Copy( URL, AnsiPos('&st=', URL ) + 4, AnsiPos( '&to=',URL) - AnsiPos('&st=', URL ) - 4 ) );
             if AnsiPos( '&nofirst=',URL) <> 0 then begin
                 buf := Copy( URL, AnsiPos('&to=', URL ) + 4, AnsiPos( '&nofirst=',URL) - AnsiPos('&to=', URL ) - 4);
             end else begin
@@ -2650,7 +2730,7 @@ begin
             end;
             try
                 if buf <> '' then
-                    endRes := StrToInt(buf);
+                    endRes := StrToInt64(buf);
             except
                 endRes := 0;
             end;
@@ -2676,7 +2756,7 @@ begin
         end;
     end else if (AnsiPos('&start=', URL ) <> 0) and ( AnsiPos( '&end=',URL) <> 0 ) then begin
         try
-            stRes := StrToInt( Copy( URL, AnsiPos('&start=', URL ) + 7, AnsiPos( '&end=',URL) - AnsiPos('&start=', URL ) - 7 ) );
+            stRes := StrToInt64( Copy( URL, AnsiPos('&start=', URL ) + 7, AnsiPos( '&end=',URL) - AnsiPos('&start=', URL ) - 7 ) );
             if AnsiPos( '&nofirst=',URL) <> 0 then begin
                 buf := Copy( URL, AnsiPos('&end=', URL ) + 5, AnsiPos( '&nofirst=',URL) - AnsiPos('&end=', URL ) - 5);
             end else begin
@@ -2688,7 +2768,7 @@ begin
             end;
             try
                 if buf <> '' then
-                    endRes := StrToInt(buf);
+                    endRes := StrToInt64(buf);
             except
                 endRes := 0;
             end;
@@ -2704,7 +2784,7 @@ begin
             try
                 convBuf := Copy( buf, 1, ps );
                 if convBuf <> '' then begin
-                    stRes := StrToInt(convBuf);
+                    stRes := StrToInt64(convBuf);
                     Delete(buf,1,ps+1);
                     ps := 0;
                     pch := PChar(buf);
@@ -2712,7 +2792,7 @@ begin
                     try
                         convBuf := Copy( buf, 1, ps );
                         if convBuf <> '' then
-                            endRes := StrToInt(convBuf)
+                            endRes := StrToInt64(convBuf)
                         else
                             endRes := 0;
                     except
@@ -2762,7 +2842,8 @@ begin
 
        wkMin := 0;
        wkMax := 1;
-
+    if URL[length(URL)] = '\' then
+       URL := URL + 'n';
        FAWKStr.RegExp := 'http://.+\.(2ch\.net|bbspink\.com)/';
        if FAWKStr.Match(FAWKStr.ProcessEscSeq(URL), RStart, RLength) <> 0 then begin
                s := Copy(URL, RStart + RLength - 1, Length(URL));
@@ -3128,152 +3209,154 @@ begin
 end;
 
 (*************************************************************************
+ *\8b@\94\\96¼\81@\81@\81F\83{\81[\83h\83t\83@\83C\83\8b\97ñ\8b\93
+ *\89Â\8e\8b\81@\81@\81@\81FPublic
+ *************************************************************************)
+procedure TGikoSys.ListBoardFile;
+var
+       boardFileList   : TStringList;
+       i, l                                    : Integer;
+begin
+
+  // BBS \82Ì\8aJ\95ú
+  try
+    for i := 0 to Length( BBSs ) - 1 do
+      BBSs[ i ].Free;
+  except
+  end;
+  SetLength( BBSs, 0 );
+
+  l := 0;
+  // \94Â\83\8a\83X\83g\82Ì\97ñ\8b\93
+  if FileExists( GikoSys.GetBoardFileName ) then begin
+    SetLength( BBSs, l + 1 );
+    BBSs[ l ]                          := TBBS.Create( GikoSys.GetBoardFileName );
+    BBSs[ l ].Title    := '\82Q\82¿\82á\82ñ\82Ë\82é';
+               Inc( l );
+  end;
+
+  if FileExists( GikoSys.GetCustomBoardFileName ) then begin
+    SetLength( BBSs, l + 1 );
+    BBSs[ l ]                          := TBBS.Create( GikoSys.GetCustomBoardFileName );
+    BBSs[ l ].Title    := '\82»\82Ì\91¼';
+               Inc( l );
+  end;
+
+  // Board \83t\83H\83\8b\83_
+  if DirectoryExists( GikoSys.Setting.GetBoardDir ) then begin
+    BoardFileList := TStringList.Create;
+    try
+      GikoSys.GetFileList( GikoSys.Setting.GetBoardDir, '*', BoardFileList, True, True );
+                       SetLength( BBSs, l + BoardFileList.Count );
+      for i := BoardFileList.Count - 1 downto 0 do begin
+        BBSs[ l ]                              := TBBS.Create( BoardFileList[ i ] );
+        BBSs[ l ].Title        := ChangeFileExt( ExtractFileName( BoardFileList[ i ] ), '' );
+
+        Inc( l );
+      end;
+    finally
+      BoardFileList.Free;
+    end;
+  end;
+
+end;
+
+(*************************************************************************
  *\8b@\94\\96¼\81@\81@\81F\83{\81[\83h\83t\83@\83C\83\8b\93Ç\82Ý\8d\9e\82Ý
  *\89Â\8e\8b\81@\81@\81@\81FPublic
- *\97\9a\97ð\82P\81@\81@\81F\90V\8bK\8dì\90¬
  *************************************************************************)
-procedure TGikoSys.ReadBoardFile;
+procedure TGikoSys.ReadBoardFile( bbs : TBBS );
 var
-       idx: Integer;
-       ini: TMemIniFile;
-       CategoryList: TStringList;
-       BoardList: TStringList;
-       Category: TCategory;
-       Board: TBoard;
-       inistr: string;
-       RoundItem: TRoundItem;
+       idx                                             : Integer;
+       ini                                             : TMemIniFile;
 
-       // BBS \94z\97ñ(1 \83{\81[\83h\83t\83@\83C\83\8b\82É\82Â\82« 1 \8d\80\96Ú)
-       bbsList                         : array of TStringList;
-       boardFileList   : TStringList;
+       boardFile                       : TStringList;
+       CategoryList    : TStringList;
+       BoardList                       : TStringList;
+       Category                        : TCategory;
+       Board                                   : TBoard;
+       inistr                          : string;
+       RoundItem                       : TRoundItem;
 
        i, iBound                       : Integer;
        j, jBound                       : Integer;
        k, kBound                       : Integer;
-       l, lBound                       : Integer;
 begin
-       ini := TMemIniFile.Create('');
-       try
-               // BBS \82Ì\8aJ\95ú
-               try
-                       for i := 0 to Length( BBSs ) - 1 do
-                               BBSs[ i ].Free;
-               except
-               end;
-               SetLength( BBSs, 0 );
-
-               // \94Â\83\8a\83X\83g\82Ì\97ñ\8b\93
-               if FileExists( GikoSys.GetBoardFileName ) then begin
-                       l                                                               := Length( bbsList );
-                       SetLength( bbsList, l + 1 );
-                       bbsList[ l ]            := TStringList.Create;
-                       bbsList[ l ].LoadFromFile( GikoSys.GetBoardFileName );
-
-                       SetLength( BBSs, l + 1 );
-                       BBSs[ l ]                               := TBBS.Create( GikoSys.Setting.LogFolder );
-                       BBSs[ l ].Title := '\82Q\82¿\82á\82ñ\82Ë\82é';
-               end;
-
-               if FileExists( GikoSys.GetCustomBoardFileName ) then begin
-                       l                                                               := Length( bbsList );
-                       SetLength( bbsList, l + 1 );
-                       bbsList[ l ]            := TStringList.Create;
-                       bbsList[ l ].LoadFromFile( GikoSys.GetCustomBoardFileName );
-
-                       SetLength( BBSs, l + 1 );
-                       BBSs[ l ]                               := TBBS.Create( GikoSys.Setting.LogFolder );
-                       BBSs[ l ].Title := '\82»\82Ì\91¼';
-               end;
 
-               // Board \83t\83H\83\8b\83_
-               if DirectoryExists( GikoSys.Setting.GetBoardDir ) then begin
-                       BoardFileList := TStringList.Create;
-                       try
-                               GikoSys.GetFileList( GikoSys.Setting.GetBoardDir, '*', BoardFileList, True, True );
-                               l := Length( bbsList );
-                               for i := BoardFileList.Count - 1 downto 0 do begin
-                                       SetLength( bbsList, l + 1 );
-                                       bbsList[ l ]            := TStringList.Create;
-                                       bbsList[ l ].LoadFromFile( BoardFileList[ i ] );
-
-                                       SetLength( BBSs, l + 1 );
-                                       BBSs[ l ]                               := TBBS.Create( GikoSys.Setting.LogFolder );
-                                       BBSs[ l ].Title := ChangeFileExt( ExtractFileName( BoardFileList[ i ] ), '' );
-
-                                       Inc( l );
-                               end;
-                       finally
-                               BoardFileList.Free;
-                       end;
-               end;
-
-               lBound := Length( bbsList ) - 1;
-               for l := 0 to lBound do begin
-                       ini.SetStrings( bbsList[ l ] );
-                       CategoryList    := TStringList.Create;
-                       BoardList                       := TStringList.Create;
-                       try
-                               ini.ReadSections( CategoryList );
-
-                               iBound := CategoryList.Count - 1;
-                               for i := 0 to iBound do begin
-                                       ini.ReadSection( CategoryList[i], BoardList );
-                                       Category                                := TCategory.Create;
-                                       Category.No                     := i + 1;
-                                       Category.Title  := CategoryList[i];
-
-                                       jBound := BoardList.Count - 1;
-                                       for j := 0 to jBound do begin
-                                               Board := nil;
-                                               inistr := ini.ReadString(CategoryList[i], BoardList[j], '');
-
-                                               //===== \83v\83\89\83O\83C\83\93
-                                               try
-                                                       kBound := Length( BoardPlugIns ) - 1;
-                                                       for k := 0 to kBound do begin
-                                                               if Assigned( Pointer( BoardPlugIns[ k ].Module ) ) then begin
-                                                                       if BoardPlugIns[ k ].AcceptURL( inistr ) = atBoard then begin
-                                                                               Board := TBoard.Create( BoardPlugIns[ k ], inistr );
-
-                                                                               Break;
-                                                                       end;
-                                                               end;
-                                                       end;
-                                               except
-                                                       // exception \82ª\94­\90\82µ\82½\8fê\8d\87\82Í\93à\95\94\8f\88\97\9d\82É\94C\82¹\82½\82¢\82Ì\82Å\82±\82±\82Å\82Í\89½\82à\82µ\82È\82¢
-                                               end;
+  if not FileExists( bbs.FilePath ) then
+    Exit;
+
+       bbs.Clear;
+  ini := TMemIniFile.Create('');
+  boardFile := TStringList.Create;
+  try
+    boardFile.LoadFromFile( bbs.FilePath );
+
+    ini.SetStrings( boardFile );
+    CategoryList       := TStringList.Create;
+    BoardList                  := TStringList.Create;
+    try
+      ini.ReadSections( CategoryList );
+
+      iBound := CategoryList.Count - 1;
+      for i := 0 to iBound do begin
+        ini.ReadSection( CategoryList[i], BoardList );
+        Category                               := TCategory.Create;
+        Category.No                    := i + 1;
+        Category.Title := CategoryList[i];
+
+        jBound := BoardList.Count - 1;
+        for j := 0 to jBound do begin
+          Board := nil;
+          inistr := ini.ReadString(CategoryList[i], BoardList[j], '');
+
+          //===== \83v\83\89\83O\83C\83\93
+          try
+            kBound := Length( BoardPlugIns ) - 1;
+            for k := 0 to kBound do begin
+              if Assigned( Pointer( BoardPlugIns[ k ].Module ) ) then begin
+                if BoardPlugIns[ k ].AcceptURL( inistr ) = atBoard then begin
+                  Board := TBoard.Create( BoardPlugIns[ k ], inistr );
+
+                  Break;
+                end;
+              end;
+            end;
+          except
+            // exception \82ª\94­\90\82µ\82½\8fê\8d\87\82Í\93à\95\94\8f\88\97\9d\82É\94C\82¹\82½\82¢\82Ì\82Å\82±\82±\82Å\82Í\89½\82à\82µ\82È\82¢
+          end;
+
+          if Board = nil then
+            Board := TBoard.Create( nil, inistr );
+          Board.BeginUpdate;
+          Board.No := j + 1;
+          Board.Title := BoardList[j];
+          Board.RoundDate := ZERO_DATE;
+
+          idx := RoundList.Find(Board);
+          if idx <> -1 then begin
+            RoundItem                          := RoundList.Items[idx, grtBoard];
+            Board.Round                        := True;
+            Board.RoundName    := RoundItem.RoundName;
+          end;
+
+          Category.Add(Board);
+          Board.LoadSettings;
+          Board.EndUpdate;
+        end;
 
-                                               if Board = nil then
-                                                       Board := TBoard.Create( nil, inistr );
-                                               Board.BeginUpdate;
-                                               Board.No := j + 1;
-                                               Board.Title := BoardList[j];
-                                               Board.RoundDate := ZERO_DATE;
-
-                                               idx := RoundList.Find(Board);
-                                               if idx <> -1 then begin
-                                                       RoundItem                               := RoundList.Items[idx, grtBoard];
-                                                       Board.Round                     := True;
-                                                       Board.RoundName := RoundItem.RoundName;
-                                               end;
-                                               Category.Add(Board);
-                                               Board.LoadSettings;
-                                               Board.EndUpdate;
-                                       end;
+        bbs.Add( Category );
+      end;
+                       bbs.IsBoardFileRead := True;
+    finally
+      BoardList.Free;
+      CategoryList.Free;
+    end;
+  finally
+    boardFile.Free;
+    ini.Free;
+  end;
 
-                                       BBSs[ l ].Add( Category );
-                               end;
-                       finally
-                               BoardList.Free;
-                               CategoryList.Free;
-                       end;
-               end;
-       finally
-               ini.Free;
-               lBound := Length( bbsList ) - 1;
-               for l := 0 to lBound do
-                       bbsList[ l ].Free;
-       end;
 end;
 
 function       TGikoSys.GetUnknownCategory : TCategory;
@@ -3315,7 +3398,28 @@ begin
        end;
 
 end;
-
+function TGikoSys.GetSambaFileName : string;
+begin
+       Result := Setting.GetSambaFileName;
+end;
+procedure TGikoSys.SambaFileExists();
+var
+       sambaTmp: string;
+    sambaStrList: TStringList;
+begin
+    if not FileExists(GikoSys.GetSambaFileName) then begin
+       sambaTmp := ChangeFileExt(GikoSys.GetSambaFileName, '.default');
+        sambaStrList := TStringList.Create;
+        try
+            if FileExists(sambaTmp) then begin
+                       sambaStrList.LoadFromFile(sambaTmp);
+                sambaStrList.SaveToFile(GikoSys.GetSambaFileName);
+            end;
+        finally
+               sambaStrList.Free;
+        end;
+    end;
+end;
 
 initialization
        GikoSys := TGikoSys.Create;