npmac.cpp 43.6 KB
Newer Older
Jean-Paul Saman's avatar
Jean-Paul Saman committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
 *
 * Safari/Mozilla/Firefox plugin for VLC
 * Copyright (C) 2009, Jean-Paul Saman <jpsaman@videolan.org>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 */

21
22
23
24
25
26
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
//
// npmac.cpp
//
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

27
28
#include "config.h"

29
30
#include <string.h>

31
32
33
34
35
36
37
#include <Processes.h>
#include <Gestalt.h>
#include <CodeFragments.h>
#include <Timer.h>
#include <Resources.h>
#include <ToolUtils.h>

38
39
#define XP_MACOSX 1
#undef TARGET_RT_MAC_CFM
40
41

//
42
// A4Stuff.h contains the definition of EnterCodeResource and
43
// EnterCodeResource, used for setting up the code resource’s
44
45
46
47
48
49
// globals for 68K (analagous to the function SetCurrentA5
// defined by the toolbox).
//
// A4Stuff does not exist as of CW 7. Define them to nothing.
//

50
#if (defined(__MWERKS__) && (__MWERKS__ >= 0x2400)) || defined(__GNUC__)
51
52
    #define EnterCodeResource()
    #define ExitCodeResource()
53
54
55
56
57
58
59
60
61
62
63
64
#else
    #include <A4Stuff.h>
#endif

#include "npapi.h"

//
// The Mixed Mode procInfos defined in npupp.h assume Think C-
// style calling conventions.  These conventions are used by
// Metrowerks with the exception of pointer return types, which
// in Metrowerks 68K are returned in A0, instead of the standard
// D0. Thus, since NPN_MemAlloc and NPN_UserAgent return pointers,
65
// Mixed Mode will return the values to a 68K plugin in D0, but
66
67
68
69
70
71
72
73
74
// a 68K plugin compiled by Metrowerks will expect the result in
// A0.  The following pragma forces Metrowerks to use D0 instead.
//
#ifdef __MWERKS__
#ifndef powerc
#pragma pointers_in_D0
#endif
#endif

75
76
77
78
#ifdef XP_UNIX
#undef XP_UNIX
#endif

79
80
#if (((NP_VERSION_MAJOR << 8) + NP_VERSION_MINOR) < 20)
#include "npupp.h" 
81
#else
82
#include "npfunctions.h"
83
#endif
84

85
86
#include "../vlcshell.h"

87
88
89
90
91
92
#ifdef __MWERKS__
#ifndef powerc
#pragma pointers_in_A0
#endif
#endif

93
// The following fix for static initializers (which fixes a previous
94
// incompatibility with some parts of PowerPlant, was submitted by
95
96
// Jan Ulbrich.
#ifdef __MWERKS__
97
98
99
100
101
102
103
104
105
106
107
108
109
    #ifdef __cplusplus
    extern "C" {
    #endif
        #ifndef powerc
            extern void __InitCode__(void);
        #else
            extern void __sinit(void);
            #define __InitCode__ __sinit
        #endif
        extern void __destroy_global_chain(void);
    #ifdef __cplusplus
    }
    #endif // __cplusplus
110
111
112
113
114
115
#endif // __MWERKS__

//
// Define PLUGIN_TRACE to 1 to have the wrapper functions emit
// DebugStr messages whenever they are called.
//
116
#define PLUGIN_TRACE 0
117
118

#if PLUGIN_TRACE
119
#define PLUGINDEBUGSTR(msg)     ::DebugStr(msg)
120
#else
121
#define PLUGINDEBUGSTR(msg) {}
122
123
#endif

124
#if defined(XP_MACOSX) && defined(__POWERPC__) && (!defined(TARGET_RT_MAC_CFM))
125
126

// glue for mapping outgoing Macho function pointers to TVectors
damienf's avatar
damienf committed
127
struct TFPtoTVGlue {
128
129
130
    void* glue[2];
};

131
static struct {
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
    TFPtoTVGlue     newp;
    TFPtoTVGlue     destroy;
    TFPtoTVGlue     setwindow;
    TFPtoTVGlue     newstream;
    TFPtoTVGlue     destroystream;
    TFPtoTVGlue     asfile;
    TFPtoTVGlue     writeready;
    TFPtoTVGlue     write;
    TFPtoTVGlue     print;
    TFPtoTVGlue     event;
    TFPtoTVGlue     urlnotify;
    TFPtoTVGlue     getvalue;
    TFPtoTVGlue     setvalue;

    TFPtoTVGlue     shutdown;
} gPluginFuncsGlueTable;

static inline void* SetupFPtoTVGlue(TFPtoTVGlue* functionGlue, void* fp)
{
    functionGlue->glue[0] = fp;
    functionGlue->glue[1] = 0;
    return functionGlue;
}

#define PLUGIN_TO_HOST_GLUE(name, fp) (SetupFPtoTVGlue(&gPluginFuncsGlueTable.name, (void*)fp))

// glue for mapping netscape TVectors to Macho function pointers
struct TTVtoFPGlue {
Jean-Paul Saman's avatar
Jean-Paul Saman committed
160
    uint32_t glue[6];
161
162
};

163
static struct {
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
    TTVtoFPGlue             geturl;
    TTVtoFPGlue             posturl;
    TTVtoFPGlue             requestread;
    TTVtoFPGlue             newstream;
    TTVtoFPGlue             write;
    TTVtoFPGlue             destroystream;
    TTVtoFPGlue             status;
    TTVtoFPGlue             uagent;
    TTVtoFPGlue             memalloc;
    TTVtoFPGlue             memfree;
    TTVtoFPGlue             memflush;
    TTVtoFPGlue             reloadplugins;
    TTVtoFPGlue             getJavaEnv;
    TTVtoFPGlue             getJavaPeer;
    TTVtoFPGlue             geturlnotify;
    TTVtoFPGlue             posturlnotify;
    TTVtoFPGlue             getvalue;
    TTVtoFPGlue             setvalue;
    TTVtoFPGlue             invalidaterect;
    TTVtoFPGlue             invalidateregion;
    TTVtoFPGlue             forceredraw;
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
    // NPRuntime support
    TTVtoFPGlue             getstringidentifier;
    TTVtoFPGlue             getstringidentifiers;
    TTVtoFPGlue             getintidentifier;
    TTVtoFPGlue             identifierisstring;
    TTVtoFPGlue             utf8fromidentifier;
    TTVtoFPGlue             intfromidentifier;
    TTVtoFPGlue             createobject;
    TTVtoFPGlue             retainobject;
    TTVtoFPGlue             releaseobject;
    TTVtoFPGlue             invoke;
    TTVtoFPGlue             invokeDefault;
    TTVtoFPGlue             evaluate;
    TTVtoFPGlue             getproperty;
    TTVtoFPGlue             setproperty;
    TTVtoFPGlue             removeproperty;
    TTVtoFPGlue             hasproperty;
    TTVtoFPGlue             hasmethod;
    TTVtoFPGlue             releasevariantvalue;
    TTVtoFPGlue             setexception;
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
} gNetscapeFuncsGlueTable;

static void* SetupTVtoFPGlue(TTVtoFPGlue* functionGlue, void* tvp)
{
    static const TTVtoFPGlue glueTemplate = { 0x3D800000, 0x618C0000, 0x800C0000, 0x804C0004, 0x7C0903A6, 0x4E800420 };

    memcpy(functionGlue, &glueTemplate, sizeof(TTVtoFPGlue));
    functionGlue->glue[0] |= ((UInt32)tvp >> 16);
    functionGlue->glue[1] |= ((UInt32)tvp & 0xFFFF);
    ::MakeDataExecutable(functionGlue, sizeof(TTVtoFPGlue));
    return functionGlue;
}

