OSDN Git Service

1.52.1.658
[gikonavigoeson/gikonavi.git] / ExternalBoardManager.pas
index 92b9f20..cbd4429 100644 (file)
@@ -16,14 +16,18 @@ type
                FFilePath                                               : string;               // \83v\83\89\83O\83C\83\93\82ð\8e¦\82·\83p\83X
                FModule                                                 : HMODULE;      // \83v\83\89\83O\83C\83\93\82Ì\83\82\83W\83\85\81[\83\8b\83n\83\93\83h\83\8b
 
+               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;
@@ -44,6 +48,8 @@ type
                constructor     CreateFromName( inName : string );
                // \83\82\83W\83\85\81[\83\8b\83n\83\93\83h\83\8b\82ð\8ew\92è\82µ\82Ä\8dì\90¬
                constructor     CreateFromModule( inModule : HMODULE );
+               // \83f\83X\83g\83\89\83N\83^
+               destructor      Destroy; override;
 
                // \83v\83\89\83O\83C\83\93\82Ì\83p\83X\82ð\8ew\92è\82µ\82Ä\83\8d\81[\83h
                procedure       LoadFromPath( inPath : string );
@@ -53,12 +59,18 @@ type
                procedure       LoadFromModule( inModule : HMODULE );
 
                //===== PlugInMain \8aÖ\98A
+               // \83v\83\89\83O\83C\83\93\82ª(\90³\82µ\82­)\83\8d\81[\83h\82³\82ê\82½
+               procedure       Loaded;
                // \83o\81[\83W\83\87\83\93\8fî\95ñ
                procedure       VersionInfo(    var outAgent : string;
                        var outMajor : DWORD; var outMinor : DWORD;
                        var outRelease : string; var outRevision : DWORD );
                // \8ew\92è\82µ\82½ URL \82ð\82±\82Ì\83v\83\89\83O\83C\83\93\82Å\8eó\82¯\95t\82¯\82é\82©\82Ç\82¤\82©
                function        AcceptURL( inURL : string ) : TAcceptType;
+        // URL\82©\82ç\8eg\82¦\82éBoard\82ÌURL\82ð\93±\82«\8fo\82·
+        function       ExtractBoardURL( inURL : string ): string;
+               // \83\81\83j\83\85\81[\83n\83\93\83h\83\89
+               procedure       PlugInMenu( inHandle : HMENU );
 
                //===== TThreadItem \8aÖ\98A
                // TThreadItem \82ª\90\90¬\82³\82ê\82½
@@ -71,6 +83,8 @@ type
                function        WriteThread( threadItem : DWORD; inName : string; inMail : string; inMessage : string ) : TDownloadState;
                // \83\8c\83X\94Ô\8d\86 n \82É\91Î\82·\82é html \82ð\97v\8b\81
                function        GetRes( threadItem : DWORD; inNo : DWORD ) : string;
+               // \83\8c\83X\94Ô\8d\86 n \82É\91Î\82·\82é Dat \82ð\97v\8b\81
+               function        GetDat( threadItem : DWORD; inNo : DWORD ) : string;
                // \83X\83\8c\83b\83h\82Ì\83w\83b\83_ html \82ð\97v\8b\81
                function        GetHeader( threadItem : DWORD; inOptionalHeader : string ) : string;
                // \83X\83\8c\83b\83h\82Ì\83t\83b\83^ html \82ð\97v\8b\81
@@ -111,7 +125,7 @@ procedure InitializeBoardPlugIns;
 
 implementation
 
-uses GikoSystem;
+uses GikoSystem, BoardGroup;
 
 // *************************************************************************
 // BoardPlugin \83t\83H\83\8b\83_\82É\82 \82é\83v\83\89\83O\83C\83\93\82ð\91S\82Ä\83\8d\81[\83h
@@ -124,12 +138,27 @@ begin
 
        pluginNames := TStringList.Create;
        try
