From 9f6ff57124207dd08271d02041de33a5b933af8f Mon Sep 17 00:00:00 2001 From: "peterlubczynski%netscape.com" Date: Wed, 28 Nov 2001 01:56:31 +0000 Subject: [PATCH] More Mac Plugin SDK changes. NOT PART OF BUILD git-svn-id: svn://10.0.0.236/trunk@109085 18797224-902f-48f8-a5cc-f745e15eee43 --- .../scriptable/mac/Scriptable Plugin.mcp | Bin 0 -> 193521 bytes .../scriptable/mac/Scriptable PluginIDL.mcp | Bin 0 -> 90992 bytes .../samples/scriptable/mac/Scriptable.rsrc | Bin 0 -> 721 bytes .../scriptable/mac/nsIScriptablePlugin.idl | 29 ++ .../scriptable/mac/nsScriptablePeer.cpp | 127 ++++++ .../samples/scriptable/mac/nsScriptablePeer.h | 105 +++++ .../sdk/samples/scriptable/mac/plugin.cpp | 371 ++++++++++++++++++ .../tools/sdk/samples/scriptable/mac/plugin.h | 82 ++++ .../scriptable/mac/pluginCarbonPrefix.h | 24 ++ .../sdk/samples/scriptable/mac/pluginPrefix.h | 23 ++ 10 files changed, 761 insertions(+) create mode 100644 mozilla/modules/plugin/tools/sdk/samples/scriptable/mac/Scriptable Plugin.mcp create mode 100644 mozilla/modules/plugin/tools/sdk/samples/scriptable/mac/Scriptable PluginIDL.mcp create mode 100644 mozilla/modules/plugin/tools/sdk/samples/scriptable/mac/Scriptable.rsrc create mode 100644 mozilla/modules/plugin/tools/sdk/samples/scriptable/mac/nsIScriptablePlugin.idl create mode 100644 mozilla/modules/plugin/tools/sdk/samples/scriptable/mac/nsScriptablePeer.cpp create mode 100644 mozilla/modules/plugin/tools/sdk/samples/scriptable/mac/nsScriptablePeer.h create mode 100644 mozilla/modules/plugin/tools/sdk/samples/scriptable/mac/plugin.cpp create mode 100644 mozilla/modules/plugin/tools/sdk/samples/scriptable/mac/plugin.h create mode 100644 mozilla/modules/plugin/tools/sdk/samples/scriptable/mac/pluginCarbonPrefix.h create mode 100644 mozilla/modules/plugin/tools/sdk/samples/scriptable/mac/pluginPrefix.h diff --git a/mozilla/modules/plugin/tools/sdk/samples/scriptable/mac/Scriptable Plugin.mcp b/mozilla/modules/plugin/tools/sdk/samples/scriptable/mac/Scriptable Plugin.mcp new file mode 100644 index 0000000000000000000000000000000000000000..9d77f38318c8985fd5534497da28a558e5db2a8d GIT binary patch literal 193521 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 literal 0 HcmV?d00001 diff --git a/mozilla/modules/plugin/tools/sdk/samples/scriptable/mac/Scriptable.rsrc b/mozilla/modules/plugin/tools/sdk/samples/scriptable/mac/Scriptable.rsrc new file mode 100644 index 0000000000000000000000000000000000000000..43f9a7352cf605a0108a80fae2723e7494c21f87 GIT binary patch literal 721 zcmZuvzi-n}5Wd(Uq|~ZPhKeB-Pa=ujss3CC~9>vCVd1+X@)nmyN| zg6DfiSWr=w)w0uX$6$zt#DAEO9ouqskNu&JqS)7?wa;fSED4Z&`j%9RUzlz#NmetB zW+7XHIH_Wlu^j3)|*HV zurH+Y)!|W2;;YRwrMAe4(_%tCgcs74`Zt(ym|QKo9d^P&Y^rEkB-nOo_%;`T$*P8D zx`DoFQPQybZPO-K@9E*iNz3ub4QI!+EdBIE7OFGA%TWh-T4pCIx`K==~5%Wmn-XmJ~=WY H^?3gcZtbnK literal 0 HcmV?d00001 diff --git a/mozilla/modules/plugin/tools/sdk/samples/scriptable/mac/nsIScriptablePlugin.idl b/mozilla/modules/plugin/tools/sdk/samples/scriptable/mac/nsIScriptablePlugin.idl new file mode 100644 index 00000000000..37972f706a5 --- /dev/null +++ b/mozilla/modules/plugin/tools/sdk/samples/scriptable/mac/nsIScriptablePlugin.idl @@ -0,0 +1,29 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 2001 Netscape Communications Corporation. All + * Rights Reserved. + * + * Contributor(s): + */ + +#include "nsISupports.idl" + +[scriptable, uuid(d2d536a0-b6fc-11d5-9d10-0060b0fbd8ac)] +interface nsIScriptablePlugin : nsISupports { + void showVersion(); + void clear(); +}; diff --git a/mozilla/modules/plugin/tools/sdk/samples/scriptable/mac/nsScriptablePeer.cpp b/mozilla/modules/plugin/tools/sdk/samples/scriptable/mac/nsScriptablePeer.cpp new file mode 100644 index 00000000000..404b38cb7e9 --- /dev/null +++ b/mozilla/modules/plugin/tools/sdk/samples/scriptable/mac/nsScriptablePeer.cpp @@ -0,0 +1,127 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: NPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Netscape Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the NPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the NPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +// ============================== +// ! Scriptability related code ! +// ============================== + +///////////////////////////////////////////////////// +// +// This file implements the nsScriptablePeer object +// The native methods of this class are supposed to +// be callable from JavaScript +// +#include "plugin.h" + +static NS_DEFINE_IID(kIScriptableIID, NS_ISCRIPTABLEPLUGIN_IID); +static NS_DEFINE_IID(kIClassInfoIID, NS_ICLASSINFO_IID); +static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); + +nsScriptablePeer::nsScriptablePeer(nsPluginInstance* aPlugin) +{ + mPlugin = aPlugin; + mRefCnt = 0; +} + +nsScriptablePeer::~nsScriptablePeer() +{ +} + +// AddRef, Release and QueryInterface are common methods and must +// be implemented for any interface +NS_IMETHODIMP_(nsrefcnt) nsScriptablePeer::AddRef() +{ + ++mRefCnt; + return mRefCnt; +} + +NS_IMETHODIMP_(nsrefcnt) nsScriptablePeer::Release() +{ + --mRefCnt; + if (mRefCnt == 0) { + delete this; + return 0; + } + return mRefCnt; +} + +// here nsScriptablePeer should return three interfaces it can be asked for by their iid's +// static casts are necessary to ensure that correct pointer is returned +NS_IMETHODIMP nsScriptablePeer::QueryInterface(const nsIID& aIID, void** aInstancePtr) +{ + if(!aInstancePtr) + return NS_ERROR_NULL_POINTER; + + if(aIID.Equals(kIScriptableIID)) { + *aInstancePtr = static_cast(this); + AddRef(); + return NS_OK; + } + + if(aIID.Equals(kIClassInfoIID)) { + *aInstancePtr = static_cast(this); + AddRef(); + return NS_OK; + } + + if(aIID.Equals(kISupportsIID)) { + *aInstancePtr = static_cast(static_cast(this)); + AddRef(); + return NS_OK; + } + + return NS_NOINTERFACE; +} + +// +// the following methods will be callable from JavaScript +// +NS_IMETHODIMP nsScriptablePeer::ShowVersion() +{ + if (mPlugin) + mPlugin->showVersion(); + + return NS_OK; +} + +NS_IMETHODIMP nsScriptablePeer::Clear() +{ + if (mPlugin) + mPlugin->clear(); + + return NS_OK; +} diff --git a/mozilla/modules/plugin/tools/sdk/samples/scriptable/mac/nsScriptablePeer.h b/mozilla/modules/plugin/tools/sdk/samples/scriptable/mac/nsScriptablePeer.h new file mode 100644 index 00000000000..15467e287b3 --- /dev/null +++ b/mozilla/modules/plugin/tools/sdk/samples/scriptable/mac/nsScriptablePeer.h @@ -0,0 +1,105 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: NPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Netscape Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the NPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the NPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +// ============================== +// ! Scriptability related code ! +// ============================== +// +// nsScriptablePeer - xpconnect scriptable peer +// + +#ifndef __nsScriptablePeer_h__ +#define __nsScriptablePeer_h__ + +#include "nsIScriptablePlugin.h" +#include "nsIClassInfo.h" + +class nsPluginInstance; + +// We must implement nsIClassInfo because it signals the +// Mozilla Security Manager to allow calls from JavaScript. + +class nsClassInfoMixin : public nsIClassInfo +{ + // These flags are used by the DOM and security systems to signal that + // JavaScript callers are allowed to call this object's scritable methods. + NS_IMETHOD GetFlags(PRUint32 *aFlags) + {*aFlags = nsIClassInfo::PLUGIN_OBJECT | nsIClassInfo::DOM_OBJECT; + return NS_OK;} + NS_IMETHOD GetImplementationLanguage(PRUint32 *aImplementationLanguage) + {*aImplementationLanguage = nsIProgrammingLanguage::CPLUSPLUS; + return NS_OK;} + // The rest of the methods can safely return error codes... + NS_IMETHOD GetInterfaces(PRUint32 *count, nsIID * **array) + {return NS_ERROR_NOT_IMPLEMENTED;} + NS_IMETHOD GetHelperForLanguage(PRUint32 language, nsISupports **_retval) + {return NS_ERROR_NOT_IMPLEMENTED;} + NS_IMETHOD GetContractID(char * *aContractID) + {return NS_ERROR_NOT_IMPLEMENTED;} + NS_IMETHOD GetClassDescription(char * *aClassDescription) + {return NS_ERROR_NOT_IMPLEMENTED;} + NS_IMETHOD GetClassID(nsCID * *aClassID) + {return NS_ERROR_NOT_IMPLEMENTED;} + NS_IMETHOD GetClassIDNoAlloc(nsCID *aClassIDNoAlloc) + {return NS_ERROR_NOT_IMPLEMENTED;} +}; + +class nsScriptablePeer : public nsIScriptablePlugin, + public nsClassInfoMixin +{ +public: + nsScriptablePeer(nsPluginInstance* plugin); + ~nsScriptablePeer(); + +public: + // methods from nsISupports + NS_IMETHOD QueryInterface(const nsIID& aIID, void** aInstancePtr); + NS_IMETHOD_(nsrefcnt) AddRef(); + NS_IMETHOD_(nsrefcnt) Release(); + +protected: + nsrefcnt mRefCnt; + +public: + // native methods callable from JavaScript + NS_DECL_NSISCRIPTABLEPLUGIN + +protected: + nsPluginInstance* mPlugin; +}; + +#endif \ No newline at end of file diff --git a/mozilla/modules/plugin/tools/sdk/samples/scriptable/mac/plugin.cpp b/mozilla/modules/plugin/tools/sdk/samples/scriptable/mac/plugin.cpp new file mode 100644 index 00000000000..f9beefcbdd3 --- /dev/null +++ b/mozilla/modules/plugin/tools/sdk/samples/scriptable/mac/plugin.cpp @@ -0,0 +1,371 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: NPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Netscape Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the NPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the NPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include "plugin.h" + +#include + +#if !TARGET_API_MAC_CARBON +extern QDGlobals* gQDPtr; +#endif + + +////////////////////////////////////// +// +// general initialization and shutdown +// +NPError NS_PluginInitialize() +{ + return NPERR_NO_ERROR; +} + +void NS_PluginShutdown() +{ +} + +///////////////////////////////////////////////////////////// +// +// construction and destruction of our plugin instance object +// +nsPluginInstanceBase * NS_NewPluginInstance(nsPluginCreateData * aCreateDataStruct) +{ + if(!aCreateDataStruct) + return NULL; + + nsPluginInstance * plugin = new nsPluginInstance(aCreateDataStruct->instance); + return plugin; +} + +void NS_DestroyPluginInstance(nsPluginInstanceBase * aPlugin) +{ + if(aPlugin) + delete aPlugin; +} + +//////////////////////////////////////// +// +// nsPluginInstance class implementation +// +nsPluginInstance::nsPluginInstance(NPP aInstance) : nsPluginInstanceBase(), + mInstance(aInstance), + mInitialized(FALSE), + mScriptablePeer(NULL) +{ + mWindow = NULL; + mString[0] = '\0'; +} + +nsPluginInstance::~nsPluginInstance() +{ + NS_IF_RELEASE(mScriptablePeer); +} + +NPBool nsPluginInstance::init(NPWindow* aWindow) +{ + if(aWindow == NULL) + return FALSE; + + mWindow = aWindow; + mInitialized = TRUE; + mSaveClip = NewRgn(); + return TRUE; +} + +void nsPluginInstance::shut() +{ + mWindow = NULL; + mInitialized = FALSE; +} + +NPBool nsPluginInstance::isInitialized() +{ + return mInitialized; +} + +///////////////////////////////////////////////////////////// +// +// DrawString +// +void +nsPluginInstance::DrawString(const unsigned char* text, + short width, + short height, + short centerX, + Rect drawRect) +{ + short length, textHeight, textWidth; + + if(text == NULL) + return; + + length = strlen((char*)text); + TextFont(1); + TextFace(bold); + TextMode(srcCopy); + TextSize(12); + + FontInfo fontInfo; + GetFontInfo(&fontInfo); + + textHeight = fontInfo.ascent + fontInfo.descent + fontInfo.leading; + textWidth = TextWidth(text, 0, length); + + if (width > textWidth && height > textHeight) + { + MoveTo(centerX - (textWidth >> 1), height >> 1); + DrawText(text, 0, length); + } +} + +///////////////////////////////////////////////////////////// +// +// DoDraw - paint +// +void +nsPluginInstance::DoDraw(void) +{ + Rect drawRect; + RGBColor black = { 0x0000, 0x0000, 0x0000 }; + RGBColor white = { 0xFFFF, 0xFFFF, 0xFFFF }; + SInt32 height = mWindow->height; + SInt32 width = mWindow->width; + SInt32 centerX = (width) >> 1; + SInt32 centerY = (height) >> 1; + + //const char * ua = getVersion(); + //char* pascalString = (char*) NPN_MemAlloc(strlen(ua) + 1); + //strcpy(pascalString, ua); + UInt8 *pTheText = (unsigned char*) mString; + + drawRect.top = 0; + drawRect.left = 0; + drawRect.bottom = drawRect.top + height; + drawRect.right = drawRect.left + width; + + PenNormal(); + RGBForeColor(&black); + RGBBackColor(&white); + +#if !TARGET_API_MAC_CARBON + FillRect(&drawRect, &(gQDPtr->white)); +#else + Pattern qdWhite; + FillRect(&drawRect, GetQDGlobalsWhite(&qdWhite)); +#endif + + FrameRect(&drawRect); + DrawString(pTheText, width, height, centerX, drawRect); +} + +///////////////////////////////////////////////////////////// +// +// SetWindow +// +NPError +nsPluginInstance::SetWindow(NPWindow* window) +{ + mWindow = window; + if( StartDraw(window) ) { + DoDraw(); + EndDraw(window); + } + return NPERR_NO_ERROR; +} + +///////////////////////////////////////////////////////////// +// +// HandleEvent +// +uint16 +nsPluginInstance::HandleEvent(void* event) +{ + int16 eventHandled = FALSE; + + EventRecord* ev = (EventRecord*) event; + if (event != NULL) + { + switch (ev->what) + { + /* + * Draw ourselves on update events + */ + case updateEvt: + if( StartDraw(mWindow) ) { + DoDraw(); + EndDraw(mWindow); + } + eventHandled = true; + break; + + default: + break; + } + } + return eventHandled; +} + +///////////////////////////////////////////////////////////// +// +// StartDraw - setup port state +// +NPBool +nsPluginInstance::StartDraw(NPWindow* window) +{ + if (mWindow == NULL) + return false; + + NP_Port* npport = (NP_Port*) mWindow->window; + CGrafPtr ourPort = npport->port; + + if (mWindow->clipRect.left < mWindow->clipRect.right) + { + GetPort(&mSavePort); + SetPort((GrafPtr) ourPort); + Rect portRect; +#if !TARGET_API_MAC_CARBON + portRect = ourPort->portRect; +#else + GetPortBounds(ourPort, &portRect); +#endif + mSavePortTop = portRect.top; + mSavePortLeft = portRect.left; + GetClip(mSaveClip); + + mRevealedRect.top = mWindow->clipRect.top + npport->porty; + mRevealedRect.left = mWindow->clipRect.left + npport->portx; + mRevealedRect.bottom = mWindow->clipRect.bottom + npport->porty; + mRevealedRect.right = mWindow->clipRect.right + npport->portx; + SetOrigin(npport->portx, npport->porty); + ClipRect(&mRevealedRect); + + return true; + } + else + return false; +} + +///////////////////////////////////////////////////////////// +// +// EndDraw - restore port state +// +void +nsPluginInstance::EndDraw(NPWindow* window) +{ + SetOrigin(mSavePortLeft, mSavePortTop); + SetClip(mSaveClip); + SetPort(mSavePort); +} + + +// this will force to draw a version string in the plugin window +void nsPluginInstance::showVersion() +{ + const char *ua = NPN_UserAgent(mInstance); + strcpy(mString, ua); + DoDraw(); +} + +// this will clean the plugin window +void nsPluginInstance::clear() +{ + strcpy(mString, ""); + DoDraw(); +} + +// ============================== +// ! Scriptability related code ! +// ============================== +// +// here the plugin is asked by Mozilla to tell if it is scriptable +// we should return a valid interface id and a pointer to +// nsScriptablePeer interface which we should have implemented +// and which should be defined in the corressponding *.xpt file +// in the bin/components folder +NPError nsPluginInstance::GetValue(NPPVariable aVariable, void *aValue) +{ + NPError rv = NPERR_NO_ERROR; + + switch (aVariable) { + case NPPVpluginScriptableInstance: { + // addref happens in getter, so we don't addref here + nsIScriptablePlugin * scriptablePeer = getScriptablePeer(); + if (scriptablePeer) { + *(nsISupports **)aValue = scriptablePeer; + } else + rv = NPERR_OUT_OF_MEMORY_ERROR; + } + break; + + case NPPVpluginScriptableIID: { + static nsIID scriptableIID = NS_ISCRIPTABLEPLUGIN_IID; + nsIID* ptr = (nsIID *)NPN_MemAlloc(sizeof(nsIID)); + if (ptr) { + *ptr = scriptableIID; + *(nsIID **)aValue = ptr; + } else + rv = NPERR_OUT_OF_MEMORY_ERROR; + } + break; + + default: + break; + } + + return rv; +} + +// ============================== +// ! Scriptability related code ! +// ============================== +// +// this method will return the scriptable object (and create it if necessary) +nsIScriptablePlugin* nsPluginInstance::getScriptablePeer() +{ + if (!mScriptablePeer) { + mScriptablePeer = new nsScriptablePeer(this); + if(!mScriptablePeer) + return NULL; + + NS_ADDREF(mScriptablePeer); + } + + // add reference for the caller requesting the object + NS_ADDREF(mScriptablePeer); + return mScriptablePeer; + + return NULL; +} diff --git a/mozilla/modules/plugin/tools/sdk/samples/scriptable/mac/plugin.h b/mozilla/modules/plugin/tools/sdk/samples/scriptable/mac/plugin.h new file mode 100644 index 00000000000..f180c661742 --- /dev/null +++ b/mozilla/modules/plugin/tools/sdk/samples/scriptable/mac/plugin.h @@ -0,0 +1,82 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: NPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Netscape Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the NPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the NPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef __PLUGIN_H__ +#define __PLUGIN_H__ + +#include "pluginbase.h" +#include "nsScriptablePeer.h" + +class nsPluginInstance : public nsPluginInstanceBase +{ +public: + nsPluginInstance(NPP aInstance); + ~nsPluginInstance(); + + NPBool init(NPWindow* aWindow); + void shut(); + NPBool isInitialized(); + NPError SetWindow(NPWindow* pNPWindow); + uint16 HandleEvent(void* event); + NPError GetValue(NPPVariable variable, void *value); + + void showVersion(); + void clear(); + nsIScriptablePlugin* getScriptablePeer(); + + char mString[128]; + +private: + // locals + void DoDraw(); + NPBool StartDraw(NPWindow* window); + void EndDraw(NPWindow* window); + void DrawString(const unsigned char* text, short width, short height, short centerX, Rect drawRect); + + nsIScriptablePlugin * mScriptablePeer; + + NPWindow * mWindow; + NPP mInstance; + NPBool mInitialized; + GrafPtr mSavePort; + RgnHandle mSaveClip; + Rect mRevealedRect; + short mSavePortTop; + short mSavePortLeft; +}; + +#endif // __PLUGIN_H__ diff --git a/mozilla/modules/plugin/tools/sdk/samples/scriptable/mac/pluginCarbonPrefix.h b/mozilla/modules/plugin/tools/sdk/samples/scriptable/mac/pluginCarbonPrefix.h new file mode 100644 index 00000000000..d97f591353d --- /dev/null +++ b/mozilla/modules/plugin/tools/sdk/samples/scriptable/mac/pluginCarbonPrefix.h @@ -0,0 +1,24 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Netscape Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/NPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All + * Rights Reserved. + * + * Contributor(s): + */ + +#define XP_MAC 1 +#define TARGET_CARBON 1 diff --git a/mozilla/modules/plugin/tools/sdk/samples/scriptable/mac/pluginPrefix.h b/mozilla/modules/plugin/tools/sdk/samples/scriptable/mac/pluginPrefix.h new file mode 100644 index 00000000000..7c398a5d7e9 --- /dev/null +++ b/mozilla/modules/plugin/tools/sdk/samples/scriptable/mac/pluginPrefix.h @@ -0,0 +1,23 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Netscape Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/NPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All + * Rights Reserved. + * + * Contributor(s): + */ + +#define XP_MAC 1