2 WebNetscapePluginPackage.m
3 Copyright (c) 2002, Apple, Inc. All rights reserved.
6 #import <WebKit/WebNetscapePluginPackage.h>
8 #import <WebKit/WebKitLogging.h>
9 #import <WebKit/WebKitNSStringExtras.h>
10 #import <WebKit/WebNSObjectExtras.h>
12 #import <JavaScriptCore/npruntime_impl.h>
14 typedef void (* FunctionPointer) (void);
15 typedef void (* TransitionVector) (void);
16 static FunctionPointer functionPointerForTVector(TransitionVector);
17 static TransitionVector tVectorForFunctionPointer(FunctionPointer);
19 #define PluginNameOrDescriptionStringNumber 126
20 #define MIMEDescriptionStringNumber 127
21 #define MIMEListStringStringNumber 128
23 #define RealPlayerAppIndentifier @"com.RealNetworks.RealOne Player"
24 #define RealPlayerPluginFilename @"RealPlayer Plugin"
26 @implementation WebNetscapePluginPackage
30 // The Shockwave plugin requires a valid file in CurApRefNum.
31 // But it doesn't seem to matter what file it is.
32 // If we're called inside a Cocoa application which won't have a
33 // CurApRefNum, we set it to point to the system resource file.
34 if (LMGetCurApRefNum() == -1) {
35 // To get the refNum for the system resource file, we have to do
36 // UseResFile(kSystemResFile) and then look at CurResFile().
37 short savedCurResFile = CurResFile();
38 UseResFile(kSystemResFile);
39 LMSetCurApRefNum(CurResFile());
40 UseResFile(savedCurResFile);
44 - (SInt16)openResourceFile
50 return CFBundleOpenBundleResourceMap(cfBundle);
52 err = FSPathMakeRef((const UInt8 *)[path fileSystemRepresentation], &fref, NULL);
57 return FSOpenResFile(&fref, fsRdPerm);
61 - (void)closeResourceFile:(SInt16)resRef
64 CFBundleCloseBundleResourceMap(cfBundle, resRef);
70 - (NSString *)stringForStringListID:(SInt16)stringListID andIndex:(SInt16)index
72 // Get resource, and dereference the handle.
73 Handle stringHandle = Get1Resource('STR#', stringListID);
74 if (stringHandle == NULL) {
77 unsigned char *p = (unsigned char *)*stringHandle;
82 // Check the index against the length of the string list, then skip the length.
83 if (index < 1 || index > *(SInt16 *)p) {
88 // Skip any strings that come before the one we are looking for.
92 // Convert the one we found into an NSString.
93 return [[[NSString alloc] initWithBytes:(p + 1) length:*p encoding:[NSString _web_encodingForResource:stringHandle]] autorelease];
96 - (BOOL)getPluginInfoFromResources
98 SInt16 resRef = [self openResourceFile];
104 if (ResError() != noErr) {
108 NSString *MIME, *extensionsList, *description;
113 NSMutableDictionary *MIMEToExtensionsDictionary = [NSMutableDictionary dictionary];
114 NSMutableDictionary *MIMEToDescriptionDictionary = [NSMutableDictionary dictionary];
117 MIME = [[self stringForStringListID:MIMEListStringStringNumber
118 andIndex:i] lowercaseString];
123 // FIXME: Avoid mime types with semi-colons because KJS can't properly parse them using KWQKConfigBase
124 r = [MIME rangeOfString:@";"];
129 extensionsList = [[self stringForStringListID:MIMEListStringStringNumber
130 andIndex:i+1] lowercaseString];
131 if (extensionsList) {
132 extensions = [extensionsList componentsSeparatedByString:@","];
133 [MIMEToExtensionsDictionary setObject:extensions forKey:MIME];
135 // DRM and WMP claim MIMEs without extensions. Use a @"" extension in this case.
136 [MIMEToExtensionsDictionary setObject:[NSArray arrayWithObject:@""] forKey:MIME];
139 description = [self stringForStringListID:MIMEDescriptionStringNumber
140 andIndex:[MIMEToExtensionsDictionary count]];
142 [MIMEToDescriptionDictionary setObject:description forKey:MIME];
144 [MIMEToDescriptionDictionary setObject:@"" forKey:MIME];
148 [self setMIMEToDescriptionDictionary:MIMEToDescriptionDictionary];
149 [self setMIMEToExtensionsDictionary:MIMEToExtensionsDictionary];
151 NSString *filename = [self filename];
153 description = [self stringForStringListID:PluginNameOrDescriptionStringNumber andIndex:1];
155 description = filename;
157 [self setPluginDescription:description];
160 NSString *theName = [self stringForStringListID:PluginNameOrDescriptionStringNumber andIndex:2];
164 [self setName:theName];
166 [self closeResourceFile:resRef];
171 - initWithPath:(NSString *)pluginPath
173 [super initWithPath:pluginPath];
182 CFBundleGetPackageInfo(cfBundle, &type, NULL);
185 // Single-file plug-in with resource fork
187 type = [[[NSFileManager defaultManager] fileAttributesAtPath:path traverseLink:YES] fileHFSTypeCode];
193 if (type != FOUR_CHAR_CODE('BRPL')) {
198 // Check if the executable is Mach-O or CFM.
200 NSFileHandle *executableFile = [NSFileHandle fileHandleForReadingAtPath:[bundle executablePath]];
201 NSData *data = [executableFile readDataOfLength:8];
202 [executableFile closeFile];
203 // Check the length of the data before calling memcmp. We think this fixes 3782543.
204 if (data == nil || [data length] < 8) {
208 isCFM = memcmp([data bytes], "Joy!peff", 8) == 0;
218 if (![self getPluginInfoFromPLists] && ![self getPluginInfoFromResources]) {
226 - (WebExecutableType)executableType
229 return WebCFMExecutableType;
231 return WebMachOExecutableType;
240 - (void)unloadWithoutShutdown
246 if (resourceRef != -1) {
247 [self closeResourceFile:resourceRef];
251 CFBundleUnloadExecutable(cfBundle);
253 CloseConnection(&connID);
256 LOG(Plugins, "Plugin Unloaded");
261 - (void)launchRealPlayer
263 CFURLRef appURL = NULL;
264 OSStatus error = LSFindApplicationForInfo(kLSUnknownCreator, (CFStringRef)RealPlayerAppIndentifier, NULL, NULL, &appURL);
266 LSLaunchURLSpec URLSpec;
267 bzero(&URLSpec, sizeof(URLSpec));
268 URLSpec.launchFlags = kLSLaunchDefaults | kLSLaunchDontSwitch;
269 URLSpec.appURL = appURL;
270 LSOpenFromURLSpec(&URLSpec, NULL);
277 NP_GetEntryPointsFuncPtr NP_GetEntryPoints = NULL;
278 NP_InitializeFuncPtr NP_Initialize = NULL;
279 MainFuncPtr pluginMainFunc;
284 CFAbsoluteTime start = CFAbsoluteTimeGetCurrent();
286 LOG(Plugins, "%f Load timing started for: %@", start, [self name]);
293 if (!CFBundleLoadExecutable(cfBundle)) {
297 CFAbsoluteTime currentTime = CFAbsoluteTimeGetCurrent();
298 CFAbsoluteTime duration = currentTime - start;
300 LOG(Plugins, "%f CFBundleLoadExecutable took %f seconds", currentTime, duration);
304 pluginMainFunc = (MainFuncPtr)CFBundleGetFunctionPointerForName(cfBundle, CFSTR("main") );
305 if (!pluginMainFunc) {
309 NP_Initialize = (NP_InitializeFuncPtr)CFBundleGetFunctionPointerForName(cfBundle, CFSTR("NP_Initialize"));
310 NP_GetEntryPoints = (NP_GetEntryPointsFuncPtr)CFBundleGetFunctionPointerForName(cfBundle, CFSTR("NP_GetEntryPoints"));
311 NPP_Shutdown = (NPP_ShutdownProcPtr)CFBundleGetFunctionPointerForName(cfBundle, CFSTR("NP_Shutdown"));
312 if (!NP_Initialize || !NP_GetEntryPoints || !NPP_Shutdown) {
321 err = FSPathMakeRef((UInt8 *)[path fileSystemRepresentation], &fref, NULL);
323 ERROR("FSPathMakeRef failed. Error=%d", err);
326 err = FSGetCatalogInfo(&fref, kFSCatInfoNone, NULL, NULL, &spec, NULL);
328 ERROR("FSGetCatalogInfo failed. Error=%d", err);
331 err = GetDiskFragment(&spec, 0, kCFragGoesToEOF, nil, kPrivateCFragCopy, &connID, (Ptr *)&pluginMainFunc, nil);
333 ERROR("GetDiskFragment failed. Error=%d", err);
337 CFAbsoluteTime currentTime = CFAbsoluteTimeGetCurrent();
338 CFAbsoluteTime duration = currentTime - start;
340 LOG(Plugins, "%f GetDiskFragment took %f seconds", currentTime, duration);
343 pluginMainFunc = (MainFuncPtr)functionPointerForTVector((TransitionVector)pluginMainFunc);
344 if (!pluginMainFunc) {
348 // NOTE: pluginMainFunc is freed after it is called. Be sure not to return before that.
353 // Plugins (at least QT) require that you call UseResFile on the resource file before loading it.
354 resourceRef = [self openResourceFile];
355 if (resourceRef != -1) {
356 UseResFile(resourceRef);
359 // swap function tables
361 browserFuncs.version = NP_VERSION_MINOR;
362 browserFuncs.size = sizeof(NPNetscapeFuncs);
363 browserFuncs.geturl = (NPN_GetURLProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_GetURL);
364 browserFuncs.posturl = (NPN_PostURLProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_PostURL);
365 browserFuncs.requestread = (NPN_RequestReadProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_RequestRead);
366 browserFuncs.newstream = (NPN_NewStreamProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_NewStream);
367 browserFuncs.write = (NPN_WriteProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_Write);
368 browserFuncs.destroystream = (NPN_DestroyStreamProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_DestroyStream);
369 browserFuncs.status = (NPN_StatusProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_Status);
370 browserFuncs.uagent = (NPN_UserAgentProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_UserAgent);
371 browserFuncs.memalloc = (NPN_MemAllocProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_MemAlloc);
372 browserFuncs.memfree = (NPN_MemFreeProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_MemFree);
373 browserFuncs.memflush = (NPN_MemFlushProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_MemFlush);
374 browserFuncs.reloadplugins = (NPN_ReloadPluginsProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_ReloadPlugins);
375 browserFuncs.geturlnotify = (NPN_GetURLNotifyProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_GetURLNotify);
376 browserFuncs.posturlnotify = (NPN_PostURLNotifyProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_PostURLNotify);
377 browserFuncs.getvalue = (NPN_GetValueProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_GetValue);
378 browserFuncs.setvalue = (NPN_SetValueProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_SetValue);
379 browserFuncs.invalidaterect = (NPN_InvalidateRectProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_InvalidateRect);
380 browserFuncs.invalidateregion = (NPN_InvalidateRegionProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_InvalidateRegion);
381 browserFuncs.forceredraw = (NPN_ForceRedrawProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_ForceRedraw);
382 browserFuncs.getJavaEnv = (NPN_GetJavaEnvProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_GetJavaEnv);
383 browserFuncs.getJavaPeer = (NPN_GetJavaPeerProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_GetJavaPeer);
385 browserFuncs.releasevariantvalue = (NPN_ReleaseVariantValueProcPtr)tVectorForFunctionPointer((FunctionPointer)_NPN_ReleaseVariantValue);
386 browserFuncs.getstringidentifier = (NPN_GetStringIdentifierProcPtr)tVectorForFunctionPointer((FunctionPointer)_NPN_GetStringIdentifier);
387 browserFuncs.getstringidentifiers = (NPN_GetStringIdentifiersProcPtr)tVectorForFunctionPointer((FunctionPointer)_NPN_GetStringIdentifiers);
388 browserFuncs.getintidentifier = (NPN_GetIntIdentifierProcPtr)tVectorForFunctionPointer((FunctionPointer)_NPN_GetIntIdentifier);
389 browserFuncs.identifierisstring = (NPN_IdentifierIsStringProcPtr)tVectorForFunctionPointer((FunctionPointer)_NPN_IdentifierIsString);
390 browserFuncs.utf8fromidentifier = (NPN_UTF8FromIdentifierProcPtr)tVectorForFunctionPointer((FunctionPointer)_NPN_UTF8FromIdentifier);
391 browserFuncs.createobject = (NPN_CreateObjectProcPtr)tVectorForFunctionPointer((FunctionPointer)_NPN_CreateObject);
392 browserFuncs.retainobject = (NPN_RetainObjectProcPtr)tVectorForFunctionPointer((FunctionPointer)_NPN_RetainObject);
393 browserFuncs.releaseobject = (NPN_ReleaseObjectProcPtr)tVectorForFunctionPointer((FunctionPointer)_NPN_ReleaseObject);
394 browserFuncs.invoke = (NPN_InvokeProcPtr)tVectorForFunctionPointer((FunctionPointer)_NPN_Invoke);
395 browserFuncs.invokeDefault = (NPN_InvokeDefaultProcPtr)tVectorForFunctionPointer((FunctionPointer)_NPN_InvokeDefault);
396 browserFuncs.evaluate = (NPN_EvaluateProcPtr)tVectorForFunctionPointer((FunctionPointer)_NPN_Evaluate);
397 browserFuncs.getproperty = (NPN_GetPropertyProcPtr)tVectorForFunctionPointer((FunctionPointer)_NPN_GetProperty);
398 browserFuncs.setproperty = (NPN_SetPropertyProcPtr)tVectorForFunctionPointer((FunctionPointer)_NPN_SetProperty);
399 browserFuncs.removeproperty = (NPN_RemovePropertyProcPtr)tVectorForFunctionPointer((FunctionPointer)_NPN_RemoveProperty);
400 browserFuncs.setexception = (NPN_SetExceptionProcPtr)tVectorForFunctionPointer((FunctionPointer)_NPN_SetException);
403 CFAbsoluteTime mainStart = CFAbsoluteTimeGetCurrent();
405 LOG(Plugins, "%f main timing started", mainStart);
406 NPP_ShutdownProcPtr shutdownFunction;
407 npErr = pluginMainFunc(&browserFuncs, &pluginFuncs, &shutdownFunction);
408 NPP_Shutdown = (NPP_ShutdownProcPtr)functionPointerForTVector((TransitionVector)shutdownFunction);
410 // Don't free pluginMainFunc if we got it from a bundle because it is owned by CFBundle in that case.
411 free(pluginMainFunc);
414 // Workaround for 3270576. The RealPlayer plug-in fails to load if its preference file is out of date.
415 // Launch the RealPlayer application to refresh the file.
416 if (npErr != NPERR_NO_ERROR) {
417 if (npErr == NPERR_MODULE_LOAD_FAILED_ERROR && [[self filename] isEqualToString:RealPlayerPluginFilename]) {
418 [self launchRealPlayer];
423 CFAbsoluteTime currentTime = CFAbsoluteTimeGetCurrent();
424 CFAbsoluteTime duration = currentTime - mainStart;
426 LOG(Plugins, "%f main took %f seconds", currentTime, duration);
428 pluginSize = pluginFuncs.size;
429 pluginVersion = pluginFuncs.version;
430 LOG(Plugins, "pluginMainFunc: %d, size=%d, version=%d", npErr, pluginSize, pluginVersion);
432 NPP_New = (NPP_NewProcPtr)functionPointerForTVector((TransitionVector)pluginFuncs.newp);
433 NPP_Destroy = (NPP_DestroyProcPtr)functionPointerForTVector((TransitionVector)pluginFuncs.destroy);
434 NPP_SetWindow = (NPP_SetWindowProcPtr)functionPointerForTVector((TransitionVector)pluginFuncs.setwindow);
435 NPP_NewStream = (NPP_NewStreamProcPtr)functionPointerForTVector((TransitionVector)pluginFuncs.newstream);
436 NPP_DestroyStream = (NPP_DestroyStreamProcPtr)functionPointerForTVector((TransitionVector)pluginFuncs.destroystream);
437 NPP_StreamAsFile = (NPP_StreamAsFileProcPtr)functionPointerForTVector((TransitionVector)pluginFuncs.asfile);
438 NPP_WriteReady = (NPP_WriteReadyProcPtr)functionPointerForTVector((TransitionVector)pluginFuncs.writeready);
439 NPP_Write = (NPP_WriteProcPtr)functionPointerForTVector((TransitionVector)pluginFuncs.write);
440 NPP_Print = (NPP_PrintProcPtr)functionPointerForTVector((TransitionVector)pluginFuncs.print);
441 NPP_HandleEvent = (NPP_HandleEventProcPtr)functionPointerForTVector((TransitionVector)pluginFuncs.event);
442 NPP_URLNotify = (NPP_URLNotifyProcPtr)functionPointerForTVector((TransitionVector)pluginFuncs.urlnotify);
443 NPP_GetValue = (NPP_GetValueProcPtr)functionPointerForTVector((TransitionVector)pluginFuncs.getvalue);
444 NPP_SetValue = (NPP_SetValueProcPtr)functionPointerForTVector((TransitionVector)pluginFuncs.setvalue);
446 // LiveConnect support
447 NPP_GetJavaClass = (NPP_GetJavaClassProcPtr)functionPointerForTVector((TransitionVector)pluginFuncs.javaClass);
448 if (NPP_GetJavaClass){
449 LOG(LiveConnect, "%@: CFM entry point for NPP_GetJavaClass = %p", [self name], NPP_GetJavaClass);
451 LOG(LiveConnect, "%@: no entry point for NPP_GetJavaClass", [self name]);
455 // no function pointer conversion necessary for mach-o
456 browserFuncs.version = NP_VERSION_MINOR;
457 browserFuncs.size = sizeof(NPNetscapeFuncs);
458 browserFuncs.geturl = NPN_GetURL;
459 browserFuncs.posturl = NPN_PostURL;
460 browserFuncs.requestread = NPN_RequestRead;
461 browserFuncs.newstream = NPN_NewStream;
462 browserFuncs.write = NPN_Write;
463 browserFuncs.destroystream = NPN_DestroyStream;
464 browserFuncs.status = NPN_Status;
465 browserFuncs.uagent = NPN_UserAgent;
466 browserFuncs.memalloc = NPN_MemAlloc;
467 browserFuncs.memfree = NPN_MemFree;
468 browserFuncs.memflush = NPN_MemFlush;
469 browserFuncs.reloadplugins = NPN_ReloadPlugins;
470 browserFuncs.geturlnotify = NPN_GetURLNotify;
471 browserFuncs.posturlnotify = NPN_PostURLNotify;
472 browserFuncs.getvalue = NPN_GetValue;
473 browserFuncs.setvalue = NPN_SetValue;
474 browserFuncs.invalidaterect = NPN_InvalidateRect;
475 browserFuncs.invalidateregion = NPN_InvalidateRegion;
476 browserFuncs.forceredraw = NPN_ForceRedraw;
477 browserFuncs.getJavaEnv = NPN_GetJavaEnv;
478 browserFuncs.getJavaPeer = NPN_GetJavaPeer;
480 browserFuncs.releasevariantvalue = _NPN_ReleaseVariantValue;
481 browserFuncs.getstringidentifier = _NPN_GetStringIdentifier;
482 browserFuncs.getstringidentifiers = _NPN_GetStringIdentifiers;
483 browserFuncs.getintidentifier = _NPN_GetIntIdentifier;
484 browserFuncs.identifierisstring = _NPN_IdentifierIsString;
485 browserFuncs.utf8fromidentifier = _NPN_UTF8FromIdentifier;
486 browserFuncs.createobject = _NPN_CreateObject;
487 browserFuncs.retainobject = _NPN_RetainObject;
488 browserFuncs.releaseobject = _NPN_ReleaseObject;
489 browserFuncs.invoke = _NPN_Invoke;
490 browserFuncs.invokeDefault = _NPN_InvokeDefault;
491 browserFuncs.evaluate = _NPN_Evaluate;
492 browserFuncs.getproperty = _NPN_GetProperty;
493 browserFuncs.setproperty = _NPN_SetProperty;
494 browserFuncs.removeproperty = _NPN_RemoveProperty;
495 browserFuncs.setexception = _NPN_SetException;
498 CFAbsoluteTime initializeStart = CFAbsoluteTimeGetCurrent();
500 LOG(Plugins, "%f NP_Initialize timing started", initializeStart);
501 npErr = NP_Initialize(&browserFuncs);
502 if (npErr != NPERR_NO_ERROR) {
506 CFAbsoluteTime currentTime = CFAbsoluteTimeGetCurrent();
507 CFAbsoluteTime duration = currentTime - initializeStart;
509 LOG(Plugins, "%f NP_Initialize took %f seconds", currentTime, duration);
511 npErr = NP_GetEntryPoints(&pluginFuncs);
512 if (npErr != NPERR_NO_ERROR) {
516 pluginSize = pluginFuncs.size;
517 pluginVersion = pluginFuncs.version;
519 NPP_New = pluginFuncs.newp;
520 NPP_Destroy = pluginFuncs.destroy;
521 NPP_SetWindow = pluginFuncs.setwindow;
522 NPP_NewStream = pluginFuncs.newstream;
523 NPP_DestroyStream = pluginFuncs.destroystream;
524 NPP_StreamAsFile = pluginFuncs.asfile;
525 NPP_WriteReady = pluginFuncs.writeready;
526 NPP_Write = pluginFuncs.write;
527 NPP_Print = pluginFuncs.print;
528 NPP_HandleEvent = pluginFuncs.event;
529 NPP_URLNotify = pluginFuncs.urlnotify;
530 NPP_GetValue = pluginFuncs.getvalue;
531 NPP_SetValue = pluginFuncs.setvalue;
533 // LiveConnect support
534 NPP_GetJavaClass = pluginFuncs.javaClass;
535 if (NPP_GetJavaClass){
536 LOG(LiveConnect, "%@: mach-o entry point for NPP_GetJavaClass = %p", [self name], NPP_GetJavaClass);
538 LOG(LiveConnect, "%@: no entry point for NPP_GetJavaClass", [self name]);
543 CFAbsoluteTime currentTime = CFAbsoluteTimeGetCurrent();
544 CFAbsoluteTime duration = currentTime - start;
546 LOG(Plugins, "%f Total load time: %f seconds", currentTime, duration);
551 [self unloadWithoutShutdown];
561 LOG(Plugins, "Unloading %@...", name);
565 [self unloadWithoutShutdown];
568 - (NPP_SetWindowProcPtr)NPP_SetWindow
570 return NPP_SetWindow;
573 - (NPP_NewProcPtr)NPP_New
578 - (NPP_DestroyProcPtr)NPP_Destroy
583 - (NPP_NewStreamProcPtr)NPP_NewStream
585 return NPP_NewStream;
588 - (NPP_StreamAsFileProcPtr)NPP_StreamAsFile
590 return NPP_StreamAsFile;
592 - (NPP_DestroyStreamProcPtr)NPP_DestroyStream
594 return NPP_DestroyStream;
597 - (NPP_WriteReadyProcPtr)NPP_WriteReady
599 return NPP_WriteReady;
601 - (NPP_WriteProcPtr)NPP_Write
606 - (NPP_HandleEventProcPtr)NPP_HandleEvent
608 return NPP_HandleEvent;
611 -(NPP_URLNotifyProcPtr)NPP_URLNotify
613 return NPP_URLNotify;
616 -(NPP_GetValueProcPtr)NPP_GetValue
621 -(NPP_SetValueProcPtr)NPP_SetValue
626 -(NPP_PrintProcPtr)NPP_Print
634 // function pointer converters
636 FunctionPointer functionPointerForTVector(TransitionVector tvp)
638 const uint32 temp[6] = {0x3D800000, 0x618C0000, 0x800C0000, 0x804C0004, 0x7C0903A6, 0x4E800420};
639 uint32 *newGlue = NULL;
642 newGlue = (uint32 *)malloc(sizeof(temp));
643 if (newGlue != NULL) {
645 for (i = 0; i < 6; i++) newGlue[i] = temp[i];
646 newGlue[0] |= ((UInt32)tvp >> 16);
647 newGlue[1] |= ((UInt32)tvp & 0xFFFF);
648 MakeDataExecutable(newGlue, sizeof(temp));
652 return (FunctionPointer)newGlue;
655 TransitionVector tVectorForFunctionPointer(FunctionPointer fp)
657 FunctionPointer *newGlue = NULL;
659 newGlue = (FunctionPointer *)malloc(2 * sizeof(FunctionPointer));
660 if (newGlue != NULL) {
665 return (TransitionVector)newGlue;