#define HOST_TO_PLUGIN_GLUE(name, fp) (SetupTVtoFPGlue(&gNetscapeFuncsGlueTable.name, (void*)fp))

#else

#define PLUGIN_TO_HOST_GLUE(name, fp) (fp)
#define HOST_TO_PLUGIN_GLUE(name, fp) (fp)
224

225
#endif /* XP_MACOSX */
226

227
228
#pragma mark -

229
230
231
232
233
234
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
//
// Globals
//
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

235
#if !TARGET_API_MAC_CARBON
236
QDGlobals*      gQDPtr;             // Pointer to Netscape’s QuickDraw globals
237
#endif
238
239
short           gResFile;           // Refnum of the plugin’s resource file
NPNetscapeFuncs    gNetscapeFuncs;      // Function table for procs in Netscape called by plugin
240
241
242
243
244
245
246
247
248
249
250
251

//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
//
// Wrapper functions for all calls from the plugin to Netscape.
// These functions let the plugin developer just call the APIs
// as documented and defined in npapi.h, without needing to know
// about the function table and call macros in npupp.h.
//
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

void NPN_Version(int* plugin_major, int* plugin_minor, int* netscape_major, int* netscape_minor)
{
252
253
254
255
    *plugin_major = NP_VERSION_MAJOR;
    *plugin_minor = NP_VERSION_MINOR;
    *netscape_major = gNetscapeFuncs.version >> 8;      // Major version is in high byte
    *netscape_minor = gNetscapeFuncs.version & 0xFF;    // Minor version is in low byte
256
257
258
259
}

NPError NPN_GetURLNotify(NPP instance, const char* url, const char* window, void* notifyData)
{
260
261
    int navMinorVers = gNetscapeFuncs.version & 0xFF;
    NPError err;
damienf's avatar
damienf committed
262

263
264
265
266
267
268
269
270
271
    if( navMinorVers >= NPVERS_HAS_NOTIFICATION )
    {
        err = CallNPN_GetURLNotifyProc(gNetscapeFuncs.geturlnotify, instance, url, window, notifyData);
    }
    else
    {
        err = NPERR_INCOMPATIBLE_VERSION_ERROR;
    }
    return err;
272
273
274
275
}

NPError NPN_GetURL(NPP instance, const char* url, const char* window)
{
276
    return CallNPN_GetURLProc(gNetscapeFuncs.geturl, instance, url, window);
277
278
}

Jean-Paul Saman's avatar
Jean-Paul Saman committed
279
NPError NPN_PostURLNotify(NPP instance, const char* url, const char* window, uint32_t len, const char* buf, NPBool file, void* notifyData)
280
{
281
282
    int navMinorVers = gNetscapeFuncs.version & 0xFF;
    NPError err;
damienf's avatar
damienf committed
283

284
285
    if( navMinorVers >= NPVERS_HAS_NOTIFICATION )
    {
286
        err = CallNPN_PostURLNotifyProc(gNetscapeFuncs.posturlnotify, instance, url,
287
288
289
290
291
292
293
                                                        window, len, buf, file, notifyData);
    }
    else
    {
        err = NPERR_INCOMPATIBLE_VERSION_ERROR;
    }
    return err;
294
295
}

Jean-Paul Saman's avatar
Jean-Paul Saman committed
296
NPError NPN_PostURL(NPP instance, const char* url, const char* window, uint32_t len, const char* buf, NPBool file)
297
{
298
    return CallNPN_PostURLProc(gNetscapeFuncs.posturl, instance, url, window, len, buf, file);
299
300
301
302
}

NPError NPN_RequestRead(NPStream* stream, NPByteRange* rangeList)
{
303
    return CallNPN_RequestReadProc(gNetscapeFuncs.requestread, stream, rangeList);
304
305
306
307
}

NPError NPN_NewStream(NPP instance, NPMIMEType type, const char* window, NPStream** stream)
{
308
309
    int navMinorVers = gNetscapeFuncs.version & 0xFF;
    NPError err;
damienf's avatar
damienf committed
310

311
312
313
314
315
316
317
318
319
    if( navMinorVers >= NPVERS_HAS_STREAMOUTPUT )
    {
        err = CallNPN_NewStreamProc(gNetscapeFuncs.newstream, instance, type, window, stream);
    }
    else
    {
        err = NPERR_INCOMPATIBLE_VERSION_ERROR;
    }
    return err;
320
321
}

Jean-Paul Saman's avatar
Jean-Paul Saman committed
322
int32_t NPN_Write(NPP instance, NPStream* stream, int32_t len, void* buffer)
323
{
324
325
    int navMinorVers = gNetscapeFuncs.version & 0xFF;
    NPError err;
damienf's avatar
damienf committed
326

327
328
329
330
331
332
333
334
335
    if( navMinorVers >= NPVERS_HAS_STREAMOUTPUT )
    {
        err = CallNPN_WriteProc(gNetscapeFuncs.write, instance, stream, len, buffer);
    }
    else
    {
        err = NPERR_INCOMPATIBLE_VERSION_ERROR;
    }
    return err;
336
337
}

338
NPError    NPN_DestroyStream(NPP instance, NPStream* stream, NPError reason)
339
{
340
341
    int navMinorVers = gNetscapeFuncs.version & 0xFF;
    NPError err;
damienf's avatar
damienf committed
342

343
344
345
346
347
348
349
350
351
    if( navMinorVers >= NPVERS_HAS_STREAMOUTPUT )
    {
        err = CallNPN_DestroyStreamProc(gNetscapeFuncs.destroystream, instance, stream, reason);
    }
    else
    {
        err = NPERR_INCOMPATIBLE_VERSION_ERROR;
    }
    return err;
352
353
354
355
}

void NPN_Status(NPP instance, const char* message)
{
356
    CallNPN_StatusProc(gNetscapeFuncs.status, instance, message);
357
358
359
360
}

const char* NPN_UserAgent(NPP instance)
{
361
    return CallNPN_UserAgentProc(gNetscapeFuncs.uagent, instance);
362
363
}

Jean-Paul Saman's avatar
Jean-Paul Saman committed
364
void* NPN_MemAlloc(uint32_t size)
365
{
366
    return CallNPN_MemAllocProc(gNetscapeFuncs.memalloc, size);
367
368
369
370
}

void NPN_MemFree(void* ptr)
{
371
    CallNPN_MemFreeProc(gNetscapeFuncs.memfree, ptr);
372
373
}

Jean-Paul Saman's avatar
Jean-Paul Saman committed
374
uint32_t NPN_MemFlush(uint32_t size)
375
{
376
    return CallNPN_MemFlushProc(gNetscapeFuncs.memflush, size);
377
378
379
380
}

void NPN_ReloadPlugins(NPBool reloadPages)
{
381
    CallNPN_ReloadPluginsProc(gNetscapeFuncs.reloadplugins, reloadPages);
382
383
}

384
#ifdef OJI
385
386
JRIEnv* NPN_GetJavaEnv(void)
{
387
    return CallNPN_GetJavaEnvProc( gNetscapeFuncs.getJavaEnv );
388
389
}

390
jobject  NPN_GetJavaPeer(NPP instance)
391
{
392
    return CallNPN_GetJavaPeerProc( gNetscapeFuncs.getJavaPeer, instance );
393
}
394
#endif
395
396
397

NPError NPN_GetValue(NPP instance, NPNVariable variable, void *value)
{
398
    return CallNPN_GetValueProc( gNetscapeFuncs.getvalue, instance, variable, value);
399
400
401
402
}

