X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=GikoSystem.pas;h=a1a644adeadf05e38379d191a5ecf3f12e800f54;hb=3152aa5e4a757007e33ef6117a609cd1885f80cd;hp=8fcd4bca459fac17ba3b6068c5fbac0b9edd0263;hpb=9dbd154ba250d3cd69c90cb307293575516f9bb2;p=gikonavigoeson%2Fgikonavi.git diff --git a/GikoSystem.pas b/GikoSystem.pas index 8fcd4bc..a1a644a 100644 --- a/GikoSystem.pas +++ b/GikoSystem.pas @@ -4,7 +4,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, - ComCtrls, IniFiles, ShellAPI, ActnList, Math, + ComCtrls, {IniFiles,} ShellAPI, ActnList, Math, {$IF Defined(DELPRO) } SHDocVw, MSHTML, @@ -12,10 +12,10 @@ uses SHDocVw_TLB, MSHTML_TLB, {$IFEND} - {HttpApp,} YofUtils, URLMon, IdGlobal, IdURI, {Masks,} + {HttpApp,} URLMon, IdGlobal, IdURI, {Masks,} Setting, BoardGroup, gzip, Dolib, bmRegExp, AbonUnit, ExternalBoardManager, ExternalBoardPlugInMain, - Sort, GikoBayesian; + GikoBayesian, GikoMessage; type TVerResourceKey = ( @@ -102,11 +102,6 @@ type FNoParam: Boolean; //!< ƒŒƒX”Ôƒpƒ‰ƒ[ƒ^‚È‚µ end; - //! MessageList - TGikoMessageListType = (gmLogout, gmLogin, gmForceLogin, gmSureItiran, - gmUnKnown, gmSureSyutoku, gmSureDiff, gmNotMod, gmAbort, gmError, - gmNewRes, gmNewSure, gmResError, gmSureError); - TGikoSys = class(TObject) private { Private éŒ¾ } @@ -116,8 +111,11 @@ type FResRange : Longint; FBayesian : TGikoBayesian; //!< ƒxƒCƒWƒAƒ“ƒtƒBƒ‹ƒ^ FVersion : String; //!< ƒtƒ@ƒCƒ‹ƒo[ƒWƒ‡ƒ“ -// FExitWrite: TStringList; -// function StrToFloatDef(s: string; Default: Double): Double; + FGikoMessage: TGikoMessage; + //! ‚ ‚éƒZƒpƒŒ[ƒ^‚Å‹æØ‚ç‚ꂽ•¶Žš—ñ‚©‚ç‚Ž”Ô–Ú‚Ì•¶Žš—ñ‚ðŽæ‚èo‚· + function ChooseString(const Text, Separator: string; Index: integer): string; + //! ˆêŽžƒtƒ@ƒCƒ‹‚©‚ç‚Ì•œ‹Œ + procedure RestoreThreadData(Board: TBoard); public { Public éŒ¾ } FAbon : TAbon; @@ -129,13 +127,10 @@ type property ResRange : Longint read FResRange write FResRange; //! ƒo[ƒWƒ‡ƒ“î•ñ 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; @@ -156,6 +151,9 @@ type function GetUserAgent: string; function GetSambaFileName : string; + function GetMainKeyFileName : String; + function GetEditorKeyFileName: String; + function GetInputAssistFileName: String; procedure ReadSubjectFile(Board: TBoard); procedure CreateThreadDat(Board: TBoard); procedure WriteThreadDat(Board: TBoard); @@ -176,7 +174,6 @@ type function GetFileSize(FileName : string) : longint; function GetFileLineCount(FileName : string): longint; - function Get2chDate(aDate: TDateTime): string; function IntToDateTime(val: Int64): TDateTime; function DateTimeToInt(ADate: TDateTime): Int64; @@ -186,17 +183,13 @@ type function RemoveToken(var s:string; const delimiter:string):string; function GetTokenIndex(s: string; delimiter: string; index: Integer): string; - function DeleteLink(const s: string): string; function GetShortName(const LongName: string; ALength: integer): string; function BoolToInt(b: Boolean): Integer; function IntToBool(i: Integer): Boolean; function GzipDecompress(ResStream: TStream; ContentEncoding: string): string; - procedure LoadKeySetting(ActionList: TActionList); - procedure SaveKeySetting(ActionList: TActionList); - procedure LoadEditorKeySetting(ActionList: TActionList); - procedure SaveEditorKeySetting(ActionList: TActionList); - + procedure LoadKeySetting(ActionList: TActionList; FileName: String); + procedure SaveKeySetting(ActionList: TActionList; FileName: String); procedure CreateProcess(const AppPath: string; const Param: string); procedure OpenBrowser(URL: string; BrowserType: TGikoBrowserType); function HTMLDecode(const AStr: String): String; @@ -219,17 +212,11 @@ type procedure GetPopupResNumber(URL : string; var stRes, endRes : Int64); - //! Samba24‚̃tƒ@ƒCƒ‹‚ª‘¶Ý‚·‚é‚©B‘¶Ý‚µ‚È‚¢ê‡Adefaultƒtƒ@ƒCƒ‹‚ðrename‚·‚é - procedure SambaFileExists(); - 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 CreateSameIDResAnchor(var Numbers: TStringList; ThreadItem: TThreadItem; limited: Integer):string; 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; - function GetSameIDResCount(AIDNum : Integer; ThreadItem: TThreadItem):Integer; overload; - + function GetResID(AIDNum: Integer; ThreadItem: TThreadItem): String; //! ’PŒê‰ðÍ procedure SpamCountWord( const text : string; wordCount : TWordCount ); //! ŠwKƒNƒŠƒA @@ -250,6 +237,25 @@ type //! IE‚̃o[ƒWƒ‡ƒ“î•ñ‚̎擾 function GetIEVersion: string; function SetUserOptionalStyle(): string; + //! ƒMƒRƒiƒr‚̃ƒbƒZ[ƒW‚ðÝ’è‚·‚é + procedure SetGikoMessage; + //! ƒMƒRƒiƒr‚̃ƒbƒZ[ƒW‚ðŽæ“¾‚·‚é + function GetGikoMessage(MesType: TGikoMessageListType): String; + //! GMT‚ÌŽž‚ðTDateTime‚É•ÏŠ·‚·‚é + function DateStrToDateTime(const DateStr: string): TDateTime; + //! User32.dll‚ª—˜—p‚Å‚«‚é‚© + function CanUser32DLL: Boolean; + //! OEˆø—p•„Žæ“¾ + function GetOEIndentChar : string; + //! ’uŠ·Ý’èƒtƒ@ƒCƒ‹Žæ“¾ + function GetReplaceFileName: String; + //! ƒCƒ“ƒfƒbƒNƒX‚É‚È‚¢dati‚Í‚®‚êdatj‚̒ljÁ + procedure AddOutofIndexDat(Board: TBoard; DatList: TStringList; AllCreate: boolean = True); + //! ƒtƒ@ƒCƒ‹–¼‚©‚ç‚̃XƒŒƒbƒhì¬“ú‚̎擾 + function GetCreateDateFromName(FileName: String): TDateTime; + function GetExtpreviewFileName: String; + + procedure ShowRefCount(msg: String; unk: IUnknown); end; var @@ -259,7 +265,7 @@ const ZERO_DATE: Integer = 25569; BETA_VERSION_NAME_E = 'beta'; BETA_VERSION_NAME_J = 'ÊÞÀ'; - BETA_VERSION = 51; + BETA_VERSION = 58; BETA_VERSION_BUILD = ''; //!< debug”Å‚È‚Ç APP_NAME = 'gikoNavi'; BE_PHP_URL = 'http://be.2ch.net/test/p.php?i='; @@ -268,7 +274,8 @@ const implementation uses - Giko, RoundData, Favorite, Registry, HTMLCreate, MojuUtils; + Giko, RoundData, Favorite, Registry, HTMLCreate, MojuUtils, Sort, YofUtils, + IniFiles, DateUtils, SkinFiles; const FOLDER_INDEX_VERSION = '1.01'; @@ -277,6 +284,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/'; @@ -299,6 +307,7 @@ const // ************************************************************************* constructor TGikoSys.Create; begin + Inherited; FSetting := TSetting.Create; FDolib := TDolib.Create; FAWKStr := TAWKStr.Create(nil); @@ -325,6 +334,8 @@ begin FVersion := Trim(GetVersionInfo(vrFileVersion)); FBayesian := TGikoBayesian.Create; //FBoardURLList := TStringList.Create; + //ƒƒbƒZ[ƒW‚̍쐬 + FGikoMessage := TGikoMessage.Create; end; // ************************************************************************* @@ -335,17 +346,6 @@ var i: Integer; FileList: TStringList; begin - //ƒXƒŒƒbƒhƒf[ƒ^ƒtƒ@ƒCƒ‹‚ðXV -// FlashExitWrite; - -// FExitWrite.Free; - FBayesian.Free; - FAWKStr.Free; - FSetting.Free; - FDolib.Free; - FAbon.Free; - FSelectResFilter.Free; - //FBoardURLList.Free; //ƒeƒ“ƒ|ƒ‰ƒŠHTML‚ðíœ FileList := TStringList.Create; try @@ -358,6 +358,13 @@ begin finally FileList.Free; end; + FreeAndNil(FGikoMessage); + FreeAndNil(FBayesian); + FreeAndNil(FSelectResFilter); + FreeAndNil(FAbon); + FreeAndNil(FAWKStr); + FreeAndNil(FDolib); + FreeAndNil(FSetting); inherited; end; @@ -365,7 +372,6 @@ end; \brief •¶Žš—ñ”Žšƒ`ƒFƒbƒN \param s ƒ`ƒFƒbƒN‚·‚镶Žš—ñ \return s ‚ª•„†•t‚«®”‚Æ‚µ‚Ä”FŽ¯‰Â”\‚È‚ç True -\todo MonaUtils.IsNumeric() ‚ª“¯“™‚Ì‹@”\‚ð•ÛŽ‚µ‚Ä‚¢‚é } {$HINTS OFF} function TGikoSys.IsNumeric(s: string): boolean; @@ -382,7 +388,6 @@ end; \brief •¶Žš—ñ•‚“®¬”“_”Žšƒ`ƒFƒbƒN \param s ƒ`ƒFƒbƒN‚·‚镶Žš—ñ \return s ‚ª•„†•t‚«•‚“®¬”‚Æ‚µ‚Ä”FŽ¯‰Â”\‚È‚ç True -\todo MonaUtils.IsFloat() ‚ª“¯“™‚Ì‹@”\‚ð•ÛŽ‚µ‚Ä‚¢‚é } function TGikoSys.IsFloat(s: string): boolean; var @@ -471,37 +476,37 @@ end; //! Skin:ƒwƒbƒ_‚̃tƒ@ƒCƒ‹–¼ function TGikoSys.GetSkinHeaderFileName: string; begin - Result := Setting.GetSkinHeaderFileName; + Result := Setting.SkinFiles.GetSkinHeaderFileName; end; //! Skin:ƒtƒbƒ^‚̃tƒ@ƒCƒ‹–¼ function TGikoSys.GetSkinFooterFileName: string; begin - Result := Setting.GetSkinFooterFileName; + Result := Setting.SkinFiles.GetSkinFooterFileName; end; //! Skin:V’…ƒŒƒX‚̃tƒ@ƒCƒ‹–¼ function TGikoSys.GetSkinNewResFileName: string; begin - Result := Setting.GetSkinNewResFileName; + Result := Setting.SkinFiles.GetSkinNewResFileName; end; //! Skin:”ñV’…ƒŒƒX‚̃tƒ@ƒCƒ‹–¼ function TGikoSys.GetSkinResFileName: string; begin - Result := Setting.GetSkinResFileName; + Result := Setting.SkinFiles.GetSkinResFileName; end; //! Skin:‚µ‚¨‚è(‚±‚±‚Ü‚Å“Ç‚ñ‚¾)‚̃tƒ@ƒCƒ‹–¼ function TGikoSys.GetSkinBookmarkFileName: string; begin - Result := Setting.GetSkinBookmarkFileName; + Result := Setting.SkinFiles.GetSkinBookmarkFileName; end; //! Skin:‚µ‚¨‚è(V’…ƒŒƒX)‚̃tƒ@ƒCƒ‹–¼ function TGikoSys.GetSkinNewmarkFileName: string; begin - Result := Setting.GetSkinNewmarkFileName; + Result := Setting.SkinFiles.GetSkinNewmarkFileName; end; //! UserAgentŽæ“¾ @@ -526,19 +531,6 @@ begin end; {! -\brief ‚Q‚¿‚á‚ñ‚Ë‚é•ûŽ®ŽžŽæ“¾ -\param •ÏŠ·‚·‚鎞 -\return 2‚¿‚á‚ñ‚Ë‚é•ûŽ®‚ÅŽž‚ð•\‚µ‚½•¶Žš—ñ -} -function TGikoSys.Get2chDate(aDate: TDateTime): string; -var - d2: TDateTime; -begin - d2 := aDate - EncodeTime(9, 0, 0, 0); - Result := FloatToStr(Trunc((d2 - ZERO_DATE) * 86400)); -end; - -{! \brief Œo‰ß•b‚ð TDateTime ‚É•ÏŠ· \param val 1970/1/1/ 00:00:00 ‚©‚ç‚ÌŒo‰ß•b \return val ‚ðŽ¦‚· TDateTime @@ -568,65 +560,67 @@ 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; - //protocol, host, path, document, port, bookmark : string; - //is2ch : 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; UnRead := 0; - //is2ch := false; usePlugIn := Board.IsBoardPlugInAvailable; - server := UrlToServer( Board.URL ); - //is2ch := Is2chHost(server); + //server := UrlToServer( Board.URL ); + // ƒXƒŒƒbƒh‚Å‹¤’Ê‚ÌURL•” + if Board.is2ch then begin + urlHead := UrlToServer( Board.URL ) + 'test/read.cgi/' + Board.BBSID + '/'; + end else begin + urlHead := UrlToServer( Board.URL ) + 'test/read.cgi?bbs=' + Board.BBSID + '&key='; + end; FileName := Board.GetFolderIndexFileName; - FileList := TStringList.Create; - FileList.Sorted := True; - FileList.BeginUpdate; - TmpFileList := TStringList.Create; - TmpFileList.Sorted := True; - TmpFileList.BeginUpdate; - //IsLogFile—pDATƒtƒ@ƒCƒ‹ƒŠƒXƒg - GetFileList(ExtractFileDir(Board.GetFolderIndexFileName), '*.dat', FileList, False); - FileList.EndUpdate; - //‘O‰ñˆÙíI—¹Žž—pTmpƒtƒ@ƒCƒ‹ƒŠƒXƒg - GetFileList(ExtractFileDir(Board.GetFolderIndexFileName), '*.tmp', TmpFileList, False); - TmpFileList.EndUpdate; + // + datFileCheck := (Setting.CheckDatFile) or (not FileExists(FileName)); + if (datFileCheck) then begin + FileList := TStringList.Create; + FileList.Sorted := True; + FileList.BeginUpdate; + //IsLogFile—pDATƒtƒ@ƒCƒ‹ƒŠƒXƒg + GetFileList(ExtractFileDir(Board.GetFolderIndexFileName), '*.dat', FileList, False); + FileList.EndUpdate; + end; // d•¡‚ð–h‚® Board.BeginUpdate; Board.Sorted := True; - sl := TStringList.Create; try if FileExists(FileName) then begin sl.LoadFromFile(FileName); - //‚Qs–Ú‚©‚çi‚Ps–ڂ̓o[ƒWƒ‡ƒ“j 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, @@ -637,7 +631,7 @@ begin ThreadItem := TThreadItem.Create( nil, Board, - server + 'test/read.cgi/' + Board.BBSID + '/' + ChangeFileExt( Rec.FFileName, '' ) + '/l50', + urlHead + ChangeFileExt( Rec.FFileName, '' ) + '/l50', islog, Rec.FFileName ); @@ -645,7 +639,7 @@ begin ThreadItem := TThreadItem.Create( nil, Board, - server + 'test/read.cgi?bbs=' + Board.BBSID + '&key=' + ChangeFileExt( Rec.FFileName, '' ) + '&ls=50', + urlHead + ChangeFileExt( Rec.FFileName, '' ) + '&ls=50', islog, Rec.FFileName ); @@ -653,21 +647,18 @@ begin end; ThreadItem.BeginUpdate; - if islog then + if (datFileCheck) and (islog) then FileList.Delete( Index ); 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.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; @@ -680,21 +671,10 @@ begin Node := FavoriteDM.TreeView.Items.AddChildObject( FavoriteDM.TreeView.Items.Item[0], ThreadItem.Title, FavoThreadItem); *} - {//„‰ñƒŠƒXƒg‚É‘¶Ý‚µ‚½‚珄‰ñƒtƒ‰ƒOƒZƒbƒg - 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; - } - ThreadItem.EndUpdate; Board.Add(ThreadItem); - if (ThreadItem.IsLogFile) and (ThreadItem.UnRead) then + if (ThreadItem.UnRead) and (ThreadItem.IsLogFile) then Inc(UnRead); end; end; @@ -702,98 +682,101 @@ begin if UnRead <> Board.UnRead then Board.UnRead := UnRead; - Boardpath := ExtractFilePath(Board.GetFolderIndexFileName); - //ƒCƒ“ƒfƒbƒNƒX‚É–³‚©‚Á‚½ƒƒO‚ð’ljÁi•…‚êƒCƒ“ƒfƒbƒNƒX‘Ήžj - for i := 0 to FileList.Count - 1 do begin - FileName := Boardpath + FileList[i]; - - //ResRec := DivideStrLine(ReadThreadFile(FileName, 1)); - if usePlugIn then begin - ThreadItem := TThreadItem.Create( - Board.BoardPlugIn, - Board, - Board.BoardPlugIn.FileName2ThreadURL( DWORD( Board ), FileList[i] ) ); - DivideStrLine(Board.BoardPlugIn.GetDat( DWORD( ThreadItem ), 1 ), @ResRec); - end else begin - ThreadItem := TThreadItem.Create( - nil, - Board, - Get2chBoard2ThreadURL( Board, ChangeFileExt( FileList[i], '' ) ) ); - DivideStrLine(ReadThreadFile(FileName, 1), @ResRec); - end; - - ThreadItem.BeginUpdate; - ThreadItem.FileName := FileList[i]; - //ThreadItem.FilePath := FileName; - ThreadItem.No := Board.Count + 1; - ThreadItem.Title := ResRec.FTitle; - ThreadItem.Count := GetFileLineCount(FileName); - ThreadItem.AllResCount := ThreadItem.Count; - ThreadItem.NewResCount := ThreadItem.Count; - ThreadItem.Size := GetFileSize(FileName) - ThreadItem.Count;//1byte‚¸‚ê‚é‚Æ‚«‚ª‚ ‚邯‚Ç‚»‚ê‚Í‚ ‚«‚ç‚ß‚é - ThreadItem.RoundDate := ZERO_DATE; - ThreadItem.LastModified := ZERO_DATE; - ThreadItem.Kokomade := -1; - 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; + if (datFileCheck) then begin + //ƒCƒ“ƒfƒbƒNƒX‚É–³‚©‚Á‚½ƒƒO‚ð’ljÁi•…‚êƒCƒ“ƒfƒbƒNƒX‘Ήžj + AddOutofIndexDat(Board, FileList); + end; Board.EndUpdate; - //‘O‰ñˆÙíI—¹Žžƒ`ƒFƒbƒN - 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; - - //„‰ñ‚̐ݒè‚ÍRoundData‚Ì•û‚ª‚â‚é‚©‚珟Žè‚ɐݒ肵‚Ă̓_ƒI@by ‚à‚¶‚ã - //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; - + //‘O‰ñˆÙíI—¹Žžƒ`ƒFƒbƒN + RestoreThreadData( Board ); finally sl.Free; - FileList.Free; - TmpFileList.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 ƒCƒ“ƒfƒbƒNƒX‚É‚È‚¢dati‚Í‚®‚êdatj‚̒ljÁ +\param Board ’ljÁ‚·‚é” +\param DatList datƒtƒ@ƒCƒ‹–¼ +} +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); + //ƒCƒ“ƒfƒbƒNƒX‚É–³‚©‚Á‚½ƒƒO‚ð’ljÁi•…‚êƒCƒ“ƒfƒbƒNƒX‘Ήžj + for i := 0 to DatList.Count - 1 do begin + FileName := Boardpath + DatList[i]; + 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]; + //ThreadItem.FilePath := FileName; + ThreadItem.No := Board.Count + 1; + ThreadItem.Title := ResRec.FTitle; + ThreadItem.Count := GetFileLineCount(FileName); + ThreadItem.AllResCount := ThreadItem.Count; + ThreadItem.NewResCount := ThreadItem.Count; + ThreadItem.Size := GetFileSize(FileName) - ThreadItem.Count;//1byte‚¸‚ê‚é‚Æ‚«‚ª‚ ‚邯‚Ç‚»‚ê‚Í‚ ‚«‚ç‚ß‚é + ThreadItem.RoundDate := FileDateToDateTime( FileAge( FileName ) ); + ThreadItem.LastModified := ThreadItem.RoundDate; + ThreadItem.Kokomade := -1; + ThreadItem.NewReceive := 0; + ThreadItem.ParentBoard := Board; + ThreadItem.IsLogFile := True; + ThreadItem.Round := False; + ThreadItem.UnRead := False; + ThreadItem.ScrollTop := 0; + ThreadItem.AgeSage := gasNone; + ThreadItem.EndUpdate; + if (AllCreate) or (create) then begin + Board.Add(ThreadItem); + end; + end; end; - {! \brief ƒXƒŒƒbƒhƒCƒ“ƒfƒbƒNƒXƒtƒ@ƒCƒ‹(Folder.idx)ì¬ \param Board Folder.idx ‚ðì¬‚·‚é” @@ -845,7 +828,7 @@ begin '%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x', [cnt, //”ԍ† Rec.FFileName, //ƒtƒ@ƒCƒ‹–¼ - Rec.FTitle, //ƒ^ƒCƒgƒ‹ + MojuUtils.Sanitize(Rec.FTitle), //ƒ^ƒCƒgƒ‹ Rec.FCount, //ƒJƒEƒ“ƒg 0, //size 0, //RoundDate @@ -903,9 +886,9 @@ begin sl.Add(FOLDER_INDEX_VERSION); // ƒXƒŒ”ԍ†•Û‘¶‚Ì‚½‚߃\[ƒg - Sort.SortNoFlag := true; - Sort.SortOrder := true; - Sort.SortIndex := 0; + Sort.SetSortNoFlag(true); + Sort.SetSortOrder(true); + Sort.SetSortIndex(0); //Sort.SortNonAcquiredCountFlag := GikoSys.Setting.NonAcquiredCount; Board.CustomSort(ThreadItemSortProc); @@ -915,7 +898,7 @@ begin '%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x', [Board.Items[i].No, //”ԍ† Board.Items[i].FileName, //ƒtƒ@ƒCƒ‹–¼ - Board.Items[i].Title, //ƒ^ƒCƒgƒ‹ + MojuUtils.Sanitize(Board.Items[i].Title), //ƒ^ƒCƒgƒ‹ Board.Items[i].Count, //ƒJƒEƒ“ƒg Board.Items[i].Size, //size DateTimeToInt(Board.Items[i].RoundDate), //RoundDate @@ -952,21 +935,21 @@ end; } 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.FCount := StrToIntDef('$' + RemoveToken(Line, #1), 0); - Result.FSize := StrToIntDef('$' + RemoveToken(Line, #1), 0); - Result.FRoundDate := IntToDateTime(StrToIntDef('$' + RemoveToken(Line, #1), ZERO_DATE)); - Result.FLastModified := IntToDateTime(StrToIntDef('$' + RemoveToken(Line, #1), ZERO_DATE)); - Result.FKokomade := StrToIntDef('$' + RemoveToken(Line, #1), -1); - Result.FNewReceive := StrToIntDef('$' + RemoveToken(Line, #1), 0); + Result.FNo := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0); + Result.FFileName := MojuUtils.RemoveToken(Line, #1); + Result.FTitle := MojuUtils.UnSanitize(MojuUtils.RemoveToken(Line, #1)); + Result.FCount := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0); + Result.FSize := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0); + Result.FRoundDate := IntToDateTime(StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), ZERO_DATE)); + Result.FLastModified := IntToDateTime(StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), ZERO_DATE)); + Result.FKokomade := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), -1); + Result.FNewReceive := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0); RemoveToken(Line, #1);//9: ; //–¢Žg—p - Result.FUnRead := IntToBool(StrToIntDef('$' + RemoveToken(Line, #1), 0)); - Result.FScrollTop := StrToIntDef('$' + RemoveToken(Line, #1), 0); - Result.FAllResCount := StrToIntDef('$' + RemoveToken(Line, #1), 0); - Result.FNewResCount := StrToIntDef('$' + RemoveToken(Line, #1), 0); - Result.FAgeSage := TGikoAgeSage(StrToIntDef('$' + RemoveToken(Line, #1), 0)); + Result.FUnRead := IntToBool(StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0)); + Result.FScrollTop := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0); + Result.FAllResCount := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0); + Result.FNewResCount := StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0); + Result.FAgeSage := TGikoAgeSage(StrToIntDef('$' + MojuUtils.RemoveToken(Line, #1), 0)); end; @@ -991,18 +974,13 @@ var rc: Integer; SearchRec : TSearchRec; s: string; - maskExt: string; begin - //maskExt := Copy(Mask, 1, Length(Mask) - 1); - maskExt := Mask; Path := IncludeTrailingPathDelimiter(Path); rc := FindFirst(Path + '*.*', faAnyfile, SearchRec); try while rc = 0 do begin if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin s := Path + SearchRec.Name; - //if (SearchRec.Attr and faDirectory > 0) then - // s := IncludeTrailingPathDelimiter(s) if (SearchRec.Attr and faDirectory = 0) and (MatchesMask(s, Mask)) then if IsPathAdd then @@ -1037,20 +1015,19 @@ procedure TGikoSys.GetFileList(Path: string; Mask: string; var List: TStringList var rc: Integer; SearchRec : TSearchRec; - s: string; begin Path := IncludeTrailingPathDelimiter(Path); rc := FindFirst(Path + Mask, faAnyfile, SearchRec); try while rc = 0 do begin if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin - s := Path + SearchRec.Name; - - if (SearchRec.Attr and faDirectory = 0) then - if IsPathAdd then - List.Add(s) - else - List.Add(SearchRec.Name); + if (SearchRec.Attr and faDirectory = 0) then begin + if IsPathAdd then begin + List.Add(Path + SearchRec.Name) + end else begin + List.Add(SearchRec.Name); + end; + end; end; rc := FindNext(SearchRec); end; @@ -1210,10 +1187,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; {! @@ -1368,17 +1345,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; {! @@ -1419,39 +1394,6 @@ begin Result := RemoveToken(s, delimiter); end; -{! -\brief HTML ‚©‚çƒAƒ“ƒJ[ƒ^ƒO‚ðíœ -\param s Œ³‚É‚È‚é HTML -\return ƒAƒ“ƒJ[ƒ^ƒO‚ªíœ‚³‚ꂽ HTML -} -function TGikoSys.DeleteLink(const s: string): string; -var - s1: string; - s2: string; - idx: Integer; - i: Integer; -begin - i := 0; - Result := ''; - while True do begin - s1 := GetTokenIndex(s, '', s1); - if idx <> 0 then - Delete(s1, 1, idx + 1); - idx := Pos('">', s2); - if idx <> 0 then - Delete(s2, 1, idx + 1); - - Result := Result + s1 + s2; - - if s2 = '' then - Break; - - inc(i, 2); - end; -end; //ƒCƒ“ƒfƒbƒNƒX–¢XVƒoƒbƒtƒ@‚ðƒtƒ‰ƒbƒVƒ…I {procedure TGikoSys.FlashExitWrite; @@ -1590,7 +1532,11 @@ begin Dec(i); Delete(s, i + 1, ln - i); - s := MojuUtils.CustomStringReplace(s, #0, '*'); + i := Pos(#0, s); + while i <> 0 do begin + s[i] := '*'; + i := Pos(#0, s); + end; Result := s; finally @@ -1601,11 +1547,9 @@ end; {! \brief ƒAƒNƒVƒ‡ƒ“‚ɃVƒ‡[ƒgƒJƒbƒgƒL[‚ðÝ’è \param ActionList Ý’è‚·‚éƒAƒNƒVƒ‡ƒ“ˆê—— -\todo STD_SEC ‚ð GetXXXFileName() ‚É’Ç‚¢o‚¹ - -KeySetting.ini ‚É•Û‘¶‚³‚ê‚Ä‚¢‚éƒVƒ‡[ƒgƒJƒbƒgƒL[‚ð ActionList ‚ɐݒ肵‚Ü‚·B +\param FileName Iniƒtƒ@ƒCƒ‹‚Ì–¼‘O } -procedure TGikoSys.LoadKeySetting(ActionList: TActionList); +procedure TGikoSys.LoadKeySetting(ActionList: TActionList; FileName: String); const STD_SEC = 'KeySetting'; var @@ -1616,10 +1560,10 @@ var SecList: TStringList; Component: TComponent; begin - if not FileExists(GetConfigDir + KEY_SETTING_FILE_NAME) then + if not FileExists(fileName) then Exit; SecList := TStringList.Create; - ini := TMemIniFile.Create(GetConfigDir + KEY_SETTING_FILE_NAME); + ini := TMemIniFile.Create(fileName); try ini.ReadSection(STD_SEC, SecList); for i := 0 to SecList.Count - 1 do begin @@ -1641,18 +1585,18 @@ end; {! \brief ƒAƒNƒVƒ‡ƒ“‚ɐݒ肳‚ê‚Ä‚¢‚éƒVƒ‡[ƒgƒJƒbƒgƒL[‚ðƒtƒ@ƒCƒ‹‚É•Û‘¶ \param ActionList •Û‘¶‚·‚éƒAƒNƒVƒ‡ƒ“ˆê—— -\todo STD_SEC ‚ð GetXXXFileName() ‚É’Ç‚¢o‚¹ +\param FileName Iniƒtƒ@ƒCƒ‹–¼ -ActionList ‚ɐݒ肳‚ê‚Ä‚¢‚éƒVƒ‡[ƒgƒJƒbƒgƒL[‚ð KeySetting.ini ‚É•Û‘¶‚µ‚Ü‚·B +ActionList ‚ɐݒ肳‚ê‚Ä‚¢‚éƒVƒ‡[ƒgƒJƒbƒgƒL[‚ð FileName ‚É•Û‘¶‚µ‚Ü‚·B } -procedure TGikoSys.SaveKeySetting(ActionList: TActionList); +procedure TGikoSys.SaveKeySetting(ActionList: TActionList; FileName: String); const STD_SEC = 'KeySetting'; var i: Integer; ini: TMemIniFile; begin - ini := TMemIniFile.Create(GetConfigDir + KEY_SETTING_FILE_NAME); + ini := TMemIniFile.Create(GetConfigDir + FileName); try for i := 0 to ActionList.ActionCount - 1 do begin if ActionList.Actions[i].Tag = -1 then @@ -1665,74 +1609,6 @@ begin end; end; -{! -\brief ƒŒƒXƒGƒfƒBƒ^‚̃AƒNƒVƒ‡ƒ“‚ɃVƒ‡[ƒgƒJƒbƒg‚ðÝ’è -\param ActionList Ý’è‚·‚éƒAƒNƒVƒ‡ƒ“ˆê—— -\todo STD_SEC, EKEY_SETTING_FILE_NAME ‚ð GetXXXFileName() ‚É’Ç‚¢o‚¹ -\todo LoadKeySetting ‚Æ“‡‚¹‚æ - -ƒtƒ@ƒCƒ‹‚É•Û‘¶‚³‚ê‚Ä‚¢‚éƒVƒ‡[ƒgƒJƒbƒgƒL[‚ð ActionList ‚ɐݒ肵‚Ü‚·B -} -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; - -{! -\brief ƒŒƒXƒGƒfƒBƒ^‚ɐݒ肳‚ê‚Ä‚¢‚éƒVƒ‡[ƒgƒJƒbƒgƒL[‚ðƒtƒ@ƒCƒ‹‚É•Û‘¶ -\param ActionList •Û‘¶‚·‚éƒAƒNƒVƒ‡ƒ“ˆê—— -\todo STD_SEC, EKEY_SETTING_FILE_NAME ‚ð GetXXXFileName() ‚É’Ç‚¢o‚¹ -\todo LoadKeySetting ‚Æ“‡‚¹‚æ - -ActionList ‚ɐݒ肳‚ê‚Ä‚¢‚éƒVƒ‡[ƒgƒJƒbƒgƒL[‚ðƒtƒ@ƒCƒ‹‚É•Û‘¶‚µ‚Ü‚·B -} -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; {! \brief ƒvƒƒZƒX‚̐¶¬ @@ -1960,7 +1836,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); @@ -2189,7 +2071,7 @@ begin //•W€‘Ž® //ÅŒã‚Íl50, 10, 10-20, 10n, 10-20n, -10, 10-, 10n- ‚È‚Ç //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)); @@ -2626,7 +2508,9 @@ end; procedure TGikoSys.ListBoardFile; var boardFileList : TStringList; - i, l, k : Integer; + i, l : Integer; + sCategory : TCategory; + sBoard : TBoard; begin // BBS ‚ÌŠJ•ú try @@ -2657,13 +2541,9 @@ begin BoardFileList := TStringList.Create; try BoardFileList.BeginUpdate; - GikoSys.GetFileList( GikoSys.Setting.GetBoardDir, '*', BoardFileList, True, True ); + GikoSys.GetFileList( GikoSys.Setting.GetBoardDir, '*.txt', BoardFileList, True, True ); BoardFileList.EndUpdate; - for k := BoardFileList.Count - 1 downto 0 do begin - if AnsiCompareText(ExtractFileExt(BoardFileList[ k ]), '.bak') = 0 then - BoardFileList.Delete(k); - end; - SetLength( BBSs, l + BoardFileList.Count ); + 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 ] ), '' ); @@ -2673,6 +2553,19 @@ begin BoardFileList.Free; end; end; + + // “ÁŽê—p“rBBS¶¬ + // Šù‚É‘¶Ý‚·‚éê‡‚͍폜‚·‚é + DestorySpecialBBS(BoardGroup.SpecialBBS); + SpecialBBS := TBBS.Create(''); + SpecialBBS.Title := '“ÁŽê—p“r(”ñ•\Ž¦)'; + sCategory := TCategory.Create; + sCategory.No := 1; + sCategory.Title := '“ÁŽê—p“r(”ñ•\Ž¦)'; + SpecialBBS.Add(sCategory); + sBoard := TSpecialBoard.Create(nil, 'http://localhost/gikonavi/special/index.html'); + sBoard.IsThreadDatRead := True; + sCategory.Add(sBoard); end; {! @@ -2870,64 +2763,41 @@ function TGikoSys.GetSambaFileName : string; begin Result := Setting.GetSambaFileName; end; - -//! Samba.ini ‚ª–³‚¯‚ê‚΍쐬 -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; - {! -\brief “¯‚¶“Še ID ‚ðŽ‚ÂƒŒƒX‚ðƒAƒ“ƒJ[‚É‚µ‚Ä—ñ‹“ -\param AID ŒÂl‚ð“Á’è‚·‚é“Še ID +\brief —ñ‹“‚³‚ꂽƒŒƒX”ԍ†‚ւ̃Aƒ“ƒJ[—pHTMLì¬ +\param Numbers —ñ‹“‚³‚ꂽƒŒƒX”ԍ† \param ThreadItem —ñ‹“‚·‚éƒXƒŒƒbƒh -\param limited —ñ‹“‚·‚鐔‚𐧌À‚·‚é‚È‚ç True +\param limited —ñ‹“‚·‚鐔‚𐧌À‚·‚é‚È‚ç1ˆÈã \return —ñ‹“‚³‚ꂽƒŒƒXƒAƒ“ƒJ[ -\todo limited ‚ð Integer ‚É‚·‚é‚©A20 ‚ðŠO‚ɏo‚· } -function TGikoSys.GetSameIDResAnchor(const AID : string; ThreadItem: TThreadItem; limited: boolean):string; +function TGikoSys.CreateSameIDResAnchor( + var Numbers: TStringList; ThreadItem: TThreadItem; + limited: Integer):string; var i: integer; - body: TStringList; + Res: TResRec; + ResLink : TResLinkRec; begin - Result := ''; - if (not IsNoValidID(AID)) and - (ThreadItem <> nil) and (ThreadItem.IsLogFile) then 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 - Result := Result + '>' + body[i] + ' '; - end; - end else begin - for i := 0 to body.Count - 1 do begin - Result := Result + '>' + body[i] + ' '; - end; - end; - finally - body.Free; - end; + // bodyˆÈŠO‚ÍŽg—p‚µ‚È‚¢‚̂ŏ‰Šú‰»‚µ‚È‚¢ + Res.FBody := ''; + Res.FType := glt2chNew; - Result := HTMLCreater.ConvRes( - Result, - ThreadItem.ParentBoard.BBSID, ChangeFileExt(ThreadItem.FileName, ''), - 'bbs', 'key', 'st', 'to', 'nofirst', 'true', false); - end; + Result := ''; + if (Numbers <> nil) and (Numbers.Count > 0) then begin + if (limited > 0) and (Numbers.Count > limited) then begin + for i := Numbers.Count - limited to Numbers.Count - 1 do begin + Res.FBody := Res.FBody + '>' + Numbers[i] + ' '; + end; + end else begin + for i := 0 to Numbers.Count - 1 do begin + Res.FBody := Res.FBody + '>' + Numbers[i] + ' '; + end; + end; + ResLink.FBbs := ThreadItem.ParentBoard.BBSID; + ResLink.FKey := ChangeFileExt(ThreadItem.FileName, ''); + HTMLCreater.ConvRes(@Res, @ResLink, false); + Result := Res.FBody; + end; end; {! @@ -2942,6 +2812,22 @@ var ReadList: TStringList; Res: TResRec; boardPlugIn : TBoardPlugIn; + + procedure CheckSameID(const AID:String; const Target: String; no: Integer); + var + pos: Integer; + begin + pos := AnsiPos('id:', LowerCase(Target)); + if (pos > 0) then begin + if(AnsiPos(AID, Copy(Target, pos-1, Length(Target))) > 0) then begin + body.Add(IntToStr(no)); + end; + end else begin + if(AnsiPos(AID, Target) > 0) then begin + body.Add(IntToStr(no)); + end; + end; + end; begin if (not IsNoValidID(AID)) and (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin @@ -2953,20 +2839,16 @@ begin for i := 0 to threadItem.Count - 1 do begin // ƒŒƒX - DivideStrLine(boardPlugIn.GetDat(DWORD( threadItem ), i + 1), @Res); - if(AnsiPos(AID, Res.FDateTime) > 0) then begin - body.Add(IntToStr(i+1)); - end; + THTMLCreate.DivideStrLine(boardPlugIn.GetDat(DWORD( threadItem ), i + 1), @Res); + CheckSameID(AID, Res.FDateTime, i+1); end; end else begin ReadList := TStringList.Create; try ReadList.LoadFromFile(ThreadItem.GetThreadFileName); for i := 0 to ReadList.Count - 1 do begin - DivideStrLine(ReadList[i], @Res); - if AnsiPos(AID, Res.FDateTime) > 0 then begin - body.Add(IntToStr(i+1)); - end; + THTMLCreate.DivideStrLine(ReadList[i], @Res); + CheckSameID(AID, Res.FDateTime, i+1); end; finally ReadList.Free; @@ -2979,54 +2861,31 @@ end; \brief “¯‚¶“Še ID ‚ðŽ‚ÂƒŒƒX‚ð—ñ‹“ \param AIDNum ŒÂl‚ð“Á’è‚·‚é“Še ID \param ThreadItem —ñ‹“‚·‚éƒXƒŒƒbƒh -\param limited —ñ‹“‚·‚鐔‚𐧌À‚·‚é‚È‚ç True -\return -\todo limited ‚ð Integer ‚É‚·‚é‚©A20 ‚ðŠO‚ɏo‚· +\param body OUT:—ñ‹“‚³‚ꂽƒŒƒX”ԍ†‚ª•Ô‚é } -function TGikoSys.GetSameIDResAnchor(AIDNum : Integer; ThreadItem: TThreadItem; limited: boolean):string; +procedure TGikoSys.GetSameIDRes(AIDNum : Integer; ThreadItem: TThreadItem;var body: TStringList); var - i: integer; - body: TStringList; + AID : String; begin - Result := ''; - if (ThreadItem <> nil) and (ThreadItem.IsLogFile) then 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 - Result := Result + '>' + body[i] + ' '; - end; - end else begin - for i := 0 to body.Count - 1 do begin - Result := Result + '>' + body[i] + ' '; - end; - end; - finally - body.Free; - end; - Result := HTMLCreater.ConvRes( - Result, ThreadItem.ParentBoard.BBSID, - ChangeFileExt(ThreadItem.FileName, ''), - 'bbs', 'key', 'st', 'to', 'nofirst', 'true', - false); + AID := GetResID(AIDNum, ThreadItem); + if not IsNoValidID(AID) then begin + GetSameIDRes(AID, ThreadItem, body); end; end; - {! -\brief “¯‚¶“Še ID ‚ðŽ‚ÂƒŒƒX‚ð—ñ‹“ -\param AIDNum ŒÂl‚ð“Á’è‚·‚é“Še ID -\param ThreadItem —ñ‹“‚·‚éƒXƒŒƒbƒh -\param body OUT:—ñ‹“‚³‚ꂽƒŒƒX”ԍ†‚ª•Ô‚é +\brief “Še ID Žæ“¾ +\param AIDNum “Še ƒŒƒX”ԍ† +\param ThreadItem “ŠeƒXƒŒƒbƒh +\param body OUT:“ŠeID } -procedure TGikoSys.GetSameIDRes(AIDNum : Integer; ThreadItem: TThreadItem;var body: TStringList); +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 @@ -3034,25 +2893,25 @@ begin //===== ƒvƒ‰ƒOƒCƒ“‚É‚æ‚é•\Ž¦ //boardPlugIn := ThreadItem.BoardPlugIn; boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn; - DivideStrLine(boardPlugIn.GetDat(DWORD( threadItem ), AIDNum), @Res); + THTMLCreate.DivideStrLine(boardPlugIn.GetDat(DWORD( threadItem ), AIDNum), @Res); end else begin - DivideStrLine( ReadThreadFile(ThreadItem.GetThreadFileName, AIDNum), @Res); + 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; @@ -3060,54 +2919,6 @@ begin stList.Free; end; end; - if not IsNoValidID(AID) then - GetSameIDRes(AID, ThreadItem, body); - end; -end; - -{! -\brief “¯‚¶“Še ID ‚ðŽ‚ÂƒŒƒX‚ðƒJƒEƒ“ƒg -\param AID ŒÂl‚ð“Á’è‚·‚é“Še ID -\param ThreadItem —ñ‹“‚·‚éƒXƒŒƒbƒh -\return “¯‚¶ ID ‚ðŽ‚ÂƒŒƒX‚̐” -} -function TGikoSys.GetSameIDResCount(const AID : string; ThreadItem: TThreadItem):Integer; -var - body: TStringList; -begin - Result := 0; - if (not IsNoValidID(AID)) - and (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin - body := TStringList.Create; - try - GetSameIDRes(AID, ThreadItem, body); - Result := body.Count; - finally - body.Free; - end; - end; - -end; - -{! -\brief “¯‚¶“Še ID ‚ðŽ‚ÂƒŒƒX‚ðƒJƒEƒ“ƒg -\param AIDNum ŒÂl‚ð“Á’è‚·‚é“Še ID -\param ThreadItem —ñ‹“‚·‚éƒXƒŒƒbƒh -\return “¯‚¶ ID ‚ðŽ‚ÂƒŒƒX‚̐” -} -function TGikoSys.GetSameIDResCount(AIDNum : Integer; ThreadItem: TThreadItem):Integer; -var - body: TStringList; -begin - Result := 0; - if (ThreadItem <> nil) and (ThreadItem.IsLogFile) then begin - body := TStringList.Create; - try - GetSameIDRes(AIDNum, ThreadItem, body); - Result := body.Count; - finally - body.Free; - end; end; end; @@ -3355,14 +3166,276 @@ begin R.Free; end; end; +//! mainƒtƒH[ƒ€‚̃Vƒ‡[ƒgƒJƒbƒgƒL[‚ÌIniƒtƒ@ƒCƒ‹–¼ +function TGikoSys.GetMainKeyFileName : String; +begin + Result := Setting.GetMainKeyFileName; +end; +//! EditorƒtƒH[ƒ€‚̃Vƒ‡[ƒgƒJƒbƒgƒL[‚ÌIniƒtƒ@ƒCƒ‹–¼ +function TGikoSys.GetEditorKeyFileName: String; +begin + Result := Setting.GetEditorKeyFileName; +end; +//! “ü—̓AƒVƒXƒg‚̐ݒèƒtƒ@ƒCƒ‹–¼ +function TGikoSys.GetInputAssistFileName: String; +begin + Result := Setting.GetInputAssistFileName; +end; +//! ƒMƒRƒiƒr‚̃ƒbƒZ[ƒW‚ðÝ’è‚·‚é +procedure TGikoSys.SetGikoMessage; +begin + if FGikoMessage = nil then begin + FGikoMessage := TGikoMessage.Create; + end else begin + FGikoMessage.Clear; + end; + + if (Setting.GengoSupport) then begin + try + if (FileExists(Setting.GetLanguageFileName)) then begin + FGikoMessage.LoadFromFile(Setting.GetLanguageFileName); + end; + except + FGikoMessage.Clear; + end; + end; +end; +//! ƒMƒRƒiƒr‚̃ƒbƒZ[ƒW‚ðŽæ“¾‚·‚é +function TGikoSys.GetGikoMessage(MesType: TGikoMessageListType): String; +begin + Result := ''; + if FGikoMessage <> nil then begin + Result := FGikoMessage.GetMessage(MesType); + end; +end; +//Tue, 17 Dec 2002 12:18:07 GMT ¨ TDateTime‚Ö +//MonaUtils‚©‚çˆÚ“® +function TGikoSys.DateStrToDateTime(const DateStr: string): TDateTime; + function StrMonthToMonth(const s: string): integer; + const + m: array[1..12] of string = ('Jan','Feb','Mar','Apr','May','Jun', 'Jul','Aug','Sep','Oct','Nov','Dec'); + var + i: integer; + begin + Result := -1; + for i := Low(m) to High(m) do begin + if (SameText(s, m[i])) then begin + Result := i; + Break; + end; + end; + end; +var + wDay, wMonth, wYear: word; + wHour, wMinute, wSecond: word; + sTime: string; + d: TDateTime; +begin + wDay := StrToIntDef(ChooseString(DateStr, ' ', 1), 0); + wMonth := StrMonthToMonth(ChooseString(DateStr, ' ', 2)); + wYear := StrToIntDef(ChooseString(DateStr, ' ', 3), 0); + sTime := ChooseString(DateStr, ' ', 4); + wHour := StrToIntDef(ChooseString(sTime, ':', 0), 0); + wMinute := StrToIntDef(ChooseString(sTime, ':', 1), 0); + wSecond := StrToIntDef(ChooseString(sTime, ':', 2), 0); + d := EncodeDateTime(wYear, wMonth, wDay, wHour, wMinute, wSecond, 0); + Result := d; +end; +//MonaUtils‚©‚çˆÚ“® +//! ‚ ‚éƒZƒpƒŒ[ƒ^‚Å‹æØ‚ç‚ꂽ•¶Žš—ñ‚©‚ç‚Ž”Ô–Ú‚Ì•¶Žš—ñ‚ðŽæ‚èo‚· +function TGikoSys.ChooseString(const Text, Separator: string; Index: integer): string; +var + S : string; + i, p : integer; +begin + S := Text; + for i := 0 to Index - 1 do begin + if (AnsiPos(Separator, S) = 0) then S := '' + else S := Copy(S, AnsiPos(Separator, S) + Length(Separator), Length(S)); + end; + p := AnsiPos(Separator, S); + if (p > 0) then Result := Copy(S, 1, p - 1) else Result := S; +end; +//! ˆêŽžƒtƒ@ƒCƒ‹‚©‚ç‚Ì•œ‹Œ +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 + //‘O‰ñˆÙíI—¹Žž—pTmpƒtƒ@ƒCƒ‹ƒŠƒXƒg + GetFileList(Boardpath, '*.tmp', TmpFileList, False); + TmpFileList.EndUpdate; + //‘O‰ñˆÙíI—¹Žžƒ`ƒFƒbƒN + 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); + ThreadItem.IsLogFile := FileExists(ThreadItem.GetThreadFileName); + if(ThreadItem.Size = 0) and (ThreadItem.IsLogFile) then begin + try + ThreadItem.Size := GetFileSize(ThreadItem.GetThreadFileName) - ThreadItem.Count; + except + end; + end; + + //„‰ñ‚̐ݒè‚ÍRoundData‚Ì•û‚ª‚â‚é‚©‚珟Žè‚ɐݒ肵‚Ă̓_ƒI@by ‚à‚¶‚ã + //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‚ª—˜—p‚Å‚«‚é‚© +\return Boolean —˜—p‚Å‚«‚éê‡‚Í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ˆø—p•„Žæ“¾ +\return OE‚̈ø—p•„iÝ’肳‚ê‚Ä‚¢‚È‚¢ê‡‚Í'>') +} +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; +//! ’uŠ·Ý’èƒtƒ@ƒCƒ‹Žæ“¾ +function TGikoSys.GetReplaceFileName: String; +begin + Result := Setting.GetReplaceFileName; +end; +//! ƒvƒŒƒrƒ…[Šg’£‚̐ݒèƒtƒ@ƒCƒ‹Žæ“¾ +function TGikoSys.GetExtpreviewFileName: String; +begin + Result := Setting.GetExtprevieFileName; +end; + +//! ƒtƒ@ƒCƒ‹–¼‚©‚ç‚̃XƒŒƒbƒhì¬“ú‚̎擾 +function TGikoSys.GetCreateDateFromName(FileName: String): TDateTime; +var + tmp : String; + unixtime: Int64; +begin + // ƒƒOƒtƒ@ƒCƒ‹‚ÌŠg’£Žq‚ð‚Í‚¸‚µ‚½‚à‚Ì‚ªƒXƒŒì¬“úŽž + 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); +{$IFDEF DEBUG} +var + count : integer; +{$ENDIF} +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.