18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2005, 2006, 2007 Apple Inc. All rights reserved.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1.  Redistributions of source code must retain the above copyright
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     notice, this list of conditions and the following disclaimer.
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2.  Redistributions in binary form must reproduce the above copyright
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     notice, this list of conditions and the following disclaimer in the
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     documentation and/or other materials provided with the distribution.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     its contributors may be used to endorse or promote products derived
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     from this software without specific prior written permission.
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(NETSCAPE_PLUGIN_API)
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebNetscapePluginPackage.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#import "WebTypesInternal.h"
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebKitLogging.h"
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebKitNSStringExtras.h"
350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "WebNSFileManagerExtras.h"
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebNSObjectExtras.h"
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebNetscapeDeprecatedFunctions.h"
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/npruntime_impl.h>
3906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#import <wtf/RetainPtr.h>
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
41563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#if USE(PLUGIN_HOST_PROCESS)
42563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import "NetscapePluginHostManager.h"
43563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
44563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkusing namespace WebKit;
45563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#endif
46563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
4706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenusing namespace WebCore;
4806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef SUPPORT_CFM
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projecttypedef void (* FunctionPointer)(void);
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projecttypedef void (* TransitionVector)(void);
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic FunctionPointer functionPointerForTVector(TransitionVector);
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic TransitionVector tVectorForFunctionPointer(FunctionPointer);
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define PluginNameOrDescriptionStringNumber     126
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define MIMEDescriptionStringNumber             127
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define MIMEListStringStringNumber              128
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define RealPlayerAppIndentifier                @"com.RealNetworks.RealOne Player"
6106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#define RealPlayerPluginFilename                "RealPlayer Plugin"
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@interface WebNetscapePluginPackage (Internal)
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_unloadWithShutdown:(BOOL)shutdown;
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebNetscapePluginPackage
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef __LP64__
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (void)initialize
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The Shockwave plugin requires a valid file in CurApRefNum.
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // But it doesn't seem to matter what file it is.
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If we're called inside a Cocoa application which won't have a
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // CurApRefNum, we set it to point to the system resource file.
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Call CurResFile before testing the result of WebLMGetCurApRefNum.
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If we are called before the bundle resource map has been opened
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // for a Carbon application (or a Cocoa app with Resource Manager
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // resources) we *do not* want to set CurApRefNum to point at the
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // system resource file. CurResFile triggers Resource Manager lazy
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // initialization, and will open the bundle resource map as necessary.
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CurResFile();
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (WebLMGetCurApRefNum() == -1) {
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // To get the refNum for the system resource file, we have to do
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // UseResFile(kSystemResFile) and then look at CurResFile().
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        short savedCurResFile = CurResFile();
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        UseResFile(kSystemResFile);
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WebLMSetCurApRefNum(CurResFile());
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        UseResFile(savedCurResFile);
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (ResFileRefNum)openResourceFile
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef SUPPORT_CFM
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!isBundle) {
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        FSRef fref;
10206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        OSErr err = FSPathMakeRef((const UInt8 *)[(NSString *)path fileSystemRepresentation], &fref, NULL);
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (err != noErr)
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return -1;
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return FSOpenResFile(&fref, fsRdPerm);
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return CFBundleOpenBundleResourceMap(cfBundle.get());
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)closeResourceFile:(ResFileRefNum)resRef
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef SUPPORT_CFM
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!isBundle) {
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CloseResFile(resRef);
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    CFBundleCloseBundleResourceMap(cfBundle.get(), resRef);
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSString *)stringForStringListID:(SInt16)stringListID andIndex:(SInt16)index
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Get resource, and dereference the handle.
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Handle stringHandle = Get1Resource('STR#', stringListID);
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (stringHandle == NULL) {
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned char *p = (unsigned char *)*stringHandle;
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!p)
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Check the index against the length of the string list, then skip the length.
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (index < 1 || index > *(SInt16 *)p)
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    p += sizeof(SInt16);
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Skip any strings that come before the one we are looking for.
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (--index)
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        p += 1 + *p;
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Convert the one we found into an NSString.
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [[[NSString alloc] initWithBytes:(p + 1) length:*p encoding:[NSString _web_encodingForResource:stringHandle]] autorelease];
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)getPluginInfoFromResources
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SInt16 resRef = [self openResourceFile];
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (resRef == -1)
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return NO;
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    UseResFile(resRef);
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (ResError() != noErr)
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return NO;
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSString *MIME, *extensionsList, *description;
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSArray *extensions;
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned i;
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (i=1; 1; i+=2) {
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        MIME = [[self stringForStringListID:MIMEListStringStringNumber
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                   andIndex:i] lowercaseString];
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!MIME)
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        MimeClassInfo mimeClassInfo;
17006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        mimeClassInfo.type = String(MIME).lower();
17106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        extensionsList = [[self stringForStringListID:MIMEListStringStringNumber andIndex:i+1] lowercaseString];
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (extensionsList) {
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            extensions = [extensionsList componentsSeparatedByString:@","];
17506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            for (NSUInteger j = 0; j < [extensions count]; ++j)
17606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                mimeClassInfo.extensions.append((NSString *)[extensions objectAtIndex:j]);
17706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        }
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        description = [self stringForStringListID:MIMEDescriptionStringNumber
18006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                                         andIndex:pluginInfo.mimes.size() + 1];
18106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        mimeClassInfo.desc = description;
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        pluginInfo.mimes.append(mimeClassInfo);
18406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    }
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    NSString *filename = [(NSString *)path lastPathComponent];
18706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    pluginInfo.file = filename;
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    description = [self stringForStringListID:PluginNameOrDescriptionStringNumber andIndex:1];
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!description)
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        description = filename;
19206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    pluginInfo.desc = description;
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSString *theName = [self stringForStringListID:PluginNameOrDescriptionStringNumber andIndex:2];
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!theName)
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        theName = filename;
19806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    pluginInfo.name = theName;
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self closeResourceFile:resRef];
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return YES;
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)_initWithPath:(NSString *)pluginPath
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    resourceRef = -1;
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    OSType type = 0;
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (cfBundle) {
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Bundle
21306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        CFBundleGetPackageInfo(cfBundle.get(), &type, NULL);
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef SUPPORT_CFM
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        isBundle = YES;
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef SUPPORT_CFM
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Single-file plug-in with resource fork
2200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        NSString *destinationPath = [[NSFileManager defaultManager] destinationOfSymbolicLinkAtPath:path error:0];
2210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        type = [[[NSFileManager defaultManager] attributesOfItemAtPath:destinationPath error:0] fileHFSTypeCode];
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        isBundle = NO;
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        isCFM = YES;
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return NO;
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (type != FOUR_CHAR_CODE('BRPL'))
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return NO;
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Check if the executable is Mach-O or CFM.
23306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (cfBundle) {
23406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        RetainPtr<CFURLRef> executableURL(AdoptCF, CFBundleCopyExecutableURL(cfBundle.get()));
23506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if (!executableURL)
23606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            return NO;
23706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        NSFileHandle *executableFile = [NSFileHandle fileHandleForReadingAtPath:[(NSURL *)executableURL.get() path]];
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NSData *data = [executableFile readDataOfLength:512];
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [executableFile closeFile];
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Check the length of the data before calling memcmp. We think this fixes 3782543.
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (data == nil || [data length] < 8)
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return NO;
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        BOOL hasCFMHeader = memcmp([data bytes], "Joy!peff", 8) == 0;
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef SUPPORT_CFM
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        isCFM = hasCFMHeader;
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (hasCFMHeader)
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return NO;
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
250635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
251635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if USE(PLUGIN_HOST_PROCESS)
25206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        RetainPtr<CFArrayRef> archs(AdoptCF, CFBundleCopyExecutableArchitectures(cfBundle.get()));
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
25406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if ([(NSArray *)archs.get() containsObject:[NSNumber numberWithInteger:NSBundleExecutableArchitectureX86_64]])
255635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            pluginHostArchitecture = CPU_TYPE_X86_64;
25606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        else if ([(NSArray *)archs.get() containsObject:[NSNumber numberWithInteger:NSBundleExecutableArchitectureI386]])
257635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            pluginHostArchitecture = CPU_TYPE_X86;
258635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        else
259635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            return NO;
260635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#else
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (![self isNativeLibraryData:data])
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return NO;
263635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (![self getPluginInfoFromPLists] && ![self getPluginInfoFromResources])
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return NO;
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return YES;
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)initWithPath:(NSString *)pluginPath
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!(self = [super initWithPath:pluginPath]))
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Initializing a plugin package can cause it to be loaded.  If there was an error initializing the plugin package,
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // ensure that it is unloaded before deallocating it (WebBasePluginPackage requires & asserts this).
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (![self _initWithPath:pluginPath]) {
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self _unloadWithShutdown:YES];
2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self release];
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return self;
2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WebExecutableType)executableType
2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef SUPPORT_CFM
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (isCFM)
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return WebCFMExecutableType;
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return WebMachOExecutableType;
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
297635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if USE(PLUGIN_HOST_PROCESS)
298635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (cpu_type_t)pluginHostArchitecture
299635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
300635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return pluginHostArchitecture;
301635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
302563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
303563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (void)createPropertyListFile
304563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
30506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    NetscapePluginHostManager::createPropertyListFile(path, pluginHostArchitecture);
306563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
307563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
308635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
309635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)launchRealPlayer
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFURLRef appURL = NULL;
3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    OSStatus error = LSFindApplicationForInfo(kLSUnknownCreator, (CFStringRef)RealPlayerAppIndentifier, NULL, NULL, &appURL);
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!error) {
3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        LSLaunchURLSpec URLSpec;
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bzero(&URLSpec, sizeof(URLSpec));
3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        URLSpec.launchFlags = kLSLaunchDefaults | kLSLaunchDontSwitch;
3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        URLSpec.appURL = appURL;
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        LSOpenFromURLSpec(&URLSpec, NULL);
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CFRelease(appURL);
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_applyDjVuWorkaround
3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!cfBundle)
3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if ([self bundleIdentifier] == "com.lizardtech.NPDjVu") {
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // The DjVu plug-in will crash copying the vtable if it's too big so we cap it to
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // what the plug-in expects here.
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // size + version + 40 function pointers.
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.size = 2 + 2 + sizeof(void *) * 40;
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)unload
3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self _unloadWithShutdown:YES];
3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
343563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (BOOL)_tryLoad
344563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NP_GetEntryPointsFuncPtr NP_GetEntryPoints = NULL;
3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NP_InitializeFuncPtr NP_Initialize = NULL;
3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NPError npErr;
3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef SUPPORT_CFM
3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    MainFuncPtr pluginMainFunc = NULL;
3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if !LOG_DISABLED
3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFAbsoluteTime start = CFAbsoluteTimeGetCurrent();
3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFAbsoluteTime currentTime;
3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFAbsoluteTime duration;
3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
35806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    LOG(Plugins, "%f Load timing started for: %@", start, (NSString *)[self pluginInfo].name);
3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (isLoaded)
3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return YES;
3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef SUPPORT_CFM
3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (isBundle) {
3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
36606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        if (!CFBundleLoadExecutable(cfBundle.get()))
367563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            return NO;
3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if !LOG_DISABLED
3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        currentTime = CFAbsoluteTimeGetCurrent();
3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        duration = currentTime - start;
3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        LOG(Plugins, "%f CFBundleLoadExecutable took %f seconds", currentTime, duration);
3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        isLoaded = YES;
3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef SUPPORT_CFM
3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isCFM) {
37706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            pluginMainFunc = (MainFuncPtr)CFBundleGetFunctionPointerForName(cfBundle.get(), CFSTR("main") );
3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!pluginMainFunc)
379563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                return NO;
3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
38206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            NP_Initialize = (NP_InitializeFuncPtr)CFBundleGetFunctionPointerForName(cfBundle.get(), CFSTR("NP_Initialize"));
38306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            NP_GetEntryPoints = (NP_GetEntryPointsFuncPtr)CFBundleGetFunctionPointerForName(cfBundle.get(), CFSTR("NP_GetEntryPoints"));
38406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            NP_Shutdown = (NPP_ShutdownProcPtr)CFBundleGetFunctionPointerForName(cfBundle.get(), CFSTR("NP_Shutdown"));
385635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (!NP_Initialize || !NP_GetEntryPoints || !NP_Shutdown)
386563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                return NO;
3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef SUPPORT_CFM
3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // single CFM file
3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        FSSpec spec;
3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        FSRef fref;
3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        OSErr err;
3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        err = FSPathMakeRef((UInt8 *)[(NSString *)path fileSystemRepresentation], &fref, NULL);
3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (err != noErr) {
3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            LOG_ERROR("FSPathMakeRef failed. Error=%d", err);
398563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            return NO;
3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        err = FSGetCatalogInfo(&fref, kFSCatInfoNone, NULL, NULL, &spec, NULL);
4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (err != noErr) {
4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            LOG_ERROR("FSGetCatalogInfo failed. Error=%d", err);
403563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            return NO;
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        err = WebGetDiskFragment(&spec, 0, kCFragGoesToEOF, nil, kPrivateCFragCopy, &connID, (Ptr *)&pluginMainFunc, nil);
4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (err != noErr) {
4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            LOG_ERROR("WebGetDiskFragment failed. Error=%d", err);
408563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            return NO;
4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if !LOG_DISABLED
4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        currentTime = CFAbsoluteTimeGetCurrent();
4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        duration = currentTime - start;
4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        LOG(Plugins, "%f WebGetDiskFragment took %f seconds", currentTime, duration);
4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        isLoaded = YES;
4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        pluginMainFunc = (MainFuncPtr)functionPointerForTVector((TransitionVector)pluginMainFunc);
4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!pluginMainFunc) {
419563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            return NO;
4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // NOTE: pluginMainFunc is freed after it is called. Be sure not to return before that.
4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        isCFM = YES;
4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif /* SUPPORT_CFM */
4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Plugins (at least QT) require that you call UseResFile on the resource file before loading it.
4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    resourceRef = [self openResourceFile];
4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (resourceRef != -1) {
4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        UseResFile(resourceRef);
4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // swap function tables
4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef SUPPORT_CFM
4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (isCFM) {
4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.version = NP_VERSION_MINOR;
4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.size = sizeof(NPNetscapeFuncs);
4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.geturl = (NPN_GetURLProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_GetURL);
4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.posturl = (NPN_PostURLProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_PostURL);
4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.requestread = (NPN_RequestReadProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_RequestRead);
4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.newstream = (NPN_NewStreamProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_NewStream);
4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.write = (NPN_WriteProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_Write);
4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.destroystream = (NPN_DestroyStreamProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_DestroyStream);
4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.status = (NPN_StatusProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_Status);
4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.uagent = (NPN_UserAgentProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_UserAgent);
4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.memalloc = (NPN_MemAllocProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_MemAlloc);
4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.memfree = (NPN_MemFreeProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_MemFree);
4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.memflush = (NPN_MemFlushProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_MemFlush);
4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.reloadplugins = (NPN_ReloadPluginsProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_ReloadPlugins);
4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.geturlnotify = (NPN_GetURLNotifyProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_GetURLNotify);
4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.posturlnotify = (NPN_PostURLNotifyProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_PostURLNotify);
4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.getvalue = (NPN_GetValueProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_GetValue);
4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.setvalue = (NPN_SetValueProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_SetValue);
4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.invalidaterect = (NPN_InvalidateRectProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_InvalidateRect);
4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.invalidateregion = (NPN_InvalidateRegionProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_InvalidateRegion);
4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.forceredraw = (NPN_ForceRedrawProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_ForceRedraw);
4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.getJavaEnv = (NPN_GetJavaEnvProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_GetJavaEnv);
4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.getJavaPeer = (NPN_GetJavaPeerProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_GetJavaPeer);
4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.pushpopupsenabledstate = (NPN_PushPopupsEnabledStateProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_PushPopupsEnabledState);
4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.poppopupsenabledstate = (NPN_PopPopupsEnabledStateProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_PopPopupsEnabledState);
4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.pluginthreadasynccall = (NPN_PluginThreadAsyncCallProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_PluginThreadAsyncCall);
4630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        browserFuncs.getvalueforurl = (NPN_GetValueForURLProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_GetValueForURL);
4640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        browserFuncs.setvalueforurl = (NPN_SetValueForURLProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_SetValueForURL);
4650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        browserFuncs.getauthenticationinfo = (NPN_GetAuthenticationInfoProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_GetAuthenticationInfo);
4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.scheduletimer = (NPN_ScheduleTimerProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_ScheduleTimer);
4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.unscheduletimer = (NPN_UnscheduleTimerProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_UnscheduleTimer);
4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.popupcontextmenu = (NPN_PopUpContextMenuProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_PopUpContextMenu);
4690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        browserFuncs.convertpoint = (NPN_ConvertPointProcPtr)tVectorForFunctionPointer((FunctionPointer)NPN_ConvertPoint);
4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.releasevariantvalue = (NPN_ReleaseVariantValueProcPtr)tVectorForFunctionPointer((FunctionPointer)_NPN_ReleaseVariantValue);
4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.getstringidentifier = (NPN_GetStringIdentifierProcPtr)tVectorForFunctionPointer((FunctionPointer)_NPN_GetStringIdentifier);
4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.getstringidentifiers = (NPN_GetStringIdentifiersProcPtr)tVectorForFunctionPointer((FunctionPointer)_NPN_GetStringIdentifiers);
4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.getintidentifier = (NPN_GetIntIdentifierProcPtr)tVectorForFunctionPointer((FunctionPointer)_NPN_GetIntIdentifier);
4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.identifierisstring = (NPN_IdentifierIsStringProcPtr)tVectorForFunctionPointer((FunctionPointer)_NPN_IdentifierIsString);
4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.utf8fromidentifier = (NPN_UTF8FromIdentifierProcPtr)tVectorForFunctionPointer((FunctionPointer)_NPN_UTF8FromIdentifier);
4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.intfromidentifier = (NPN_IntFromIdentifierProcPtr)tVectorForFunctionPointer((FunctionPointer)_NPN_IntFromIdentifier);
4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.createobject = (NPN_CreateObjectProcPtr)tVectorForFunctionPointer((FunctionPointer)_NPN_CreateObject);
4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.retainobject = (NPN_RetainObjectProcPtr)tVectorForFunctionPointer((FunctionPointer)_NPN_RetainObject);
4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.releaseobject = (NPN_ReleaseObjectProcPtr)tVectorForFunctionPointer((FunctionPointer)_NPN_ReleaseObject);
481635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        browserFuncs.hasmethod = (NPN_HasMethodProcPtr)tVectorForFunctionPointer((FunctionPointer)_NPN_HasProperty);
4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.invoke = (NPN_InvokeProcPtr)tVectorForFunctionPointer((FunctionPointer)_NPN_Invoke);
4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.invokeDefault = (NPN_InvokeDefaultProcPtr)tVectorForFunctionPointer((FunctionPointer)_NPN_InvokeDefault);
4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.evaluate = (NPN_EvaluateProcPtr)tVectorForFunctionPointer((FunctionPointer)_NPN_Evaluate);
485635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        browserFuncs.hasproperty = (NPN_HasPropertyProcPtr)tVectorForFunctionPointer((FunctionPointer)_NPN_HasProperty);
4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.getproperty = (NPN_GetPropertyProcPtr)tVectorForFunctionPointer((FunctionPointer)_NPN_GetProperty);
4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.setproperty = (NPN_SetPropertyProcPtr)tVectorForFunctionPointer((FunctionPointer)_NPN_SetProperty);
4888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.removeproperty = (NPN_RemovePropertyProcPtr)tVectorForFunctionPointer((FunctionPointer)_NPN_RemoveProperty);
4898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.setexception = (NPN_SetExceptionProcPtr)tVectorForFunctionPointer((FunctionPointer)_NPN_SetException);
4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.enumerate = (NPN_EnumerateProcPtr)tVectorForFunctionPointer((FunctionPointer)_NPN_Enumerate);
4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.construct = (NPN_ConstructProcPtr)tVectorForFunctionPointer((FunctionPointer)_NPN_Construct);
4928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self _applyDjVuWorkaround];
4948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if !LOG_DISABLED
4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CFAbsoluteTime mainStart = CFAbsoluteTimeGetCurrent();
4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
4988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        LOG(Plugins, "%f main timing started", mainStart);
4998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NPP_ShutdownProcPtr shutdownFunction;
5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        npErr = pluginMainFunc(&browserFuncs, &pluginFuncs, &shutdownFunction);
501635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NP_Shutdown = (NPP_ShutdownProcPtr)functionPointerForTVector((TransitionVector)shutdownFunction);
5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!isBundle)
5038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Don't free pluginMainFunc if we got it from a bundle because it is owned by CFBundle in that case.
504563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            free(reinterpret_cast<void*>(pluginMainFunc));
5058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Workaround for 3270576. The RealPlayer plug-in fails to load if its preference file is out of date.
5078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Launch the RealPlayer application to refresh the file.
5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (npErr != NPERR_NO_ERROR) {
50906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            if (npErr == NPERR_MODULE_LOAD_FAILED_ERROR && equalIgnoringCase(pluginInfo.file, RealPlayerPluginFilename))
5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                [self launchRealPlayer];
511563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            return NO;
5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if !LOG_DISABLED
5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        currentTime = CFAbsoluteTimeGetCurrent();
5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        duration = currentTime - mainStart;
5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
5178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        LOG(Plugins, "%f main took %f seconds", currentTime, duration);
5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        pluginSize = pluginFuncs.size;
5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        pluginVersion = pluginFuncs.version;
5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        LOG(Plugins, "pluginMainFunc: %d, size=%d, version=%d", npErr, pluginSize, pluginVersion);
5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
523635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        pluginFuncs.newp = (NPP_NewProcPtr)functionPointerForTVector((TransitionVector)pluginFuncs.newp);
524635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        pluginFuncs.destroy = (NPP_DestroyProcPtr)functionPointerForTVector((TransitionVector)pluginFuncs.destroy);
525635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        pluginFuncs.setwindow = (NPP_SetWindowProcPtr)functionPointerForTVector((TransitionVector)pluginFuncs.setwindow);
526635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        pluginFuncs.newstream = (NPP_NewStreamProcPtr)functionPointerForTVector((TransitionVector)pluginFuncs.newstream);
527635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        pluginFuncs.destroystream = (NPP_DestroyStreamProcPtr)functionPointerForTVector((TransitionVector)pluginFuncs.destroystream);
528635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        pluginFuncs.asfile = (NPP_StreamAsFileProcPtr)functionPointerForTVector((TransitionVector)pluginFuncs.asfile);
529635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        pluginFuncs.writeready = (NPP_WriteReadyProcPtr)functionPointerForTVector((TransitionVector)pluginFuncs.writeready);
530635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        pluginFuncs.write = (NPP_WriteProcPtr)functionPointerForTVector((TransitionVector)pluginFuncs.write);
531635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        pluginFuncs.print = (NPP_PrintProcPtr)functionPointerForTVector((TransitionVector)pluginFuncs.print);
532635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        pluginFuncs.event = (NPP_HandleEventProcPtr)functionPointerForTVector((TransitionVector)pluginFuncs.event);
533635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        pluginFuncs.urlnotify = (NPP_URLNotifyProcPtr)functionPointerForTVector((TransitionVector)pluginFuncs.urlnotify);
534635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        pluginFuncs.getvalue = (NPP_GetValueProcPtr)functionPointerForTVector((TransitionVector)pluginFuncs.getvalue);
535635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        pluginFuncs.setvalue = (NPP_SetValueProcPtr)functionPointerForTVector((TransitionVector)pluginFuncs.setvalue);
5368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // LiveConnect support
538563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        pluginFuncs.javaClass = (JRIGlobalRef)functionPointerForTVector((TransitionVector)pluginFuncs.javaClass);
539635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (pluginFuncs.javaClass) {
54006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            LOG(LiveConnect, "%@:  CFM entry point for NPP_GetJavaClass = %p", (NSString *)[self pluginInfo].name, pluginFuncs.javaClass);
5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
54206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            LOG(LiveConnect, "%@:  no entry point for NPP_GetJavaClass", (NSString *)[self pluginInfo].name);
5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // no function pointer conversion necessary for Mach-O
5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.version = NP_VERSION_MINOR;
5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.size = sizeof(NPNetscapeFuncs);
5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.geturl = NPN_GetURL;
5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.posturl = NPN_PostURL;
5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.requestread = NPN_RequestRead;
5558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.newstream = NPN_NewStream;
5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.write = NPN_Write;
5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.destroystream = NPN_DestroyStream;
5588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.status = NPN_Status;
5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.uagent = NPN_UserAgent;
5608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.memalloc = NPN_MemAlloc;
5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.memfree = NPN_MemFree;
5628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.memflush = NPN_MemFlush;
5638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.reloadplugins = NPN_ReloadPlugins;
5648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.geturlnotify = NPN_GetURLNotify;
5658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.posturlnotify = NPN_PostURLNotify;
5668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.getvalue = NPN_GetValue;
5678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.setvalue = NPN_SetValue;
5688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.invalidaterect = NPN_InvalidateRect;
5698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.invalidateregion = NPN_InvalidateRegion;
5708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.forceredraw = NPN_ForceRedraw;
5718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.getJavaEnv = NPN_GetJavaEnv;
5728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.getJavaPeer = NPN_GetJavaPeer;
5738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.pushpopupsenabledstate = NPN_PushPopupsEnabledState;
5748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.poppopupsenabledstate = NPN_PopPopupsEnabledState;
5758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.pluginthreadasynccall = NPN_PluginThreadAsyncCall;
5760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        browserFuncs.getvalueforurl = NPN_GetValueForURL;
5770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        browserFuncs.setvalueforurl = NPN_SetValueForURL;
5780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        browserFuncs.getauthenticationinfo = NPN_GetAuthenticationInfo;
5798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.scheduletimer = NPN_ScheduleTimer;
5808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.unscheduletimer = NPN_UnscheduleTimer;
5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.popupcontextmenu = NPN_PopUpContextMenu;
5820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        browserFuncs.convertpoint = NPN_ConvertPoint;
5830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.releasevariantvalue = _NPN_ReleaseVariantValue;
5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.getstringidentifier = _NPN_GetStringIdentifier;
5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.getstringidentifiers = _NPN_GetStringIdentifiers;
5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.getintidentifier = _NPN_GetIntIdentifier;
5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.identifierisstring = _NPN_IdentifierIsString;
5898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.utf8fromidentifier = _NPN_UTF8FromIdentifier;
5908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.intfromidentifier = _NPN_IntFromIdentifier;
5918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.createobject = _NPN_CreateObject;
5928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.retainobject = _NPN_RetainObject;
5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.releaseobject = _NPN_ReleaseObject;
594635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        browserFuncs.hasmethod = _NPN_HasMethod;
5958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.invoke = _NPN_Invoke;
5968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.invokeDefault = _NPN_InvokeDefault;
5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.evaluate = _NPN_Evaluate;
598635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        browserFuncs.hasproperty = _NPN_HasProperty;
5998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.getproperty = _NPN_GetProperty;
6008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.setproperty = _NPN_SetProperty;
6018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.removeproperty = _NPN_RemoveProperty;
6028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.setexception = _NPN_SetException;
6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.enumerate = _NPN_Enumerate;
6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        browserFuncs.construct = _NPN_Construct;
6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self _applyDjVuWorkaround];
6078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if !LOG_DISABLED
6098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CFAbsoluteTime initializeStart = CFAbsoluteTimeGetCurrent();
6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
6118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        LOG(Plugins, "%f NP_Initialize timing started", initializeStart);
6128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        npErr = NP_Initialize(&browserFuncs);
6138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (npErr != NPERR_NO_ERROR)
614563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            return NO;
6158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if !LOG_DISABLED
6168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        currentTime = CFAbsoluteTimeGetCurrent();
6178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        duration = currentTime - initializeStart;
6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
6198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        LOG(Plugins, "%f NP_Initialize took %f seconds", currentTime, duration);
6208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        pluginFuncs.size = sizeof(NPPluginFuncs);
6228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        npErr = NP_GetEntryPoints(&pluginFuncs);
6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (npErr != NPERR_NO_ERROR)
625563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            return NO;
6268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        pluginSize = pluginFuncs.size;
6288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        pluginVersion = pluginFuncs.version;
6298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
630635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (pluginFuncs.javaClass)
63106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            LOG(LiveConnect, "%@:  mach-o entry point for NPP_GetJavaClass = %p", (NSString *)[self pluginInfo].name, pluginFuncs.javaClass);
632635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        else
63306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            LOG(LiveConnect, "%@:  no entry point for NPP_GetJavaClass", (NSString *)[self pluginInfo].name);
6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef SUPPORT_CFM
6368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
6388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if !LOG_DISABLED
6408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    currentTime = CFAbsoluteTimeGetCurrent();
6418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    duration = currentTime - start;
6428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
6438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG(Plugins, "%f Total load time: %f seconds", currentTime, duration);
6448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
645563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return YES;
646563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
647563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
648563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (BOOL)load
649563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
650563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if ([self _tryLoad])
651563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return [super load];
6528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self _unloadWithShutdown:NO];
6548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return NO;
6558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NPPluginFuncs *)pluginFuncs
6588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return &pluginFuncs;
6608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)wasRemovedFromPluginDatabase:(WebPluginDatabase *)database
6638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [super wasRemovedFromPluginDatabase:database];
6658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Unload when removed from final plug-in database
6678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([pluginDatabases count] == 0)
6688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self _unloadWithShutdown:YES];
6698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)open
6728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    instanceCount++;
6748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Handle the case where all instances close a plug-in package, but another
6768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // instance opens the package before it is unloaded (which only happens when
6778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // the plug-in database is refreshed)
6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    needsUnload = NO;
6798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!isLoaded) {
6818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Should load when the first instance opens the plug-in package
6828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(instanceCount == 1);
6838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self load];
6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)close
6888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(instanceCount > 0);
6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    instanceCount--;
6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (instanceCount == 0 && needsUnload)
6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self _unloadWithShutdown:YES];
6938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
69506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
69606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen- (BOOL)supportsSnapshotting
69706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
69806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if ([self bundleIdentifier] != "com.macromedia.Flash Player.plugin")
69906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        return YES;
70006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
70106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // Flash has a bogus Info.plist entry for CFBundleVersionString, so use CFBundleShortVersionString.
70206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    NSString *versionString = (NSString *)CFDictionaryGetValue(CFBundleGetInfoDictionary(cfBundle.get()), CFSTR("CFBundleShortVersionString"));
70306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
70406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    if (![versionString hasPrefix:@"10.1"])
70506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        return YES;
70606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
70706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // Some prerelease versions of Flash 10.1 crash when sent a drawRect event using the CA drawing model: <rdar://problem/7739922>
70806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return CFStringCompare((CFStringRef)versionString, CFSTR("10.1.53.60"), kCFCompareNumerically) != kCFCompareLessThan;
70906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
71006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
7118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
7128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef SUPPORT_CFM
7148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// function pointer converters
7168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFunctionPointer functionPointerForTVector(TransitionVector tvp)
7188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
71921939df44de1705786c545cd1bf519d47250322dBen Murdoch    const uint32_t temp[6] = {0x3D800000, 0x618C0000, 0x800C0000, 0x804C0004, 0x7C0903A6, 0x4E800420};
72021939df44de1705786c545cd1bf519d47250322dBen Murdoch    uint32_t *newGlue = NULL;
7218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (tvp != NULL) {
72321939df44de1705786c545cd1bf519d47250322dBen Murdoch        newGlue = (uint32_t *)malloc(sizeof(temp));
7248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (newGlue != NULL) {
7258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            unsigned i;
7268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            for (i = 0; i < 6; i++) newGlue[i] = temp[i];
7278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            newGlue[0] |= ((uintptr_t)tvp >> 16);
7288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            newGlue[1] |= ((uintptr_t)tvp & 0xFFFF);
7298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            MakeDataExecutable(newGlue, sizeof(temp));
7308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
7318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return (FunctionPointer)newGlue;
7348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectTransitionVector tVectorForFunctionPointer(FunctionPointer fp)
7378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FunctionPointer *newGlue = NULL;
7398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (fp != NULL) {
7408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        newGlue = (FunctionPointer *)malloc(2 * sizeof(FunctionPointer));
7418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (newGlue != NULL) {
7428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            newGlue[0] = fp;
7438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            newGlue[1] = NULL;
7448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
7458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return (TransitionVector)newGlue;
7478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
7508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebNetscapePluginPackage (Internal)
7528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_unloadWithShutdown:(BOOL)shutdown
7548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!isLoaded)
7568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
75806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    LOG(Plugins, "Unloading %@...", (NSString *)pluginInfo.name);
7598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Cannot unload a plug-in package while an instance is still using it
7618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (instanceCount > 0) {
7628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        needsUnload = YES;
7638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
7648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
766635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (shutdown && NP_Shutdown)
767635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NP_Shutdown();
7688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (resourceRef != -1)
7708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self closeResourceFile:resourceRef];
7718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef SUPPORT_CFM
773563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!isBundle)
7748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        WebCloseConnection(&connID);
7758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
7768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG(Plugins, "Plugin Unloaded");
7788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    isLoaded = NO;
7798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
7828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
783