NPError NPN_SetValue(NPP instance, NPPVariable variable, void *value)
{
403
    return CallNPN_SetValueProc( gNetscapeFuncs.setvalue, instance, variable, value);
404
405
406
407
}

void NPN_InvalidateRect(NPP instance, NPRect *rect)
{
408
    CallNPN_InvalidateRectProc( gNetscapeFuncs.invalidaterect, instance, rect);
409
410
411
412
}

void NPN_InvalidateRegion(NPP instance, NPRegion region)
{
413
    CallNPN_InvalidateRegionProc( gNetscapeFuncs.invalidateregion, instance, region);
414
415
416
417
}

void NPN_ForceRedraw(NPP instance)
{
418
419
420
421
422
423
424
    CallNPN_ForceRedrawProc( gNetscapeFuncs.forceredraw, instance);
}

NPIdentifier NPN_GetStringIdentifier(const NPUTF8 *name)
{
    int navMinorVers = gNetscapeFuncs.version & 0xFF;
    if( navMinorVers >= 14 )
damienf's avatar
damienf committed
425
    {
426
        return CallNPN_GetStringIdentifierProc( gNetscapeFuncs.getstringidentifier, name);
427
428
429
430
431
432
433
434
    }
    return NULL;
}

void NPN_GetStringIdentifiers(const NPUTF8 **names, int32_t nameCount, NPIdentifier *identifiers)
{
    int navMinorVers = gNetscapeFuncs.version & 0xFF;
    if( navMinorVers >= 14 )
damienf's avatar
damienf committed
435
    {
436
        CallNPN_GetStringIdentifiersProc( gNetscapeFuncs.getstringidentifiers, names, nameCount, identifiers);
437
438
439
440
441
442
443
    }
}

NPIdentifier NPN_GetIntIdentifier(int32_t intid)
{
    int navMinorVers = gNetscapeFuncs.version & 0xFF;
    if( navMinorVers >= 14 )
damienf's avatar
damienf committed
444
    {
445
        return CallNPN_GetIntIdentifierProc( gNetscapeFuncs.getintidentifier, intid);
446
447
448
449
450
451
452
453
    }
    return NULL;
}

bool NPN_IdentifierIsString(NPIdentifier identifier)
{
    int navMinorVers = gNetscapeFuncs.version & 0xFF;
    if( navMinorVers >= 14 )
damienf's avatar
damienf committed
454
    {
455
        return CallNPN_IdentifierIsStringProc( gNetscapeFuncs.identifierisstring, identifier);
456
457
458
459
460
461
462
463
    }
    return false;
}

NPUTF8 *NPN_UTF8FromIdentifier(NPIdentifier identifier)
{
    int navMinorVers = gNetscapeFuncs.version & 0xFF;
    if( navMinorVers >= 14 )
damienf's avatar
damienf committed
464
    {
465
        return CallNPN_UTF8FromIdentifierProc( gNetscapeFuncs.utf8fromidentifier, identifier);
466
467
468
469
470
471
472
473
    }
    return NULL;
}

int32_t NPN_IntFromIdentifier(NPIdentifier identifier)
{
    int navMinorVers = gNetscapeFuncs.version & 0xFF;
    if( navMinorVers >= 14 )
damienf's avatar
damienf committed
474
    {
475
        return CallNPN_IntFromIdentifierProc( gNetscapeFuncs.intfromidentifier, identifier);
476
477
478
479
480
481
482
483
    }
    return 0;
}

NPObject *NPN_CreateObject(NPP instance, NPClass *aClass)
{
    int navMinorVers = gNetscapeFuncs.version & 0xFF;
    if( navMinorVers >= 14 )
damienf's avatar
damienf committed
484
    {
485
        return CallNPN_CreateObjectProc( gNetscapeFuncs.createobject, instance, aClass);
486
487
488
489
490
491
492
493
    }
    return NULL;
}

NPObject *NPN_RetainObject(NPObject *npobj)
{
    int navMinorVers = gNetscapeFuncs.version & 0xFF;
    if( navMinorVers >= 14 )
damienf's avatar
damienf committed
494
    {
495
        return CallNPN_RetainObjectProc( gNetscapeFuncs.retainobject, npobj);
496
497
498
499
500
501
502
503
    }
    return NULL;
}

void NPN_ReleaseObject(NPObject *npobj)
{
    int navMinorVers = gNetscapeFuncs.version & 0xFF;
    if( navMinorVers >= 14 )
damienf's avatar
damienf committed
504
    {
505
        CallNPN_ReleaseObjectProc( gNetscapeFuncs.releaseobject, npobj);
506
507
508
509
510
511
512
    }
}

bool NPN_Invoke(NPP instance, NPObject *npobj, NPIdentifier methodName, const NPVariant *args, uint32_t argCount, NPVariant *result)
{
    int navMinorVers = gNetscapeFuncs.version & 0xFF;
    if( navMinorVers >= 14 )
damienf's avatar
damienf committed
513
    {
514
        return CallNPN_InvokeProc( gNetscapeFuncs.invoke, instance, npobj, methodName, args, argCount, result);
515
516
517
518
519
520
521
522
    }
    return false;
}

bool NPN_InvokeDefault(NPP instance, NPObject *npobj, const NPVariant *args, uint32_t argCount, NPVariant *result)
{
    int navMinorVers = gNetscapeFuncs.version & 0xFF;
    if( navMinorVers >= 14 )
damienf's avatar
damienf committed
523
    {
524
        return CallNPN_InvokeDefaultProc( gNetscapeFuncs.invokeDefault, instance, npobj, args, argCount, result);
525
526
527
528
529
530
531
532
    }
    return false;
}

bool NPN_Evaluate(NPP instance, NPObject *npobj, NPString *script, NPVariant *result)
{
    int navMinorVers = gNetscapeFuncs.version & 0xFF;
    if( navMinorVers >= 14 )
damienf's avatar
damienf committed
533
    {
534
        return CallNPN_EvaluateProc( gNetscapeFuncs.evaluate, instance, npobj, script, result);
535
536
537
538
539
540
541
542
    }
    return false;
}

bool NPN_GetProperty(NPP instance, NPObject *npobj, NPIdentifier propertyName, NPVariant *result)
{
    int navMinorVers = gNetscapeFuncs.version & 0xFF;
    if( navMinorVers >= 14 )
damienf's avatar
damienf committed
543
    {
544
        return CallNPN_GetPropertyProc( gNetscapeFuncs.getproperty, instance, npobj, propertyName, result);
545
546
547
548
549
550
551
552
    }
    return false;
}

bool NPN_SetProperty(NPP instance, NPObject *npobj, NPIdentifier propertyName, const NPVariant *value)
{
    int navMinorVers = gNetscapeFuncs.version & 0xFF;
    if( navMinorVers >= 14 )
damienf's avatar
damienf committed
553
    {
554
        return CallNPN_SetPropertyProc( gNetscapeFuncs.setproperty, instance, npobj, propertyName, value);
555
556
557
558
559
560
561
562
    }
    return false;
}

bool NPN_RemoveProperty(NPP instance, NPObject *npobj, NPIdentifier propertyName)
{
    int navMinorVers = gNetscapeFuncs.version & 0xFF;
    if( navMinorVers >= 14 )
damienf's avatar
damienf committed
563
    {
564
        return CallNPN_RemovePropertyProc( gNetscapeFuncs.removeproperty, instance, npobj, propertyName);
565
566
567
568
569
570
571
572
    }
    return false;
}

bool NPN_HasProperty(NPP instance, NPObject *npobj, NPIdentifier propertyName)
{
    int navMinorVers = gNetscapeFuncs.version & 0xFF;
    if( navMinorVers >= 14 )
damienf's avatar
damienf committed
573
    {
574
        return CallNPN_HasPropertyProc( gNetscapeFuncs.hasproperty, instance, npobj, propertyName);
575
576
577
578
579
580
581
582
    }
    return false;
}

