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