10bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*
20bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch     File: MovieControllerLayer.m
30bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
40bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
50bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch Inc. ("Apple") in consideration of your agreement to the following
60bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch terms, and your use, installation, modification or redistribution of
70bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch this Apple software constitutes acceptance of these terms.  If you do
80bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch not agree with these terms, please do not use, install, modify or
90bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch redistribute this Apple software.
100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch In consideration of your agreement to abide by the following terms, and
120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch subject to these terms, Apple grants you a personal, non-exclusive
130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch license, under Apple's copyrights in this original Apple software (the
140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch "Apple Software"), to use, reproduce, modify and redistribute the Apple
150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch Software, with or without modifications, in source and/or binary forms;
160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch provided that if you redistribute the Apple Software in its entirety and
170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch without modifications, you must retain this notice and the following
180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch text and disclaimers in all such redistributions of the Apple Software.
190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch Neither the name, trademarks, service marks or logos of Apple Inc. may
200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch be used to endorse or promote products derived from the Apple Software
210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch without specific prior written permission from Apple.  Except as
220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch expressly stated in this notice, no other rights or licenses, express or
230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch implied, are granted by Apple herein, including but not limited to any
240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch patent rights that may be infringed by your derivative works or by other
250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch works in which the Apple Software may be incorporated.
260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION,
370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED
380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch POSSIBILITY OF SUCH DAMAGE.
410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch Copyright (C) 2009 Apple Inc. All Rights Reserved.
430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch */
450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import <WebKit/npapi.h>
470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import <WebKit/npfunctions.h>
480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import <WebKit/npruntime.h>
490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import <QuartzCore/QuartzCore.h>
510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import <QTKit/QTKit.h>
520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "MovieControllerLayer.h"
540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// Browser function table
560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic NPNetscapeFuncs* browser;
570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// Structure for per-instance storage
590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochtypedef struct PluginObject
600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NPP npp;
620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NPWindow window;
640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    CALayer *rootLayer;
660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    MovieControllerLayer *controllerLayer;
670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QTMovieLayer *movieLayer;
680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    CALayer *mouseDownLayer;
700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NSURL *movieURL;
720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QTMovie *movie;
730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} PluginObject;
740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
7506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian MonsenNPError NPP_New(NPMIMEType pluginType, NPP instance, uint16_t mode, int16_t argc, char* argn[], char* argv[], NPSavedData* saved);
760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochNPError NPP_Destroy(NPP instance, NPSavedData** save);
770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochNPError NPP_SetWindow(NPP instance, NPWindow* window);
780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochNPError NPP_NewStream(NPP instance, NPMIMEType type, NPStream* stream, NPBool seekable, uint16* stype);
790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochNPError NPP_DestroyStream(NPP instance, NPStream* stream, NPReason reason);
8006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenint32_t NPP_WriteReady(NPP instance, NPStream* stream);
8106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenint32_t NPP_Write(NPP instance, NPStream* stream, int32_t offset, int32_t len, void* buffer);
820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid NPP_StreamAsFile(NPP instance, NPStream* stream, const char* fname);
830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid NPP_Print(NPP instance, NPPrint* platformPrint);
8406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenint16_t NPP_HandleEvent(NPP instance, void* event);
850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid NPP_URLNotify(NPP instance, const char* URL, NPReason reason, void* notifyData);
860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochNPError NPP_GetValue(NPP instance, NPPVariable variable, void *value);
870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochNPError NPP_SetValue(NPP instance, NPNVariable variable, void *value);
880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#pragma export on
900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// Mach-o entry points
910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochNPError NP_Initialize(NPNetscapeFuncs *browserFuncs);
920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochNPError NP_GetEntryPoints(NPPluginFuncs *pluginFuncs);
930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid NP_Shutdown(void);
940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#pragma export off
950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochNPError NP_Initialize(NPNetscapeFuncs* browserFuncs)
970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    browser = browserFuncs;
990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return NPERR_NO_ERROR;
1000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
1010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochNPError NP_GetEntryPoints(NPPluginFuncs* pluginFuncs)
1030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
1040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    pluginFuncs->version = 11;
1050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    pluginFuncs->size = sizeof(pluginFuncs);
1060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    pluginFuncs->newp = NPP_New;
1070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    pluginFuncs->destroy = NPP_Destroy;
1080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    pluginFuncs->setwindow = NPP_SetWindow;
1090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    pluginFuncs->newstream = NPP_NewStream;
1100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    pluginFuncs->destroystream = NPP_DestroyStream;
1110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    pluginFuncs->asfile = NPP_StreamAsFile;
1120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    pluginFuncs->writeready = NPP_WriteReady;
1130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    pluginFuncs->write = (NPP_WriteProcPtr)NPP_Write;
1140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    pluginFuncs->print = NPP_Print;
1150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    pluginFuncs->event = NPP_HandleEvent;
1160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    pluginFuncs->urlnotify = NPP_URLNotify;
1170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    pluginFuncs->getvalue = NPP_GetValue;
1180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    pluginFuncs->setvalue = NPP_SetValue;
1190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return NPERR_NO_ERROR;
1210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
1220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid NP_Shutdown(void)
1240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
1250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
1270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
12806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian MonsenNPError NPP_New(NPMIMEType pluginType, NPP instance, uint16_t mode, int16_t argc, char* argn[], char* argv[], NPSavedData* saved)
1290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
1300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Create per-instance storage
1310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    PluginObject *obj = (PluginObject *)malloc(sizeof(PluginObject));
1320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    bzero(obj, sizeof(PluginObject));
1330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    obj->npp = instance;
1350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    instance->pdata = obj;
1360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Ask the browser if it supports the Core Animation drawing model
1380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NPBool supportsCoreAnimation;
1390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (browser->getvalue(instance, NPNVsupportsCoreAnimationBool, &supportsCoreAnimation) != NPERR_NO_ERROR)
1400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        supportsCoreAnimation = FALSE;
1410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!supportsCoreAnimation)
1430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return NPERR_INCOMPATIBLE_VERSION_ERROR;
1440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // If the browser supports the Core Animation drawing model, enable it.
1460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    browser->setvalue(instance, NPPVpluginDrawingModel, (void *)NPDrawingModelCoreAnimation);
1470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // If the browser supports the Cocoa event model, enable it.
1490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NPBool supportsCocoa;
1500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (browser->getvalue(instance, NPNVsupportsCocoaBool, &supportsCocoa) != NPERR_NO_ERROR)
1510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        supportsCocoa = FALSE;
1520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!supportsCocoa)
1540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return NPERR_INCOMPATIBLE_VERSION_ERROR;
1550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    browser->setvalue(instance, NPPVpluginEventModel, (void *)NPEventModelCocoa);
1570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
15806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    for (int16_t i = 0; i < argc; i++) {
1590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (strcasecmp(argn[i], "movieurl") == 0) {
1600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            NSString *urlString = [NSString stringWithUTF8String:argv[i]];
1610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            if (urlString)
1620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                obj->movieURL = [[NSURL URLWithString:urlString] retain];
1630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            break;
1640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
1650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
1670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return NPERR_NO_ERROR;
1690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
1700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochNPError NPP_Destroy(NPP instance, NPSavedData** save)
1720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
1730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Free per-instance storage
1740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    PluginObject *obj = instance->pdata;
1750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [obj->movie stop];
1770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [obj->rootLayer release];
1780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    free(obj);
1800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return NPERR_NO_ERROR;
1820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
1830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochNPError NPP_SetWindow(NPP instance, NPWindow* window)
1850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
1860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    PluginObject *obj = instance->pdata;
1870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    obj->window = *window;
1880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return NPERR_NO_ERROR;
1900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
1910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochNPError NPP_NewStream(NPP instance, NPMIMEType type, NPStream* stream, NPBool seekable, uint16* stype)
1940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
1950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    *stype = NP_ASFILEONLY;
1960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return NPERR_NO_ERROR;
1970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
1980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochNPError NPP_DestroyStream(NPP instance, NPStream* stream, NPReason reason)
2000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
2010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return NPERR_NO_ERROR;
2020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
2030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
20406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenint32_t NPP_WriteReady(NPP instance, NPStream* stream)
2050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
2060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return 0;
2070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
2080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
20906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenint32_t NPP_Write(NPP instance, NPStream* stream, int32_t offset, int32_t len, void* buffer)
2100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
2110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return 0;
2120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
2130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid NPP_StreamAsFile(NPP instance, NPStream* stream, const char* fname)
2150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
2160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
2170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid NPP_Print(NPP instance, NPPrint* platformPrint)
2190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
2200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
2220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic void handleMouseDown(PluginObject *obj, NPCocoaEvent *event)
2240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
2250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    CGPoint point = CGPointMake(event->data.mouse.pluginX,
2260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                // Flip the y coordinate
2270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                obj->window.height - event->data.mouse.pluginY);
2280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    obj->mouseDownLayer = [obj->rootLayer hitTest:point];
2300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (obj->mouseDownLayer == obj->controllerLayer) {
2310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        [obj->controllerLayer handleMouseDown:[obj->rootLayer convertPoint:point toLayer:obj->controllerLayer]];
2320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
2330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
2340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
2350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic void togglePlayPause(PluginObject *obj)
2370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
2380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!obj->movie)
2390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
2400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if ([obj->movie rate] == 0)
2420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        [obj->movie play];
2430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    else
2440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        [obj->movie stop];
2450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
2470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic void handleMouseUp(PluginObject *obj, NPCocoaEvent *event)
2490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
2500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    CGPoint point = CGPointMake(event->data.mouse.pluginX,
2510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                // Flip the y coordinate
2520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                obj->window.height - event->data.mouse.pluginY);
2530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    CALayer *mouseDownLayer = obj->mouseDownLayer;
2550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    obj->mouseDownLayer = nil;
2560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (mouseDownLayer == obj->controllerLayer) {
2570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        [obj->controllerLayer handleMouseUp:[obj->rootLayer convertPoint:point toLayer:obj->controllerLayer]];
2580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
2590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
2600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
2610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic void handleMouseDragged(PluginObject *obj, NPCocoaEvent *event)
2630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
2640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    CGPoint point = CGPointMake(event->data.mouse.pluginX,
2650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                // Flip the y coordinate
2660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                obj->window.height - event->data.mouse.pluginY);
2670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (obj->mouseDownLayer == obj->controllerLayer) {
2690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        [obj->controllerLayer handleMouseDragged:[obj->rootLayer convertPoint:point toLayer:obj->controllerLayer]];
2700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
2710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
2720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
2730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic void handleMouseEntered(PluginObject *obj)
2750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
2760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Show the controller layer.
2770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    obj->controllerLayer.opacity = 1.0;
2780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
2790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic void handleMouseExited(PluginObject *obj)
2810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
2820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Hide the controller layer if the movie is playing.
2830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if ([obj->movie rate])
2840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        obj->controllerLayer.opacity = 0.0;
2850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
2860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic int handleKeyDown(PluginObject *obj, NPCocoaEvent *event)
2880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
2890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NSString *characters = (NSString *)event->data.key.characters;
2900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if ([characters length] == 1 && [characters characterAtIndex:0] == ' ') {
2920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        togglePlayPause(obj);
2930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return 1;
2940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
2950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return 0;
2970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
2980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic int handleScrollEvent(PluginObject *obj, NPCocoaEvent *event)
3010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
3020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    double delta = event->data.mouse.deltaY;
3030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (delta < 0)
3040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        [obj->movie stepForward];
3050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    else
3060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        [obj->movie stepBackward];
3070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return 0;
3080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
3090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
31206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenint16_t NPP_HandleEvent(NPP instance, void* event)
3130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
3140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    PluginObject *obj = instance->pdata;
3150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NPCocoaEvent *cocoaEvent = event;
3170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    switch(cocoaEvent->type) {
3190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        case NPCocoaEventMouseDown:
3200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            handleMouseDown(obj, cocoaEvent);
3210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return 1;
3220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        case NPCocoaEventMouseUp:
3230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            handleMouseUp(obj, cocoaEvent);
3240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return 1;
3250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        case NPCocoaEventMouseDragged:
3260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            handleMouseDragged(obj, cocoaEvent);
3270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return 1;
3280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        case NPCocoaEventMouseEntered:
3290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            handleMouseEntered(obj);
3300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return 1;
3310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        case NPCocoaEventMouseExited:
3320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            handleMouseExited(obj);
3330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return 1;
3340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        case NPCocoaEventKeyDown:
3350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return handleKeyDown(obj, cocoaEvent);
3360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        case NPCocoaEventScrollWheel:
3370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return handleScrollEvent(obj, cocoaEvent);
3380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
3390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return 0;
3410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
3420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid NPP_URLNotify(NPP instance, const char* url, NPReason reason, void* notifyData)
3440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
3450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
3470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochNPError NPP_GetValue(NPP instance, NPPVariable variable, void *value)
3490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
3500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    PluginObject *obj = instance->pdata;
3510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    switch (variable) {
3530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        case NPPVpluginCoreAnimationLayer:
3540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            if (!obj->rootLayer) {
3550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                // Setup layer hierarchy.
3560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                obj->rootLayer = [[CALayer layer] retain];
3570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                obj->movieLayer = [QTMovieLayer layer];
3590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                obj->movieLayer.autoresizingMask = kCALayerWidthSizable | kCALayerHeightSizable;
3600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                [obj->rootLayer addSublayer:obj->movieLayer];
3610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                obj->controllerLayer = [MovieControllerLayer layer];
3630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                [obj->rootLayer addSublayer:obj->controllerLayer];
3640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                if (obj->movieURL) {
3660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:obj->movieURL, QTMovieURLAttribute,
3670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                                [NSNumber numberWithBool:YES], QTMovieOpenForPlaybackAttribute,
3680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                                [NSNumber numberWithBool:YES], QTMovieLoopsAttribute,
3690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                                nil];
3700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    obj->movie = [QTMovie movieWithAttributes:attributes error:nil];
3710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    if (obj->movie) {
3730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                        obj->movieLayer.movie = obj->movie;
3740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                        [obj->controllerLayer setMovie:obj->movie];
3750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    }
3760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                }
3770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            }
3790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            // Make sure to return a retained layer
3810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            *((CALayer **)value) = [obj->rootLayer retain];
3820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return NPERR_NO_ERROR;
3840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        default:
3860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return NPERR_GENERIC_ERROR;
3870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
3880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
3890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochNPError NPP_SetValue(NPP instance, NPNVariable variable, void *value)
3910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
3920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return NPERR_GENERIC_ERROR;
3930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
394