[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