[SCM] WebKit Debian packaging branch, debian/unstable, updated. debian/1.1.15-1-40151-g37bb677

cblu cblu at 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Sat Sep 26 05:56:17 UTC 2009


The following commit has been merged in the debian/unstable branch:
commit 4e5684db5565945347336764d56452bf5944ee04
Author: cblu <cblu at 268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Tue Feb 26 22:44:10 2002 +0000

    Added support for mach-o bundled plugins.
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@670 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/kwq/WCPlugin.h b/WebCore/kwq/WCPlugin.h
index 2e996b0..7640e24 100644
--- a/WebCore/kwq/WCPlugin.h
+++ b/WebCore/kwq/WCPlugin.h
@@ -28,12 +28,14 @@
 
 @interface WCPlugin : NSObject {
     NSMutableArray *mimeTypes;
-    NSString *name, *executablePath, *filename, *pluginDescription;
-    BOOL isLoaded;
+    NSString *name, *path, *filename, *pluginDescription;
+    BOOL isLoaded, isBundle, isCFM;
     NPPluginFuncs pluginFuncs;
     NPNetscapeFuncs browserFuncs;
     uint16 pluginSize;
     uint16 pluginVersion;
+    CFBundleRef bundle;
+    CFragConnectionID connID; 
     
     NPP_NewProcPtr NPP_New;
     NPP_DestroyProcPtr NPP_Destroy;
@@ -51,15 +53,15 @@
     NPP_ShutdownProcPtr NPP_Shutdown; 
 }
 
-- (BOOL)initializeWithPath:(NSString *)plugin;
-- (BOOL)getPluginInfoForResourceFile:(SInt16)resRef;
+- (BOOL)initializeWithPath:(NSString *)pluginPath;
+- (void)getPluginInfoForResourceFile:(SInt16)resRef;
 - (void)load;
 - (void)unload;
 - (NSString *)mimeTypeForURL:(NSString *)URL;
 - (NSArray *)mimeTypes;
 - (NSString *)name;
 - (NSString *)filename;
-- (NSString *)executablePath;
+- (NSString *)path;
 - (BOOL)isLoaded;
 - (NSString *)description;
 - (NSString *)pluginDescription;
diff --git a/WebCore/kwq/WCPlugin.mm b/WebCore/kwq/WCPlugin.mm
index fef88dc..8fb41f4 100644
--- a/WebCore/kwq/WCPlugin.mm
+++ b/WebCore/kwq/WCPlugin.mm
@@ -29,64 +29,58 @@
 
 @implementation WCPlugin
 
-- (BOOL)initializeWithPath:(NSString *)plugin{
+- (BOOL)initializeWithPath:(NSString *)pluginPath{
     NSFileManager *fileManager;
     NSDictionary *fileInfo;
-    CFBundleRef bundle;
-    NSBundle *bundle2;
-    CFURLRef pluginURL;
     SInt16 resRef;
     FSRef fref;
     OSErr err;
     UInt32 type;
-    
+    CFURLRef pluginURL;
+        
     fileManager = [NSFileManager defaultManager];
-    fileInfo = [fileManager fileAttributesAtPath:plugin traverseLink:YES];
+    fileInfo = [fileManager fileAttributesAtPath:pluginPath traverseLink:YES];
     if([[fileInfo objectForKey:@"NSFileType"] isEqualToString:@"NSFileTypeRegular"]){  // plug-in with resource fork
         if([[fileInfo objectForKey:@"NSFileHFSTypeCode"] unsignedLongValue] == 1112690764){ // 1112690764 = 'BRPL'
-            filename = [plugin lastPathComponent];
-            executablePath = plugin;
-            err = FSPathMakeRef((UInt8 *)[plugin cString], &fref, NULL);
+            err = FSPathMakeRef((UInt8 *)[pluginPath cString], &fref, NULL);
             if(err != noErr){
                 KWQDebug("WCPlugin: FSPathMakeRef failed. Error=%d\n", err);
                 return FALSE;
             }
             resRef = FSOpenResFile(&fref, fsRdPerm);
             if(resRef <= noErr){
-                KWQDebug("WCPlugin: FSOpenResFile failed. Can't open resource file: %s, Error=%d\n", [plugin cString], err);
+                KWQDebug("WCPlugin: FSOpenResFile failed. Can't open resource file: %s, Error=%d\n", [pluginPath cString], err);
                 return FALSE;
             }
-            if(![self getPluginInfoForResourceFile:resRef]){
-            	return FALSE;
-            }
+            [self getPluginInfoForResourceFile:resRef];
+            isBundle = FALSE;
         }else return FALSE;
+        
     }else if([[fileInfo objectForKey:@"NSFileType"] isEqualToString:@"NSFileTypeDirectory"]){ //bundle plug-in
-        pluginURL = CFURLCreateWithFileSystemPath(NULL, (CFStringRef)plugin, kCFURLPOSIXPathStyle, TRUE);
+        pluginURL = CFURLCreateWithFileSystemPath(NULL, (CFStringRef)pluginPath, kCFURLPOSIXPathStyle, TRUE);
         bundle = CFBundleCreate(NULL, pluginURL);
-        bundle2 = [NSBundle bundleWithPath:plugin]; // CFBundleCopyExecutableURL doesn't return full path! Have to use NSBundle
         CFBundleGetPackageInfo(bundle, &type, NULL);
         if(type == 1112690764){  // 1112690764 = 'BRPL'
-            filename = [plugin lastPathComponent];
-            executablePath = [bundle2 executablePath];
             resRef = CFBundleOpenBundleResourceMap(bundle);
-            if(![self getPluginInfoForResourceFile:resRef]){
-            	return FALSE;
-            }
-        }else return FALSE;
-        CFRelease(bundle);
+            [self getPluginInfoForResourceFile:resRef];
+            isBundle = TRUE;
+        }else{
+            return FALSE;
+        }
         CFRelease(pluginURL);
-
     }else{
         return FALSE;
     }
-
-    [executablePath retain];
+    
+    filename = [pluginPath lastPathComponent];
+    path = pluginPath;
+    [path retain];
     [filename retain];
     isLoaded = FALSE;
     return TRUE;
 }
 
