npmac.cpp
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:44k
源码类别:

midi

开发平台:

Unix_Linux

  1. /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
  2.  *
  3.  * Safari/Mozilla/Firefox plugin for VLC
  4.  * Copyright (C) 2009, Jean-Paul Saman <jpsaman@videolan.org>
  5.  *
  6.  * This library is free software; you can redistribute it and/or
  7.  * modify it under the terms of the GNU Lesser General Public
  8.  * License as published by the Free Software Foundation; either
  9.  * version 2.1 of the License, or (at your option) any later version.
  10.  *
  11.  * This library is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14.  * Lesser General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU Lesser General Public
  17.  * License along with this library; if not, write to the Free Software
  18.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  19.  */
  20. //::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  21. //
  22. // npmac.cpp
  23. //
  24. //::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  25. #include "config.h"
  26. #include <string.h>
  27. #include <Processes.h>
  28. #include <Gestalt.h>
  29. #include <CodeFragments.h>
  30. #include <Timer.h>
  31. #include <Resources.h>
  32. #include <ToolUtils.h>
  33. #define XP_MACOSX 1
  34. #undef TARGET_RT_MAC_CFM
  35. //
  36. // A4Stuff.h contains the definition of EnterCodeResource and
  37. // EnterCodeResource, used for setting up the code resource’s
  38. // globals for 68K (analagous to the function SetCurrentA5
  39. // defined by the toolbox).
  40. //
  41. // A4Stuff does not exist as of CW 7. Define them to nothing.
  42. //
  43. #if (defined(__MWERKS__) && (__MWERKS__ >= 0x2400)) || defined(__GNUC__)
  44.     #define EnterCodeResource()
  45.     #define ExitCodeResource()
  46. #else
  47.     #include <A4Stuff.h>
  48. #endif
  49. #include "npapi.h"
  50. //
  51. // The Mixed Mode procInfos defined in npupp.h assume Think C-
  52. // style calling conventions.  These conventions are used by
  53. // Metrowerks with the exception of pointer return types, which
  54. // in Metrowerks 68K are returned in A0, instead of the standard
  55. // D0. Thus, since NPN_MemAlloc and NPN_UserAgent return pointers,
  56. // Mixed Mode will return the values to a 68K plugin in D0, but
  57. // a 68K plugin compiled by Metrowerks will expect the result in
  58. // A0.  The following pragma forces Metrowerks to use D0 instead.
  59. //
  60. #ifdef __MWERKS__
  61. #ifndef powerc
  62. #pragma pointers_in_D0
  63. #endif
  64. #endif
  65. #ifdef XP_UNIX
  66. #undef XP_UNIX
  67. #endif
  68. #ifdef HAVE_NPFUNCTIONS_H
  69. #include "npfunctions.h"
  70. #else
  71. #include "npupp.h"
  72. #endif
  73. #include "../vlcshell.h"
  74. #ifdef __MWERKS__
  75. #ifndef powerc
  76. #pragma pointers_in_A0
  77. #endif
  78. #endif
  79. // The following fix for static initializers (which fixes a previous
  80. // incompatibility with some parts of PowerPlant, was submitted by
  81. // Jan Ulbrich.
  82. #ifdef __MWERKS__
  83.     #ifdef __cplusplus
  84.     extern "C" {
  85.     #endif
  86.         #ifndef powerc
  87.             extern void __InitCode__(void);
  88.         #else
  89.             extern void __sinit(void);
  90.             #define __InitCode__ __sinit
  91.         #endif
  92.         extern void __destroy_global_chain(void);
  93.     #ifdef __cplusplus
  94.     }
  95.     #endif // __cplusplus
  96. #endif // __MWERKS__
  97. //
  98. // Define PLUGIN_TRACE to 1 to have the wrapper functions emit
  99. // DebugStr messages whenever they are called.
  100. //
  101. #define PLUGIN_TRACE 0
  102. #if PLUGIN_TRACE
  103. #define PLUGINDEBUGSTR(msg)     ::DebugStr(msg)
  104. #else
  105. #define PLUGINDEBUGSTR(msg) {}
  106. #endif
  107. #if defined(XP_MACOSX) && defined(__POWERPC__) && (!defined(TARGET_RT_MAC_CFM))
  108. // glue for mapping outgoing Macho function pointers to TVectors
  109. struct TFPtoTVGlue {
  110.     void* glue[2];
  111. };
  112. static struct {
  113.     TFPtoTVGlue     newp;
  114.     TFPtoTVGlue     destroy;
  115.     TFPtoTVGlue     setwindow;
  116.     TFPtoTVGlue     newstream;
  117.     TFPtoTVGlue     destroystream;
  118.     TFPtoTVGlue     asfile;
  119.     TFPtoTVGlue     writeready;
  120.     TFPtoTVGlue     write;
  121.     TFPtoTVGlue     print;
  122.     TFPtoTVGlue     event;
  123.     TFPtoTVGlue     urlnotify;
  124.     TFPtoTVGlue     getvalue;
  125.     TFPtoTVGlue     setvalue;
  126.     TFPtoTVGlue     shutdown;
  127. } gPluginFuncsGlueTable;
  128. static inline void* SetupFPtoTVGlue(TFPtoTVGlue* functionGlue, void* fp)
  129. {
  130.     functionGlue->glue[0] = fp;
  131.     functionGlue->glue[1] = 0;
  132.     return functionGlue;
  133. }
  134. #define PLUGIN_TO_HOST_GLUE(name, fp) (SetupFPtoTVGlue(&gPluginFuncsGlueTable.name, (void*)fp))
  135. // glue for mapping netscape TVectors to Macho function pointers
  136. struct TTVtoFPGlue {
  137.     uint32_t glue[6];
  138. };
  139. static struct {
  140.     TTVtoFPGlue             geturl;
  141.     TTVtoFPGlue             posturl;
  142.     TTVtoFPGlue             requestread;
  143.     TTVtoFPGlue             newstream;
  144.     TTVtoFPGlue             write;
  145.     TTVtoFPGlue             destroystream;
  146.     TTVtoFPGlue             status;
  147.     TTVtoFPGlue             uagent;
  148.     TTVtoFPGlue             memalloc;
  149.     TTVtoFPGlue             memfree;
  150.     TTVtoFPGlue             memflush;
  151.     TTVtoFPGlue             reloadplugins;
  152.     TTVtoFPGlue             getJavaEnv;
  153.     TTVtoFPGlue             getJavaPeer;
  154.     TTVtoFPGlue             geturlnotify;
  155.     TTVtoFPGlue             posturlnotify;
  156.     TTVtoFPGlue             getvalue;
  157.     TTVtoFPGlue             setvalue;
  158.     TTVtoFPGlue             invalidaterect;
  159.     TTVtoFPGlue             invalidateregion;
  160.     TTVtoFPGlue             forceredraw;
  161.     // NPRuntime support
  162.     TTVtoFPGlue             getstringidentifier;
  163.     TTVtoFPGlue             getstringidentifiers;
  164.     TTVtoFPGlue             getintidentifier;
  165.     TTVtoFPGlue             identifierisstring;
  166.     TTVtoFPGlue             utf8fromidentifier;
  167.     TTVtoFPGlue             intfromidentifier;
  168.     TTVtoFPGlue             createobject;
  169.     TTVtoFPGlue             retainobject;
  170.     TTVtoFPGlue             releaseobject;
  171.     TTVtoFPGlue             invoke;
  172.     TTVtoFPGlue             invokeDefault;
  173.     TTVtoFPGlue             evaluate;
  174.     TTVtoFPGlue             getproperty;
  175.     TTVtoFPGlue             setproperty;
  176.     TTVtoFPGlue             removeproperty;
  177.     TTVtoFPGlue             hasproperty;
  178.     TTVtoFPGlue             hasmethod;
  179.     TTVtoFPGlue             releasevariantvalue;
  180.     TTVtoFPGlue             setexception;
  181. } gNetscapeFuncsGlueTable;
  182. static void* SetupTVtoFPGlue(TTVtoFPGlue* functionGlue, void* tvp)
  183. {
  184.     static const TTVtoFPGlue glueTemplate = { 0x3D800000, 0x618C0000, 0x800C0000, 0x804C0004, 0x7C0903A6, 0x4E800420 };
  185.     memcpy(functionGlue, &glueTemplate, sizeof(TTVtoFPGlue));
  186.     functionGlue->glue[0] |= ((UInt32)tvp >> 16);
  187.     functionGlue->glue[1] |= ((UInt32)tvp & 0xFFFF);
  188.     ::MakeDataExecutable(functionGlue, sizeof(TTVtoFPGlue));
  189.     return functionGlue;
  190. }
  191. #define HOST_TO_PLUGIN_GLUE(name, fp) (SetupTVtoFPGlue(&gNetscapeFuncsGlueTable.name, (void*)fp))
  192. #else
  193. #define PLUGIN_TO_HOST_GLUE(name, fp) (fp)
  194. #define HOST_TO_PLUGIN_GLUE(name, fp) (fp)
  195. #endif /* XP_MACOSX */
  196. #pragma mark -
  197. //::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  198. //
  199. // Globals
  200. //
  201. //::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  202. #if !TARGET_API_MAC_CARBON
  203. QDGlobals*      gQDPtr;             // Pointer to Netscape’s QuickDraw globals
  204. #endif
  205. short           gResFile;           // Refnum of the plugin’s resource file
  206. NPNetscapeFuncs    gNetscapeFuncs;      // Function table for procs in Netscape called by plugin
  207. //::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  208. //
  209. // Wrapper functions for all calls from the plugin to Netscape.
  210. // These functions let the plugin developer just call the APIs
  211. // as documented and defined in npapi.h, without needing to know
  212. // about the function table and call macros in npupp.h.
  213. //
  214. //::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  215. void NPN_Version(int* plugin_major, int* plugin_minor, int* netscape_major, int* netscape_minor)
  216. {
  217.     *plugin_major = NP_VERSION_MAJOR;
  218.     *plugin_minor = NP_VERSION_MINOR;
  219.     *netscape_major = gNetscapeFuncs.version >> 8;      // Major version is in high byte
  220.     *netscape_minor = gNetscapeFuncs.version & 0xFF;    // Minor version is in low byte
  221. }
  222. NPError NPN_GetURLNotify(NPP instance, const char* url, const char* window, void* notifyData)
  223. {
  224.     int navMinorVers = gNetscapeFuncs.version & 0xFF;
  225.     NPError err;
  226.     if( navMinorVers >= NPVERS_HAS_NOTIFICATION )
  227.     {
  228.         err = CallNPN_GetURLNotifyProc(gNetscapeFuncs.geturlnotify, instance, url, window, notifyData);
  229.     }
  230.     else
  231.     {
  232.         err = NPERR_INCOMPATIBLE_VERSION_ERROR;
  233.     }
  234.     return err;
  235. }
  236. NPError NPN_GetURL(NPP instance, const char* url, const char* window)
  237. {
  238.     return CallNPN_GetURLProc(gNetscapeFuncs.geturl, instance, url, window);
  239. }
  240. NPError NPN_PostURLNotify(NPP instance, const char* url, const char* window, uint32_t len, const char* buf, NPBool file, void* notifyData)
  241. {
  242.     int navMinorVers = gNetscapeFuncs.version & 0xFF;
  243.     NPError err;
  244.     if( navMinorVers >= NPVERS_HAS_NOTIFICATION )
  245.     {
  246.         err = CallNPN_PostURLNotifyProc(gNetscapeFuncs.posturlnotify, instance, url,
  247.                                                         window, len, buf, file, notifyData);
  248.     }
  249.     else
  250.     {
  251.         err = NPERR_INCOMPATIBLE_VERSION_ERROR;
  252.     }
  253.     return err;
  254. }
  255. NPError NPN_PostURL(NPP instance, const char* url, const char* window, uint32_t len, const char* buf, NPBool file)
  256. {
  257.     return CallNPN_PostURLProc(gNetscapeFuncs.posturl, instance, url, window, len, buf, file);
  258. }
  259. NPError NPN_RequestRead(NPStream* stream, NPByteRange* rangeList)
  260. {
  261.     return CallNPN_RequestReadProc(gNetscapeFuncs.requestread, stream, rangeList);
  262. }
  263. NPError NPN_NewStream(NPP instance, NPMIMEType type, const char* window, NPStream** stream)
  264. {
  265.     int navMinorVers = gNetscapeFuncs.version & 0xFF;
  266.     NPError err;
  267.     if( navMinorVers >= NPVERS_HAS_STREAMOUTPUT )
  268.     {
  269.         err = CallNPN_NewStreamProc(gNetscapeFuncs.newstream, instance, type, window, stream);
  270.     }
  271.     else
  272.     {
  273.         err = NPERR_INCOMPATIBLE_VERSION_ERROR;
  274.     }
  275.     return err;
  276. }
  277. int32_t NPN_Write(NPP instance, NPStream* stream, int32_t len, void* buffer)
  278. {
  279.     int navMinorVers = gNetscapeFuncs.version & 0xFF;
  280.     NPError err;
  281.     if( navMinorVers >= NPVERS_HAS_STREAMOUTPUT )
  282.     {
  283.         err = CallNPN_WriteProc(gNetscapeFuncs.write, instance, stream, len, buffer);
  284.     }
  285.     else
  286.     {
  287.         err = NPERR_INCOMPATIBLE_VERSION_ERROR;
  288.     }
  289.     return err;
  290. }
  291. NPError    NPN_DestroyStream(NPP instance, NPStream* stream, NPError reason)
  292. {
  293.     int navMinorVers = gNetscapeFuncs.version & 0xFF;
  294.     NPError err;
  295.     if( navMinorVers >= NPVERS_HAS_STREAMOUTPUT )
  296.     {
  297.         err = CallNPN_DestroyStreamProc(gNetscapeFuncs.destroystream, instance, stream, reason);
  298.     }
  299.     else
  300.     {
  301.         err = NPERR_INCOMPATIBLE_VERSION_ERROR;
  302.     }
  303.     return err;
  304. }
  305. void NPN_Status(NPP instance, const char* message)
  306. {
  307.     CallNPN_StatusProc(gNetscapeFuncs.status, instance, message);
  308. }
  309. const char* NPN_UserAgent(NPP instance)
  310. {
  311.     return CallNPN_UserAgentProc(gNetscapeFuncs.uagent, instance);
  312. }
  313. void* NPN_MemAlloc(uint32_t size)
  314. {
  315.     return CallNPN_MemAllocProc(gNetscapeFuncs.memalloc, size);
  316. }
  317. void NPN_MemFree(void* ptr)
  318. {
  319.     CallNPN_MemFreeProc(gNetscapeFuncs.memfree, ptr);
  320. }
  321. uint32_t NPN_MemFlush(uint32_t size)
  322. {
  323.     return CallNPN_MemFlushProc(gNetscapeFuncs.memflush, size);
  324. }
  325. void NPN_ReloadPlugins(NPBool reloadPages)
  326. {
  327.     CallNPN_ReloadPluginsProc(gNetscapeFuncs.reloadplugins, reloadPages);
  328. }
  329. #ifdef OJI
  330. JRIEnv* NPN_GetJavaEnv(void)
  331. {
  332.     return CallNPN_GetJavaEnvProc( gNetscapeFuncs.getJavaEnv );
  333. }
  334. jobject  NPN_GetJavaPeer(NPP instance)
  335. {
  336.     return CallNPN_GetJavaPeerProc( gNetscapeFuncs.getJavaPeer, instance );
  337. }
  338. #endif
  339. NPError NPN_GetValue(NPP instance, NPNVariable variable, void *value)
  340. {
  341.     return CallNPN_GetValueProc( gNetscapeFuncs.getvalue, instance, variable, value);
  342. }
  343. NPError NPN_SetValue(NPP instance, NPPVariable variable, void *value)
  344. {
  345.     return CallNPN_SetValueProc( gNetscapeFuncs.setvalue, instance, variable, value);
  346. }
  347. void NPN_InvalidateRect(NPP instance, NPRect *rect)
  348. {
  349.     CallNPN_InvalidateRectProc( gNetscapeFuncs.invalidaterect, instance, rect);
  350. }
  351. void NPN_InvalidateRegion(NPP instance, NPRegion region)
  352. {
  353.     CallNPN_InvalidateRegionProc( gNetscapeFuncs.invalidateregion, instance, region);
  354. }
  355. void NPN_ForceRedraw(NPP instance)
  356. {
  357.     CallNPN_ForceRedrawProc( gNetscapeFuncs.forceredraw, instance);
  358. }
  359. NPIdentifier NPN_GetStringIdentifier(const NPUTF8 *name)
  360. {
  361.     int navMinorVers = gNetscapeFuncs.version & 0xFF;
  362.     if( navMinorVers >= 14 )
  363.     {
  364.         return CallNPN_GetStringIdentifierProc( gNetscapeFuncs.getstringidentifier, name);
  365.     }
  366.     return NULL;
  367. }
  368. void NPN_GetStringIdentifiers(const NPUTF8 **names, int32_t nameCount, NPIdentifier *identifiers)
  369. {
  370.     int navMinorVers = gNetscapeFuncs.version & 0xFF;
  371.     if( navMinorVers >= 14 )
  372.     {
  373.         CallNPN_GetStringIdentifiersProc( gNetscapeFuncs.getstringidentifiers, names, nameCount, identifiers);
  374.     }
  375. }
  376. NPIdentifier NPN_GetIntIdentifier(int32_t intid)
  377. {
  378.     int navMinorVers = gNetscapeFuncs.version & 0xFF;
  379.     if( navMinorVers >= 14 )
  380.     {
  381.         return CallNPN_GetIntIdentifierProc( gNetscapeFuncs.getintidentifier, intid);
  382.     }
  383.     return NULL;
  384. }
  385. bool NPN_IdentifierIsString(NPIdentifier identifier)
  386. {
  387.     int navMinorVers = gNetscapeFuncs.version & 0xFF;
  388.     if( navMinorVers >= 14 )
  389.     {
  390.         return CallNPN_IdentifierIsStringProc( gNetscapeFuncs.identifierisstring, identifier);
  391.     }
  392.     return false;
  393. }
  394. NPUTF8 *NPN_UTF8FromIdentifier(NPIdentifier identifier)
  395. {
  396.     int navMinorVers = gNetscapeFuncs.version & 0xFF;
  397.     if( navMinorVers >= 14 )
  398.     {
  399.         return CallNPN_UTF8FromIdentifierProc( gNetscapeFuncs.utf8fromidentifier, identifier);
  400.     }
  401.     return NULL;
  402. }
  403. int32_t NPN_IntFromIdentifier(NPIdentifier identifier)
  404. {
  405.     int navMinorVers = gNetscapeFuncs.version & 0xFF;
  406.     if( navMinorVers >= 14 )
  407.     {
  408.         return CallNPN_IntFromIdentifierProc( gNetscapeFuncs.intfromidentifier, identifier);
  409.     }
  410.     return 0;
  411. }
  412. NPObject *NPN_CreateObject(NPP instance, NPClass *aClass)
  413. {
  414.     int navMinorVers = gNetscapeFuncs.version & 0xFF;
  415.     if( navMinorVers >= 14 )
  416.     {
  417.         return CallNPN_CreateObjectProc( gNetscapeFuncs.createobject, instance, aClass);
  418.     }
  419.     return NULL;
  420. }
  421. NPObject *NPN_RetainObject(NPObject *npobj)
  422. {
  423.     int navMinorVers = gNetscapeFuncs.version & 0xFF;
  424.     if( navMinorVers >= 14 )
  425.     {
  426.         return CallNPN_RetainObjectProc( gNetscapeFuncs.retainobject, npobj);
  427.     }
  428.     return NULL;
  429. }
  430. void NPN_ReleaseObject(NPObject *npobj)
  431. {
  432.     int navMinorVers = gNetscapeFuncs.version & 0xFF;
  433.     if( navMinorVers >= 14 )
  434.     {
  435.         CallNPN_ReleaseObjectProc( gNetscapeFuncs.releaseobject, npobj);
  436.     }
  437. }
  438. bool NPN_Invoke(NPP instance, NPObject *npobj, NPIdentifier methodName, const NPVariant *args, uint32_t argCount, NPVariant *result)
  439. {
  440.     int navMinorVers = gNetscapeFuncs.version & 0xFF;
  441.     if( navMinorVers >= 14 )
  442.     {
  443.         return CallNPN_InvokeProc( gNetscapeFuncs.invoke, instance, npobj, methodName, args, argCount, result);
  444.     }
  445.     return false;
  446. }
  447. bool NPN_InvokeDefault(NPP instance, NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result)
  448. {
  449.     int navMinorVers = gNetscapeFuncs.version & 0xFF;
  450.     if( navMinorVers >= 14 )
  451.     {
  452.         return CallNPN_InvokeDefaultProc( gNetscapeFuncs.invokeDefault, instance, npobj, args, argCount, result);
  453.     }
  454.     return false;
  455. }
  456. bool NPN_Evaluate(NPP instance, NPObject *npobj, NPString *script, NPVariant *result)
  457. {
  458.     int navMinorVers = gNetscapeFuncs.version & 0xFF;
  459.     if( navMinorVers >= 14 )
  460.     {
  461.         return CallNPN_EvaluateProc( gNetscapeFuncs.evaluate, instance, npobj, script, result);
  462.     }
  463.     return false;
  464. }
  465. bool NPN_GetProperty(NPP instance, NPObject *npobj, NPIdentifier propertyName, NPVariant *result)
  466. {
  467.     int navMinorVers = gNetscapeFuncs.version & 0xFF;
  468.     if( navMinorVers >= 14 )
  469.     {
  470.         return CallNPN_GetPropertyProc( gNetscapeFuncs.getproperty, instance, npobj, propertyName, result);
  471.     }
  472.     return false;
  473. }
  474. bool NPN_SetProperty(NPP instance, NPObject *npobj, NPIdentifier propertyName, const NPVariant *value)
  475. {
  476.     int navMinorVers = gNetscapeFuncs.version & 0xFF;
  477.     if( navMinorVers >= 14 )
  478.     {
  479.         return CallNPN_SetPropertyProc( gNetscapeFuncs.setproperty, instance, npobj, propertyName, value);
  480.     }
  481.     return false;
  482. }
  483. bool NPN_RemoveProperty(NPP instance, NPObject *npobj, NPIdentifier propertyName)
  484. {
  485.     int navMinorVers = gNetscapeFuncs.version & 0xFF;
  486.     if( navMinorVers >= 14 )
  487.     {
  488.         return CallNPN_RemovePropertyProc( gNetscapeFuncs.removeproperty, instance, npobj, propertyName);
  489.     }
  490.     return false;
  491. }
  492. bool NPN_HasProperty(NPP instance, NPObject *npobj, NPIdentifier propertyName)
  493. {
  494.     int navMinorVers = gNetscapeFuncs.version & 0xFF;
  495.     if( navMinorVers >= 14 )
  496.     {
  497.         return CallNPN_HasPropertyProc( gNetscapeFuncs.hasproperty, instance, npobj, propertyName);
  498.     }
  499.     return false;
  500. }
  501. bool NPN_HasMethod(NPP instance, NPObject *npobj, NPIdentifier methodName)
  502. {
  503.     int navMinorVers = gNetscapeFuncs.version & 0xFF;
  504.     if( navMinorVers >= 14 )
  505.     {
  506.         return CallNPN_HasMethodProc( gNetscapeFuncs.hasmethod, instance, npobj, methodName);
  507.     }
  508.     return false;
  509. }
  510. void NPN_ReleaseVariantValue(NPVariant *variant)
  511. {
  512.     int navMinorVers = gNetscapeFuncs.version & 0xFF;
  513.     if( navMinorVers >= 14 )
  514.     {
  515.         CallNPN_ReleaseVariantValueProc( gNetscapeFuncs.releasevariantvalue, variant);
  516.     }
  517. }
  518. void NPN_SetException(NPObject *npobj, const NPUTF8 *message)
  519. {
  520.     int navMinorVers = gNetscapeFuncs.version & 0xFF;
  521.     if( navMinorVers >= 14 )
  522.     {
  523.         CallNPN_SetExceptionProc( gNetscapeFuncs.setexception, npobj, message);
  524.     }
  525. }
  526. #pragma mark -
  527. //::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  528. //
  529. // Wrapper functions for all calls from Netscape to the plugin.
  530. // These functions let the plugin developer just create the APIs
  531. // as documented and defined in npapi.h, without needing to
  532. // install those functions in the function table or worry about
  533. // setting up globals for 68K plugins.
  534. //
  535. //::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  536. NPError     Private_Initialize(void);
  537. void        Private_Shutdown(void);
  538. NPError     Private_New(NPMIMEType pluginType, NPP instance, uint16_t mode, int16_t argc, char* argn[], char* argv[], NPSavedData* saved);
  539. NPError     Private_Destroy(NPP instance, NPSavedData** save);
  540. NPError     Private_SetWindow(NPP instance, NPWindow* window);
  541. NPError     Private_GetValue( NPP instance, NPPVariable variable, void *value );
  542. NPError     Private_SetValue( NPP instance, NPPVariable variable, void *value );
  543. NPError     Private_NewStream(NPP instance, NPMIMEType type, NPStream* stream, NPBool seekable, uint16_t* stype);
  544. NPError     Private_DestroyStream(NPP instance, NPStream* stream, NPError reason);
  545. int32_t     Private_WriteReady(NPP instance, NPStream* stream);
  546. int32_t     Private_Write(NPP instance, NPStream* stream, int32_t offset, int32_t len, void* buffer);
  547. void        Private_StreamAsFile(NPP instance, NPStream* stream, const char* fname);
  548. void        Private_Print(NPP instance, NPPrint* platformPrint);
  549. int16_t     Private_HandleEvent(NPP instance, void* event);
  550. void        Private_URLNotify(NPP instance, const char* url, NPReason reason, void* notifyData);
  551. jobject     Private_GetJavaClass(void);
  552. NPError Private_Initialize(void)
  553. {
  554.     NPError err;
  555.     EnterCodeResource();
  556.     PLUGINDEBUGSTR("pInitialize;g;");
  557.     err = NPP_Initialize();
  558.     ExitCodeResource();
  559.     return err;
  560. }
  561. void Private_Shutdown(void)
  562. {
  563.     EnterCodeResource();
  564.     PLUGINDEBUGSTR("pShutdown;g;");
  565.     NPP_Shutdown();
  566. #ifdef __MWERKS__
  567.     __destroy_global_chain();
  568. #endif
  569.     ExitCodeResource();
  570. }
  571. NPError    Private_New(NPMIMEType pluginType, NPP instance, uint16_t mode, int16_t argc, char* argn[], char* argv[], NPSavedData* saved)
  572. {
  573.     EnterCodeResource();
  574.     NPError ret = NPP_New(pluginType, instance, mode, argc, argn, argv, saved);
  575.     PLUGINDEBUGSTR("pNew;g;");
  576.     ExitCodeResource();
  577.     return ret;
  578. }
  579. NPError Private_Destroy(NPP instance, NPSavedData** save)
  580. {
  581.     NPError err;
  582.     EnterCodeResource();
  583.     PLUGINDEBUGSTR("pDestroy;g;");
  584.     err = NPP_Destroy(instance, save);
  585.     ExitCodeResource();
  586.     return err;
  587. }
  588. NPError Private_SetWindow(NPP instance, NPWindow* window)
  589. {
  590.     NPError err;
  591.     EnterCodeResource();
  592.     PLUGINDEBUGSTR("pSetWindow;g;");
  593.     err = NPP_SetWindow(instance, window);
  594.     ExitCodeResource();
  595.     return err;
  596. }
  597. NPError Private_GetValue( NPP instance, NPPVariable variable, void *value )
  598. {
  599.     NPError err;
  600.     EnterCodeResource();
  601.     PLUGINDEBUGSTR("pGetValue;g;");
  602.     err = NPP_GetValue(instance, variable, value);
  603.     ExitCodeResource();
  604.     return err;
  605. }
  606. NPError Private_SetValue( NPP instance, NPNVariable variable, void *value )
  607. {
  608.     NPError err;
  609.     EnterCodeResource();
  610.     PLUGINDEBUGSTR("pSetValue;g;");
  611.     err = NPP_SetValue(instance, variable, value);
  612.     ExitCodeResource();
  613.     return err;
  614. }
  615. NPError Private_NewStream(NPP instance, NPMIMEType type, NPStream* stream, NPBool seekable, uint16_t* stype)
  616. {
  617.     NPError err;
  618.     EnterCodeResource();
  619.     PLUGINDEBUGSTR("pNewStream;g;");
  620.     err = NPP_NewStream(instance, type, stream, seekable, stype);
  621.     ExitCodeResource();
  622.     return err;
  623. }
  624. int32_t Private_WriteReady(NPP instance, NPStream* stream)
  625. {
  626.     int32_t result;
  627.     EnterCodeResource();
  628.     PLUGINDEBUGSTR("pWriteReady;g;");
  629.     result = NPP_WriteReady(instance, stream);
  630.     ExitCodeResource();
  631.     return result;
  632. }
  633. int32_t Private_Write(NPP instance, NPStream* stream, int32_t offset, int32_t len, void* buffer)
  634. {
  635.     int32_t result;
  636.     EnterCodeResource();
  637.     PLUGINDEBUGSTR("pWrite;g;");
  638.     result = NPP_Write(instance, stream, offset, len, buffer);
  639.     ExitCodeResource();
  640.     return result;
  641. }
  642. void Private_StreamAsFile(NPP instance, NPStream* stream, const char* fname)
  643. {
  644.     EnterCodeResource();
  645.     PLUGINDEBUGSTR("pStreamAsFile;g;");
  646.     NPP_StreamAsFile(instance, stream, fname);
  647.     ExitCodeResource();
  648. }
  649. NPError Private_DestroyStream(NPP instance, NPStream* stream, NPError reason)
  650. {
  651.     NPError err;
  652.     EnterCodeResource();
  653.     PLUGINDEBUGSTR("pDestroyStream;g;");
  654.     err = NPP_DestroyStream(instance, stream, reason);
  655.     ExitCodeResource();
  656.     return err;
  657. }
  658. int16_t Private_HandleEvent(NPP instance, void* event)
  659. {
  660.     int16_t result;
  661.     EnterCodeResource();
  662.     PLUGINDEBUGSTR("pHandleEvent;g;");
  663.     result = NPP_HandleEvent(instance, event);
  664.     ExitCodeResource();
  665.     return result;
  666. }
  667. void Private_Print(NPP instance, NPPrint* platformPrint)
  668. {
  669.     EnterCodeResource();
  670.     PLUGINDEBUGSTR("pPrint;g;");
  671.     NPP_Print(instance, platformPrint);
  672.     ExitCodeResource();
  673. }
  674. void Private_URLNotify(NPP instance, const char* url, NPReason reason, void* notifyData)
  675. {
  676.     EnterCodeResource();
  677.     PLUGINDEBUGSTR("pURLNotify;g;");
  678.     NPP_URLNotify(instance, url, reason, notifyData);
  679.     ExitCodeResource();
  680. }
  681. #ifdef OJI
  682. jobject Private_GetJavaClass(void)
  683. {
  684.     EnterCodeResource();
  685.     PLUGINDEBUGSTR("pGetJavaClass;g;");
  686.     jobject clazz = NPP_GetJavaClass();
  687.     ExitCodeResource();
  688.     if (clazz)
  689.     {
  690.         JRIEnv* env = NPN_GetJavaEnv();
  691.         return (jobject)JRI_NewGlobalRef(env, clazz);
  692.     }
  693.     return NULL;
  694. }
  695. #endif
  696. void SetUpQD(void);
  697. void SetUpQD(void)
  698. {
  699. #if !TARGET_API_MAC_CARBON
  700.     ProcessSerialNumber PSN;
  701.     FSSpec              myFSSpec;
  702.     Str63               name;
  703.     ProcessInfoRec      infoRec;
  704.     OSErr               result = noErr;
  705.     CFragConnectionID   connID;
  706.     Str255              errName;
  707. #endif
  708.     //
  709.     // Memorize the plugin’s resource file
  710.     // refnum for later use.
  711.     //
  712.     gResFile = CurResFile();
  713. #if !TARGET_API_MAC_CARBON
  714.     //
  715.     // Ask the system if CFM is available.
  716.     //
  717.     long response;
  718.     OSErr err = Gestalt(gestaltCFMAttr, &response);
  719.     Boolean hasCFM = BitTst(&response, 31-gestaltCFMPresent);
  720.     ProcessInfoRec infoRec;
  721.     if (hasCFM)
  722.     {
  723.         //
  724.         // GetProcessInformation takes a process serial number and
  725.         // will give us back the name and FSSpec of the application.
  726.         // See the Process Manager in IM.
  727.         //
  728.         Str63 name;
  729.         FSSpec myFSSpec;
  730.         infoRec.processInfoLength = sizeof(ProcessInfoRec);
  731.         infoRec.processName = name;
  732.         infoRec.processAppSpec = &myFSSpec;
  733.         ProcessSerialNumber PSN;
  734.         PSN.highLongOfPSN = 0;
  735.         PSN.lowLongOfPSN = kCurrentProcess;
  736.         result = GetProcessInformation(&PSN, &infoRec);
  737.         if (result != noErr)
  738.             PLUGINDEBUGSTR("pFailed in GetProcessInformation");
  739.     }
  740.     else
  741.         //
  742.         // If no CFM installed, assume it must be a 68K app.
  743.         //
  744.         result = -1;
  745.     CFragConnectionID connID;
  746.     if (result == noErr)
  747.     {
  748.         //
  749.         // Now that we know the app name and FSSpec, we can call GetDiskFragment
  750.         // to get a connID to use in a subsequent call to FindSymbol (it will also
  751.         // return the address of “main” in app, which we ignore).  If GetDiskFragment
  752.         // returns an error, we assume the app must be 68K.
  753.         //
  754.         Ptr mainAddr;
  755.         Str255 errName;
  756.         result =  GetDiskFragment(infoRec.processAppSpec, 0L, 0L, infoRec.processName,
  757.                                   kLoadCFrag, &connID, (Ptr*)&mainAddr, errName);
  758.     }
  759.     if (result == noErr)
  760.     {
  761.         //
  762.         // The app is a PPC code fragment, so call FindSymbol
  763.         // to get the exported “qd” symbol so we can access its
  764.         // QuickDraw globals.
  765.         //
  766.         CFragSymbolClass symClass;
  767.         result = FindSymbol(connID, "pqd", (Ptr*)&gQDPtr, &symClass);
  768.         if (result != noErr) {  // this fails if we are in NS 6
  769.             gQDPtr = &qd;       // so we default to the standard QD globals
  770.         }
  771.     }
  772.     else
  773.     {
  774.         //
  775.         // The app is 68K, so use its A5 to compute the address
  776.         // of its QuickDraw globals.
  777.         //
  778.         gQDPtr = (QDGlobals*)(*((long*)SetCurrentA5()) - (sizeof(QDGlobals) - sizeof(GrafPtr)));
  779.     }
  780. #endif
  781. }
  782. #ifdef __GNUC__
  783. // gcc requires that main have an 'int' return type
  784. int main(NPNetscapeFuncs* nsTable, NPPluginFuncs* pluginFuncs, NPP_ShutdownUPP* unloadUpp);
  785. #else
  786. NPError main(NPNetscapeFuncs* nsTable, NPPluginFuncs* pluginFuncs, NPP_ShutdownUPP* unloadUpp);
  787. #endif
  788. #if !TARGET_API_MAC_CARBON
  789. #pragma export on
  790. #if TARGET_RT_MAC_CFM
  791. RoutineDescriptor mainRD = BUILD_ROUTINE_DESCRIPTOR(uppNPP_MainEntryProcInfo, main);
  792. #endif
  793. #pragma export off
  794. #endif /* !TARGET_API_MAC_CARBON */
  795. #ifdef __GNUC__
  796. DEFINE_API_C(int) main(NPNetscapeFuncs* nsTable, NPPluginFuncs* pluginFuncs, NPP_ShutdownUPP* unloadUpp)
  797. #else
  798. DEFINE_API_C(NPError) main(NPNetscapeFuncs* nsTable, NPPluginFuncs* pluginFuncs, NPP_ShutdownUPP* unloadUpp)
  799. #endif
  800. {
  801.     EnterCodeResource();
  802.     PLUGINDEBUGSTR("pmain");
  803. #ifdef __MWERKS__
  804.     __InitCode__();
  805. #endif
  806.     NPError err = NPERR_NO_ERROR;
  807.     //
  808.     // Ensure that everything Netscape passed us is valid!
  809.     //
  810.     if ((nsTable == NULL) || (pluginFuncs == NULL) || (unloadUpp == NULL))
  811.         err = NPERR_INVALID_FUNCTABLE_ERROR;
  812.     //
  813.     // Check the “major” version passed in Netscape’s function table.
  814.     // We won’t load if the major version is newer than what we expect.
  815.     // Also check that the function tables passed in are big enough for
  816.     // all the functions we need (they could be bigger, if Netscape added
  817.     // new APIs, but that’s OK with us -- we’ll just ignore them).
  818.     //
  819.     if (err == NPERR_NO_ERROR)
  820.     {
  821.         if ((nsTable->version >> 8) > NP_VERSION_MAJOR)     // Major version is in high byte
  822.             err = NPERR_INCOMPATIBLE_VERSION_ERROR;
  823.     }
  824.     if (err == NPERR_NO_ERROR)
  825.     {
  826.         //
  827.         // Copy all the fields of Netscape’s function table into our
  828.         // copy so we can call back into Netscape later.  Note that
  829.         // we need to copy the fields one by one, rather than assigning
  830.         // the whole structure, because the Netscape function table
  831.         // could actually be bigger than what we expect.
  832.         //
  833.         int navMinorVers = nsTable->version & 0xFF;
  834.         gNetscapeFuncs.version          = nsTable->version;
  835.         gNetscapeFuncs.size             = nsTable->size;
  836.         gNetscapeFuncs.posturl          = (NPN_PostURLUPP)HOST_TO_PLUGIN_GLUE(posturl, nsTable->posturl);
  837.         gNetscapeFuncs.geturl           = (NPN_GetURLUPP)HOST_TO_PLUGIN_GLUE(geturl, nsTable->geturl);
  838.         gNetscapeFuncs.requestread      = (NPN_RequestReadUPP)HOST_TO_PLUGIN_GLUE(requestread, nsTable->requestread);
  839.         gNetscapeFuncs.newstream        = (NPN_NewStreamUPP)HOST_TO_PLUGIN_GLUE(newstream, nsTable->newstream);
  840.         gNetscapeFuncs.write            = (NPN_WriteUPP)HOST_TO_PLUGIN_GLUE(write, nsTable->write);
  841.         gNetscapeFuncs.destroystream    = (NPN_DestroyStreamUPP)HOST_TO_PLUGIN_GLUE(destroystream, nsTable->destroystream);
  842.         gNetscapeFuncs.status           = (NPN_StatusUPP)HOST_TO_PLUGIN_GLUE(status, nsTable->status);
  843.         gNetscapeFuncs.uagent           = (NPN_UserAgentUPP)HOST_TO_PLUGIN_GLUE(uagent, nsTable->uagent);
  844.         gNetscapeFuncs.memalloc         = (NPN_MemAllocUPP)HOST_TO_PLUGIN_GLUE(memalloc, nsTable->memalloc);
  845.         gNetscapeFuncs.memfree          = (NPN_MemFreeUPP)HOST_TO_PLUGIN_GLUE(memfree, nsTable->memfree);
  846.         gNetscapeFuncs.memflush         = (NPN_MemFlushUPP)HOST_TO_PLUGIN_GLUE(memflush, nsTable->memflush);
  847.         gNetscapeFuncs.reloadplugins    = (NPN_ReloadPluginsUPP)HOST_TO_PLUGIN_GLUE(reloadplugins, nsTable->reloadplugins);
  848.         if( navMinorVers >= NPVERS_HAS_LIVECONNECT )
  849.         {
  850.             gNetscapeFuncs.getJavaEnv   = (NPN_GetJavaEnvUPP)HOST_TO_PLUGIN_GLUE(getJavaEnv, nsTable->getJavaEnv);
  851.             gNetscapeFuncs.getJavaPeer  = (NPN_GetJavaPeerUPP)HOST_TO_PLUGIN_GLUE(getJavaPeer, nsTable->getJavaPeer);
  852.         }
  853.         if( navMinorVers >= NPVERS_HAS_NOTIFICATION )
  854.         {
  855.             gNetscapeFuncs.geturlnotify = (NPN_GetURLNotifyUPP)HOST_TO_PLUGIN_GLUE(geturlnotify, nsTable->geturlnotify);
  856.             gNetscapeFuncs.posturlnotify    = (NPN_PostURLNotifyUPP)HOST_TO_PLUGIN_GLUE(posturlnotify, nsTable->posturlnotify);
  857.         }
  858.         gNetscapeFuncs.getvalue         = (NPN_GetValueUPP)HOST_TO_PLUGIN_GLUE(getvalue, nsTable->getvalue);
  859.         gNetscapeFuncs.setvalue         = (NPN_SetValueUPP)HOST_TO_PLUGIN_GLUE(setvalue, nsTable->setvalue);
  860.         gNetscapeFuncs.invalidaterect   = (NPN_InvalidateRectUPP)HOST_TO_PLUGIN_GLUE(invalidaterect, nsTable->invalidaterect);
  861.         gNetscapeFuncs.invalidateregion = (NPN_InvalidateRegionUPP)HOST_TO_PLUGIN_GLUE(invalidateregion, nsTable->invalidateregion);
  862.         gNetscapeFuncs.forceredraw      = (NPN_ForceRedrawUPP)HOST_TO_PLUGIN_GLUE(forceredraw, nsTable->forceredraw);
  863.         if( navMinorVers >= 14 )
  864.         {
  865.             // NPRuntime support
  866.             gNetscapeFuncs.getstringidentifier  = (NPN_GetStringIdentifierUPP)HOST_TO_PLUGIN_GLUE(getstringidentifier, nsTable->getstringidentifier);
  867.             gNetscapeFuncs.getstringidentifiers = (NPN_GetStringIdentifiersUPP)HOST_TO_PLUGIN_GLUE(getstringidentifiers, nsTable->getstringidentifiers);
  868.             gNetscapeFuncs.getintidentifier     = (NPN_GetIntIdentifierUPP)HOST_TO_PLUGIN_GLUE(getintidentifier, nsTable->getintidentifier);
  869.             gNetscapeFuncs.identifierisstring   = (NPN_IdentifierIsStringUPP)HOST_TO_PLUGIN_GLUE(identifierisstring, nsTable->identifierisstring);
  870.             gNetscapeFuncs.utf8fromidentifier   = (NPN_UTF8FromIdentifierUPP)HOST_TO_PLUGIN_GLUE(utf8fromidentifier, nsTable->utf8fromidentifier);
  871.             gNetscapeFuncs.intfromidentifier    = (NPN_IntFromIdentifierUPP)HOST_TO_PLUGIN_GLUE(intfromidentifier, nsTable->intfromidentifier);
  872.             gNetscapeFuncs.createobject         = (NPN_CreateObjectUPP)HOST_TO_PLUGIN_GLUE(createobject, nsTable->createobject);
  873.             gNetscapeFuncs.retainobject         = (NPN_RetainObjectUPP)HOST_TO_PLUGIN_GLUE(retainobject, nsTable->retainobject);
  874.             gNetscapeFuncs.releaseobject        = (NPN_ReleaseObjectUPP)HOST_TO_PLUGIN_GLUE(releaseobject, nsTable->releaseobject);
  875.             gNetscapeFuncs.invoke               = (NPN_InvokeUPP)HOST_TO_PLUGIN_GLUE(invoke, nsTable->invoke);
  876.             gNetscapeFuncs.invokeDefault        = (NPN_InvokeDefaultUPP)HOST_TO_PLUGIN_GLUE(invokeDefault, nsTable->invokeDefault);
  877.             gNetscapeFuncs.evaluate             = (NPN_EvaluateUPP)HOST_TO_PLUGIN_GLUE(evaluate, nsTable->evaluate);
  878.             gNetscapeFuncs.getproperty          = (NPN_GetPropertyUPP)HOST_TO_PLUGIN_GLUE(getproperty, nsTable->getproperty);
  879.             gNetscapeFuncs.setproperty          = (NPN_SetPropertyUPP)HOST_TO_PLUGIN_GLUE(setproperty, nsTable->setproperty);
  880.             gNetscapeFuncs.removeproperty       = (NPN_RemovePropertyUPP)HOST_TO_PLUGIN_GLUE(removeproperty, nsTable->removeproperty);
  881.             gNetscapeFuncs.hasproperty          = (NPN_HasPropertyUPP)HOST_TO_PLUGIN_GLUE(hasproperty, nsTable->hasproperty);
  882.             gNetscapeFuncs.hasmethod            = (NPN_HasMethodUPP)HOST_TO_PLUGIN_GLUE(hasmethod, nsTable->hasmethod);
  883.             gNetscapeFuncs.releasevariantvalue  = (NPN_ReleaseVariantValueUPP)HOST_TO_PLUGIN_GLUE(releasevariantvalue, nsTable->releasevariantvalue);
  884.             gNetscapeFuncs.setexception         = (NPN_SetExceptionUPP)HOST_TO_PLUGIN_GLUE(setexception, nsTable->setexception);
  885.         }
  886.         //
  887.         // Set up the plugin function table that Netscape will use to
  888.         // call us.  Netscape needs to know about our version and size
  889.         // and have a UniversalProcPointer for every function we implement.
  890.         //
  891.         pluginFuncs->version        = (NP_VERSION_MAJOR << 8) + NP_VERSION_MINOR;
  892.         pluginFuncs->size           = sizeof(NPPluginFuncs);
  893. #if (((NP_VERSION_MAJOR << 8) + NP_VERSION_MINOR) < 20)
  894.         pluginFuncs->newp           = NewNPP_NewProc(PLUGIN_TO_HOST_GLUE(newp, Private_New));
  895.         pluginFuncs->destroy        = NewNPP_DestroyProc(PLUGIN_TO_HOST_GLUE(destroy, Private_Destroy));
  896.         pluginFuncs->setwindow      = NewNPP_SetWindowProc(PLUGIN_TO_HOST_GLUE(setwindow, Private_SetWindow));
  897.         pluginFuncs->newstream      = NewNPP_NewStreamProc(PLUGIN_TO_HOST_GLUE(newstream, Private_NewStream));
  898.         pluginFuncs->destroystream  = NewNPP_DestroyStreamProc(PLUGIN_TO_HOST_GLUE(destroystream, Private_DestroyStream));
  899.         pluginFuncs->asfile         = NewNPP_StreamAsFileProc(PLUGIN_TO_HOST_GLUE(asfile, Private_StreamAsFile));
  900.         pluginFuncs->writeready     = NewNPP_WriteReadyProc(PLUGIN_TO_HOST_GLUE(writeready, Private_WriteReady));
  901.         pluginFuncs->write          = NewNPP_WriteProc(PLUGIN_TO_HOST_GLUE(write, Private_Write));
  902.         pluginFuncs->print          = NewNPP_PrintProc(PLUGIN_TO_HOST_GLUE(print, Private_Print));
  903.         pluginFuncs->event          = NewNPP_HandleEventProc(PLUGIN_TO_HOST_GLUE(event, Private_HandleEvent));
  904.         pluginFuncs->getvalue       = NewNPP_GetValueProc(PLUGIN_TO_HOST_GLUE(getvalue, Private_GetValue));
  905. #else
  906.         pluginFuncs->newp           = (NPP_NewProcPtr)(PLUGIN_TO_HOST_GLUE(newp, Private_New));
  907.         pluginFuncs->destroy        = (NPP_DestroyProcPtr)(PLUGIN_TO_HOST_GLUE(destroy, Private_Destroy));
  908.         pluginFuncs->setwindow      = (NPP_SetWindowProcPtr)(PLUGIN_TO_HOST_GLUE(setwindow, Private_SetWindow));
  909.         pluginFuncs->newstream      = (NPP_NewStreamProcPtr)(PLUGIN_TO_HOST_GLUE(newstream, Private_NewStream));
  910.         pluginFuncs->destroystream  = (NPP_DestroyStreamProcPtr)(PLUGIN_TO_HOST_GLUE(destroystream, Private_DestroyStream));
  911.         pluginFuncs->asfile         = (NPP_StreamAsFileProcPtr)(PLUGIN_TO_HOST_GLUE(asfile, Private_StreamAsFile));
  912.         pluginFuncs->writeready     = (NPP_WriteReadyProcPtr)(PLUGIN_TO_HOST_GLUE(writeready, Private_WriteReady));
  913.         pluginFuncs->write          = (NPP_WriteProcPtr)(PLUGIN_TO_HOST_GLUE(write, Private_Write));
  914.         pluginFuncs->print          = (NPP_PrintProcPtr)(PLUGIN_TO_HOST_GLUE(print, Private_Print));
  915.         pluginFuncs->event          = (NPP_HandleEventProcPtr)(PLUGIN_TO_HOST_GLUE(event, Private_HandleEvent));
  916.         pluginFuncs->getvalue       = (NPP_GetValueProcPtr)(PLUGIN_TO_HOST_GLUE(getvalue, Private_GetValue));
  917. #endif
  918.         if( navMinorVers >= NPVERS_HAS_NOTIFICATION )
  919.         {
  920. #if (((NP_VERSION_MAJOR << 8) + NP_VERSION_MINOR) < 20)
  921.             pluginFuncs->urlnotify = NewNPP_URLNotifyProc(PLUGIN_TO_HOST_GLUE(urlnotify, Private_URLNotify));
  922. #else
  923.             pluginFuncs->urlnotify = (NPP_URLNotifyProcPtr)(PLUGIN_TO_HOST_GLUE(urlnotify, Private_URLNotify));
  924. #endif
  925.         }
  926. #ifdef OJI
  927.         if( navMinorVers >= NPVERS_HAS_LIVECONNECT )
  928.         {
  929.             pluginFuncs->javaClass  = (JRIGlobalRef) Private_GetJavaClass();
  930.         }
  931. #else
  932.         pluginFuncs->javaClass = NULL;
  933. #endif
  934. #if (((NP_VERSION_MAJOR << 8) + NP_VERSION_MINOR) < 20)
  935.         *unloadUpp = NewNPP_ShutdownProc(PLUGIN_TO_HOST_GLUE(shutdown, Private_Shutdown));
  936. #else
  937.         *unloadUpp = (NPP_ShutdownProcPtr)(PLUGIN_TO_HOST_GLUE(shutdown, Private_Shutdown));
  938. #endif
  939.         SetUpQD();
  940.         err = Private_Initialize();
  941.     }
  942.     ExitCodeResource();
  943.     return err;
  944. }
  945. #ifdef __MACH__
  946. /*
  947. ** netscape plugins functions when building Mach-O binary
  948. */
  949. extern "C" {
  950.     NPError NP_Initialize(NPNetscapeFuncs* nsTable);
  951.     NPError NP_GetEntryPoints(NPPluginFuncs* pluginFuncs);
  952.     NPError NP_Shutdown(void);
  953. }
  954. /*
  955. ** netscape plugins functions when using Mach-O binary
  956. */
  957. NPError NP_Initialize(NPNetscapeFuncs* nsTable)
  958. {
  959.     PLUGINDEBUGSTR("pNP_Initialize");
  960.     /* validate input parameters */
  961.     if( NULL == nsTable  )
  962.         return NPERR_INVALID_FUNCTABLE_ERROR;
  963.     /*
  964.      * Check the major version passed in Netscape's function table.
  965.      * We won't load if the major version is newer than what we expect.
  966.      * Also check that the function tables passed in are big enough for
  967.      * all the functions we need (they could be bigger, if Netscape added
  968.      * new APIs, but that's OK with us -- we'll just ignore them).
  969.      *
  970.      */
  971.     if ((nsTable->version >> 8) > NP_VERSION_MAJOR)
  972.         return NPERR_INCOMPATIBLE_VERSION_ERROR;
  973.     if (nsTable->size < sizeof(NPNetscapeFuncs))
  974.         return NPERR_INVALID_FUNCTABLE_ERROR;
  975.     int navMinorVers = nsTable->version & 0xFF;
  976.     /*
  977.      * Copy all the fields of Netscape function table into our
  978.      * copy so we can call back into Netscape later.  Note that
  979.      * we need to copy the fields one by one, rather than assigning
  980.      * the whole structure, because the Netscape function table
  981.      * could actually be bigger than what we expect.
  982.      */
  983.     gNetscapeFuncs.version       = nsTable->version;
  984.     gNetscapeFuncs.size          = nsTable->size;
  985.     gNetscapeFuncs.posturl       = nsTable->posturl;
  986.     gNetscapeFuncs.geturl        = nsTable->geturl;
  987.     gNetscapeFuncs.requestread   = nsTable->requestread;
  988.     gNetscapeFuncs.newstream     = nsTable->newstream;
  989.     gNetscapeFuncs.write         = nsTable->write;
  990.     gNetscapeFuncs.destroystream = nsTable->destroystream;
  991.     gNetscapeFuncs.status        = nsTable->status;
  992.     gNetscapeFuncs.uagent        = nsTable->uagent;
  993.     gNetscapeFuncs.memalloc      = nsTable->memalloc;
  994.     gNetscapeFuncs.memfree       = nsTable->memfree;
  995.     gNetscapeFuncs.memflush      = nsTable->memflush;
  996.     gNetscapeFuncs.reloadplugins = nsTable->reloadplugins;
  997.     if( navMinorVers >= NPVERS_HAS_LIVECONNECT )
  998.     {
  999.         gNetscapeFuncs.getJavaEnv   = nsTable->getJavaEnv;
  1000.         gNetscapeFuncs.getJavaPeer  = nsTable->getJavaPeer;
  1001.     }
  1002.     if( navMinorVers >= NPVERS_HAS_NOTIFICATION )
  1003.     {
  1004.         gNetscapeFuncs.geturlnotify     = nsTable->geturlnotify;
  1005.         gNetscapeFuncs.posturlnotify    = nsTable->posturlnotify;
  1006.     }
  1007.     gNetscapeFuncs.getvalue         = nsTable->getvalue;
  1008.     gNetscapeFuncs.setvalue         = nsTable->setvalue;
  1009.     gNetscapeFuncs.invalidaterect   = nsTable->invalidaterect;
  1010.     gNetscapeFuncs.invalidateregion = nsTable->invalidateregion;
  1011.     gNetscapeFuncs.forceredraw      = nsTable->forceredraw;
  1012.     if( navMinorVers >= 14 )
  1013.     {
  1014.         // NPRuntime support
  1015.         gNetscapeFuncs.getstringidentifier  = nsTable->getstringidentifier;
  1016.         gNetscapeFuncs.getstringidentifiers = nsTable->getstringidentifiers;
  1017.         gNetscapeFuncs.getintidentifier     = nsTable->getintidentifier;
  1018.         gNetscapeFuncs.identifierisstring   = nsTable->identifierisstring;
  1019.         gNetscapeFuncs.utf8fromidentifier   = nsTable->utf8fromidentifier;
  1020.         gNetscapeFuncs.intfromidentifier    = nsTable->intfromidentifier;
  1021.         gNetscapeFuncs.createobject         = nsTable->createobject;
  1022.         gNetscapeFuncs.retainobject         = nsTable->retainobject;
  1023.         gNetscapeFuncs.releaseobject        = nsTable->releaseobject;
  1024.         gNetscapeFuncs.invoke               = nsTable->invoke;
  1025.         gNetscapeFuncs.invokeDefault        = nsTable->invokeDefault;
  1026.         gNetscapeFuncs.evaluate             = nsTable->evaluate;
  1027.         gNetscapeFuncs.getproperty          = nsTable->getproperty;
  1028.         gNetscapeFuncs.setproperty          = nsTable->setproperty;
  1029.         gNetscapeFuncs.removeproperty       = nsTable->removeproperty;
  1030.         gNetscapeFuncs.hasproperty          = nsTable->hasproperty;
  1031.         gNetscapeFuncs.hasmethod            = nsTable->hasmethod;
  1032.         gNetscapeFuncs.releasevariantvalue  = nsTable->releasevariantvalue;
  1033.         gNetscapeFuncs.setexception         = nsTable->setexception;
  1034.     }
  1035.     return NPP_Initialize();
  1036. }
  1037. NPError NP_GetEntryPoints(NPPluginFuncs* pluginFuncs)
  1038. {
  1039.     int navMinorVers = gNetscapeFuncs.version & 0xFF;
  1040.     PLUGINDEBUGSTR("pNP_GetEntryPoints");
  1041.     if( pluginFuncs == NULL )
  1042.         return NPERR_INVALID_FUNCTABLE_ERROR;
  1043.     /*if (pluginFuncs->size < sizeof(NPPluginFuncs))
  1044.     return NPERR_INVALID_FUNCTABLE_ERROR;*/
  1045.     /*
  1046.      * Set up the plugin function table that Netscape will use to
  1047.      * call us.  Netscape needs to know about our version and size
  1048.      * and have a UniversalProcPointer for every function we
  1049.      * implement.
  1050.      */
  1051.     pluginFuncs->version    = (NP_VERSION_MAJOR << 8) + NP_VERSION_MINOR;
  1052.     pluginFuncs->size       = sizeof(NPPluginFuncs);
  1053. #if (((NP_VERSION_MAJOR << 8) + NP_VERSION_MINOR) < 20)
  1054.     pluginFuncs->newp       = NewNPP_NewProc(Private_New);
  1055.     pluginFuncs->destroy    = NewNPP_DestroyProc(Private_Destroy);
  1056.     pluginFuncs->setwindow  = NewNPP_SetWindowProc(Private_SetWindow);
  1057.     pluginFuncs->newstream  = NewNPP_NewStreamProc(Private_NewStream);
  1058.     pluginFuncs->destroystream = NewNPP_DestroyStreamProc(Private_DestroyStream);
  1059.     pluginFuncs->asfile     = NewNPP_StreamAsFileProc(Private_StreamAsFile);
  1060.     pluginFuncs->writeready = NewNPP_WriteReadyProc(Private_WriteReady);
  1061.     pluginFuncs->write      = NewNPP_WriteProc(Private_Write);
  1062.     pluginFuncs->print      = NewNPP_PrintProc(Private_Print);
  1063.     pluginFuncs->event      = NewNPP_HandleEventProc(Private_HandleEvent);
  1064.     pluginFuncs->getvalue   = NewNPP_GetValueProc(Private_GetValue);
  1065.     pluginFuncs->setvalue   = NewNPP_SetValueProc(Private_SetValue);
  1066. #else
  1067.     pluginFuncs->newp       = (NPP_NewProcPtr)(Private_New);
  1068.     pluginFuncs->destroy    = (NPP_DestroyProcPtr)(Private_Destroy);
  1069.     pluginFuncs->setwindow  = (NPP_SetWindowProcPtr)(Private_SetWindow);
  1070.     pluginFuncs->newstream  = (NPP_NewStreamProcPtr)(Private_NewStream);
  1071.     pluginFuncs->destroystream = (NPP_DestroyStreamProcPtr)(Private_DestroyStream);
  1072.     pluginFuncs->asfile     = (NPP_StreamAsFileProcPtr)(Private_StreamAsFile);
  1073.     pluginFuncs->writeready = (NPP_WriteReadyProcPtr)(Private_WriteReady);
  1074.     pluginFuncs->write      = (NPP_WriteProcPtr)(Private_Write);
  1075.     pluginFuncs->print      = (NPP_PrintProcPtr)(Private_Print);
  1076.     pluginFuncs->event      = (NPP_HandleEventProcPtr)(Private_HandleEvent);
  1077.     pluginFuncs->getvalue   = (NPP_GetValueProcPtr)(Private_GetValue);
  1078.     pluginFuncs->setvalue   = (NPP_SetValueProcPtr)(Private_SetValue);
  1079. #endif
  1080.     if( navMinorVers >= NPVERS_HAS_NOTIFICATION )
  1081.     {
  1082.         pluginFuncs->urlnotify = Private_URLNotify;
  1083.     }
  1084. #ifdef OJI
  1085.     if( navMinorVers >= NPVERS_HAS_LIVECONNECT )
  1086.     {
  1087.         pluginFuncs->javaClass  = (JRIGlobalRef) Private_GetJavaClass();
  1088.     }
  1089. #else
  1090.     pluginFuncs->javaClass = NULL;
  1091. #endif
  1092.     return NPERR_NO_ERROR;
  1093. }
  1094. NPError NP_Shutdown(void)
  1095. {
  1096.     PLUGINDEBUGSTR("pNP_Shutdown");
  1097.     NPP_Shutdown();
  1098.     return NPERR_NO_ERROR;
  1099. }
  1100. #endif