bool NPN_HasMethod(NPP instance, NPObject *npobj, NPIdentifier methodName)
{
    int navMinorVers = gNetscapeFuncs.version & 0xFF;
    if( navMinorVers >= 14 )
damienf's avatar
damienf committed
583
    {
584
        return CallNPN_HasMethodProc( gNetscapeFuncs.hasmethod, instance, npobj, methodName);
585
586
587
588
589
590
591
592
    }
    return false;
}

void NPN_ReleaseVariantValue(NPVariant *variant)
{
    int navMinorVers = gNetscapeFuncs.version & 0xFF;
    if( navMinorVers >= 14 )
damienf's avatar
damienf committed
593
    {
594
        CallNPN_ReleaseVariantValueProc( gNetscapeFuncs.releasevariantvalue, variant);
595
596
597
598
599
600
601
    }
}

void NPN_SetException(NPObject *npobj, const NPUTF8 *message)
{
    int navMinorVers = gNetscapeFuncs.version & 0xFF;
    if( navMinorVers >= 14 )
damienf's avatar
damienf committed
602
    {
603
        CallNPN_SetExceptionProc( gNetscapeFuncs.setexception, npobj, message);
604
    }
605
606
}

607
608
#pragma mark -

609
610
611
612
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
//
// Wrapper functions for all calls from Netscape to the plugin.
// These functions let the plugin developer just create the APIs
613
// as documented and defined in npapi.h, without needing to
614
615
616
617
618
// install those functions in the function table or worry about
// setting up globals for 68K plugins.
//
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

619
620
NPError     Private_Initialize(void);
void        Private_Shutdown(void);
Jean-Paul Saman's avatar
Jean-Paul Saman committed
621
NPError     Private_New(NPMIMEType pluginType, NPP instance, uint16_t mode, int16_t argc, char* argn[], char* argv[], NPSavedData* saved);
622
623
624
625
NPError     Private_Destroy(NPP instance, NPSavedData** save);
NPError     Private_SetWindow(NPP instance, NPWindow* window);
NPError     Private_GetValue( NPP instance, NPPVariable variable, void *value );
NPError     Private_SetValue( NPP instance, NPPVariable variable, void *value );
Jean-Paul Saman's avatar
Jean-Paul Saman committed
626
NPError     Private_NewStream(NPP instance, NPMIMEType type, NPStream* stream, NPBool seekable, uint16_t* stype);
627
NPError     Private_DestroyStream(NPP instance, NPStream* stream, NPError reason);
Jean-Paul Saman's avatar
Jean-Paul Saman committed
628
629
int32_t     Private_WriteReady(NPP instance, NPStream* stream);
int32_t     Private_Write(NPP instance, NPStream* stream, int32_t offset, int32_t len, void* buffer);
630
631
void        Private_StreamAsFile(NPP instance, NPStream* stream, const char* fname);
void        Private_Print(NPP instance, NPPrint* platformPrint);
Jean-Paul Saman's avatar
Jean-Paul Saman committed
632
int16_t     Private_HandleEvent(NPP instance, void* event);
633
void        Private_URLNotify(NPP instance, const char* url, NPReason reason, void* notifyData);
634
jobject     Private_GetJavaClass(void);
635
636
637
638


NPError Private_Initialize(void)
{
639
640
641
642
643
644
    NPError err;
    EnterCodeResource();
    PLUGINDEBUGSTR("\pInitialize;g;");
    err = NPP_Initialize();
    ExitCodeResource();
    return err;
645
646
647
648
}

void Private_Shutdown(void)
{
649
650
651
    EnterCodeResource();
    PLUGINDEBUGSTR("\pShutdown;g;");
    NPP_Shutdown();
652

653
#ifdef __MWERKS__
654
    __destroy_global_chain();
655
656
#endif

657
    ExitCodeResource();
658
659
}

Jean-Paul Saman's avatar
Jean-Paul Saman committed
660
NPError    Private_New(NPMIMEType pluginType, NPP instance, uint16_t mode, int16_t argc, char* argn[], char* argv[], NPSavedData* saved)
661
{
662
663
664
665
    EnterCodeResource();
    NPError ret = NPP_New(pluginType, instance, mode, argc, argn, argv, saved);
    PLUGINDEBUGSTR("\pNew;g;");
    ExitCodeResource();
666
    return ret;
667
668
669
670
}

NPError Private_Destroy(NPP instance, NPSavedData** save)
{
671
672
673
674
675
676
    NPError err;
    EnterCodeResource();
    PLUGINDEBUGSTR("\pDestroy;g;");
    err = NPP_Destroy(instance, save);
    ExitCodeResource();
    return err;
677
678
679
680
}

NPError Private_SetWindow(NPP instance, NPWindow* window)
{
681
682
683
684
685
686
    NPError err;
    EnterCodeResource();
    PLUGINDEBUGSTR("\pSetWindow;g;");
    err = NPP_SetWindow(instance, window);
    ExitCodeResource();
    return err;
687
688
}

689
690
NPError Private_GetValue( NPP instance, NPPVariable variable, void *value )
{
691
692
693
    NPError err;
    EnterCodeResource();
    PLUGINDEBUGSTR("\pGetValue;g;");
694
    err = NPP_GetValue(instance, variable, value);
695
696
697
698
699
700
701
702
703
    ExitCodeResource();
    return err;
}

NPError Private_SetValue( NPP instance, NPNVariable variable, void *value )
{
    NPError err;
    EnterCodeResource();
    PLUGINDEBUGSTR("\pSetValue;g;");
704
    err = NPP_SetValue(instance, variable, value);
705
706
    ExitCodeResource();
    return err;
707
708
}

Jean-Paul Saman's avatar
Jean-Paul Saman committed
709
NPError Private_NewStream(NPP instance, NPMIMEType type, NPStream* stream, NPBool seekable, uint16_t* stype)
710
{
711
712
713
714
715
716
    NPError err;
    EnterCodeResource();
    PLUGINDEBUGSTR("\pNewStream;g;");
    err = NPP_NewStream(instance, type, stream, seekable, stype);
    ExitCodeResource();
    return err;
717
718
}

Jean-Paul Saman's avatar
Jean-Paul Saman committed
719
int32_t Private_WriteReady(NPP instance, NPStream* stream)
720
{
Jean-Paul Saman's avatar
Jean-Paul Saman committed
721
    int32_t result;
722
723
724
725
726
    EnterCodeResource();
    PLUGINDEBUGSTR("\pWriteReady;g;");
    result = NPP_WriteReady(instance, stream);
    ExitCodeResource();
    return result;
727
728
}

Jean-Paul Saman's avatar
Jean-Paul Saman committed
729
int32_t Private_Write(NPP instance, NPStream* stream, int32_t offset, int32_t len, void* buffer)
730
{
Jean-Paul Saman's avatar
Jean-Paul Saman committed
731
    int32_t result;
732
733
734
735
736
    EnterCodeResource();
    PLUGINDEBUGSTR("\pWrite;g;");
    result = NPP_Write(instance, stream, offset, len, buffer);
    ExitCodeResource();
    return result;
737
738
739
740
}

void Private_StreamAsFile(NPP instance, NPStream* stream, const char* fname)
{
741
742
743
744
    EnterCodeResource();
    PLUGINDEBUGSTR("\pStreamAsFile;g;");
    NPP_StreamAsFile(instance, stream, fname);
    ExitCodeResource();
745
746
747
748
}