-- (BOOL)getPluginInfoForResourceFile:(SInt16)resRef{
+- (void)getPluginInfoForResourceFile:(SInt16)resRef{
     Str255 theString;
     char temp[300], description[600]; // I wish I didn't have to use these C strings
     NSMutableArray *mime; // mime is an array containing the mime type, extension(s) and descriptions for that mime type.
@@ -126,87 +120,155 @@
     name = [NSString stringWithCString:temp]; // plugin's name
     [name retain];
     [mimeTypes retain];
-    return TRUE;
 }
 
 - (void)load{    
     OSErr err;
     FSSpec spec;
-    FSRef fref;
-    CFragConnectionID connID;  
+    FSRef fref; 
     mainFuncPtr pluginMainFunc;
+    NPError npErr;
+    Boolean didLoad;
+    NSBundle *tempBundle;
+    NSFileHandle *executableFile;
+    NSData *data;
     
     if(isLoaded){
         return;
     }
-    err = FSPathMakeRef((UInt8 *)[executablePath cString], &fref, NULL);
-    if(err != noErr){
-        KWQDebug("WCPlugin: load: FSPathMakeRef failed. Error=%d\n", err);
-        return;
-    }
-    err = FSGetCatalogInfo(&fref, kFSCatInfoNone, NULL, NULL, &spec, NULL);
-    if(err != noErr){
-        KWQDebug("WCPlugin: load: FSGetCatalogInfo failed. Error=%d\n", err);
-        return;
+    if(isBundle){ //CFM or Mach-o bundle
+        tempBundle = [NSBundle bundleWithPath:path];
+        executableFile = [NSFileHandle fileHandleForReadingAtPath:[tempBundle executablePath]];
+        data = [executableFile readDataOfLength:8];
+        if(!strcmp([data bytes], "Joy!peff")){
+            isCFM = TRUE;
+        }else{
+            isCFM = FALSE;
+        }
+        [executableFile closeFile];
+        didLoad = CFBundleLoadExecutable(bundle);
+        if (!didLoad) {
+            return;
+        }
+        pluginMainFunc = (void*)CFBundleGetFunctionPointerForName(bundle, CFSTR("main") );
+    }else{ // single CFM file
+        err = FSPathMakeRef((UInt8 *)[path cString], &fref, NULL);
+        if(err != noErr){
+            KWQDebug("WCPlugin: load: FSPathMakeRef failed. Error=%d\n", err);
+            return;
+        }
+        err = FSGetCatalogInfo(&fref, kFSCatInfoNone, NULL, NULL, &spec, NULL);
+        if(err != noErr){
+            KWQDebug("WCPlugin: load: FSGetCatalogInfo failed. Error=%d\n", err);
+            return;
+        }
+        err = GetDiskFragment(&spec, 0, kCFragGoesToEOF, nil, kPrivateCFragCopy, &connID, (Ptr *)&pluginMainFunc, nil);
+        if(err != noErr){
+            KWQDebug("WCPlugin: load: GetDiskFragment failed. Error=%d\n", err);
+            return;
+        }
+        pluginMainFunc = functionPointerForTVector(pluginMainFunc);
+        isCFM = TRUE;
     }
-    err = GetDiskFragment(&spec, 0, kCFragGoesToEOF, nil, kPrivateCFragCopy, &connID, (Ptr *)&pluginMainFunc, nil);
-    if(err != noErr){
-        KWQDebug("WCPlugin: load: GetDiskFragment failed. Error=%d\n", err);
-        return;
+    if(isCFM){
+        browserFuncs.version = 11;
+        browserFuncs.size = sizeof(NPNetscapeFuncs);
+        browserFuncs.geturl = tVectorForFunctionPointer(NPN_GetURL);
+        browserFuncs.posturl = tVectorForFunctionPointer(NPN_PostURL);
+        browserFuncs.requestread = tVectorForFunctionPointer(NPN_RequestRead);
+        browserFuncs.newstream = tVectorForFunctionPointer(NPN_NewStream);
+        browserFuncs.write = tVectorForFunctionPointer(NPN_Write);
+        browserFuncs.destroystream = tVectorForFunctionPointer(NPN_DestroyStream);
+        browserFuncs.status = tVectorForFunctionPointer(NPN_Status);
+        browserFuncs.uagent = tVectorForFunctionPointer(NPN_UserAgent);
+        browserFuncs.memalloc = tVectorForFunctionPointer(NPN_MemAlloc);
+        browserFuncs.memfree = tVectorForFunctionPointer(NPN_MemFree);
+        browserFuncs.memflush = tVectorForFunctionPointer(NPN_MemFlush);
+        browserFuncs.reloadplugins = tVectorForFunctionPointer(NPN_ReloadPlugins);
+        browserFuncs.geturlnotify = tVectorForFunctionPointer(NPN_GetURLNotify);
+        browserFuncs.posturlnotify = tVectorForFunctionPointer(NPN_PostURLNotify);
+        browserFuncs.getvalue = tVectorForFunctionPointer(NPN_GetValue);
+        browserFuncs.setvalue = tVectorForFunctionPointer(NPN_SetValue);
+        browserFuncs.invalidaterect = tVectorForFunctionPointer(NPN_InvalidateRect);
+        browserFuncs.invalidateregion = tVectorForFunctionPointer(NPN_InvalidateRegion);
+        browserFuncs.forceredraw = tVectorForFunctionPointer(NPN_ForceRedraw);
+        
+        npErr = pluginMainFunc(&browserFuncs, &pluginFuncs, &NPP_Shutdown);
+        
+        pluginSize = pluginFuncs.size;
+        pluginVersion = pluginFuncs.version;
+        KWQDebug("pluginMainFunc: %d, size=%d, version=%d\n", npErr, pluginSize, pluginVersion);
+        
+        NPP_New = functionPointerForTVector(pluginFuncs.newp);
+        NPP_Destroy = functionPointerForTVector(pluginFuncs.destroy);
+        NPP_SetWindow = functionPointerForTVector(pluginFuncs.setwindow);
+        NPP_NewStream = functionPointerForTVector(pluginFuncs.newstream);
+        NPP_DestroyStream = functionPointerForTVector(pluginFuncs.destroystream);
+        NPP_StreamAsFile = functionPointerForTVector(pluginFuncs.asfile);
+        NPP_WriteReady = functionPointerForTVector(pluginFuncs.writeready);
+        NPP_Write = functionPointerForTVector(pluginFuncs.write);
+        NPP_Print = functionPointerForTVector(pluginFuncs.print);
+        NPP_HandleEvent = functionPointerForTVector(pluginFuncs.event);
+        NPP_URLNotify = functionPointerForTVector(pluginFuncs.urlnotify);
+        NPP_GetValue = functionPointerForTVector(pluginFuncs.getvalue);
+        NPP_SetValue = functionPointerForTVector(pluginFuncs.setvalue);
+    }else{ // no function pointer conversion necessary for mach-o
+        browserFuncs.version = 11;
+        browserFuncs.size = sizeof(NPNetscapeFuncs);
+        browserFuncs.geturl = NPN_GetURL;
+        browserFuncs.posturl = NPN_PostURL;
+        browserFuncs.requestread = NPN_RequestRead;
+        browserFuncs.newstream = NPN_NewStream;
+        browserFuncs.write = NPN_Write;
+        browserFuncs.destroystream = NPN_DestroyStream;
+        browserFuncs.status = NPN_Status;
+        browserFuncs.uagent = NPN_UserAgent;
+        browserFuncs.memalloc = NPN_MemAlloc;
+        browserFuncs.memfree = NPN_MemFree;
+        browserFuncs.memflush = NPN_MemFlush;
+        browserFuncs.reloadplugins = NPN_ReloadPlugins;
+        browserFuncs.geturlnotify = NPN_GetURLNotify;
+        browserFuncs.posturlnotify = NPN_PostURLNotify;
+        browserFuncs.getvalue = NPN_GetValue;
+        browserFuncs.setvalue = NPN_SetValue;
+        browserFuncs.invalidaterect = NPN_InvalidateRect;
+        browserFuncs.invalidateregion = NPN_InvalidateRegion;
+        browserFuncs.forceredraw = NPN_ForceRedraw;
+        
+        npErr = pluginMainFunc(&browserFuncs, &pluginFuncs, &NPP_Shutdown);
+        
+        pluginSize = pluginFuncs.size;
+        pluginVersion = pluginFuncs.version;
+        KWQDebug("pluginMainFunc: %d, size=%d, version=%d\n", npErr, pluginSize, pluginVersion);
+        
+        NPP_New = pluginFuncs.newp;
+        NPP_Destroy = pluginFuncs.destroy;
+        NPP_SetWindow = pluginFuncs.setwindow;
+        NPP_NewStream = pluginFuncs.newstream;
+        NPP_DestroyStream = pluginFuncs.destroystream;
+        NPP_StreamAsFile = pluginFuncs.asfile;
+        NPP_WriteReady = pluginFuncs.writeready;
+        NPP_Write = pluginFuncs.write;
+        NPP_Print = pluginFuncs.print;
+        NPP_HandleEvent = pluginFuncs.event;
+        NPP_URLNotify = pluginFuncs.urlnotify;
+        NPP_GetValue = pluginFuncs.getvalue;
+        NPP_SetValue = pluginFuncs.setvalue;
     }
-        NPError npErr;
-    
-    browserFuncs.version = 11;
-    browserFuncs.size = sizeof(NPNetscapeFuncs);
-    browserFuncs.geturl = tVectorForFunctionPointer(NPN_GetURLNotify);
-    browserFuncs.posturl = tVectorForFunctionPointer(NPN_PostURLNotify);
-    browserFuncs.requestread = tVectorForFunctionPointer(NPN_RequestRead);
-    browserFuncs.newstream = tVectorForFunctionPointer(NPN_NewStream);
-    browserFuncs.write = tVectorForFunctionPointer(NPN_Write);
-    browserFuncs.destroystream = tVectorForFunctionPointer(NPN_DestroyStream);
-    browserFuncs.status = tVectorForFunctionPointer(NPN_Status);
-    browserFuncs.uagent = tVectorForFunctionPointer(NPN_UserAgent);
-    browserFuncs.memalloc = tVectorForFunctionPointer(NPN_MemAlloc);
-    browserFuncs.memfree = tVectorForFunctionPointer(NPN_MemFree);
-    browserFuncs.memflush = tVectorForFunctionPointer(NPN_MemFlush);
-    browserFuncs.reloadplugins = tVectorForFunctionPointer(NPN_ReloadPlugins);
-    browserFuncs.geturlnotify = tVectorForFunctionPointer(NPN_GetURLNotify);
-    browserFuncs.posturlnotify = tVectorForFunctionPointer(NPN_PostURLNotify);
-    browserFuncs.getvalue = tVectorForFunctionPointer(NPN_GetValue);
-    browserFuncs.setvalue = tVectorForFunctionPointer(NPN_SetValue);
-    browserFuncs.invalidaterect = tVectorForFunctionPointer(NPN_InvalidateRect);
-    browserFuncs.invalidateregion = tVectorForFunctionPointer(NPN_InvalidateRegion);
-    browserFuncs.forceredraw = tVectorForFunctionPointer(NPN_ForceRedraw);
-    
-    pluginMainFunc = functionPointerForTVector(pluginMainFunc);
-    npErr = pluginMainFunc(&browserFuncs, &pluginFuncs, &NPP_Shutdown);
-    
-    pluginSize = pluginFuncs.size;
-    pluginVersion = pluginFuncs.version;
-    KWQDebug("pluginMainFunc: %d, size=%d, version=%d\n", npErr, pluginSize, pluginVersion);
-    
-    NPP_New = functionPointerForTVector(pluginFuncs.newp);
-    NPP_Destroy = functionPointerForTVector(pluginFuncs.destroy);
-    NPP_SetWindow = functionPointerForTVector(pluginFuncs.setwindow);
-    NPP_NewStream = functionPointerForTVector(pluginFuncs.newstream);
-    NPP_DestroyStream = functionPointerForTVector(pluginFuncs.destroystream);
-    NPP_StreamAsFile = functionPointerForTVector(pluginFuncs.asfile);
-    NPP_WriteReady = functionPointerForTVector(pluginFuncs.writeready);
-    NPP_Write = functionPointerForTVector(pluginFuncs.write);
-    NPP_Print = functionPointerForTVector(pluginFuncs.print);
-    NPP_HandleEvent = functionPointerForTVector(pluginFuncs.event);
-    NPP_URLNotify = functionPointerForTVector(pluginFuncs.urlnotify);
-    NPP_GetValue = functionPointerForTVector(pluginFuncs.getvalue);
-    NPP_SetValue = functionPointerForTVector(pluginFuncs.setvalue);
-    
     KWQDebug("Plugin Loaded\n");
     isLoaded = TRUE;
-    
 }
 
 - (void)unload{
     NPP_Shutdown();
-    // unload library here
+    if(isBundle){
+        CFBundleUnloadExecutable(bundle);
+        CFRelease(bundle);
+    }else{
+        CloseConnection(&connID);
+    }
+    KWQDebug("Plugin Unloaded\n");
+    isLoaded = FALSE;
 }
 
 - (NSString *)mimeTypeForURL:(NSString *)URL
@@ -287,8 +349,8 @@
     return filename;
 }
 
-- (NSString *)executablePath{
-    return executablePath;
+- (NSString *)path{
+    return path;
 }
 
 - (BOOL)isLoaded{
@@ -306,8 +368,8 @@
     [desc appendString:@"name: "];
     [desc appendString:name];
     [desc appendString:@"\n"];
-    [desc appendString:@"executablePath: "];
-    [desc appendString:executablePath];
+    [desc appendString:@"path: "];
+    [desc appendString:path];
     [desc appendString:@"\n"];
     [desc appendString:@"isLoaded: "];
     if(isLoaded){
@@ -318,6 +380,9 @@
     [desc appendString:@"mimeTypes: "];
     [desc appendString:[mimeTypes description]];
     [desc appendString:@"\n"];
+    [desc appendString:@"pluginDescription: "];
+    [desc appendString:pluginDescription];
+    [desc appendString:@"\n"];
     return desc;
 }
 
diff --git a/WebCore/kwq/npapi.h b/WebCore/kwq/npapi.h
index 66e3d6a..e73a667 100644
--- a/WebCore/kwq/npapi.h
+++ b/WebCore/kwq/npapi.h
@@ -207,6 +207,7 @@ typedef NPError	(*NPN_RequestReadProcPtr)(NPStream* stream, NPByteRange* rangeLi
 typedef NPError	(*NPN_NewStreamProcPtr)(NPP instance, NPMIMEType type, const char* window, NPStream** stream);
 typedef int32 (*NPN_WriteProcPtr)(NPP instance, NPStream* stream, int32 len, void* buffer);
 typedef NPError (*NPN_DestroyStreamProcPtr)(NPP instance, NPStream* stream, NPReason reason);
+typedef void (*NPN_StatusProcPtr)(NPP instance, const char* message);
 typedef const char*(*NPN_UserAgentProcPtr)(NPP instance);
 typedef void* (*NPN_MemAllocProcPtr)(uint32 size);
 typedef void (*NPN_MemFreeProcPtr)(void* ptr);
@@ -247,7 +248,7 @@ typedef struct _NPNetscapeFuncs {
     NPN_NewStreamProcPtr newstream;
     NPN_WriteProcPtr write;
     NPN_DestroyStreamProcPtr destroystream;
-    NPN_DestroyStreamProcPtr status;
+    NPN_StatusProcPtr status;
     NPN_UserAgentProcPtr uagent;
     NPN_MemAllocProcPtr memalloc;
     NPN_MemFreeProcPtr memfree;
diff --git a/WebCore/src/kwq/WCPlugin.h b/WebCore/src/kwq/WCPlugin.h
index 2e996b0..7640e24 100644
--- a/WebCore/src/kwq/WCPlugin.h
+++ b/WebCore/src/kwq/WCPlugin.h
@@ -28,12 +28,14 @@
 
 @interface WCPlugin : NSObject {
     NSMutableArray *mimeTypes;
-    NSString *name, *executablePath, *filename, *pluginDescription;
-    BOOL isLoaded;
+    NSString *name, *path, *filename, *pluginDescription;
+    BOOL isLoaded, isBundle, isCFM;
     NPPluginFuncs pluginFuncs;
     NPNetscapeFuncs browserFuncs;
     uint16 pluginSize;
     uint16 pluginVersion;
+    CFBundleRef bundle;
+    CFragConnectionID connID; 
     
     NPP_NewProcPtr NPP_New;
     NPP_DestroyProcPtr NPP_Destroy;
@@ -51,15 +53,15 @@
     NPP_ShutdownProcPtr NPP_Shutdown; 
 }
 
-- (BOOL)initializeWithPath:(NSString *)plugin;
-- (BOOL)getPluginInfoForResourceFile:(SInt16)resRef;
+- (BOOL)initializeWithPath:(NSString *)pluginPath;
+- (void)getPluginInfoForResourceFile:(SInt16)resRef;
 - (void)load;
 - (void)unload;
 - (NSString *)mimeTypeForURL:(NSString *)URL;
 - (NSArray *)mimeTypes;
 - (NSString *)name;
 - (NSString *)filename;
-- (NSString *)executablePath;
+- (NSString *)path;
 - (BOOL)isLoaded;
 - (NSString *)description;
 - (NSString *)pluginDescription;
diff --git a/WebCore/src/kwq/WCPlugin.mm b/WebCore/src/kwq/WCPlugin.mm
index fef88dc..8fb41f4 100644
--- a/WebCore/src/kwq/WCPlugin.mm
+++ b/WebCore/src/kwq/WCPlugin.mm
@@ -29,64 +29,58 @@
 
 @implementation WCPlugin
 
-- (BOOL)initializeWithPath:(NSString *)plugin{
+- (BOOL)initializeWithPath:(NSString *)pluginPath{
     NSFileManager *fileManager;
     NSDictionary *fileInfo;
-    CFBundleRef bundle;
-    NSBundle *bundle2;
-    CFURLRef pluginURL;
     SInt16 resRef;
     FSRef fref;
     OSErr err;
     UInt32 type;
-    
+    CFURLRef pluginURL;
+        
     fileManager = [NSFileManager defaultManager];
-    fileInfo = [fileManager fileAttributesAtPath:plugin traverseLink:YES];
+    fileInfo = [fileManager fileAttributesAtPath:pluginPath traverseLink:YES];
     if([[fileInfo objectForKey:@"NSFileType"] isEqualToString:@"NSFileTypeRegular"]){  // plug-in with resource fork
         if([[fileInfo objectForKey:@"NSFileHFSTypeCode"] unsignedLongValue] == 1112690764){ // 1112690764 = 'BRPL'
-            filename = [plugin lastPathComponent];
-            executablePath = plugin;
-            err = FSPathMakeRef((UInt8 *)[plugin cString], &fref, NULL);
+            err = FSPathMakeRef((UInt8 *)[pluginPath cString], &fref, NULL);
             if(err != noErr){
                 KWQDebug("WCPlugin: FSPathMakeRef failed. Error=%d\n", err);
                 return FALSE;
             }
             resRef = FSOpenResFile(&fref, fsRdPerm);
             if(resRef <= noErr){
-                KWQDebug("WCPlugin: FSOpenResFile failed. Can't open resource file: %s, Error=%d\n", [plugin cString], err);
+                KWQDebug("WCPlugin: FSOpenResFile failed. Can't open resource file: %s, Error=%d\n", [pluginPath cString], err);
                 return FALSE;
             }
-            if(![self getPluginInfoForResourceFile:resRef]){
-            	return FALSE;
-            }
+            [self getPluginInfoForResourceFile:resRef];
+            isBundle = FALSE;
         }else return FALSE;
+        
     }else if([[fileInfo objectForKey:@"NSFileType"] isEqualToString:@"NSFileTypeDirectory"]){ //bundle plug-in
-        pluginURL = CFURLCreateWithFileSystemPath(NULL, (CFStringRef)plugin, kCFURLPOSIXPathStyle, TRUE);
+        pluginURL = CFURLCreateWithFileSystemPath(NULL, (CFStringRef)pluginPath, kCFURLPOSIXPathStyle, TRUE);
         bundle = CFBundleCreate(NULL, pluginURL);
-        bundle2 = [NSBundle bundleWithPath:plugin]; // CFBundleCopyExecutableURL doesn't return full path! Have to use NSBundle
         CFBundleGetPackageInfo(bundle, &type, NULL);
         if(type == 1112690764){  // 1112690764 = 'BRPL'
-            filename = [plugin lastPathComponent];
-            executablePath = [bundle2 executablePath];
             resRef = CFBundleOpenBundleResourceMap(bundle);
-            if(![self getPluginInfoForResourceFile:resRef]){
-            	return FALSE;
-            }
-        }else return FALSE;
-        CFRelease(bundle);
+            [self getPluginInfoForResourceFile:resRef];
+            isBundle = TRUE;
+        }else{
+            return FALSE;
+        }
         CFRelease(pluginURL);
-
     }else{
         return FALSE;
     }
-
-    [executablePath retain];
+    
+    filename = [pluginPath lastPathComponent];
+    path = pluginPath;
+    [path retain];
     [filename retain];
     isLoaded = FALSE;
     return TRUE;
 }
 
-- (BOOL)getPluginInfoForResourceFile:(SInt16)resRef{
+- (void)getPluginInfoForResourceFile:(SInt16)resRef{
     Str255 theString;
     char temp[300], description[600]; // I wish I didn't have to use these C strings
     NSMutableArray *mime; // mime is an array containing the mime type, extension(s) and descriptions for that mime type.
@@ -126,87 +120,155 @@
     name = [NSString stringWithCString:temp]; // plugin's name
     [name retain];
     [mimeTypes retain];
-    return TRUE;
 }
 
 - (void)load{    
     OSErr err;
     FSSpec spec;
-    FSRef fref;
-    CFragConnectionID connID;  
+    FSRef fref; 
     mainFuncPtr pluginMainFunc;
+    NPError npErr;
+    Boolean didLoad;
+    NSBundle *tempBundle;
+    NSFileHandle *executableFile;
+    NSData *data;
     
     if(isLoaded){
         return;
     }
-    err = FSPathMakeRef((UInt8 *)[executablePath cString], &fref, NULL);
-    if(err != noErr){
-        KWQDebug("WCPlugin: load: FSPathMakeRef failed. Error=%d\n", err);
-        return;
-    }
-    err = FSGetCatalogInfo(&fref, kFSCatInfoNone, NULL, NULL, &spec, NULL);
-    if(err != noErr){
-        KWQDebug("WCPlugin: load: FSGetCatalogInfo failed. Error=%d\n", err);
-        return;
+    if(isBundle){ //CFM or Mach-o bundle
+        tempBundle = [NSBundle bundleWithPath:path];
+        executableFile = [NSFileHandle fileHandleForReadingAtPath:[tempBundle executablePath]];
+        data = [executableFile readDataOfLength:8];
+        if(!strcmp([data bytes], "Joy!peff")){
+            isCFM = TRUE;
+        }else{
+            isCFM = FALSE;
+        }
+        [executableFile closeFile];
+        didLoad = CFBundleLoadExecutable(bundle);
+        if (!didLoad) {
+            return;
+        }
+        pluginMainFunc = (void*)CFBundleGetFunctionPointerForName(bundle, CFSTR("main") );
+    }else{ // single CFM file
+        err = FSPathMakeRef((UInt8 *)[path cString], &fref, NULL);
+        if(err != noErr){
+            KWQDebug("WCPlugin: load: FSPathMakeRef failed. Error=%d\n", err);
+            return;
+        }
+        err = FSGetCatalogInfo(&fref, kFSCatInfoNone, NULL, NULL, &spec, NULL);
+        if(err != noErr){
+            KWQDebug("WCPlugin: load: FSGetCatalogInfo failed. Error=%d\n", err);
+            return;
+        }
+        err = GetDiskFragment(&spec, 0, kCFragGoesToEOF, nil, kPrivateCFragCopy, &connID, (Ptr *)&pluginMainFunc, nil);
+        if(err != noErr){
+            KWQDebug("WCPlugin: load: GetDiskFragment failed. Error=%d\n", err);
+            return;
+        }
+        pluginMainFunc = functionPointerForTVector(pluginMainFunc);
+        isCFM = TRUE;
     }
-    err = GetDiskFragment(&spec, 0, kCFragGoesToEOF, nil, kPrivateCFragCopy, &connID, (Ptr *)&pluginMainFunc, nil);
-    if(err != noErr){
-        KWQDebug("WCPlugin: load: GetDiskFragment failed. Error=%d\n", err);
-        return;
+    if(isCFM){
+        browserFuncs.version = 11;
+        browserFuncs.size = sizeof(NPNetscapeFuncs);
+        browserFuncs.geturl = tVectorForFunctionPointer(NPN_GetURL);
+        browserFuncs.posturl = tVectorForFunctionPointer(NPN_PostURL);
+        browserFuncs.requestread = tVectorForFunctionPointer(NPN_RequestRead);
+        browserFuncs.newstream = tVectorForFunctionPointer(NPN_NewStream);
+        browserFuncs.write = tVectorForFunctionPointer(NPN_Write);
+        browserFuncs.destroystream = tVectorForFunctionPointer(NPN_DestroyStream);
+        browserFuncs.status = tVectorForFunctionPointer(NPN_Status);
+        browserFuncs.uagent = tVectorForFunctionPointer(NPN_UserAgent);
+        browserFuncs.memalloc = tVectorForFunctionPointer(NPN_MemAlloc);
+        browserFuncs.memfree = tVectorForFunctionPointer(NPN_MemFree);
+        browserFuncs.memflush = tVectorForFunctionPointer(NPN_MemFlush);
+        browserFuncs.reloadplugins = tVectorForFunctionPointer(NPN_ReloadPlugins);
+        browserFuncs.geturlnotify = tVectorForFunctionPointer(NPN_GetURLNotify);
+        browserFuncs.posturlnotify = tVectorForFunctionPointer(NPN_PostURLNotify);
+        browserFuncs.getvalue = tVectorForFunctionPointer(NPN_GetValue);
+        browserFuncs.setvalue = tVectorForFunctionPointer(NPN_SetValue);
+        browserFuncs.invalidaterect = tVectorForFunctionPointer(NPN_InvalidateRect);
+        browserFuncs.invalidateregion = tVectorForFunctionPointer(NPN_InvalidateRegion);
+        browserFuncs.forceredraw = tVectorForFunctionPointer(NPN_ForceRedraw);
+        
+        npErr = pluginMainFunc(&browserFuncs, &pluginFuncs, &NPP_Shutdown);
+        
+        pluginSize = pluginFuncs.size;
+        pluginVersion = pluginFuncs.version;
+        KWQDebug("pluginMainFunc: %d, size=%d, version=%d\n", npErr, pluginSize, pluginVersion);
+        
+        NPP_New = functionPointerForTVector(pluginFuncs.newp);
+        NPP_Destroy = functionPointerForTVector(pluginFuncs.destroy);
+        NPP_SetWindow = functionPointerForTVector(pluginFuncs.setwindow);
+        NPP_NewStream = functionPointerForTVector(pluginFuncs.newstream);
+        NPP_DestroyStream = functionPointerForTVector(pluginFuncs.destroystream);
+        NPP_StreamAsFile = functionPointerForTVector(pluginFuncs.asfile);
+        NPP_WriteReady = functionPointerForTVector(pluginFuncs.writeready);
+        NPP_Write = functionPointerForTVector(pluginFuncs.write);
+        NPP_Print = functionPointerForTVector(pluginFuncs.print);
+        NPP_HandleEvent = functionPointerForTVector(pluginFuncs.event);
+        NPP_URLNotify = functionPointerForTVector(pluginFuncs.urlnotify);
+        NPP_GetValue = functionPointerForTVector(pluginFuncs.getvalue);
+        NPP_SetValue = functionPointerForTVector(pluginFuncs.setvalue);
+    }else{ // no function pointer conversion necessary for mach-o
+        browserFuncs.version = 11;
+        browserFuncs.size = sizeof(NPNetscapeFuncs);
+        browserFuncs.geturl = NPN_GetURL;
+        browserFuncs.posturl = NPN_PostURL;
+        browserFuncs.requestread = NPN_RequestRead;
+        browserFuncs.newstream = NPN_NewStream;
+        browserFuncs.write = NPN_Write;
+        browserFuncs.destroystream = NPN_DestroyStream;
+        browserFuncs.status = NPN_Status;
+        browserFuncs.uagent = NPN_UserAgent;
+        browserFuncs.memalloc = NPN_MemAlloc;
+        browserFuncs.memfree = NPN_MemFree;
+        browserFuncs.memflush = NPN_MemFlush;
+        browserFuncs.reloadplugins = NPN_ReloadPlugins;
+        browserFuncs.geturlnotify = NPN_GetURLNotify;
+        browserFuncs.posturlnotify = NPN_PostURLNotify;
+        browserFuncs.getvalue = NPN_GetValue;
+        browserFuncs.setvalue = NPN_SetValue;
+        browserFuncs.invalidaterect = NPN_InvalidateRect;
+        browserFuncs.invalidateregion = NPN_InvalidateRegion;
+        browserFuncs.forceredraw = NPN_ForceRedraw;
+        
+        npErr = pluginMainFunc(&browserFuncs, &pluginFuncs, &NPP_Shutdown);
+        
+        pluginSize = pluginFuncs.size;
+        pluginVersion = pluginFuncs.version;
+        KWQDebug("pluginMainFunc: %d, size=%d, version=%d\n", npErr, pluginSize, pluginVersion);
+        
+        NPP_New = pluginFuncs.newp;
+        NPP_Destroy = pluginFuncs.destroy;
+        NPP_SetWindow = pluginFuncs.setwindow;
+        NPP_NewStream = pluginFuncs.newstream;
+        NPP_DestroyStream = pluginFuncs.destroystream;
+        NPP_StreamAsFile = pluginFuncs.asfile;
+        NPP_WriteReady = pluginFuncs.writeready;
+        NPP_Write = pluginFuncs.write;
+        NPP_Print = pluginFuncs.print;
+        NPP_HandleEvent = pluginFuncs.event;
+        NPP_URLNotify = pluginFuncs.urlnotify;
+        NPP_GetValue = pluginFuncs.getvalue;
+        NPP_SetValue = pluginFuncs.setvalue;
     }
-        NPError npErr;
-    
-    browserFuncs.version = 11;
-    browserFuncs.size = sizeof(NPNetscapeFuncs);
-    browserFuncs.geturl = tVectorForFunctionPointer(NPN_GetURLNotify);
-    browserFuncs.posturl = tVectorForFunctionPointer(NPN_PostURLNotify);
-    browserFuncs.requestread = tVectorForFunctionPointer(NPN_RequestRead);
-    browserFuncs.newstream = tVectorForFunctionPointer(NPN_NewStream);
-    browserFuncs.write = tVectorForFunctionPointer(NPN_Write);
-    browserFuncs.destroystream = tVectorForFunctionPointer(NPN_DestroyStream);
-    browserFuncs.status = tVectorForFunctionPointer(NPN_Status);
-    browserFuncs.uagent = tVectorForFunctionPointer(NPN_UserAgent);
-    browserFuncs.memalloc = tVectorForFunctionPointer(NPN_MemAlloc);
-    browserFuncs.memfree = tVectorForFunctionPointer(NPN_MemFree);
-    browserFuncs.memflush = tVectorForFunctionPointer(NPN_MemFlush);
-    browserFuncs.reloadplugins = tVectorForFunctionPointer(NPN_ReloadPlugins);
-    browserFuncs.geturlnotify = tVectorForFunctionPointer(NPN_GetURLNotify);
-    browserFuncs.posturlnotify = tVectorForFunctionPointer(NPN_PostURLNotify);
-    browserFuncs.getvalue = tVectorForFunctionPointer(NPN_GetValue);
-    browserFuncs.setvalue = tVectorForFunctionPointer(NPN_SetValue);
-    browserFuncs.invalidaterect = tVectorForFunctionPointer(NPN_InvalidateRect);
-    browserFuncs.invalidateregion = tVectorForFunctionPointer(NPN_InvalidateRegion);
-    browserFuncs.forceredraw = tVectorForFunctionPointer(NPN_ForceRedraw);
-    
-    pluginMainFunc = functionPointerForTVector(pluginMainFunc);
-    npErr = pluginMainFunc(&browserFuncs, &pluginFuncs, &NPP_Shutdown);
-    
-    pluginSize = pluginFuncs.size;
-    pluginVersion = pluginFuncs.version;
-    KWQDebug("pluginMainFunc: %d, size=%d, version=%d\n", npErr, pluginSize, pluginVersion);
-    
-    NPP_New = functionPointerForTVector(pluginFuncs.newp);
-    NPP_Destroy = functionPointerForTVector(pluginFuncs.destroy);
-    NPP_SetWindow = functionPointerForTVector(pluginFuncs.setwindow);
-    NPP_NewStream = functionPointerForTVector(pluginFuncs.newstream);
-    NPP_DestroyStream = functionPointerForTVector(pluginFuncs.destroystream);
-    NPP_StreamAsFile = functionPointerForTVector(pluginFuncs.asfile);
-    NPP_WriteReady = functionPointerForTVector(pluginFuncs.writeready);
-    NPP_Write = functionPointerForTVector(pluginFuncs.write);
-    NPP_Print = functionPointerForTVector(pluginFuncs.print);
-    NPP_HandleEvent = functionPointerForTVector(pluginFuncs.event);
-    NPP_URLNotify = functionPointerForTVector(pluginFuncs.urlnotify);
-    NPP_GetValue = functionPointerForTVector(pluginFuncs.getvalue);
-    NPP_SetValue = functionPointerForTVector(pluginFuncs.setvalue);
-    
     KWQDebug("Plugin Loaded\n");
     isLoaded = TRUE;
-    
 }
 
 - (void)unload{
     NPP_Shutdown();
-    // unload library here
+    if(isBundle){
+        CFBundleUnloadExecutable(bundle);
+        CFRelease(bundle);
+    }else{
+        CloseConnection(&connID);
+    }
+    KWQDebug("Plugin Unloaded\n");
+    isLoaded = FALSE;
 }
 
 - (NSString *)mimeTypeForURL:(NSString *)URL
@@ -287,8 +349,8 @@
     return filename;
 }
 
-- (NSString *)executablePath{
-    return executablePath;
+- (NSString *)path{
+    return path;
 }
 
 - (BOOL)isLoaded{
@@ -306,8 +368,8 @@
     [desc appendString:@"name: "];
     [desc appendString:name];
     [desc appendString:@"\n"];
-    [desc appendString:@"executablePath: "];
-    [desc appendString:executablePath];
+    [desc appendString:@"path: "];
+    [desc appendString:path];
     [desc appendString:@"\n"];
     [desc appendString:@"isLoaded: "];
     if(isLoaded){
@@ -318,6 +380,9 @@
     [desc appendString:@"mimeTypes: "];
     [desc appendString:[mimeTypes description]];
     [desc appendString:@"\n"];
+    [desc appendString:@"pluginDescription: "];
+    [desc appendString:pluginDescription];
+    [desc appendString:@"\n"];
     return desc;
 }
 
diff --git a/WebCore/src/kwq/npapi.h b/WebCore/src/kwq/npapi.h
index 66e3d6a..e73a667 100644
--- a/WebCore/src/kwq/npapi.h
+++ b/WebCore/src/kwq/npapi.h
@@ -207,6 +207,7 @@ typedef NPError	(*NPN_RequestReadProcPtr)(NPStream* stream, NPByteRange* rangeLi
 typedef NPError	(*NPN_NewStreamProcPtr)(NPP instance, NPMIMEType type, const char* window, NPStream** stream);
 typedef int32 (*NPN_WriteProcPtr)(NPP instance, NPStream* stream, int32 len, void* buffer);
 typedef NPError (*NPN_DestroyStreamProcPtr)(NPP instance, NPStream* stream, NPReason reason);
+typedef void (*NPN_StatusProcPtr)(NPP instance, const char* message);
 typedef const char*(*NPN_UserAgentProcPtr)(NPP instance);
 typedef void* (*NPN_MemAllocProcPtr)(uint32 size);
 typedef void (*NPN_MemFreeProcPtr)(void* ptr);
@@ -247,7 +248,7 @@ typedef struct _NPNetscapeFuncs {
     NPN_NewStreamProcPtr newstream;
     NPN_WriteProcPtr write;
     NPN_DestroyStreamProcPtr destroystream;
-    NPN_DestroyStreamProcPtr status;
+    NPN_StatusProcPtr status;
     NPN_UserAgentProcPtr uagent;
     NPN_MemAllocProcPtr memalloc;
     NPN_MemFreeProcPtr memfree;
diff --git a/WebKit/Plugins.subproj/IFPluginView.mm b/WebKit/Plugins.subproj/IFPluginView.mm
index f193b87..ab520c4 100644
--- a/WebKit/Plugins.subproj/IFPluginView.mm
+++ b/WebKit/Plugins.subproj/IFPluginView.mm
@@ -517,7 +517,6 @@ static id IFPluginMake(NSRect rect, QWidget *widget, WCPlugin *plugin, NSString
         webController = [webView controller];
         [webController setMainDataSource:dataSource];
         [dataSource startLoading: YES];
-        NPP_URLNotify(instance, url, NPRES_DONE, notifyData);
     }else if(!strcmp(target, "_blank") || !strcmp(target, "_new")){
         printf("Error: No API to open new browser window\n");
     }
@@ -526,6 +525,7 @@ static id IFPluginMake(NSRect rect, QWidget *widget, WCPlugin *plugin, NSString
 
 -(NPError)getURL:(const char *)url target:(const char *)target
 {
+    KWQDebug("NPN_GetURL: %s target: %s\n", url, target);
     return [self getURLNotify:url target:target notifyData:NULL];
 }
 
diff --git a/WebKit/Plugins.subproj/WebPluginView.m b/WebKit/Plugins.subproj/WebPluginView.m
index f193b87..ab520c4 100644
--- a/WebKit/Plugins.subproj/WebPluginView.m
+++ b/WebKit/Plugins.subproj/WebPluginView.m
@@ -517,7 +517,6 @@ static id IFPluginMake(NSRect rect, QWidget *widget, WCPlugin *plugin, NSString
         webController = [webView controller];
         [webController setMainDataSource:dataSource];
         [dataSource startLoading: YES];
-        NPP_URLNotify(instance, url, NPRES_DONE, notifyData);
     }else if(!strcmp(target, "_blank") || !strcmp(target, "_new")){
         printf("Error: No API to open new browser window\n");
     }
@@ -526,6 +525,7 @@ static id IFPluginMake(NSRect rect, QWidget *widget, WCPlugin *plugin, NSString
 
 -(NPError)getURL:(const char *)url target:(const char *)target
 {
+    KWQDebug("NPN_GetURL: %s target: %s\n", url, target);
     return [self getURLNotify:url target:target notifyData:NULL];
 }
 

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list