X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=ExternalBoardManager.pas;h=a298e4b48170028e463db878aad19b8a8a16a1a5;hb=20bba43133ed0b8e5115bba320604c704d1bdd5c;hp=f4fb737a4098dd9e91c16b7199914219e491b9ce;hpb=3ae9fd779f93b6ab45af51df5b5f17e5baaac9d6;p=gikonavigoeson%2Fgikonavi.git diff --git a/ExternalBoardManager.pas b/ExternalBoardManager.pas index f4fb737..a298e4b 100644 --- a/ExternalBoardManager.pas +++ b/ExternalBoardManager.pas @@ -4,389 +4,676 @@ interface uses Windows, Classes, SysUtils, - GikoSystem, BoardGroup, AbonUnit; + IdHTTP, IdComponent, IdGlobal, IdException, + ExternalBoardPlugInMain, ExternalFilePath, ExternalThreadItem, ExternalBoardItem; type - // TThreadItem ÌvpeBÝè^æ¾ ID - TThreadItemProperty = ( - tipContext, // : DWORD // ©RÉÝèµÄ¢¢l - tipNo, // : Integer // Ô - tipFileName, // : string // Xbht@C¼ - tipTitle, // : string // Xbh^Cg - tipRoundDate, // : TDateTime // Xbhðæ¾µ½úiñúj - tipLastModified, // : TDateTime // XbhªXV³êÄ¢éúiT[o¤új - tipCount, // : Integer // XbhJEgi[Jj - tipAllResCount, // : Integer // XbhJEgiT[oj - tipNewResCount, // : Integer // XbhV - tipSize, // : Integer // XbhTCY - tipRound, // : Boolean // ñtO - tipRoundName, // : string // ñ¼ - tipIsLogFile, // : Boolean // O¶ÝtO - tipKokomade, // : Integer // RRÜÅÇñ¾Ô - tipNewReceive, // : Integer // RR©çVKóM - tipNewArrival, // : Boolean // V - tipUnRead, // : Boolean // ¢ÇtO - tipScrollTop, // : Integer // XN[Êu - tipDownloadHost, // : string // ¡ÌzXgÆá¤êÌzXg - tipAgeSage, // : TThreadAgeSage // ACeÌã°º° - tipURL // : string // XbhðuEUÅ\¦·éÛÌ URL - ); + // ========================================================================= + // vOCðÇ·é TBoardPlugin NX + // ========================================================================= + TBoardPlugIn = class( TObject ) + private + FFilePath : string; // vOCð¦·pX + FModule : HMODULE; // vOCÌW [nh + + FLoad : TOnLoad; + FVersionInfo : TOnVersionInfo; + FAcceptURL : TOnAcceptURL; + FExtractBoardURL : TOnExtractBoardURL; + FPlugInMenu : TOnPlugInMenu; + + FCreateThreadItem : TThreadItemCreate; + FDisposeThreadItem : TThreadItemDispose; + FDownloadThread : TThreadItemOnDownload; + FWriteThread : TThreadItemOnWrite; + FGetRes : TThreadItemOnGetRes; + FGetDat : TThreadItemOnGetDat; + FGetHeader : TThreadItemOnGetHeader; + FGetFooter : TThreadItemOnGetFooter; + FGetBoardURL : TThreadItemOnGetBoardURL; + + FCreateBoardItem : TBoardItemCreate; + FDisposeBoardItem : TBoardItemDispose; + FDownloadBoard : TBoardItemOnDownload; + FCreateThread : TBoardItemOnCreateThread; + FEnumThread : TBoardItemOnEnumThread; + FFileName2ThreadURL : TBoardItemOnFileName2ThreadURL; + + public + // RXgN^ + constructor Create; + // vOCÌpXðwèµÄì¬ + constructor CreateFromPath( inPath : string ); + // vOC¼ðwèµÄì¬ + constructor CreateFromName( inName : string ); + // W [nhðwèµÄì¬ + constructor CreateFromModule( inModule : HMODULE ); + // fXgN^ + destructor Destroy; override; + + // vOCÌpXðwèµÄ[h + procedure LoadFromPath( inPath : string ); + // vOC¼ðwèµÄ[h + procedure LoadFromName( inName : string ); + // W [nhðwèµÄ[h + procedure LoadFromModule( inModule : HMODULE ); + + //===== PlugInMain ÖA + // vOCª(³µ)[h³ê½ + procedure Loaded; + // o[Wîñ + procedure VersionInfo( var outAgent : string; + var outMajor : DWORD; var outMinor : DWORD; + var outRelease : string; var outRevision : DWORD ); + // wèµ½ URL ð±ÌvOCÅó¯t¯é©Ç¤© + function AcceptURL( inURL : string ) : TAcceptType; + // URL©çg¦éBoardÌURLð±«o· + function ExtractBoardURL( inURL : string ): string; + // j [nh + procedure PlugInMenu( inHandle : HMENU ); + + //===== TThreadItem ÖA + // TThreadItem ª¶¬³ê½ + procedure CreateThreadItem( threadItem : DWORD ); + // TThreadItem ªjü³ê½ + procedure DisposeThreadItem( threadItem : DWORD ); + // _E[hðw¦ + function DownloadThread( threadItem : DWORD ) : TDownloadState; + // «Ýðw¦ + function WriteThread( threadItem : DWORD; inName : string; inMail : string; inMessage : string ) : TDownloadState; + // XÔ n Éηé html ðv + function GetRes( threadItem : DWORD; inNo : DWORD ) : string; + // XÔ n Éηé Dat ðv + function GetDat( threadItem : DWORD; inNo : DWORD ) : string; + // XbhÌwb_ html ðv + function GetHeader( threadItem : DWORD; inOptionalHeader : string ) : string; + // XbhÌtb^ html ðv + function GetFooter( threadItem : DWORD; inOptionalFooter : string ) : string; + // ±Ì ThreadItem ª®·éÂÌ URL ðv + function GetBoardURL( threadItem : DWORD ) : string; + + //===== TBoardItem ÖA + // TBoard ª¶¬³ê½ + procedure CreateBoardItem( boardItem : DWORD ); + // TBoardItem ªjü³ê½ + procedure DisposeBoardItem( boardItem : DWORD ); + // _E[hðw¦ + function DownloadBoard( boardItem : DWORD ) : TDownloadState; + // X§Äðw¦ + function CreateThread( boardItem : DWORD; inSubject : string; inName : string; inMail : string; inMessage : string ) : TDownloadState; + // ±ÌÂÉÛLµÄ¢éXðñ + procedure EnumThread( boardItem : DWORD; inCallBack : TBoardItemEnumThreadCallBack ); + // t@C¼©çXbhÌ URL ðv + function FileName2ThreadURL( boardItem : DWORD; inFileName : string ) : string; + + private + procedure LoadPlugInAPI; + + public + property FilePath : string read FFilePath; + property Module : HMODULE read FModule; + end; + +var + OnWork : TWorkEvent; + OnWorkBegin : TWorkBeginEvent; + OnWorkEnd : TWorkEndEvent; + + BoardPlugIns : array of TBoardPlugIn; + +procedure InitializeBoardPlugIns; implementation -// ßèlª PChar Å é API ÌðmÛ·é -function CreateResultString( - resultStr : string -) : PChar; stdcall; +uses GikoSystem, BoardGroup; + +// ************************************************************************* +// BoardPlugin tH_É évOCðSÄ[h +// ************************************************************************* +procedure InitializeBoardPlugIns; var - tmp : PChar; + i, bound : Integer; + pluginNames : TStringList; begin - tmp := PChar( resultStr ); - GetMem( Result, Length( resultStr ) + 1 ); - Move( tmp, Result, Length( resultStr ) + 1 ); + pluginNames := TStringList.Create; + try + //GikoSys.GetFileList( GikoSys.Setting.GetBoardPlugInDir, '*', pluginNames, False, False ); + pluginNames.BeginUpdate; + GikoSys.GetFileList( GikoSys.Setting.GetBoardPlugInDir, '*.dll', pluginNames, False ); + pluginNames.EndUpdate; + SetLength( BoardPlugIns, pluginNames.Count ); + // + SetLength( BoardGroups, pluginNames.Count + 1 ); + BoardGroups[0] := TBoardGroup.Create; + BoardGroups[0].Sorted := true; + BoardGroups[0].BoardPlugIn := nil; + // + bound := pluginNames.Count - 1; + for i := 0 to bound do begin + try + BoardPlugIns[ i ] := TBoardPlugIn.CreateFromName( pluginNames.Strings[ i ] ); + BoardPlugIns[ i ].Loaded; + BoardGroups[ i + 1 ] := TBoardGroup.Create; + BoardGroups[ i + 1 ].Sorted := True; + BoardGroups[ i + 1 ].BoardPlugIn := BoardPlugIns[ i ]; + except end; + end; + finally + pluginNames.Free; + end; end; -// ßèlª PChar Å é API ÌðJú·é -procedure DisposeResultString( - resultStr : PChar -); stdcall; + + +// ========================================================================= +// vOCðÇ·é TBoardPlugin NX +// ========================================================================= + +// ************************************************************************* +// RXgN^ +// ************************************************************************* +constructor TBoardPlugIn.Create; begin - FreeMem( resultStr ); + inherited; + + FLoad := nil; + FVersionInfo := nil; + FAcceptURL := nil; + FExtractBoardURL := nil; + FPlugInMenu := nil; + + FCreateThreadItem := nil; + FDisposeThreadItem := nil; + FDownloadThread := nil; + FWriteThread := nil; + FGetRes := nil; + FGetDat := nil; + FGetHeader := nil; + FGetFooter := nil; + + FCreateBoardItem := nil; + FDisposeBoardItem := nil; + FDownloadBoard := nil; + FCreateThread := nil; + FEnumThread := nil; + FFileName2ThreadURL := nil; end; -function ApplicationFolder : PChar; stdcall; +// ************************************************************************* +// vOCÌpXðwèµÄì¬ +// ************************************************************************* +constructor TBoardPlugIn.CreateFromPath( + inPath : string +); begin - Result := CreateResultString( GikoSys.GetAppDir ); + Create; + + LoadFromPath( inPath ); end; -function PreferencesFolder : PChar; stdcall; +// ************************************************************************* +// vOC¼ðwèµÄì¬ +// ************************************************************************* +constructor TBoardPlugIn.CreateFromName( + inName : string +); begin - Result := CreateResultString( GikoSys.GetConfigDir ); + Create; + + LoadFromName( inName ); end; -function PreferencesFile : PChar; stdcall; +// ************************************************************************* +// W [nhðwèµÄì¬ +// ************************************************************************* +constructor TBoardPlugIn.CreateFromModule( + inModule : HMODULE +); begin - Result := CreateResultString( GikoSys.GetAppDir + 'gikoNavi.ini' ); + inherited Create; + + LoadFromModule( inModule ); end; -function LogFolder : PChar; stdcall; +// ************************************************************************* +// fXgN^ +// ************************************************************************* +destructor TBoardPlugIn.Destroy; begin - Result := CreateResultString( GikoSys.GetAppDir + 'Log\' ); + FreeLibrary( FModule ); + + inherited; end; -function CSSFolder : PChar; stdcall; +// ************************************************************************* +// vOCÌpXðwèµÄ[h +// ************************************************************************* +procedure TBoardPlugIn.LoadFromPath( + inPath : string +); begin - Result := CreateResultString( GikoSys.GetStyleSheetDir ); + FFilePath := inPath; + if FileExists( inPath ) then + FModule := LoadLibrary( PChar( inPath ) ) + else if FileExists( inPath + '.dll' ) then + FModule := LoadLibrary( PChar( inPath + '.dll' ) ); + + LoadPlugInAPI; end; -function SkinFolder : PChar; stdcall; +// ************************************************************************* +// vOC¼ðwèµÄ[h +// ************************************************************************* +procedure TBoardPlugIn.LoadFromName( + inName : string +); begin - Result := CreateResultString( GikoSys.GetSkinDir ); + LoadFromPath( GikoSys.Setting.GetBoardPlugInDir + inName ); end; -function SkinFile : PChar; stdcall; +// ************************************************************************* +// W [nhðwèµÄ[h +// ************************************************************************* +procedure TBoardPlugIn.LoadFromModule( + inModule : HMODULE +); +var + tmp : array [0..MAX_PATH] of Char; begin - Result := CreateResultString( GikoSys.Setting.CSSFileName ); + GetModuleFileName( inModule, tmp, SizeOf( tmp ) ); + FFilePath := tmp; + FModule := inModule; + + LoadPlugInAPI; end; -// wèµ½ URL ð_E[hµÄÔ· -function InternalDownload( - inURL : PChar // _E[h·é URL -) : PChar; stdcall; // _E[h³ê½¶ñ +// ************************************************************************* +// vOCª(³µ)[h³ê½ +// ************************************************************************* +procedure TBoardPlugIn.Loaded; begin + + if Assigned( FLoad ) then + FLoad( DWORD( Self ) ); + end; -// Q¿áñËéÌ dat `®ð[J Ú`ñÉÊ· -function InternalAbon( - inDatText : PChar // ¼O<>[<>útID<>{¶<>[üs] Å\¬³ê½eLXg -) : PChar; stdcall; // Ú`ñÏÝÌ dat `®eLXg +// ************************************************************************* +// o[Wîñ +// ************************************************************************* +procedure TBoardPlugIn.VersionInfo( + var outAgent : string; // o[WðêØÜÜÈ¢È¼Ì + var outMajor : DWORD; // W[o[W + var outMinor : DWORD; // }Ci[o[W + var outRelease : string; // [XiK¼ + var outRevision : DWORD // rWio[ +); var - datList : TStringList; - dat : PChar; + agent : PChar; + release : PChar; begin - datList := TStringList.Create; - datList.Text := string( inDatText ); - //GikoSys.FAbon.IndividualAbon( datList, ChangeFileExt(FileName,'.NG')); - GikoSys.FAbon.Execute( datList ); - GikoSys.FSelectResFilter.Execute( datList ); - - Result := CreateResultString( datList.Text ); + if Assigned( FVersionInfo ) then begin + FVersionInfo( agent, outMajor, outMinor, release, outRevision ); + outAgent := string( agent ); + outRelease := string( release ); + DisposeResultString( agent ); + DisposeResultString( release ); + end; end; -// Q¿áñËéÌ dat `® 1 sðXLÉÊ· -function InternalSkin( - inDatRes : PChar; // ¼O<>[<>útID<>{¶<> Å\¬³ê½eLXg - inResNo : DWORD; // XÔ - inIsNew : Boolean // V XÈç True -) : PChar; stdcall; // ®`³ê½ HTML +// ************************************************************************* +// wèµ½ URL ð±ÌvOCÅó¯t¯é©Ç¤© +// ************************************************************************* +function TBoardPlugIn.AcceptURL( + inURL : string +) : TAcceptType; +begin + + if Assigned( FAcceptURL ) then + Result := FAcceptURL( PChar( inURL ) ) + else + Result := atNoAccept; + +end; +// ************************************************************************* +// wèµ½ URL ©çg¦éBoardÌURLð±«o· +// ************************************************************************* +function TBoardPlugIn.ExtractBoardURL( + inURL : string +) : string; var - board : TBoard; - threadItem : TThreadItem; - sTitle : string; - res : TResRec; - no : string; + URL : PChar; +// tmp : string; +begin + Result := inURL; + if Assigned( FExtractBoardURL ) then begin + FExtractBoardURL( PChar(inURL), URL); + Result := string(URL); + DisposeResultString(URL); + end; +end; +// ************************************************************************* +// j [nh +// ************************************************************************* +procedure TBoardPlugIn.PlugInMenu( + inHandle : HMENU // j [nh +); begin - board := TBoard.Create; - threadItem := TThreadItem.Create; - res := GikoSys.DivideStrLine( string( inDatRes ) ); - no := IntToStr( inResNo ); + if Assigned( FPlugInMenu ) then + FPlugInMenu( inHandle ); - try - threadItem.ParentBoard := Board; - - if FileExists( GikoSys.GetSkinHeaderFileName ) then begin - if inIsNew then - Result := CreateResultString( GikoSys.SkinedRes( - GikoSYs.LoadFromSkin( - GikoSys.GetSkinNewResFileName, ThreadItem, sTitle, 0 - ), res, no - ) ) - else - Result := CreateResultString( GikoSys.SkinedRes( - GikoSYs.LoadFromSkin( - GikoSys.GetSkinResFileName, ThreadItem, sTitle, 0 - ), res, no - ) ); - end else begin - if res.FName = '' then - res.FName := ' '; - if res.FMailTo = '' then - Result := CreateResultString( '' - + '
' - + '