NPError Private_DestroyStream(NPP instance, NPStream* stream, NPError reason)
{
749
750
751
752
753
754
    NPError err;
    EnterCodeResource();
    PLUGINDEBUGSTR("\pDestroyStream;g;");
    err = NPP_DestroyStream(instance, stream, reason);
    ExitCodeResource();
    return err;
755
756
}

Jean-Paul Saman's avatar
Jean-Paul Saman committed
757
int16_t Private_HandleEvent(NPP instance, void* event)
758
{
Jean-Paul Saman's avatar
Jean-Paul Saman committed
759
    int16_t result;
760
761
762
763
764
    EnterCodeResource();
    PLUGINDEBUGSTR("\pHandleEvent;g;");
    result = NPP_HandleEvent(instance, event);
    ExitCodeResource();
    return result;
765
766
767
768
}

void Private_Print(NPP instance, NPPrint* platformPrint)
{
769
770
771
772
    EnterCodeResource();
    PLUGINDEBUGSTR("\pPrint;g;");
    NPP_Print(instance, platformPrint);
    ExitCodeResource();
773
774
775
776
}

void Private_URLNotify(NPP instance, const char* url, NPReason reason, void* notifyData)
{
777
778
779
780
    EnterCodeResource();
    PLUGINDEBUGSTR("\pURLNotify;g;");
    NPP_URLNotify(instance, url, reason, notifyData);
    ExitCodeResource();
781
782
}

783
784
#ifdef OJI
jobject Private_GetJavaClass(void)
785
{
786
787
    EnterCodeResource();
    PLUGINDEBUGSTR("\pGetJavaClass;g;");
788

789
    jobject clazz = NPP_GetJavaClass();
790
791
792
    ExitCodeResource();
    if (clazz)
    {
793
794
        JRIEnv* env = NPN_GetJavaEnv();
        return (jobject)JRI_NewGlobalRef(env, clazz);
795
796
797
    }
    return NULL;
}
798
#endif
799
800
801
802

void SetUpQD(void);
void SetUpQD(void)
{
803
#if !TARGET_API_MAC_CARBON
804
805
806
807
808
809
810
    ProcessSerialNumber PSN;
    FSSpec              myFSSpec;
    Str63               name;
    ProcessInfoRec      infoRec;
    OSErr               result = noErr;
    CFragConnectionID   connID;
    Str255              errName;
damienf's avatar
damienf committed
811
#endif
812
813

    //
814
    // Memorize the plugin’s resource file
815
816
817
    // refnum for later use.
    //
    gResFile = CurResFile();
damienf's avatar
damienf committed
818

819
#if !TARGET_API_MAC_CARBON
820
821
822
823
824
825
826
827
828
829
830
    //
    // Ask the system if CFM is available.
    //
    long response;
    OSErr err = Gestalt(gestaltCFMAttr, &response);
    Boolean hasCFM = BitTst(&response, 31-gestaltCFMPresent);

    ProcessInfoRec infoRec;
    if (hasCFM)
    {
        //
831
        // GetProcessInformation takes a process serial number and
832
833
834
835
836
837
838
839
        // will give us back the name and FSSpec of the application.
        // See the Process Manager in IM.
        //
        Str63 name;
        FSSpec myFSSpec;
        infoRec.processInfoLength = sizeof(ProcessInfoRec);
        infoRec.processName = name;
        infoRec.processAppSpec = &myFSSpec;
damienf's avatar
damienf committed
840

841
842
843
        ProcessSerialNumber PSN;
        PSN.highLongOfPSN = 0;
        PSN.lowLongOfPSN = kCurrentProcess;
damienf's avatar
damienf committed
844

845
846
847
848
849
850
851
852
        result = GetProcessInformation(&PSN, &infoRec);
        if (result != noErr)
            PLUGINDEBUGSTR("\pFailed in GetProcessInformation");
    }
    else
        //
        // If no CFM installed, assume it must be a 68K app.
        //
damienf's avatar
damienf committed
853
854
        result = -1;

855
856
857
858
859
860
    CFragConnectionID connID;
    if (result == noErr)
    {
        //
        // Now that we know the app name and FSSpec, we can call GetDiskFragment
        // to get a connID to use in a subsequent call to FindSymbol (it will also
861
        // return the address of “main” in app, which we ignore).  If GetDiskFragment
862
863
        // returns an error, we assume the app must be 68K.
        //
damienf's avatar
damienf committed
864
        Ptr mainAddr;
865
866
867
868
        Str255 errName;
        result =  GetDiskFragment(infoRec.processAppSpec, 0L, 0L, infoRec.processName,
                                  kLoadCFrag, &connID, (Ptr*)&mainAddr, errName);
    }
869

870
    if (result == noErr)
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
    {
        //
        // The app is a PPC code fragment, so call FindSymbol
        // to get the exported “qd” symbol so we can access its
        // QuickDraw globals.
        //
        CFragSymbolClass symClass;
        result = FindSymbol(connID, "\pqd", (Ptr*)&gQDPtr, &symClass);
        if (result != noErr) {  // this fails if we are in NS 6
            gQDPtr = &qd;       // so we default to the standard QD globals
        }
    }
    else
    {
        //
        // The app is 68K, so use its A5 to compute the address
        // of its QuickDraw globals.
        //
        gQDPtr = (QDGlobals*)(*((long*)SetCurrentA5()) - (sizeof(QDGlobals) - sizeof(GrafPtr)));
    }
891
892
893
894
#endif
}


895
896
897
#ifdef __GNUC__
// gcc requires that main have an 'int' return type
int main(NPNetscapeFuncs* nsTable, NPPluginFuncs* pluginFuncs, NPP_ShutdownUPP* unloadUpp);
898
#else
899
NPError main(NPNetscapeFuncs* nsTable, NPPluginFuncs* pluginFuncs, NPP_ShutdownUPP* unloadUpp);
900
901
#endif

902
#if !TARGET_API_MAC_CARBON
903
#pragma export on
904
905
906

#if TARGET_RT_MAC_CFM

907
RoutineDescriptor mainRD = BUILD_ROUTINE_DESCRIPTOR(uppNPP_MainEntryProcInfo, main);
908

909
#endif
910

911
#pragma export off
912
#endif /* !TARGET_API_MAC_CARBON */
913