-               GikoSys.GetFileList( GikoSys.Setting.GetBoardPlugInDir, '*', pluginNames, False, False );
+               //GikoSys.GetFileList( GikoSys.Setting.GetBoardPlugInDir, '*', pluginNames, False, False );
+        pluginNames.BeginUpdate;
+               GikoSys.GetFileList( GikoSys.Setting.GetBoardPlugInDir, '*', 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
-                       BoardPlugIns[ i ] := TBoardPlugIn.CreateFromName( pluginNames.Strings[ i ] );
+               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;
@@ -150,14 +179,18 @@ begin
 
        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;
 
@@ -213,6 +246,18 @@ begin
 end;
 
 // *************************************************************************
+// \83f\83X\83g\83\89\83N\83^
+// *************************************************************************
+destructor     TBoardPlugIn.Destroy;
+begin
+
+       FreeLibrary( FModule );
+
+       inherited;
+
+end;
+
+// *************************************************************************
 // \83v\83\89\83O\83C\83\93\82Ì\83p\83X\82ð\8ew\92è\82µ\82Ä\83\8d\81[\83h
 // *************************************************************************
 procedure TBoardPlugIn.LoadFromPath(
@@ -261,6 +306,17 @@ begin
 end;
 
 // *************************************************************************
+// \83v\83\89\83O\83C\83\93\82ª(\90³\82µ\82­)\83\8d\81[\83h\82³\82ê\82½
+// *************************************************************************
+procedure TBoardPlugIn.Loaded;
+begin
+
+       if Assigned( FLoad ) then
+               FLoad( DWORD( Self ) );
+
+end;
+
+// *************************************************************************
 // \83o\81[\83W\83\87\83\93\8fî\95ñ
 // *************************************************************************
 procedure TBoardPlugIn.VersionInfo(
@@ -299,6 +355,35 @@ begin
                Result := atNoAccept;
 
 end;
+// *************************************************************************
+// \8ew\92è\82µ\82½ URL \82©\82ç\8eg\82¦\82éBoard\82ÌURL\82ð\93±\82«\8fo\82·
+// *************************************************************************
+function       TBoardPlugIn.ExtractBoardURL(
+       inURL : string
+) : string;
+var
+       URL : PChar;
+//    tmp : string;
+begin
+    Result := inURL;
+       if Assigned( FExtractBoardURL ) then begin
+       FExtractBoardURL( PChar(inURL), URL);
+        Result := string(URL);
+        DisposeResultString(URL);
+    end;
+end;
+// *************************************************************************
+// \83\81\83j\83\85\81[\83n\83\93\83h\83\89
+// *************************************************************************
+procedure TBoardPlugIn.PlugInMenu(
+       inHandle : HMENU                                        // \83\81\83j\83\85\81[\83n\83\93\83h\83\8b
+);
+begin
+
+       if Assigned( FPlugInMenu ) then
+               FPlugInMenu( inHandle );
+
+end;
 
 // *************************************************************************
 // TThreadItem \82ª\90\90¬\82³\82ê\82½
@@ -372,8 +457,32 @@ begin
 
        if Assigned( FGetRes ) then begin
                tmp                     := FGetRes( threadItem, inNo );
-               Result  := string( tmp );
-               DisposeResultString( tmp );
+               try
+                       Result  := string( tmp );
+               finally
+                       DisposeResultString( tmp );
+               end;
+       end;
+
+end;
+
+// *************************************************************************
+// \83\8c\83X\94Ô\8d\86 n \82É\91Î\82·\82é Dat \82ð\97v\8b\81
+// *************************************************************************
+function TBoardPlugIn.GetDat(
+       threadItem      : DWORD;                // ThreadItem \82Ì\83C\83\93\83X\83^\83\93\83X
+       inNo                            : DWORD                 // \95\\8e¦\82·\82é\83\8c\83X\94Ô\8d\86
+) : string; // \82Q\82¿\82á\82ñ\82Ë\82é\82Ìdat\8c`\8e®
+var
+       tmp :   PChar;
+begin
+
+       if Assigned( FGetDat ) then begin
+               tmp := FGetDat( threadItem, inNo );
+               try
+                       Result := string( tmp );
+               finally
+                       DisposeResultString(tmp);  end;
        end;
 
 end;
@@ -391,8 +500,11 @@ begin
 
        if Assigned( FGetHeader ) then begin
                tmp                     := FGetHeader( threadItem, PChar( inOptionalHeader ) );
-               Result  := string( tmp );
-               DisposeResultString( tmp );
+               try
+                       Result  := string( tmp );
+               finally
+                       DisposeResultString( tmp );
+               end;
        end;
 
 end;
@@ -535,14 +647,18 @@ begin
 
        try
                if Assigned( Pointer( FModule ) ) then begin
+                       FLoad                                                           := GetProcAddress( FModule, 'OnLoad' );
                        FVersionInfo                            := GetProcAddress( FModule, 'OnVersionInfo' );
                        FAcceptURL                                      := GetProcAddress( FModule, 'OnAcceptURL' );
+            FExtractBoardURL                           := GetProcAddress( FModule, 'OnExtractBoardURL' );
+                       FPlugInMenu                                     := GetProcAddress( FModule, 'OnPlugInMenu' );
 
                        FCreateThreadItem               := GetProcAddress( FModule, 'ThreadItemCreate' );
                        FDisposeThreadItem      := GetProcAddress( FModule, 'ThreadItemDispose' );
                        FDownloadThread                 := GetProcAddress( FModule, 'ThreadItemOnDownload' );
                        FWriteThread                            := GetProcAddress( FModule, 'ThreadItemOnWrite' );
                        FGetRes                                                 := GetProcAddress( FModule, 'ThreadItemOnGetRes' );
+                       FGetDat                                                 := GetProcAddress( FModule, 'ThreadItemOnGetDat' );
                        FGetHeader                                      := GetProcAddress( FModule, 'ThreadItemOnGetHeader' );
                        FGetFooter                                      := GetProcAddress( FModule, 'ThreadItemOnGetFooter' );
                        FGetBoardURL                            := GetProcAddress( FModule, 'ThreadItemOnGetBoardURL' );