X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=GikoSystem.pas;h=827e109c816ffff120fd0898269151083d53b0d5;hb=ed262f6cd989d300228e6de1a3546e80dbbfa3f3;hp=7977ad3b414b967aba03b7798536019b9a808697;hpb=60b96539114b597c6d05da2a1e21fe18d7570975;p=gikonavigoeson%2Fgikonavi.git
diff --git a/GikoSystem.pas b/GikoSystem.pas
index 7977ad3..827e109 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,33 +12,33 @@ 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, Belib;
type
TVerResourceKey = (
- vrComments, // Rg
- vrCompanyName, // ïм
- vrFileDescription, // à¾
- vrFileVersion, // t@Co[W
- vrInternalName, // à¼
- vrLegalCopyright, // ì
- vrLegalTrademarks, // ¤W
- vrOriginalFilename, // ³®t@C¼
- vrPrivateBuild, // vCx[grhîñ
- vrProductName, // »i¼
- vrProductVersion, // »io[W
- vrSpecialBuild); // XyVrhîñ
-
- //BBS^Cv
+ vrComments, //!< Rg
+ vrCompanyName, //!< ïм
+ vrFileDescription, //!< à¾
+ vrFileVersion, //!< t@Co[W
+ vrInternalName, //!< à¼
+ vrLegalCopyright, //!< ì
+ vrLegalTrademarks, //!< ¤W
+ vrOriginalFilename, //!< ³®t@C¼
+ vrPrivateBuild, //!< vCx[grhîñ
+ vrProductName, //!< »i¼
+ vrProductVersion, //!< »io[W
+ vrSpecialBuild); //!< XyVrhîñ
+
+ //! BBS^Cv
TGikoBBSType = (gbt2ch);
- //O^Cv
+ //! O^Cv
TGikoLogType = (glt2chNew, glt2chOld);
- //bZ[WACR
+ //! bZ[WACR
TGikoMessageIcon = (gmiOK, gmiSAD, gmiNG, gmiWhat, gmiNone);
- //URLI[vuEU^Cv
+ //! URLI[vuEU^Cv
TGikoBrowserType = (gbtIE, gbtUserApp, gbtAuto);
@@ -48,7 +48,7 @@ type
Pos: Integer;
end;
- //CfbNXt@CR[h
+ //! CfbNXt@CR[h
TIndexRec = record
FNo: Integer;
FFileName: string;
@@ -60,7 +60,7 @@ type
FLastModified: TDateTime;
FKokomade: Integer;
FNewReceive: Integer;
- FMishiyou: Boolean; //¢gp
+ FMishiyou: Boolean; //!< ¢gp
FUnRead: Boolean;
FScrollTop: Integer;
//Index Ver 1.01
@@ -69,14 +69,17 @@ type
FAgeSage: TGikoAgeSage;
end;
- //TuWFNgR[h
+ //! TuWFNgR[h
TSubjectRec = record
FFileName: string;
FTitle: string;
FCount: Integer;
end;
- //XR[h
+ //! XR[hÖÌ|C^
+ PResRec = ^TResRec;
+
+ //! XR[h
TResRec = record
FTitle: string;
FMailTo: string;
@@ -86,23 +89,18 @@ type
FType: TGikoLogType;
end;
- //URLPathR[h
+ //! URLPathR[h
TPathRec = record
- FBBS: string; //BBSID
- FKey: string; //ThreadID
- FSt: Int64; //JnXÔ
- FTo: Int64; //I¹XÔ
- FFirst: Boolean; //>>1Ì\¦
- FStBegin: Boolean; //1`\¦
- FToEnd: Boolean; //`ÅãÜÅ\¦
- FDone: Boolean; //¬÷
- FNoParam: Boolean; //XÔp[^ȵ
- end;
-
- //MessageList
- TGikoMessageListType = (gmLogout, gmLogin, gmForceLogin, gmSureItiran,
- gmUnKnown, gmSureSyutoku, gmSureDiff, gmNotMod, gmAbort, gmError,
- gmNewRes, gmNewSure, gmResError, gmSureError);
+ FBBS: string; //!< BBSID
+ FKey: string; //!< ThreadID
+ FSt: Int64; //!< JnXÔ
+ FTo: Int64; //!< I¹XÔ
+ FFirst: Boolean; //!< >>1Ì\¦
+ FStBegin: Boolean; //!< 1`\¦
+ FToEnd: Boolean; //!< `ÅãÜÅ\¦
+ FDone: Boolean; //!< ¬÷
+ FNoParam: Boolean; //!< XÔp[^ȵ
+ end;
TGikoSys = class(TObject)
private
@@ -112,9 +110,13 @@ type
FAWKStr: TAWKStr;
FResRange : Longint;
FBayesian : TGikoBayesian; //!< xCWAtB^
- FVersion : String; //t@Co[W
-// FExitWrite: TStringList;
-// function StrToFloatDef(s: string; Default: Double): Double;
+ FVersion : String; //!< t@Co[W
+ FGikoMessage: TGikoMessage;
+ FBelib: TBelib;
+ //! éZp[^ÅæØç꽶ñ©çÔÚ̶ñðæèo·
+ function ChooseString(const Text, Separator: string; Index: integer): string;
+ //! êt@C©çÌ
+ procedure RestoreThreadData(Board: TBoard);
public
{ Public é¾ }
FAbon : TAbon;
@@ -124,15 +126,12 @@ type
destructor Destroy; override;
property ResRange : Longint read FResRange write FResRange;
- //o[Wîñ
+ //! 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;
@@ -141,6 +140,7 @@ type
function GetTempFolder: string;
function GetSentFileName: string;
function GetConfigDir: string;
+ function GetNGWordsDir: string;
function GetSkinDir: string;
function GetSkinHeaderFileName: string;
function GetSkinFooterFileName: string;
@@ -153,6 +153,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);
@@ -162,10 +165,9 @@ type
procedure GetDirectoryList(Path: string; Mask: string; List: TStringList; SubDir: Boolean);
function DivideSubject(Line: string): TSubjectRec;
- function DivideStrLine(Line: string): TResRec;
-
property Setting: TSetting read FSetting write FSetting;
property Dolib: TDolib read FDolib write FDolib;
+ property Belib: TBelib read FBelib write FBelib;
function UrlToID(url: string): string;
function UrlToServer(url: string): string;
@@ -175,7 +177,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;
@@ -183,21 +184,16 @@ type
procedure MenuFont(Font: TFont);
- function RemoveToken(var s:string; const delimiter:string):string;
+// 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 ConvRes(const Body, Bbs, Key, ParamBBS, ParamKey, ParamStart, ParamTo, ParamNoFirst, ParamTrue : string; DatToHTML: boolean = false): string; overload;
- function ConvRes(const Body, Bbs, Key, ParamBBS, ParamKey, ParamStart, ParamTo, ParamNoFirst, ParamTrue, FullURL : string): string; overload;
+ function TrimThreadTitle(const SrcTitle: string): 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;
@@ -220,17 +216,12 @@ type
procedure GetPopupResNumber(URL : string; var stRes, endRes : Int64);
- //Samba24Ìt@Cª¶Ý·é©B¶ÝµÈ¢êAdefaultt@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 CreateResAnchor(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;
+ function ExtructResID(ADateStr: String): String;
//! PêðÍ
procedure SpamCountWord( const text : string; wordCount : TWordCount );
//! wKNA
@@ -239,18 +230,45 @@ type
procedure SpamLearn( wordCount : TWordCount; isSpam : Boolean );
//! Xpx
function SpamParse( const text : string; wordCount : TWordCount ) : Extended;
- //øªAútÅàÅàÈ¢±Æð²×é
- function NotDateorTimeString(const AStr : string): boolean;
- //øÉçêÄ«½út/IDÉBE̶ñª Á½çAvt@CÖÌNðÇÁ
+ //! øÉçêÄ«½út/IDÉBE̶ñª Á½çAvt@CÖÌNðÇÁ
function AddBeProfileLink(AID : string; ANum: Integer): string;
- //o[WîñÌæ¾
+ //! o[WîñÌæ¾
function GetVersionInfo(KeyWord: TVerResourceKey): string;
- //PluginÌîñÌæ¾
+ //! PluginÌîñÌæ¾
function GetPluginsInfo(): string;
- //IEÌo[WîñÌæ¾
+ //! IEÌo[WîñÌæ¾
function GetIEVersion: string;
function SetUserOptionalStyle(): string;
+ //! MRirÌbZ[WðÝè·é
+ procedure SetGikoMessage;
+ //! MRirÌbZ[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;
+ //! CfbNXÉÈ¢datiÍ®êdatjÌÇÁ
+ procedure AddOutofIndexDat(Board: TBoard; DatList: TStringList; AllCreate: boolean = True);
+ //! t@C¼©çÌXbhì¬úÌæ¾
+ function GetCreateDateFromName(FileName: String): TDateTime;
+ function GetExtpreviewFileName: String;
+
+ procedure ShowRefCount(msg: String; unk: IUnknown);
+ //! `¯ÌCookieæ¾
+ function GetBoukenCookie(AURL: String): String;
+ //! `¯ÌCookieÝè
+ procedure SetBoukenCookie(ACookieValue, ADomain: String);
+ //! `¯ÌCookieí
+ procedure DelBoukenCookie(ADomain: String);
+ //! `¯ÌDomainêæ¾
+ procedure GetBoukenDomain(var ADomain: TStringList);
+ //! `¯ÌhC¼Cookieæ¾
+ function GetBouken(AURL: String; var Domain: String): String;
end;
var
@@ -260,8 +278,8 @@ const
ZERO_DATE: Integer = 25569;
BETA_VERSION_NAME_E = 'beta';
BETA_VERSION_NAME_J = 'ÊÞÀ';
- BETA_VERSION = 51;
- BETA_VERSION_BUILD = ''; //debugÅÈÇ
+ BETA_VERSION = 68;
+ BETA_VERSION_BUILD = ''; //!< debugÅÈÇ
APP_NAME = 'gikoNavi';
BE_PHP_URL = 'http://be.2ch.net/test/p.php?i=';
@@ -269,7 +287,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';
@@ -278,6 +297,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/';
@@ -295,13 +315,15 @@ const
'ProductVersion',
'SpecialBuild');
-(*************************************************************************
- *GikoSysRXgN^
- *************************************************************************)
+// *************************************************************************
+//! GikoSysRXgN^
+// *************************************************************************
constructor TGikoSys.Create;
begin
+ Inherited;
FSetting := TSetting.Create;
FDolib := TDolib.Create;
+ FBelib := TBelib.Create;
FAWKStr := TAWKStr.Create(nil);
if DirectoryExists(GetConfigDir) = false then begin
CreateDir(GetConfigDir);
@@ -326,27 +348,18 @@ begin
FVersion := Trim(GetVersionInfo(vrFileVersion));
FBayesian := TGikoBayesian.Create;
//FBoardURLList := TStringList.Create;
+ //bZ[WÌì¬
+ FGikoMessage := TGikoMessage.Create;
end;
-(*************************************************************************
- *GikoSysfXgN^
- *************************************************************************)
+// *************************************************************************
+//! GikoSysfXgN^
+// *************************************************************************
destructor TGikoSys.Destroy;
var
i: Integer;
FileList: TStringList;
begin
- //Xbhf[^t@CðXV
-// FlashExitWrite;
-
-// FExitWrite.Free;
- FBayesian.Free;
- FAWKStr.Free;
- FSetting.Free;
- FDolib.Free;
- FAbon.Free;
- FSelectResFilter.Free;
- //FBoardURLList.Free;
//e|HTMLðí
FileList := TStringList.Create;
try
@@ -359,12 +372,22 @@ begin
finally
FileList.Free;
end;
+ FreeAndNil(FGikoMessage);
+ FreeAndNil(FBayesian);
+ FreeAndNil(FSelectResFilter);
+ FreeAndNil(FAbon);
+ FreeAndNil(FAWKStr);
+ FreeAndNil(FBelib);
+ FreeAndNil(FDolib);
+ FreeAndNil(FSetting);
inherited;
end;
-(*************************************************************************
- *¶ñ`FbN
- *************************************************************************)
+{!
+\brief ¶ñ`FbN
+\param s `FbN·é¶ñ
+\return s ªt«®ÆµÄF¯Â\Èç True
+}
{$HINTS OFF}
function TGikoSys.IsNumeric(s: string): boolean;
var
@@ -376,9 +399,11 @@ begin
end;
{$HINTS ON}
-(*************************************************************************
- *¶ñ®¬_`FbN
- *************************************************************************)
+{!
+\brief ¶ñ®¬_`FbN
+\param s `FbN·é¶ñ
+\return s ªt«®¬ÆµÄF¯Â\Èç True
+}
function TGikoSys.IsFloat(s: string): boolean;
var
v: Extended;
@@ -386,112 +411,126 @@ begin
Result := TextToFloat(PChar(s), v, fvExtended);
end;
-(*************************************************************************
- *{[ht@C¼æ¾ipX{t@C¼j
- *************************************************************************)
+// *************************************************************************
+//! {[ht@C¼æ¾ipX{t@C¼j
+// *************************************************************************
function TGikoSys.GetBoardFileName: string;
begin
Result := Setting.GetBoardFileName;
end;
-(*************************************************************************
- *{[ht@C¼æ¾ipX{t@C¼j
- *************************************************************************)
+// *************************************************************************
+//! {[ht@C¼æ¾ipX{t@C¼j
+// *************************************************************************
function TGikoSys.GetCustomBoardFileName: string;
begin
Result := Setting.GetCustomBoardFileName;
end;
-(*************************************************************************
- *e|tH_[¼æ¾
- *************************************************************************)
+// *************************************************************************
+//! e|tH_[¼æ¾
+// *************************************************************************
function TGikoSys.GetHtmlTempFileName: string;
begin
Result := Setting.GetHtmlTempFileName;
end;
-(*************************************************************************
- *Àst@CtH_æ¾
- *************************************************************************)
+// *************************************************************************
+//! Àst@CtH_æ¾
+// *************************************************************************
function TGikoSys.GetAppDir: string;
begin
Result := Setting.GetAppDir;
end;
-(*************************************************************************
- *TempHtmlt@C¼æ¾ipX{t@C¼j
- *************************************************************************)
+// *************************************************************************
+//! TempHtmlt@C¼æ¾ipX{t@C¼j
+// *************************************************************************
function TGikoSys.GetTempFolder: string;
begin
Result := Setting.GetTempFolder;
end;
-(*************************************************************************
- *sent.init@C¼æ¾ipX{t@C¼j
- *************************************************************************)
+// *************************************************************************
+//! sent.init@C¼æ¾ipX{t@C¼j
+// *************************************************************************)
function TGikoSys.GetSentFileName: string;
begin
Result := Setting.GetSentFileName;
end;
-(*************************************************************************
- *outbox.init@C¼æ¾ipX{t@C¼j
- *************************************************************************)
+// *************************************************************************
+//! outbox.init@C¼æ¾ipX{t@C¼j
+// *************************************************************************
function TGikoSys.GetOutBoxFileName: string;
begin
Result := Setting.GetOutBoxFileName;
end;
-(*************************************************************************
- *ConfigtH_æ¾
- *************************************************************************)
+// *************************************************************************
+//! ConfigtH_æ¾
+// *************************************************************************
function TGikoSys.GetConfigDir: string;
begin
Result := Setting.GetConfigDir;
end;
+function TGikoSys.GetNGWordsDir: string;
+begin
+ Result := Setting.GetConfigDir + NGWORDs_DIR_NAME;
+end;
+
+
+//! X^CV[gtH_
function TGikoSys.GetStyleSheetDir: string;
begin
Result := Setting.GetStyleSheetDir;
end;
+//! XLtH_
function TGikoSys.GetSkinDir: string;
begin
Result := Setting.GetSkinDir;
end;
+//! Skin:wb_Ìt@C¼
function TGikoSys.GetSkinHeaderFileName: string;
begin
- Result := Setting.GetSkinHeaderFileName;
+ Result := Setting.SkinFiles.GetSkinHeaderFileName;
end;
+//! Skin:tb^Ì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æ¾
+//! UserAgentæ¾
function TGikoSys.GetUserAgent: string;
begin
if Dolib.Connected then begin
@@ -512,96 +551,97 @@ begin
end;
end;
-(*************************************************************************
- *Q¿áñËéû®æ¾
- *************************************************************************)
-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;
-
-//valÍA1970/1/1/ 00:00:00 ©çÌoßÔ
+{!
+\brief oßbð TDateTime ÉÏ·
+\param val 1970/1/1/ 00:00:00 ©çÌoßb
+\return val 𦷠TDateTime
+}
function TGikoSys.IntToDateTime(val: Int64): TDateTime;
begin
Result := ZERO_DATE + val / 86400.0;
end;
-//ADateð1970/1/1/ 00:00:00 ©çÌoßÔÉÏ··é
+
+{!
+\brief TDateTime ðoßbÉÏ·
+\param ADate Ï··é
+\return 1970/1/1/ 00:00:00 ©çÌoßb
+}
function TGikoSys.DateTimeToInt(ADate: TDateTime): Int64;
begin
Result := Trunc((ADate - ZERO_DATE) * 86400);
end;
-(*************************************************************************
- *Subjectt@CRead
- *************************************************************************)
+{!
+\brief Subjectt@CRead
+\param Board Xêðæ¾·éÂ
+}
procedure TGikoSys.ReadSubjectFile(Board: TBoard);
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 );
+ // XbhŤÊÌ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;
- //IsLogFilepDATt@CXg
- GetFileList(ExtractFileDir(Board.GetFolderIndexFileName), '*.dat', FileList, False);
- FileList.EndUpdate;
- //OñÙíI¹pTmpt@CXg
- 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;
+ //IsLogFilepDATt@CXg
+ 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);
-
//QsÚ©çiPsÚÍo[Wj
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,
@@ -612,7 +652,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
);
@@ -620,29 +660,26 @@ 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
);
end;
end;
- ThreadItem.BeginUpdate;
- if islog then
+ //ThreadItem.BeginUpdate;
+ 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;
@@ -655,21 +692,10 @@ begin
Node := FavoriteDM.TreeView.Items.AddChildObject( FavoriteDM.TreeView.Items.Item[0], ThreadItem.Title, FavoThreadItem);
*}
- {//ñXgɶݵ½çñtOZbg
- 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;
+ //ThreadItem.EndUpdate;
Board.Add(ThreadItem);
- if (ThreadItem.IsLogFile) and (ThreadItem.UnRead) then
+ if (ThreadItem.UnRead) and (ThreadItem.IsLogFile) then
Inc(UnRead);
end;
end;
@@ -677,101 +703,105 @@ begin
if UnRead <> Board.UnRead then
Board.UnRead := UnRead;
- Boardpath := ExtractFilePath(Board.GetFolderIndexFileName);
- //CfbNXɳ©Á½OðÇÁi
êCfbNXÎ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] ) );
- ResRec := DivideStrLine(Board.BoardPlugIn.GetDat( DWORD( ThreadItem ), 1 ));
- end else begin
- ThreadItem := TThreadItem.Create(
- nil,
- Board,
- Get2chBoard2ThreadURL( Board, ChangeFileExt( FileList[i], '' ) ) );
- ResRec := DivideStrLine(ReadThreadFile(FileName, 1));
- 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
+ //CfbNXɳ©Á½OðÇÁi
êCfbNXÎj
+ AddOutofIndexDat(Board, FileList);
+ end;
Board.EndUpdate;
- //OñÙíI¹`FbN
- 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¹`FbN
+ 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.' + Board.Title + ':' + IntToStr(rt) + ' ms');
+{$ENDIF}
+end;
+{!
+\brief CfbNXÉÈ¢datiÍ®êdatjÌÇÁ
+\param Board ÇÁ·éÂ
+\param DatList datt@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);
+ //CfbNXɳ©Á½OðÇÁi
êCfbNXÎ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;
-
-(*************************************************************************
- *XbhCfbNXt@C(Folder.idx)ì¬
- *************************************************************************)
+{!
+\brief XbhCfbNXt@C(Folder.idx)ì¬
+\param Board Folder.idx ð쬷éÂ
+}
procedure TGikoSys.CreateThreadDat(Board: TBoard);
var
i: integer;
@@ -819,7 +849,7 @@ begin
'%s'#1'%x'#1'%x'#1'%x'#1'%x'#1'%x',
[cnt, //Ô
Rec.FFileName, //t@C¼
- Rec.FTitle, //^Cg
+ MojuUtils.Sanitize(Rec.FTitle), //^Cg
Rec.FCount, //JEg
0, //size
0, //RoundDate
@@ -847,10 +877,10 @@ begin
end;
end;
-(*************************************************************************
- *XbhCfbNX(Thread.dat)«Ý
- *Public
- *************************************************************************)
+{!
+\brief XbhCfbNX(Thread.dat)«Ý
+\param Thread.dat ð쬷éÂ
+}
procedure TGikoSys.WriteThreadDat(Board: TBoard);
//const
// Values: array[Boolean] of string = ('0', '1');
@@ -877,9 +907,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);
@@ -889,7 +919,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, //^Cg
+ MojuUtils.Sanitize(Board.Items[i].Title), //^Cg
Board.Items[i].Count, //JEg
Board.Items[i].Size, //size
DateTimeToInt(Board.Items[i].RoundDate), //RoundDate
@@ -919,45 +949,59 @@ begin
end;
end;
+{!
+\brief Folder.idx ð 1 sðß
+\param Line Folder.idx ð\¬·é 1 s
+\return Xbhîñ
+}
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);
- RemoveToken(Line, #1);//9: ; //¢gp
- 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));
-
-end;
-
-//wètH_àÌwèt@Cêðæ¾·é
-// ListFiles('c:\', '*.txt', list, True);
+ 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);
+ MojuUtils.RemoveToken(Line, #1);//9: ; //¢gp
+ 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;
+
+{!
+\brief wètH_àÌwèt@Cêðæ¾·é
+\param Path N_ÆÈétH_pX
+\param Mask t@C¼Ì}XN
+\param List OUT:æ¾³ê½t@C¼êªÔé
+\param SubDir ÌtH_ÜÅÄAIÉXg·éêÍ True
+\param IsPathAdd pXt«ÅXgAbv·éêÍ True
+
+Mask ð '*.txt' Ìæ¤Éwè·é±ÆÅA
+ÁèÌt@C¼âÁèÌg£qÉiÁ½XgAbvªÂ\Å·B
+
+\par á:
+\code
+GetFileList('c:\', '*.txt', list, True, True);
+\endcode
+}
procedure TGikoSys.GetFileList(Path: string; Mask: string; var List: TStringList; SubDir: Boolean; IsPathAdd: Boolean);
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
@@ -974,27 +1018,37 @@ begin
end;
List.Sort;
end;
-//wètH_àÌwèt@Cêðæ¾·é
-//TutH_ÍõµÈ¢
-// ListFiles('c:\', '*.txt', list, True);
+
+{!
+\breif wètH_àÌwèt@Cêðæ¾·éB
+ TutH_ÍõµÈ¢
+\param Path N_ÆÈétH_pX
+\param Mask t@C¼Ì}XN
+\param List OUT:æ¾³ê½t@C¼êªÔé
+\param IsPathAdd pXt«ÅXgAbv·éêÍ True
+\note ÄNwèÂ\È GetFileList() ª éÌűÌÖÍsv?
+\par á
+\code
+GetFileList('c:\', '*.txt', list, True);
+\endcode
+}
procedure TGikoSys.GetFileList(Path: string; Mask: string; var List: TStringList; IsPathAdd: Boolean);
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;
@@ -1003,7 +1057,22 @@ begin
end;
List.Sort;
end;
-//wètH_àÌfBNgêðæ¾·é
+
+{!
+\brief wètH_àÌfBNgêðæ¾·é
+\param Path N_ÆÈétH_pX
+\param Mask tH_¼Ì}XN
+\param List OUT:æ¾³ê½tH_¼êªÔé
+\param SubDir ÌtH_ÜÅÄAIÉXg·éêÍ True
+
+Mask ð '*.txt' Ìæ¤Éwè·é±ÆÅA
+ÁèÌt@C¼âÁèÌg£qÉiÁ½XgAbvªÂ\Å·B
+
+\par á:
+\code
+GetDirectoryList('c:\', '*.txt', list, True);
+\endcode
+}
procedure TGikoSys.GetDirectoryList(Path: string; Mask: string; List: TStringList; SubDir: Boolean);
var
rc: Integer;
@@ -1032,9 +1101,11 @@ begin
end;
-(*************************************************************************
- *TuWFNgêsðª
- *************************************************************************)
+{!
+\brief Subject.txt êsððß
+\param Line Subject.txt ð\¬·é 1 s
+\return Xbhîñ
+}
function TGikoSys.DivideSubject(Line: string): TSubjectRec;
var
i: integer;
@@ -1049,8 +1120,8 @@ begin
Delim := ','
else
Delim := '<>';
- Result.FFileName := RemoveToken(Line, Delim);
- Result.FTitle := Trim(RemoveToken(Line, Delim));
+ Result.FFileName := MojuUtils.RemoveToken(Line, Delim);
+ Result.FTitle := Trim(MojuUtils.RemoveToken(Line, Delim));
ws := Result.FTitle;
if Copy(ws, Length(ws), 1) = ')' then begin
@@ -1075,43 +1146,11 @@ begin
end;
end;
-(*************************************************************************
- * datt@CÌêCðªð
- *************************************************************************)
-function TGikoSys.DivideStrLine(Line: string): TResRec;
-var
- Delim: string;
-begin
- if AnsiPos('<>', Line) = 0 then begin
- //Delim := ',';
- //Result.FType := glt2chOld;
- Line := CustomStringReplace(Line, '<>', '<>');
- Line := CustomStringReplace(Line, ',', '<>');
- Line := CustomStringReplace(Line, 'M', ',');
- end;
- Delim := '<>';
- Result.FType := glt2chNew;
- //TrimµÄÍ¢¯È¢Cª·é@byà¶ã
- Result.FName := RemoveToken(Line, Delim);
- Result.FMailTo := RemoveToken(Line, Delim);
- Result.FDateTime := RemoveToken(Line, Delim);
- Result.FBody := RemoveToken(Line, Delim);
- //ó¾ÆâèªN«é©çAóðÝè·é
- if Result.FBody = '' then begin
- Result.FBody := ' ';
- end else if ( Result.FBody[1] = ' ' ) then begin
- //Q¿áñËéÆ©¾ÆA{¶ÌæªÉP¼póªüÁÄ¢éÌÅí·é
- //¼Ìf¦ÂÅAX©ÌÌó©àµêÈ¢¯Ç»êÍúßé
- Delete(Result.FBody, 1, 1);
- end;
- //Result.FTitle := Trim(RemoveToken(Line, Delim));
- Result.FTitle := RemoveToken(Line, Delim);
-
-end;
-
-(*************************************************************************
- * URL©çBBSIDðæ¾
- *************************************************************************)
+{!
+\brief URL©çBBSIDðæ¾
+\param url BBSID ðæ¾·é URL
+\return BBSID
+}
function TGikoSys.UrlToID(url: string): string;
var
i: integer;
@@ -1133,9 +1172,13 @@ begin
end;
end;
-(*************************************************************************
- *URL©çBBSIDÈO̪(http://teri.2ch.net/)ðæ¾
- *************************************************************************)
+{!
+\brief URL©çÅãÌvfðí
+\param url ðß·é URL
+\return Øèæçê½ãÌ URL
+
+URL ©ç BBSIDÈO̪ðæ¾·éÌÉgpµÜ·B
+}
function TGikoSys.UrlToServer(url: string): string;
var
i: integer;
@@ -1158,20 +1201,24 @@ begin
end;
end;
-(*************************************************************************
- *fBNgª¶Ý·é©`FbN
- *************************************************************************)
+{!
+\brief fBNgª¶Ý·é©`FbN
+\param Name ¶ÝðmF·étH_pX
+\return tH_ª¶Ý·éÈç True
+}
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;
-(*************************************************************************
- *fBNgì¬i¡KwÎj
- *************************************************************************)
+{!
+\brief fBNgì¬i¡KwÎj
+\param Dir 쬷épX
+\return ì¬É¬÷µ½êÍ True
+}
function TGikoSys.ForceDirectoriesEx(Dir: string): Boolean;
begin
Result := True;
@@ -1183,10 +1230,15 @@ begin
Result := ForceDirectoriesEx(ExtractFilePath(Dir)) and CreateDir(Dir);
end;
-(*************************************************************************
- *¶ñ©çg[NÌØèoµiúj
- *FDelphi©çÌpN
- *************************************************************************)
+{!
+\brief ¶ñ©çg[NÌØèoµiúj
+ FDelphi©çÌpN
+\param s ³ÉÈéLN^
+\param sep æØèÉÈé¶ñ
+\param Rec OUT:¶ñ¸îñªÔé
+\return Øèoµ½g[N
+\todo Split, RemoveToken, GetTokenIndex, NthField s«
+}
function TGikoSys.StrTokFirst(const s:string; const sep: TStrTokSeparator; var Rec: TStrTokRec): string;
begin
Rec.Str := s;
@@ -1194,10 +1246,14 @@ begin
Result := StrTokNext(sep, Rec);
end;
-(*************************************************************************
- *¶ñ©çg[NÌØèoµ
- *FDelphi©çÌpN
- *************************************************************************)
+{!
+\brief ¶ñ©çg[NÌØèoµ
+ FDelphi©çÌpN
+\param sep æØèÉÈéLN^
+\param Rec IN/OUT:StrTokFirstÅ쬳꽶ñ¸îñ
+\return Øèoµ½g[N
+\todo Split, RemoveToken, GetTokenIndex, NthField s«
+}
function TGikoSys.StrTokNext(const sep: TStrTokSeparator; var Rec: TStrTokRec): string;
var
Len, I: Integer;
@@ -1224,9 +1280,11 @@ begin
end;
end;
-(*************************************************************************
- *t@CTCYæ¾
- *************************************************************************)
+{!
+\brief t@CTCYæ¾
+\param FileName t@CTCYðæ¾·ét@CpX
+\return t@CTCY(bytes)
+}
function TGikoSys.GetFileSize(FileName : string): longint;
var
F : File;
@@ -1245,9 +1303,12 @@ begin
end;
end;
-(*************************************************************************
- *t@Csæ¾
- *************************************************************************)
+{!
+\brief eLXgt@CÌsðæ¾
+\param FileName sðæ¾·ét@CpX
+\return s
+\todo }bvht@Cs«
+}
function TGikoSys.GetFileLineCount(FileName : string): longint;
var
sl: TStringList;
@@ -1266,9 +1327,13 @@ begin
end;
-(*************************************************************************
- *Xbht@C©çwèsðæ¾
- *************************************************************************)
+{!
+\brief t@C©çwèsðæ¾
+\param FileName t@CÌpX
+\param Line wès
+\return wè³ê½ 1 s
+\todo }bvht@Cs«
+}
function TGikoSys.ReadThreadFile(FileName: string; Line: Integer): string;
var
fileTmp : TStringList;
@@ -1291,33 +1356,36 @@ begin
end;
end;
-(*************************************************************************
- *VXej
[tHgÌ®«ðæ¾
- *************************************************************************)
+{!
+\brief VXej
[tHgÌ®«ðæ¾
+\param Font OUT:æ¾µ½tHg®«ªÔé
+}
procedure TGikoSys.MenuFont(Font: TFont);
var
lf: LOGFONT;
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];
-end;
-
-(*************************************************************************
- *
- *DZ©ÌTCg©çÌpN
- *************************************************************************)
-function TGikoSys.RemoveToken(var s: string;const delimiter: string): string;
+ 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;
+
+{!
+\brief æªÌg[NðØèoµ
+\param s IN/OUT:³ÉÈé¶ñAØèoµ½ãÌcè̶ñ
+\param delimiter æØèÉÈé¶ñ
+\return Øèoµ½¶ñ
+
+DZ©ÌTCg©çÌpN
+}
+{function TGikoSys.RemoveToken(var s: string;const delimiter: string): string;
var
p: Integer;
begin
@@ -1328,51 +1396,25 @@ begin
Result := Copy(s, 1, p - 1);
Delete(s, 1, Length(Result) + Length(delimiter));
end;
+}
+
+{!
+\brief n ÂÚÌg[NðØèoµ
+\param s ³ÉÈé¶ñ
+\param index 0 ©çnÜéCfbNX(n ÂÚÌ n)
+\return Øèoµ½g[N
-(*************************************************************************
- *
- *DZ©ÌTCg©çÌpN
- *************************************************************************)
+DZ©ÌTCg©çÌpN
+}
function TGikoSys.GetTokenIndex(s: string; delimiter: string; index: Integer): string;
var
i: Integer;
begin
Result := '';
for i := 0 to index do
- Result := RemoveToken(s, delimiter);
+ Result := MojuUtils.RemoveToken(s, delimiter);
end;
-(*************************************************************************
- *
- *************************************************************************)
-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;
//CfbNX¢XVobt@ðtbV
I
{procedure TGikoSys.FlashExitWrite;
@@ -1385,10 +1427,14 @@ begin
FExitWrite.Clear;
end;}
-(*************************************************************************
- *X¼ÈÇðZ¢¼OÉÏ··é
- *from HotZonu
- *************************************************************************)
+{!
+\brief X¼ÈÇðZ¢¼OÉÏ··é
+\param LongName ³ÉÈé¶ñ
+\param ALength ûßé¶ñ·(bytes)
+\return Ï·³ê½¶ñ
+
+from HotZonu
+}
function TGikoSys.GetShortName(const LongName: string; ALength: integer): string;
const
ERASECHAR : array [1..39] of string =
@@ -1401,7 +1447,7 @@ var
S : string;
i : integer;
begin
- s := Trim(LongName);
+ s := TrimThreadTitle(Trim(LongName));
if (Length(s) <= ALength) then begin
Result := s;
end else begin
@@ -1434,404 +1480,59 @@ begin
end;
end;
-(*************************************************************************
- *
- * from HotZonu
- *************************************************************************)
-function TGikoSys.ConvRes(const Body, Bbs, Key,
- ParamBBS, ParamKey, ParamStart, ParamTo, ParamNoFirst, ParamTrue : string;
- DatToHTML: boolean = false): string;
-type
- PIndex = ^TIndex;
- TIndex = record
- FIndexFrom : integer;
- FIndexTo : integer;
- FNo : string;
- end;
-const
- GT = '>';
- SN = '0123456789-';
- ZN = 'OPQRSTUVWX|';
-var
- i : integer;
- s,r : string;
- b : TMbcsByteType;
- sw: boolean;
- sp: integer;
- No: string;
- sx: string;
- List: TList;
- oc : string;
- st, et: string;
- chk : boolean;
- al : boolean;
- procedure Add(IndexFrom, IndexTo: integer; const No: string);
- var
- FIndex : PIndex;
- begin
- New(FIndex);
- FIndex.FIndexFrom := IndexFrom;
- FIndex.FIndexTo := IndexTo;
- FIndex.FNo := No;
- List.Add(FIndex);
- end;
- function 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;
-begin
- { v1.0 b2 - 03 }
- s := Body;
- r := Body;
- i := 1;
- sw := False;
- No := '';
- List:= TList.Create;
- oc := '';
- sp := 0;
- chk := False;
- al := False;
- while true do begin
- b := ByteType(s, i);
- case b of
- mbSingleByte : begin
- if (not sw) and (Copy(s,i,8) = GT + GT) then begin
- if (AnsiPos('')) or
- ((Chk) and (oc = '')) or
- ((not Chk) and (al)) then
- begin
- sw := True;
- sp := i;
- //i := i + 1;
- oc:='';
- end;
- end else
- if (sw) then begin
- sx := Copy(s,i,1);
- if (AnsiPos(sx, SN) > 0) then begin
- No := No + sx;
- end else begin
- if (No <> '') and (No <> '-') then begin
- Add(sp, i, No);
- al := True;
- end;
- sw := False;
- //
- i := i - 1;
- //
- No := '';
- oc:='';
- //chk := False;
- end;
- end else begin
- if Copy(s,i,1) = '<' then oc := '';
- oc := oc + Copy(s,i,1);
- chk := False;
- al := False;
- end;
- end;
- mbLeadByte : begin
- if (not sw) and (Copy(s,i,4) = '') then begin
- sw := True;
- sp := i;
- i := i + 3;
- chk := True;
- end else
- if (not sw) and (Copy(s,i,2) = '') then begin
- sw := True;
- sp := i;
- i := i + 1;
- chk := True;
- end else
- if (sw) then begin
- sx := Copy(s,i,2);
- if (AnsiPos(sx, ZN) > 0) then begin
- No := No + ZenToHan(sx);
- end else begin
- if (No <> '') and (No <> '-') and (No <> '|') then begin
- Add(sp, i, No);
- end;
- sw := False;
- i := i - 1;
- No := '';
- end;
- end else begin
- oc := '';
- chk := False;
- end;
- al := False;
- end;
- end;
- inc(i);
- if (i > Length(Body)) then begin
- if (sw) then begin
- if (No <> '') then Add(sp, i, No);
- end;
- Break;
- end;
- end;
- for i := List.Count - 1 downto 0 do begin
- if (AnsiPos('-', PIndex(List[i]).FNo) > 0) then begin
- st := ChooseString(PIndex(List[i]).FNo, '-', 0);
- et := ChooseString(PIndex(List[i]).FNo, '-', 1);
- end else begin
- st := PIndex(List[i]).FNo;
- et := PIndex(List[i]).FNo;
- end;
- if not DatToHTML then
- r := Copy(r,0, PIndex(List[i]).FIndexFrom - 1) +
- Format('',
- [ParamBBS, Bbs, ParamKey, Key, ParamStart, st, ParamTo, et, ParamNoFirst, ParamTrue]) +
- Copy(r,PIndex(List[i]).FIndexFrom, PIndex(List[i]).FIndexTo - PIndex(List[i]).FIndexFrom) + '' +
- Copy(r,PIndex(List[i]).FIndexTo,Length(r))
- else
- r := Copy(r,0, PIndex(List[i]).FIndexFrom - 1) +
- Format('', [st]) +
- Copy(r,PIndex(List[i]).FIndexFrom, PIndex(List[i]).FIndexTo - PIndex(List[i]).FIndexFrom) + '' +
- Copy(r,PIndex(List[i]).FIndexTo,Length(r));
-
- Dispose(PIndex(List[i]));
- end;
- List.Free;
- Result := r;
-end;
-
-function TGikoSys.ConvRes(
- const Body, Bbs, Key, ParamBBS, ParamKey,
- ParamStart, ParamTo, ParamNoFirst,
- ParamTrue, FullURL : string
-): string;
-type
- PIndex = ^TIndex;
- TIndex = record
- FIndexFrom : integer;
- FIndexTo : integer;
- FNo : string;
- end;
+function TGikoSys.TrimThreadTitle(const SrcTitle: string): string;
const
- GT = '>';
- SN = '0123456789-';
- ZN = 'OPQRSTUVWX|';
+ TRIM_STRING: array [1..4] of String =
+ ('[]ÚÖ~]', '©2ch.net', '©bbspink.com', #9);
var
- i : integer;
- s,r : string;
- b : TMbcsByteType;
- sw: boolean;
- sp: integer;
- No: string;
- sx: string;
- List: TList;
- oc : string;
- st, et: string;
- chk : boolean;
- al : boolean;
- procedure Add(IndexFrom, IndexTo: integer; const No: string);
- var
- FIndex : PIndex;
- begin
- New(FIndex);
- FIndex.FIndexFrom := IndexFrom;
- FIndex.FIndexTo := IndexTo;
- FIndex.FNo := No;
- List.Add(FIndex);
- end;
- function 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;
-begin
- { v1.0 b2 - 03 }
- s := Body;
- r := Body;
- i := 1;
- sw := False;
- No := '';
- List:= TList.Create;
- oc := '';
- sp := 0;
- chk := False;
- al := False;
- while true do begin
- b := ByteType(s, i);
- case b of
- mbSingleByte : begin
- if (not sw) and (Copy(s,i,8) = GT + GT) then begin
- if (AnsiPos('')) or
- ((Chk) and (oc = '')) or
- ((not Chk) and (al)) then
- begin
- sw := True;
- sp := i;
- //i := i + 1;
- oc:='';
- end;
- end else
- if (sw) then begin
- sx := Copy(s,i,1);
- if (AnsiPos(sx, SN) > 0) then begin
- No := No + sx;
- end else begin
- if (No <> '') and (No <> '-') then begin
- Add(sp, i, No);
- al := True;
- end;
- sw := False;
- //
- i := i - 1;
- //
- No := '';
- oc:='';
- //chk := False;
- end;
- end else begin
- if Copy(s,i,1) = '<' then oc := '';
- oc := oc + Copy(s,i,1);
- chk := False;
- al := False;
- end;
- end;
- mbLeadByte : begin
- if (not sw) and (Copy(s,i,4) = '') then begin
- sw := True;
- sp := i;
- i := i + 3;
- chk := True;
- end else
- if (not sw) and (Copy(s,i,2) = '') then begin
- sw := True;
- sp := i;
- i := i + 1;
- chk := True;
- end else
- if (sw) then begin
- sx := Copy(s,i,2);
- if (AnsiPos(sx, ZN) > 0) then begin
- No := No + ZenToHan(sx);
- end else begin
- if (No <> '') and (No <> '-') and (No <> '|') then begin
- Add(sp, i, No);
- end;
- sw := False;
- i := i - 1;
- No := '';
- end;
- end else begin
- oc := '';
- chk := False;
- end;
- al := False;
- end;
- end;
- inc(i);
- if (i > Length(Body)) then begin
- if (sw) then begin
- if (No <> '') then Add(sp, i, No);
- end;
- Break;
- end;
- end;
- for i := List.Count - 1 downto 0 do begin
- //plName := Copy(PluginName, LastDelimiter('\',PluginName) + 1, Length(PluginName) - LastDelimiter('/',PluginName) -1 );
- if (AnsiPos('-', PIndex(List[i]).FNo) > 0) then begin
- st := ChooseString(PIndex(List[i]).FNo, '-', 0);
- et := ChooseString(PIndex(List[i]).FNo, '-', 1);
- end else begin
- st := PIndex(List[i]).FNo;
- et := PIndex(List[i]).FNo;
- end;
- r := Copy(r,0, PIndex(List[i]).FIndexFrom - 1) +
- Format('',
- [FullURL, ParamStart, st, ParamTo, et, ParamNoFirst, ParamTrue]) +
- Copy(r,PIndex(List[i]).FIndexFrom, PIndex(List[i]).FIndexTo - PIndex(List[i]).FIndexFrom) + '' +
- Copy(r,PIndex(List[i]).FIndexTo,Length(r));
- Dispose(PIndex(List[i]));
- end;
- List.Free;
- Result := r;
+ i: Integer;
+ Idx: Integer;
+ Len: Integer;
+ DstTitle: String;
+begin
+ if (Setting.ThreadTitleTrim = True) then begin
+ DstTitle := SrcTitle;
+ for i := Low(TRIM_STRING) to High(TRIM_STRING) do begin
+ Len := Length(TRIM_STRING[i]);
+ while (True) do begin
+ Idx := Pos(TRIM_STRING[i], DstTitle);
+ if (Idx < 1) then
+ Break;
+ Delete(DstTitle, Idx, Len);
+ end;
+ end;
+ Result := Trim(DstTitle);
+ end else begin
+ Result := SrcTitle;
+ end;
end;
-
+{!
+\brief Boolean ð Integer ÉÏ·
+\return False..0, True..1
+}
function TGikoSys.BoolToInt(b: Boolean): Integer;
begin
Result := IfThen(b, 1, 0);
end;
+{!
+\brief Integer ð Boolean ÉÏ·
+\return 1..True, other..False
+\todo 0..False, other..True Ìûª¢¢ÌÅÍ?
+ (±ÌdlÉ˶µÄ¢é©àµêÈ¢ÌÅ¢C³)
+}
function TGikoSys.IntToBool(i: Integer): Boolean;
begin
Result := i = 1;
end;
-//gzipųk³ê½Ìðß·
+{!
+\brief gzipųk³ê½Ìðß·
+\param ResStream ÇÝÞXg[
+\param ContentEncoding GR[fBO
+\return WJ³ê½¶ñ
+}
function TGikoSys.GzipDecompress(ResStream: TStream; ContentEncoding: string): string;
const
BUF_SIZE = 4096;
@@ -1841,7 +1542,7 @@ var
buf: array[0..BUF_SIZE - 1] of Byte;
cnt: Integer;
s: string;
- i: Integer;
+ i, ln: Integer;
begin
Result := '';
TextStream := TStringStream.Create('');
@@ -1874,22 +1575,29 @@ begin
//NULL¶ð"*"É·é
s := TextStream.DataString;
i := Length(s);
+ ln := i;
while (i > 0) and (s[i] = #0) do
Dec(i);
- s := Copy(s, 1, i);
+ Delete(s, i + 1, ln - i);
i := Pos(#0, s);
while i <> 0 do begin
s[i] := '*';
i := Pos(#0, s);
end;
+
Result := s;
finally
TextStream.Free;
end;
end;
-procedure TGikoSys.LoadKeySetting(ActionList: TActionList);
+{!
+\brief ANVÉV[gJbgL[ðÝè
+\param ActionList Ýè·éANVê
+\param FileName Init@C̼O
+}
+procedure TGikoSys.LoadKeySetting(ActionList: TActionList; FileName: String);
const
STD_SEC = 'KeySetting';
var
@@ -1900,10 +1608,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
@@ -1922,67 +1630,21 @@ begin
end;
end;
-procedure TGikoSys.SaveKeySetting(ActionList: TActionList);
-const
- STD_SEC = 'KeySetting';
-var
- i: Integer;
- ini: TMemIniFile;
-begin
- ini := TMemIniFile.Create(GetConfigDir + KEY_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.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 ANVÉÝè³êÄ¢éV[gJbgL[ðt@CÉÛ¶
+\param ActionList Û¶·éANVê
+\param FileName Init@C¼
-procedure TGikoSys.SaveEditorKeySetting(ActionList: TActionList);
+ActionList ÉÝè³êÄ¢éV[gJbgL[ð FileName ÉÛ¶µÜ·B
+}
+procedure TGikoSys.SaveKeySetting(ActionList: TActionList; FileName: String);
const
STD_SEC = 'KeySetting';
var
i: Integer;
ini: TMemIniFile;
begin
- ini := TMemIniFile.Create(GetConfigDir + EKEY_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
@@ -1995,7 +1657,12 @@ begin
end;
end;
-//
+
+{!
+\brief vZX̶¬
+\param AppPath N®·évZXÌt@CpX
+\param Param AppPath Én·ø
+}
procedure TGikoSys.CreateProcess(const AppPath: string; const Param: string);
var
PI: TProcessInformation;
@@ -2014,7 +1681,7 @@ begin
SI.cbReserved2 := 0;
SI.lpReserved2 := nil;
SI.dwysize := 0;
- Windows.CreateProcess(nil,
+ if Windows.CreateProcess(nil,
PChar(Path),
nil,
nil,
@@ -2023,22 +1690,67 @@ begin
nil,
nil,
SI,
- PI);
+ PI) then
+ begin
+ CloseHandle(PI.hProcess);
+ end;
+
end;
+{!
+\brief Web uEUðN®
+\param URL Web uEUÅ\¦·é URL
+\param BrowserType uEUÌ^Cv(IE ©Ç¤©)
+}
procedure TGikoSys.OpenBrowser(URL: string; BrowserType: TGikoBrowserType);
+var
+ i, j : Integer;
+ path, arg : String;
+ params : TStringList;
begin
case BrowserType of
gbtIE:
HlinkNavigateString(nil, PWideChar(WideString(URL)));
gbtUserApp, gbtAuto:
- if (Setting.URLApp) and (FileExists(Setting.URLAppFile)) then
- GikoSys.CreateProcess(Setting.URLAppFile, URL)
- else
+ if (Setting.URLApp) then begin
+ if (FileExists(Setting.URLAppFile)) then begin
+ GikoSys.CreateProcess(Setting.URLAppFile, URL)
+ end else begin
+ // N®p[^t«Îô
+ path := '';
+ params := TStringList.Create;
+ try
+ params.Delimiter := ' ';
+ params.DelimitedText := Setting.URLAppFile;
+ for i := 0 to params.Count - 1 do begin
+ path := TrimLeft(path + ' ' + params[i]);
+ if (FileExists(path)) then begin
+ arg := '';
+ for j := i + 1 to params.Count - 1 do begin
+ arg := arg + ' ' + params[j];
+ end;
+ break;
+ end;
+ end;
+ if i < params.Count then begin
+ GikoSys.CreateProcess(path, arg + ' ' + URL);
+ end else begin
+ HlinkNavigateString(nil, PWideChar(WideString(URL)));
+ end;
+ finally
+ params.Free;
+ end;
+ end;
+ end else
HlinkNavigateString(nil, PWideChar(WideString(URL)));
end;
end;
+{!
+\brief ¶ÀÌQÆðfR[h
+\param AStr fR[h·é¶ñ
+\return fR[h³ê½¶ñ
+}
function TGikoSys.HTMLDecode(const AStr: String): String;
var
Sp, Rp, Cp, Tp: PChar;
@@ -2111,6 +1823,11 @@ begin
SetLength(Result, Rp - PChar(Result));
end;
+{!
+\brief HTML ÌAJ[^O©ç URL ðæ¾
+\param s URL ðæ¾·é HTML
+\return æ¾µ½ URL
+}
function TGikoSys.GetHRefText(s: string): string;
var
Index: Integer;
@@ -2154,10 +1871,14 @@ begin
Result := Trim(s);
end;
-//zXg¼ªQ©Ç¤©`FbN·é
+{!
+\brief zXg¼ªQ©Ç¤©`FbN·é
+\param Host `FbN·ézXg¼
+\return 2¿áñËéÌzXg¼Èç True
+}
function TGikoSys.Is2chHost(Host: string): Boolean;
const
- HOST_NAME: array[0..1] of string = ('2ch.net', 'bbspink.com');
+ HOST_NAME: array[0..1] of string = ('.2ch.net', '.bbspink.com');
var
i: Integer;
// Len: Integer;
@@ -2176,6 +1897,15 @@ begin
end;
end;
+{!
+\brief 2¿áñËé`®Ì URL ðªð
+\param url 2¿áñËé`®Ì URL
+\param path test/read.cgi ÈÇÌÔpX(ParseURI ©ç¾é)
+\param document index.html ÈÇÌhL
g¼(ParseURI ©ç¾é)
+\param BBSID OUT:BBSID ªÔé(ex. giko)
+\param BBSKey OUT:XbhL[ªÔé(ex. 10000000000)
+\return 2¿áñËéÌ URL ƵĪðÅ«½Èç True
+}
function TGikoSys.Parse2chURL(const url: string; const path: string; const document: string; var BBSID: string; var BBSKey: string): Boolean;
var
Index: Integer;
@@ -2189,7 +1919,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);
@@ -2228,85 +1964,104 @@ begin
end;
end;
end;
+
+{!
+\brief 2ch `®Ì URL ©çXÔðæ¾
+\param URL 2¿áñËé`®Ì URL
+\param stRes OUT:JnXÔªÔé
+\param endRes OUT:I¹XÔªÔé
+
+http://2ch.net/ª/32-50 \n
+Ìê stRef = 32, endRes = 50 ÉÈé
+}
procedure TGikoSys.GetPopupResNumber(URL : string; var stRes, endRes : Int64);
+const
+ START_NAME : array[0..1] of String = ('st=', 'start=');
+ END_NAME : array[0..1] of String = ('to=', 'end=');
+ RES_NAME : array[0..0] of String = ('res=');
var
buf : String;
convBuf : String;
ps : Int64;
pch : PChar;
+ bufList : TStringList;
+ i, j, idx : Integer;
begin
URL := Trim(LowerCase(URL));
- if (AnsiPos('&st=', URL ) <> 0) and ( AnsiPos( '&to=',URL) <> 0 ) then begin
- stRes := 0;
- endRes := 0;
- try
- buf := Copy( URL, AnsiPos('&st=', URL ) + 4, AnsiPos( '&to=',URL) - AnsiPos('&st=', URL ) - 4 );
- if buf <> '' then
- stRes := StrToInt64( buf );
- if AnsiPos( '&nofirst=',URL) <> 0 then begin
- buf := Copy( URL, AnsiPos('&to=', URL ) + 4, AnsiPos( '&nofirst=',URL) - AnsiPos('&to=', URL ) - 4);
- end else begin
- buf := Copy( URL, AnsiPos('&to=', URL ) + 4, Length( URL ) - AnsiPos('&to=', URL ) - 4 + 1 );
- ps := 0;
- pch := PChar(buf);
- while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
- buf := Copy( buf, 1, ps );
- end;
- try
- if buf <> '' then
- endRes := StrToInt64(buf)
- except
- endRes := 0;
- end;
- except
- stRes := 0;
- end;
- if (stRes <> 0) and (endRes = 0) then
- endRes := stRes + MAX_POPUP_RES
- else if (stRes = 0) and (endRes <> 0) then begin
- stRes := endRes - MAX_POPUP_RES;
- if stRes < 1 then
- stRes := 1;
- end;
- GikoSys.GetBrowsableThreadURL( URL );
- end else if( AnsiPos('&res=', URL ) <> 0 ) then begin
- endRes := 0;
- buf := Copy( URL, AnsiPos('&res=', URL ) + 5, Length( URL ) - AnsiPos('&res=', URL ) - 5 + 1 );
- ps := 0;
- pch := PChar(buf);
- while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
- buf := Copy( buf, 1, ps );
- try
- if buf <> '' then
- stRes := StrToInt(buf)
- else begin
- stRes := 0;
- end;
- except
- stRes := 0;
- end;
- end else if (AnsiPos('&start=', URL ) <> 0) and ( AnsiPos( '&end=',URL) <> 0 ) then begin
- try
- 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
- buf := Copy( URL, AnsiPos('&end=', URL ) + 5, Length( URL ) - AnsiPos('&to=', URL ) - 5 + 1 );
- ps := 0;
- pch := PChar(buf);
- while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
- buf := Copy( buf, 1, ps );
- end;
- try
- if buf <> '' then
- endRes := StrToInt64(buf);
- except
- endRes := 0;
- end;
- except
- stRes := 0;
- end;
- end else if ( AnsiPos('.html',URL) <> Length(URL) -4 ) and ( AnsiPos('.htm',URL) <> Length(URL) -3 ) then begin
+ for i := 0 to Length(START_NAME) -1 do begin
+ idx := AnsiPos(START_NAME[i], URL);
+ if (idx <> 0) then begin
+ break;
+ end;
+ idx := AnsiPos(END_NAME[i], URL);
+ if (idx <> 0) then begin
+ break;
+ end;
+
+ end;
+
+ if (idx <> 0) then begin
+ idx := AnsiPos('?', URL);
+ if (idx = 0) then begin
+ idx := LastDelimiter('/', URL);
+ end;
+ stRes := 0;
+ endRes := 0;
+ bufList := TStringList.Create();
+ try
+ bufList.Delimiter := '&';
+ bufList.DelimitedText := Copy(URL, idx + 1, Length(URL));
+ for i := 0 to bufList.Count - 1 do begin
+ convBuf := '';
+ // JnXÔÌõ
+ if (stRes = 0) then begin
+ for j := 0 to Length(START_NAME) - 1 do begin
+ idx := AnsiPos(START_NAME[j], bufList[i]);
+ if (idx = 1) then begin
+ convBuf := Copy(bufList[i], idx + Length(START_NAME[j]), Length(bufList[i]));
+ stRes := StrToInt64Def( convBuf, 0 );
+ break;
+ end;
+ end;
+ end;
+ // I¹XÔÌõ
+ if (convBuf = '') and (endRes = 0) then begin
+ for j := 0 to Length(END_NAME) - 1 do begin
+ idx := AnsiPos(END_NAME[j], bufList[i]);
+ if (idx = 1) then begin
+ convBuf := Copy(bufList[i], idx + Length(END_NAME[j]), Length(bufList[i]));
+ endRes := StrToInt64Def( convBuf, 0 );
+ break;
+ end;
+ end;
+ end;
+ // XÔÌõ
+ if ((stRes = 0) and (endRes = 0) and (convBuf = '')) then begin
+ for j := 0 to Length(RES_NAME) - 1 do begin
+ idx := AnsiPos(RES_NAME[j], bufList[i]);
+ if (idx = 1) then begin
+ convBuf := Copy(bufList[i], idx + Length(RES_NAME[j]), Length(bufList[i]));
+ stRes := StrToInt64Def( convBuf, 0 );
+ endRes := stRes;
+ break;
+ end;
+ end;
+ end;
+ end;
+
+ if (stRes <> 0) and (endRes = 0) then begin
+ endRes := stRes + MAX_POPUP_RES;
+ end else if (stRes = 0) and (endRes <> 0) then begin
+ stRes := endRes - MAX_POPUP_RES;
+ if stRes < 1 then begin
+ stRes := 1;
+ end;
+ end;
+ finally
+ bufList.clear;
+ bufList.free;
+ end;
+ end else if ( AnsiPos('.html',URL) <> Length(URL) -4 ) and ( AnsiPos('.htm',URL) <> Length(URL) -3 ) then begin
buf := Copy(URL, LastDelimiter('/',URL)+1,Length(URL)-LastDelimiter('/',URL)+1);
if Length(buf) > 0 then begin
if AnsiPos('-', buf) = 1 then begin
@@ -2315,15 +2070,10 @@ begin
ps := 0;
pch := PChar(buf);
while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
- try
- convBuf := Copy( buf, 1, ps );
- if convBuf <> '' then
- endRes := StrToInt64(convBuf)
- else
- endRes := 0;
- except
- endRes := 0;
- end;
+ convBuf := Copy( buf, 1, ps );
+ if convBuf <> '' then begin
+ endRes := StrToInt64Def(convBuf, 0);
+ end;
if endRes <> 0 then begin
stRes := endRes - MAX_POPUP_RES;
if stRes < 1 then
@@ -2341,15 +2091,10 @@ begin
ps := 0;
pch := PChar(buf);
while ( ps < Length(buf) )and ( pch[ps] >= '0' ) and ( pch[ps] <= '9' ) do Inc(ps);
- try
- convBuf := Copy( buf, 1, ps );
- if convBuf <> '' then
- endRes := StrToInt64(convBuf)
- else
- endRes := 0;
- except
- endRes := 0;
- end;
+ convBuf := Copy( buf, 1, ps );
+ if convBuf <> '' then begin
+ endRes := StrToInt64Def(convBuf, 0);
+ end;
end else begin
stRes := 0;
end;
@@ -2359,12 +2104,14 @@ begin
end;
end;
end;
- end else begin
- //stRes := 0;
- //endRes := 0;
end;
end;
+{!
+\brief 2¿áñËé`®Ì URL ðªð
+\param URL 2¿áñËé`®Ì URL
+\return ªð³ê½vf
+}
function TGikoSys.Parse2chURL2(URL: string): TPathRec;
var
i: Integer;
@@ -2403,7 +2150,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));
@@ -2594,6 +2341,16 @@ begin
end;
end;
+{!
+\brief URI ðªð
+\param URL ªð·é URI
+\param Protocol OUT:vgRªÔé(ex. http)
+\param Host OUT:zXgªÔé(ex. hoge.com)
+\param Path OUT:ÔpXªÔé(ex. test/read.cgi)
+\param Document OUT:hL
g¼ªÔé(ex. index.html)
+\param Port OUT:|[gªÔé(ex. 8080)
+\param Bookmark OUT:ubN}[N(?)ªÔé
+}
procedure TGikoSys.ParseURI(const URL : string; var Protocol, Host, Path, Document, Port, Bookmark: string);
var
URI: TIdURI;
@@ -2617,6 +2374,10 @@ begin
end;
end;
+{!
+\brief MRirÌo[Wðæ¾
+\return o[W̺ 2
(dwFileVersionLS)
+}
function TGikoSys.GetVersionBuild: Integer;
var
FixedFileInfo: PVSFixedFileInfo;
@@ -2640,6 +2401,23 @@ begin
end;
end;
+{!
+\brief Xbh URL ̳K»
+\param inURL ³K»·éXbh URL
+\return ³K»³ê½Xbh URL
+
+Xbh URL ðMRirÌÅêÓÈàÌɳK»µÜ·B
+êÓÈ URL É·éÅAURL ©çXbhð±«o·ìÆðÅK»µÜ·B\n
+³K»ÌûjƵÄATCgª§·éftHgÌ URL ÉÈéæ¤ÉSª¯Ü·B
+(1-1000 Ìæ¤È×ð©¯éàÌÉ͵Ȣ±Æ)
+
+á(³K»O):\n
+http://ª/ \n
+http://ª/20-100
+
+(³K»ã):\n
+http://ª/l50
+}
function TGikoSys.GetBrowsableThreadURL(
inURL : string
) : string;
@@ -2676,6 +2454,11 @@ begin
end;
+{!
+\brief Xbh URL ð URL ÉÏ·
+\param inURL Xbh URL
+\return  URL
+}
function TGikoSys.GetThreadURL2BoardURL(
inURL : string
) : string;
@@ -2710,6 +2493,12 @@ begin
end;
+{!
+\brief 2chp:Xbh URL ð URL ÉÏ·
+\param inURL Xbh URL
+\return  URL
+\see TGikoSys.GetThreadURL2BoardURL
+}
function TGikoSys.Get2chThreadURL2BoardURL(
inURL : string
) : string;
@@ -2730,6 +2519,12 @@ begin
end;
+{!
+\brief 2chp:Xbh URL ̳K»
+\param inURL ³K»·éXbh URL
+\return ³K»³ê½Xbh URL
+\see TGikoSys.GetBrowsableThreadURL
+}
function TGikoSys.Get2chBrowsableThreadURL(
inURL : string
) : string;
@@ -2761,6 +2556,12 @@ begin
end;
+{!
+\brief 2chp: URL ©çXbh URL ðì¬
+\param inBoard  URL
+\param inKey XbhL[(ex. 1000000000)
+\return Xbh URL
+}
function TGikoSys.Get2chBoard2ThreadURL(
inBoard : TBoard;
inKey : string
@@ -2778,14 +2579,16 @@ begin
end;
-(*************************************************************************
- *@\¼@@F{[ht@Cñ
- *Â@@@FPublic
- *************************************************************************)
+{!
+\brief {[ht@Cñ
+
+ñ³ê½ BBS({[h) Í BBSs ÉüèÜ·B
+}
procedure TGikoSys.ListBoardFile;
var
boardFileList : TStringList;
- i, l, k : Integer;
+ i, l : Integer;
+ sCategory : TCategory;
begin
// BBS ÌJú
try
@@ -2816,13 +2619,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 ] ), '' );
@@ -2832,11 +2631,26 @@ begin
BoardFileList.Free;
end;
end;
-end;
-(*************************************************************************
- *@\¼@@F{[ht@CÇÝÝ
- *Â@@@FPublic
- *************************************************************************)
+
+ // ÁêprBBS¶¬
+ // ùɶݷéêÍí·é
+ DestorySpecialBBS(BoardGroup.SpecialBBS);
+ SpecialBBS := TBBS.Create('');
+ SpecialBBS.Title := 'Áêpr(ñ\¦)';
+ sCategory := TCategory.Create;
+ sCategory.No := 1;
+ sCategory.Title := 'Áêpr(ñ\¦)';
+ SpecialBBS.Add(sCategory);
+ BoardGroup.SpecialBoard := TSpecialBoard.Create(nil, 'http://localhost/gikonavi/special/index.html');
+ BoardGroup.SpecialBoard.Title := '^uê';
+ BoardGroup.SpecialBoard.IsThreadDatRead := True;
+ sCategory.Add(BoardGroup.SpecialBoard);
+end;
+
+{!
+\brief {[ht@CÇÝÝ
+\param bbs {[ht@CðÇÝÞ BBS
+}
procedure TGikoSys.ReadBoardFile( bbs : TBBS );
var
// idx : Integer;
@@ -2975,6 +2789,10 @@ begin
end;
+{!
+\brief ¼Ìªs¾ÈJeS̶¬
+\return ¶¬³ê½JeS
+}
function TGikoSys.GetUnknownCategory : TCategory;
const
UNKNOWN_CATEGORY = '(¼Ìs¾)';
@@ -2994,6 +2812,10 @@ begin
end;
+{!
+\brief ¼Ìªs¾È BBS ̶¬
+\return ¶¬³ê½ BBS
+}
function TGikoSys.GetUnknownBoard( inPlugIn : TBoardPlugIn; inURL : string ) : TBoard;
var
category : TCategory;
@@ -3014,60 +2836,77 @@ begin
end;
end;
+
+//! Samba.ini
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;
-function TGikoSys.GetSameIDResAnchor(const AID : string; ThreadItem: TThreadItem; limited: boolean):string;
+{!
+\brief ñ³ê½XÔÖÌAJ[pHTMLì¬
+\param Numbers ñ³ê½XÔ
+\param ThreadItem ñ·éXbh
+\param limited ñ·éð§À·éÈç1Èã
+\return ñ³ê½XAJ[
+}
+function TGikoSys.CreateResAnchor(
+ 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;
+ // bodyÈOÍgpµÈ¢ÌÅú»µÈ¢
+ Res.FBody := '';
+ Res.FType := glt2chNew;
+
+ 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;
- finally
- body.Free;
end;
- Result := HTMLCreater.ConvRes(Result, ThreadItem.ParentBoard.BBSID, ChangeFileExt(ThreadItem.FileName, ''), 'bbs', 'key', 'st', 'to', 'nofirst', 'true', false);
+ ResLink.FBbs := ThreadItem.ParentBoard.BBSID;
+ ResLink.FKey := ChangeFileExt(ThreadItem.FileName, '');
+ HTMLCreater.ConvRes(@Res, @ResLink, false);
+ Result := Res.FBody;
end;
end;
+
+{!
+\brief ¯¶e ID ðÂXðñ
+\param AID ÂlðÁè·ée ID
+\param ThreadItem ñ·éXbh
+\param body OUT:ñ³ê½XÔªÔé
+}
procedure TGikoSys.GetSameIDRes(const AID : string; ThreadItem: TThreadItem;var body: TStringList);
var
i: integer;
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
@@ -3079,20 +2918,16 @@ begin
for i := 0 to threadItem.Count - 1 do begin
// X
- Res := DivideStrLine(boardPlugIn.GetDat(DWORD( threadItem ), i + 1));
- 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
- Res := DivideStrLine(ReadList[i]);
- 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;
@@ -3100,40 +2935,34 @@ begin
end;
end;
end;
-function TGikoSys.GetSameIDResAnchor(AIDNum : Integer; ThreadItem: TThreadItem; limited: boolean):string;
+
+{!
+\brief ¯¶e ID ðÂXðñ
+\param AIDNum ÂlðÁè·ée ID
+\param ThreadItem ñ·éXbh
+\param body OUT:ñ³ê½XÔªÔé
+}
+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;
-
-procedure TGikoSys.GetSameIDRes(AIDNum : Integer; ThreadItem: TThreadItem;var body: TStringList);
+{!
+\brief e ID æ¾
+\param AIDNum e XÔ
+\param ThreadItem eXbh
+\param body OUT:eID
+}
+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
@@ -3141,85 +2970,51 @@ begin
//===== vOCÉæé\¦
//boardPlugIn := ThreadItem.BoardPlugIn;
boardPlugIn := ThreadItem.ParentBoard.BoardPlugIn;
- Res := DivideStrLine(boardPlugIn.GetDat(DWORD( threadItem ), AIDNum));
+ THTMLCreate.DivideStrLine(boardPlugIn.GetDat(DWORD( threadItem ), AIDNum), @Res);
end else begin
- Res := DivideStrLine( ReadThreadFile(ThreadItem.GetThreadFileName, AIDNum));
- 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)
- end;
- end else begin
- stlist := TStringList.Create;
- try
- stList.DelimitedText := AID;
- AID := '';
- 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];
- break;
- end;
- end;
- finally
- stList.Free;
- end;
+ THTMLCreate.DivideStrLine( ReadThreadFile(ThreadItem.GetThreadFileName, AIDNum), @Res);
end;
- if not IsNoValidID(AID) then
- GetSameIDRes(AID, ThreadItem, body);
+ Result := ExtructResID(Res.FDateTime);
end;
end;
-function TGikoSys.GetSameIDResCount(const AID : string; ThreadItem: TThreadItem):Integer;
+{!
+\brief XÌ©çIDðo·é
+\param ADateStr ̶ñ
+\return ID(IDÆÝȹ骪ȢƫÍó¶ñ)
+}
+function TGikoSys.ExtructResID(ADateStr: String): String;
var
- body: TStringList;
+ stlist : 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;
-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;
-
-function TGikoSys.NotDateorTimeString(const AStr : string): boolean;
-begin
- Result := false;
- try
- StrToDate(AStr);
- except
- try
- StrToTime(AStr);
- Result := false;
- except
- Result := true;
- end;
- end;
-
+ Result := '';
+ if AnsiPos('id', AnsiLowerCase(ADateStr)) > 0 then begin
+ Result := Copy(ADateStr, AnsiPos('id', AnsiLowerCase(ADateStr)), Length(ADateStr));
+ if AnsiPos(' ', Result) > 0 then begin
+ Result := Copy(Result, 1, AnsiPos(' ', Result) - 1);
+ end;
+ Result := ' ' + Result;
+ end else begin
+ stlist := TStringList.Create;
+ try
+ stList.Delimiter := ' ';
+ stList.DelimitedText := ADateStr;
+ // út ID ¼@ÆÅèÅl¦é
+ if (stList.Count >= 3) then begin
+ if Length(stList[3 - 1]) >= 7 then begin
+ Result := stList[3 - 1];
+ end;
+ end;
+ finally
+ stList.Free;
+ end;
+ end;
end;
+{!
+\brief Xp:êðJEg
+\param text ³ÉÈé¶Í
+\param wordCount OUT:JEg³ê½PêÌêªÔé
+}
procedure TGikoSys.SpamCountWord( const text : string; wordCount : TWordCount );
begin
@@ -3228,6 +3023,20 @@ begin
end;
+{!
+\brief Xp:wKÊðúü
+\param wordCount úü·éPêÌê
+\param isSpam wordCount ªXpƵÄwK³êÄ¢½Èç True
+\warning wKÏÝ̶ͩǤ©ÍmFoܹñB\n
+ Learn µÄ¢È¢¶Íâ isSpam ðÔá¦Äwè·éÆ
+ f[^x[Xªj¹µÜ·B\n
+ wKÏݩǤ©ÍÆ©Éǵľ³¢B
+
+SÄÌwKÊðNA·éí¯ÅÍ èܹñB\n
+wordCount 𾽶ÍÌwKÊÌÝNAµÜ·B
+
+åÉXpÆnðØèÖ¦é½ßÉ Forget -> Learn ÌÅgpµÜ·B
+}
procedure TGikoSys.SpamForget( wordCount : TWordCount; isSpam : Boolean );
begin
@@ -3236,6 +3045,11 @@ begin
end;
+{!
+\brief Xp:wK
+\param wordCount wK·éPêÌê
+\param isSpam XpƵÄwK·éÈç True
+}
procedure TGikoSys.SpamLearn( wordCount : TWordCount; isSpam : Boolean );
begin
@@ -3244,6 +3058,12 @@ begin
end;
+{!
+\brief Xp:¶Íðð͵AXpxð¾é
+\param text ³ÉÈé¶Í
+\param wordCount OUT:JEg³ê½PêÌêªÔé(SpamCountWord Ư)
+\return 0`1 ÌXpx
+}
function TGikoSys.SpamParse( const text : string; wordCount : TWordCount ) : Extended;
begin
@@ -3256,9 +3076,17 @@ begin
end;
end;
+
+{!
+\brief [UÝèÌ CSS ð¶¬
+\return ¶¬³ê½ CSS
+
+[c[]j
[-[IvV]-[CSS ÆXL]^uÌ
+[tHgðwè], [wiFðwè] ÉÁ½ CSS 𶬵ܷB
+}
function TGikoSys.SetUserOptionalStyle(): string;
begin
- Result := '';
+ Result := '';
if Length( GikoSys.Setting.BrowserFontName ) > 0 then
Result := 'font-family:"' + GikoSys.Setting.BrowserFontName + '";';
if GikoSys.Setting.BrowserFontSize <> 0 then
@@ -3276,7 +3104,14 @@ begin
1: Result := Result + 'font-style:italic;';
end;
end;
-//øAAIDFÎÛÆÈéútID¶ñAANum:XÔ AURLF»ÌXbhÌURL
+
+{!
+\brief Be vt@CÖÌAJ[^Oð¶¬
+\param AID ÎÛÆÈéútID¶ñ
+\param ANum XÔ
+\param AURL »ÌXbhÌURL
+\return ¶¬³ê½AJ[^O
+}
function TGikoSys.AddBeProfileLink(AID : string; ANum: Integer):string ;
var
p : integer;
@@ -3297,7 +3132,12 @@ begin
end else
Result := AID;
end;
-// o[Wîñðæ¾
+
+{!
+\brief o[Wîñðæ¾
+\param KeyWord æ¾·éÚ
+\return o[W¶ñ
+}
function TGikoSys.GetVersionInfo(KeyWord: TVerResourceKey): string;
const
Translation = '\VarFileInfo\Translation';
@@ -3341,9 +3181,11 @@ begin
end;
end;
end;
-//PluginÌîñÌæ¾
-//Load³ê½SÄÌvOCÌo[WîñðÔ·
-//1s1plugin
+
+{!
+\brief Load ³êÄ¢évOCÌo[Wðñ
+\return 1s1plugin
+}
function TGikoSys.GetPluginsInfo(): String;
var
i : Integer;
@@ -3369,7 +3211,7 @@ begin
end;
-//IEÌo[Wðæ¾·é
+//! IEÌo[Wðæ¾·é
function TGikoSys.GetIEVersion: string;
var
R: TRegistry;
@@ -3390,14 +3232,327 @@ begin
R.Free;
end;
end;
+//! maintH[ÌV[gJbgL[ÌInit@C¼
+function TGikoSys.GetMainKeyFileName : String;
+begin
+ Result := Setting.GetMainKeyFileName;
+end;
+//! EditortH[ÌV[gJbgL[ÌInit@C¼
+function TGikoSys.GetEditorKeyFileName: String;
+begin
+ Result := Setting.GetEditorKeyFileName;
+end;
+//! üÍAVXgÌÝèt@C¼
+function TGikoSys.GetInputAssistFileName: String;
+begin
+ Result := Setting.GetInputAssistFileName;
+end;
+//! MRirÌbZ[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;
+//! MRirÌbZ[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©çÚ®
+//! éZp[^ÅæØç꽶ñ©çÔÚ̶ñðæè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¹pTmpt@CXg
+ GetFileList(Boardpath, '*.tmp', TmpFileList, False);
+ TmpFileList.EndUpdate;
+ //OñÙíI¹`FbN
+ 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ÌøpiÝè³êĢȢêÍ'>')
+}
+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;
+//! vr
[g£ÌÝèt@Cæ¾
+function TGikoSys.GetExtpreviewFileName: String;
+begin
+ Result := Setting.GetExtprevieFileName;
+end;
+
+//! t@C¼©çÌXbhì¬úÌæ¾
+function TGikoSys.GetCreateDateFromName(FileName: String): TDateTime;
+var
+ tmp : String;
+ unixtime: Int64;
+begin
+ // Ot@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;
+function TGikoSys.GetBoukenCookie(AURL: String): String;
+var
+ Protocol, Host, Path, Document, Port,Bookmark : String;
+begin
+ Result := '';
+ GikoSys.ParseURI(AURL, Protocol, Host, Path, Document, Port,Bookmark);
+ if ( Length(Host) > 0 ) then begin
+ Result := Setting.GetBoukenCookie(Host);
+ end;
+end;
+procedure TGikoSys.SetBoukenCookie(ACookieValue, ADomain: String);
+begin
+ if ( Length(ADomain) > 0 ) then begin
+ Setting.SetBoukenCookie(ACookieValue, ADomain);
+ end;
+end;
+//! `¯ÌDomainêæ¾
+procedure TGikoSys.GetBoukenDomain(var ADomain: TStringList);
+var
+ i : Integer;
+begin
+ ADomain.Clear;
+ for i := 0 to Setting.BoukenCookieList.Count - 1 do begin
+ ADomain.Add( Setting.BoukenCookieList.Names[i] );
+ end;
+end;
+//! `¯ÌCookieí
+procedure TGikoSys.DelBoukenCookie(ADomain: String);
+var
+ i : Integer;
+begin
+ for i := 0 to Setting.BoukenCookieList.Count - 1 do begin
+ if ( Setting.BoukenCookieList.Names[i] = ADomain ) then begin
+ Setting.BoukenCookieList.Delete(i);
+ Break;
+ end;
+ end;
+end;
+function TGikoSys.GetBouken(AURL: String; var Domain: String): String;
+var
+ Protocol, Host, Path, Document, Port,Bookmark : String;
+ Cookie : String;
+begin
+ Domain := '';
+ Cookie := '';
+ GikoSys.ParseURI(AURL, Protocol, Host, Path, Document, Port,Bookmark);
+ if ( Length(Host) > 0 ) then begin
+ Setting.GetBouken(Host, Domain, Cookie);
+ Result := Cookie;
+ end;
+end;
initialization
GikoSys := TGikoSys.Create;
finalization
if GikoSys <> nil then begin
- GikoSys.Free;
- GikoSys := nil;
+ FreeAndNil(GikoSys);
end;
end.