914
915
#ifdef __GNUC__
DEFINE_API_C(int) main(NPNetscapeFuncs* nsTable, NPPluginFuncs* pluginFuncs, NPP_ShutdownUPP* unloadUpp)
916
#else
917
DEFINE_API_C(NPError) main(NPNetscapeFuncs* nsTable, NPPluginFuncs* pluginFuncs, NPP_ShutdownUPP* unloadUpp)
918
919
#endif
{
920
921
    EnterCodeResource();
    PLUGINDEBUGSTR("\pmain");
922

923
#ifdef __MWERKS__
924
    __InitCode__();
925
926
#endif

927
    NPError err = NPERR_NO_ERROR;
damienf's avatar
damienf committed
928

929
930
931
932
933
    //
    // Ensure that everything Netscape passed us is valid!
    //
    if ((nsTable == NULL) || (pluginFuncs == NULL) || (unloadUpp == NULL))
        err = NPERR_INVALID_FUNCTABLE_ERROR;
damienf's avatar
damienf committed
934

935
936
937
938
939
940
941
942
943
944
945
946
    //
    // Check the “major” version passed in Netscape’s function table.
    // We won’t load if the major version is newer than what we expect.
    // Also check that the function tables passed in are big enough for
    // all the functions we need (they could be bigger, if Netscape added
    // new APIs, but that’s OK with us -- we’ll just ignore them).
    //
    if (err == NPERR_NO_ERROR)
    {
        if ((nsTable->version >> 8) > NP_VERSION_MAJOR)     // Major version is in high byte
            err = NPERR_INCOMPATIBLE_VERSION_ERROR;
    }
damienf's avatar
damienf committed
947

948
949
950
951
952
953
954
955
956
    if (err == NPERR_NO_ERROR)
    {
        //
        // Copy all the fields of Netscape’s function table into our
        // copy so we can call back into Netscape later.  Note that
        // we need to copy the fields one by one, rather than assigning
        // the whole structure, because the Netscape function table
        // could actually be bigger than what we expect.
        //
damienf's avatar
damienf committed
957

958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
        int navMinorVers = nsTable->version & 0xFF;

        gNetscapeFuncs.version          = nsTable->version;
        gNetscapeFuncs.size             = nsTable->size;
        gNetscapeFuncs.posturl          = (NPN_PostURLUPP)HOST_TO_PLUGIN_GLUE(posturl, nsTable->posturl);
        gNetscapeFuncs.geturl           = (NPN_GetURLUPP)HOST_TO_PLUGIN_GLUE(geturl, nsTable->geturl);
        gNetscapeFuncs.requestread      = (NPN_RequestReadUPP)HOST_TO_PLUGIN_GLUE(requestread, nsTable->requestread);
        gNetscapeFuncs.newstream        = (NPN_NewStreamUPP)HOST_TO_PLUGIN_GLUE(newstream, nsTable->newstream);
        gNetscapeFuncs.write            = (NPN_WriteUPP)HOST_TO_PLUGIN_GLUE(write, nsTable->write);
        gNetscapeFuncs.destroystream    = (NPN_DestroyStreamUPP)HOST_TO_PLUGIN_GLUE(destroystream, nsTable->destroystream);
        gNetscapeFuncs.status           = (NPN_StatusUPP)HOST_TO_PLUGIN_GLUE(status, nsTable->status);
        gNetscapeFuncs.uagent           = (NPN_UserAgentUPP)HOST_TO_PLUGIN_GLUE(uagent, nsTable->uagent);
        gNetscapeFuncs.memalloc         = (NPN_MemAllocUPP)HOST_TO_PLUGIN_GLUE(memalloc, nsTable->memalloc);
        gNetscapeFuncs.memfree          = (NPN_MemFreeUPP)HOST_TO_PLUGIN_GLUE(memfree, nsTable->memfree);
        gNetscapeFuncs.memflush         = (NPN_MemFlushUPP)HOST_TO_PLUGIN_GLUE(memflush, nsTable->memflush);
        gNetscapeFuncs.reloadplugins    = (NPN_ReloadPluginsUPP)HOST_TO_PLUGIN_GLUE(reloadplugins, nsTable->reloadplugins);
        if( navMinorVers >= NPVERS_HAS_LIVECONNECT )
        {
            gNetscapeFuncs.getJavaEnv   = (NPN_GetJavaEnvUPP)HOST_TO_PLUGIN_GLUE(getJavaEnv, nsTable->getJavaEnv);
            gNetscapeFuncs.getJavaPeer  = (NPN_GetJavaPeerUPP)HOST_TO_PLUGIN_GLUE(getJavaPeer, nsTable->getJavaPeer);
        }
        if( navMinorVers >= NPVERS_HAS_NOTIFICATION )
damienf's avatar
damienf committed
980
        {
981
982
983
984
985
986
987
988
989
            gNetscapeFuncs.geturlnotify = (NPN_GetURLNotifyUPP)HOST_TO_PLUGIN_GLUE(geturlnotify, nsTable->geturlnotify);
            gNetscapeFuncs.posturlnotify    = (NPN_PostURLNotifyUPP)HOST_TO_PLUGIN_GLUE(posturlnotify, nsTable->posturlnotify);
        }
        gNetscapeFuncs.getvalue         = (NPN_GetValueUPP)HOST_TO_PLUGIN_GLUE(getvalue, nsTable->getvalue);
        gNetscapeFuncs.setvalue         = (NPN_SetValueUPP)HOST_TO_PLUGIN_GLUE(setvalue, nsTable->setvalue);
        gNetscapeFuncs.invalidaterect   = (NPN_InvalidateRectUPP)HOST_TO_PLUGIN_GLUE(invalidaterect, nsTable->invalidaterect);
        gNetscapeFuncs.invalidateregion = (NPN_InvalidateRegionUPP)HOST_TO_PLUGIN_GLUE(invalidateregion, nsTable->invalidateregion);
        gNetscapeFuncs.forceredraw      = (NPN_ForceRedrawUPP)HOST_TO_PLUGIN_GLUE(forceredraw, nsTable->forceredraw);
        if( navMinorVers >= 14 )
damienf's avatar
damienf committed
990
        {
991
            // NPRuntime support
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
            gNetscapeFuncs.getstringidentifier  = (NPN_GetStringIdentifierUPP)HOST_TO_PLUGIN_GLUE(getstringidentifier, nsTable->getstringidentifier);
            gNetscapeFuncs.getstringidentifiers = (NPN_GetStringIdentifiersUPP)HOST_TO_PLUGIN_GLUE(getstringidentifiers, nsTable->getstringidentifiers);
            gNetscapeFuncs.getintidentifier     = (NPN_GetIntIdentifierUPP)HOST_TO_PLUGIN_GLUE(getintidentifier, nsTable->getintidentifier);
            gNetscapeFuncs.identifierisstring   = (NPN_IdentifierIsStringUPP)HOST_TO_PLUGIN_GLUE(identifierisstring, nsTable->identifierisstring);
            gNetscapeFuncs.utf8fromidentifier   = (NPN_UTF8FromIdentifierUPP)HOST_TO_PLUGIN_GLUE(utf8fromidentifier, nsTable->utf8fromidentifier);
            gNetscapeFuncs.intfromidentifier    = (NPN_IntFromIdentifierUPP)HOST_TO_PLUGIN_GLUE(intfromidentifier, nsTable->intfromidentifier);
            gNetscapeFuncs.createobject         = (NPN_CreateObjectUPP)HOST_TO_PLUGIN_GLUE(createobject, nsTable->createobject);
            gNetscapeFuncs.retainobject         = (NPN_RetainObjectUPP)HOST_TO_PLUGIN_GLUE(retainobject, nsTable->retainobject);
            gNetscapeFuncs.releaseobject        = (NPN_ReleaseObjectUPP)HOST_TO_PLUGIN_GLUE(releaseobject, nsTable->releaseobject);
            gNetscapeFuncs.invoke               = (NPN_InvokeUPP)HOST_TO_PLUGIN_GLUE(invoke, nsTable->invoke);
            gNetscapeFuncs.invokeDefault        = (NPN_InvokeDefaultUPP)HOST_TO_PLUGIN_GLUE(invokeDefault, nsTable->invokeDefault);
            gNetscapeFuncs.evaluate             = (NPN_EvaluateUPP)HOST_TO_PLUGIN_GLUE(evaluate, nsTable->evaluate);
            gNetscapeFuncs.getproperty          = (NPN_GetPropertyUPP)HOST_TO_PLUGIN_GLUE(getproperty, nsTable->getproperty);
            gNetscapeFuncs.setproperty          = (NPN_SetPropertyUPP)HOST_TO_PLUGIN_GLUE(setproperty, nsTable->setproperty);
            gNetscapeFuncs.removeproperty       = (NPN_RemovePropertyUPP)HOST_TO_PLUGIN_GLUE(removeproperty, nsTable->removeproperty);
            gNetscapeFuncs.hasproperty          = (NPN_HasPropertyUPP)HOST_TO_PLUGIN_GLUE(hasproperty, nsTable->hasproperty);
            gNetscapeFuncs.hasmethod            = (NPN_HasMethodUPP)HOST_TO_PLUGIN_GLUE(hasmethod, nsTable->hasmethod);
            gNetscapeFuncs.releasevariantvalue  = (NPN_ReleaseVariantValueUPP)HOST_TO_PLUGIN_GLUE(releasevariantvalue, nsTable->releasevariantvalue);
            gNetscapeFuncs.setexception         = (NPN_SetExceptionUPP)HOST_TO_PLUGIN_GLUE(setexception, nsTable->setexception);
        }
1012
1013
1014
1015
1016
1017
1018
1019

        //
        // Set up the plugin function table that Netscape will use to
        // call us.  Netscape needs to know about our version and size
        // and have a UniversalProcPointer for every function we implement.
        //
        pluginFuncs->version        = (NP_VERSION_MAJOR << 8) + NP_VERSION_MINOR;
        pluginFuncs->size           = sizeof(NPPluginFuncs);
1020
#if (((NP_VERSION_MAJOR << 8) + NP_VERSION_MINOR) < 20)
1021
1022
1023
1024
1025
1026
1027
1028
1029
        pluginFuncs->newp           = NewNPP_NewProc(PLUGIN_TO_HOST_GLUE(newp, Private_New));
        pluginFuncs->destroy        = NewNPP_DestroyProc(PLUGIN_TO_HOST_GLUE(destroy, Private_Destroy));
        pluginFuncs->setwindow      = NewNPP_SetWindowProc(PLUGIN_TO_HOST_GLUE(setwindow, Private_SetWindow));
        pluginFuncs->newstream      = NewNPP_NewStreamProc(PLUGIN_TO_HOST_GLUE(newstream, Private_NewStream));
        pluginFuncs->destroystream  = NewNPP_DestroyStreamProc(PLUGIN_TO_HOST_GLUE(destroystream, Private_DestroyStream));
        pluginFuncs->asfile         = NewNPP_StreamAsFileProc(PLUGIN_TO_HOST_GLUE(asfile, Private_StreamAsFile));
        pluginFuncs->writeready     = NewNPP_WriteReadyProc(PLUGIN_TO_HOST_GLUE(writeready, Private_WriteReady));
        pluginFuncs->write          = NewNPP_WriteProc(PLUGIN_TO_HOST_GLUE(write, Private_Write));
        pluginFuncs->print          = NewNPP_PrintProc(PLUGIN_TO_HOST_GLUE(print, Private_Print));
damienf's avatar
damienf committed
1030
1031
        pluginFuncs->event          = NewNPP_HandleEventProc(PLUGIN_TO_HOST_GLUE(event, Private_HandleEvent));
        pluginFuncs->getvalue       = NewNPP_GetValueProc(PLUGIN_TO_HOST_GLUE(getvalue, Private_GetValue));
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
#else
        pluginFuncs->newp           = (NPP_NewProcPtr)(PLUGIN_TO_HOST_GLUE(newp, Private_New));
        pluginFuncs->destroy        = (NPP_DestroyProcPtr)(PLUGIN_TO_HOST_GLUE(destroy, Private_Destroy));
        pluginFuncs->setwindow      = (NPP_SetWindowProcPtr)(PLUGIN_TO_HOST_GLUE(setwindow, Private_SetWindow));
        pluginFuncs->newstream      = (NPP_NewStreamProcPtr)(PLUGIN_TO_HOST_GLUE(newstream, Private_NewStream));
        pluginFuncs->destroystream  = (NPP_DestroyStreamProcPtr)(PLUGIN_TO_HOST_GLUE(destroystream, Private_DestroyStream));
        pluginFuncs->asfile         = (NPP_StreamAsFileProcPtr)(PLUGIN_TO_HOST_GLUE(asfile, Private_StreamAsFile));
        pluginFuncs->writeready     = (NPP_WriteReadyProcPtr)(PLUGIN_TO_HOST_GLUE(writeready, Private_WriteReady));
        pluginFuncs->write          = (NPP_WriteProcPtr)(PLUGIN_TO_HOST_GLUE(write, Private_Write));
        pluginFuncs->print          = (NPP_PrintProcPtr)(PLUGIN_TO_HOST_GLUE(print, Private_Print));
        pluginFuncs->event          = (NPP_HandleEventProcPtr)(PLUGIN_TO_HOST_GLUE(event, Private_HandleEvent));
        pluginFuncs->getvalue       = (NPP_GetValueProcPtr)(PLUGIN_TO_HOST_GLUE(getvalue, Private_GetValue));
#endif
1045
        if( navMinorVers >= NPVERS_HAS_NOTIFICATION )
damienf's avatar
damienf committed
1046
        {
1047
#if (((NP_VERSION_MAJOR << 8) + NP_VERSION_MINOR) < 20)
damienf's avatar
damienf committed
1048
            pluginFuncs->urlnotify = NewNPP_URLNotifyProc(PLUGIN_TO_HOST_GLUE(urlnotify, Private_URLNotify));
1049
1050
1051
#else
            pluginFuncs->urlnotify = (NPP_URLNotifyProcPtr)(PLUGIN_TO_HOST_GLUE(urlnotify, Private_URLNotify));
#endif
1052
        }
1053
#ifdef OJI
1054
1055
1056
1057
        if( navMinorVers >= NPVERS_HAS_LIVECONNECT )
        {
            pluginFuncs->javaClass  = (JRIGlobalRef) Private_GetJavaClass();
        }
1058
#else
1059
        pluginFuncs->javaClass = NULL;
1060
#endif
1061
#if (((NP_VERSION_MAJOR << 8) + NP_VERSION_MINOR) < 20)
1062
        *unloadUpp = NewNPP_ShutdownProc(PLUGIN_TO_HOST_GLUE(shutdown, Private_Shutdown));
1063
1064
1065
#else
        *unloadUpp = (NPP_ShutdownProcPtr)(PLUGIN_TO_HOST_GLUE(shutdown, Private_Shutdown));
#endif
1066
1067
1068
        SetUpQD();
        err = Private_Initialize();
    }
damienf's avatar
damienf committed
1069

1070
1071
    ExitCodeResource();
    return err;
1072
}
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092

#ifdef __MACH__

/*
** netscape plugins functions when building Mach-O binary
*/

extern "C" {
    NPError NP_Initialize(NPNetscapeFuncs* nsTable);
    NPError NP_GetEntryPoints(NPPluginFuncs* pluginFuncs);
    NPError NP_Shutdown(void);
}

/*
** netscape plugins functions when using Mach-O binary
*/

NPError NP_Initialize(NPNetscapeFuncs* nsTable)
{
    PLUGINDEBUGSTR("\pNP_Initialize");
damienf's avatar
damienf committed
1093

1094
1095
1096
1097
    /* validate input parameters */

    if( NULL == nsTable  )
        return NPERR_INVALID_FUNCTABLE_ERROR;
damienf's avatar
damienf committed
1098

1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
    /*
     * Check the major version passed in Netscape's function table.
     * We won't load if the major version is newer than what we expect.
     * Also check that the function tables passed in are big enough for
     * all the functions we need (they could be bigger, if Netscape added
     * new APIs, but that's OK with us -- we'll just ignore them).
     *
     */

    if ((nsTable->version >> 8) > NP_VERSION_MAJOR)
        return NPERR_INCOMPATIBLE_VERSION_ERROR;

    if (nsTable->size < sizeof(NPNetscapeFuncs))
        return NPERR_INVALID_FUNCTABLE_ERROR;
damienf's avatar
damienf committed
1113

1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
    int navMinorVers = nsTable->version & 0xFF;

    /*
     * Copy all the fields of Netscape function table into our
     * copy so we can call back into Netscape later.  Note that
     * we need to copy the fields one by one, rather than assigning
     * the whole structure, because the Netscape function table
     * could actually be bigger than what we expect.
     */
    gNetscapeFuncs.version       = nsTable->version;
    gNetscapeFuncs.size          = nsTable->size;
    gNetscapeFuncs.posturl       = nsTable->posturl;
    gNetscapeFuncs.geturl        = nsTable->geturl;
    gNetscapeFuncs.requestread   = nsTable->requestread;
    gNetscapeFuncs.newstream     = nsTable->newstream;
    gNetscapeFuncs.write         = nsTable->write;
    gNetscapeFuncs.destroystream = nsTable->destroystream;
    gNetscapeFuncs.status        = nsTable->status;
    gNetscapeFuncs.uagent        = nsTable->uagent;
    gNetscapeFuncs.memalloc      = nsTable->memalloc;
    gNetscapeFuncs.memfree       = nsTable->memfree;
    gNetscapeFuncs.memflush      = nsTable->memflush;
    gNetscapeFuncs.reloadplugins = nsTable->reloadplugins;
    if( navMinorVers >= NPVERS_HAS_LIVECONNECT )
    {
        gNetscapeFuncs.getJavaEnv   = nsTable->getJavaEnv;
        gNetscapeFuncs.getJavaPeer  = nsTable->getJavaPeer;
    }
    if( navMinorVers >= NPVERS_HAS_NOTIFICATION )
damienf's avatar
damienf committed
1143
    {
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
        gNetscapeFuncs.geturlnotify     = nsTable->geturlnotify;
        gNetscapeFuncs.posturlnotify    = nsTable->posturlnotify;
    }

    gNetscapeFuncs.getvalue         = nsTable->getvalue;
    gNetscapeFuncs.setvalue         = nsTable->setvalue;
    gNetscapeFuncs.invalidaterect   = nsTable->invalidaterect;
    gNetscapeFuncs.invalidateregion = nsTable->invalidateregion;
    gNetscapeFuncs.forceredraw      = nsTable->forceredraw;
    if( navMinorVers >= 14 )
damienf's avatar
damienf committed
1154
    {
1155
        // NPRuntime support
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
        gNetscapeFuncs.getstringidentifier  = nsTable->getstringidentifier;
        gNetscapeFuncs.getstringidentifiers = nsTable->getstringidentifiers;
        gNetscapeFuncs.getintidentifier     = nsTable->getintidentifier;
        gNetscapeFuncs.identifierisstring   = nsTable->identifierisstring;
        gNetscapeFuncs.utf8fromidentifier   = nsTable->utf8fromidentifier;
        gNetscapeFuncs.intfromidentifier    = nsTable->intfromidentifier;
        gNetscapeFuncs.createobject         = nsTable->createobject;
        gNetscapeFuncs.retainobject         = nsTable->retainobject;
        gNetscapeFuncs.releaseobject        = nsTable->releaseobject;
        gNetscapeFuncs.invoke               = nsTable->invoke;
        gNetscapeFuncs.invokeDefault        = nsTable->invokeDefault;
        gNetscapeFuncs.evaluate             = nsTable->evaluate;
        gNetscapeFuncs.getproperty          = nsTable->getproperty;
        gNetscapeFuncs.setproperty          = nsTable->setproperty;
        gNetscapeFuncs.removeproperty       = nsTable->removeproperty;
        gNetscapeFuncs.hasproperty          = nsTable->hasproperty;
        gNetscapeFuncs.hasmethod            = nsTable->hasmethod;
        gNetscapeFuncs.releasevariantvalue  = nsTable->releasevariantvalue;
        gNetscapeFuncs.setexception         = nsTable->setexception;
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
    }
    return NPP_Initialize();
}

NPError NP_GetEntryPoints(NPPluginFuncs* pluginFuncs)
{
    int navMinorVers = gNetscapeFuncs.version & 0xFF;

    PLUGINDEBUGSTR("\pNP_GetEntryPoints");

    if( pluginFuncs == NULL )
        return NPERR_INVALID_FUNCTABLE_ERROR;

1188
    /*if (pluginFuncs->size < sizeof(NPPluginFuncs))
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
    return NPERR_INVALID_FUNCTABLE_ERROR;*/

    /*
     * Set up the plugin function table that Netscape will use to
     * call us.  Netscape needs to know about our version and size
     * and have a UniversalProcPointer for every function we
     * implement.
     */

    pluginFuncs->version    = (NP_VERSION_MAJOR << 8) + NP_VERSION_MINOR;
    pluginFuncs->size       = sizeof(NPPluginFuncs);
1200
#if (((NP_VERSION_MAJOR << 8) + NP_VERSION_MINOR) < 20)
1201
    pluginFuncs->newp       = NewNPP_NewProc(Private_New);
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
    pluginFuncs->destroy    = NewNPP_DestroyProc(Private_Destroy);
    pluginFuncs->setwindow  = NewNPP_SetWindowProc(Private_SetWindow);
    pluginFuncs->newstream  = NewNPP_NewStreamProc(Private_NewStream);
    pluginFuncs->destroystream = NewNPP_DestroyStreamProc(Private_DestroyStream);
    pluginFuncs->asfile     = NewNPP_StreamAsFileProc(Private_StreamAsFile);
    pluginFuncs->writeready = NewNPP_WriteReadyProc(Private_WriteReady);
    pluginFuncs->write      = NewNPP_WriteProc(Private_Write);
    pluginFuncs->print      = NewNPP_PrintProc(Private_Print);
    pluginFuncs->event      = NewNPP_HandleEventProc(Private_HandleEvent);
    pluginFuncs->getvalue   = NewNPP_GetValueProc(Private_GetValue);
    pluginFuncs->setvalue   = NewNPP_SetValueProc(Private_SetValue);
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
#else
    pluginFuncs->newp       = (NPP_NewProcPtr)(Private_New);
    pluginFuncs->destroy    = (NPP_DestroyProcPtr)(Private_Destroy);
    pluginFuncs->setwindow  = (NPP_SetWindowProcPtr)(Private_SetWindow);
    pluginFuncs->newstream  = (NPP_NewStreamProcPtr)(Private_NewStream);
    pluginFuncs->destroystream = (NPP_DestroyStreamProcPtr)(Private_DestroyStream);
    pluginFuncs->asfile     = (NPP_StreamAsFileProcPtr)(Private_StreamAsFile);
    pluginFuncs->writeready = (NPP_WriteReadyProcPtr)(Private_WriteReady);
    pluginFuncs->write      = (NPP_WriteProcPtr)(Private_Write);
    pluginFuncs->print      = (NPP_PrintProcPtr)(Private_Print);
    pluginFuncs->event      = (NPP_HandleEventProcPtr)(Private_HandleEvent);
    pluginFuncs->getvalue   = (NPP_GetValueProcPtr)(Private_GetValue);
    pluginFuncs->setvalue   = (NPP_SetValueProcPtr)(Private_SetValue);
#endif
1227
    if( navMinorVers >= NPVERS_HAS_NOTIFICATION )
damienf's avatar
damienf committed
1228
1229
    {
        pluginFuncs->urlnotify = Private_URLNotify;
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
    }
#ifdef OJI
    if( navMinorVers >= NPVERS_HAS_LIVECONNECT )
    {
        pluginFuncs->javaClass  = (JRIGlobalRef) Private_GetJavaClass();
    }
#else
    pluginFuncs->javaClass = NULL;
#endif

    return NPERR_NO_ERROR;
}

NPError NP_Shutdown(void)
{
    PLUGINDEBUGSTR("\pNP_Shutdown");
    NPP_Shutdown();
    return NPERR_NO_ERROR;
}

#endif