| #ifndef _H_ScriptableInstance | 
 | #define _H_ScriptableInstance | 
 | /* | 
 |  * Copyright 2008 Google Inc. | 
 |  *  | 
 |  * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 | 
 |  *  | 
 |  * Unless required by applicable law or agreed to in writing, software | 
 |  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | 
 |  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | 
 |  * License for the specific language governing permissions and limitations under | 
 |  * the License. | 
 |  */ | 
 |  | 
 | #include <vector> | 
 | #include <set> | 
 |  | 
 | #include "Debug.h" | 
 |  | 
 | #include "mozincludes.h" | 
 | #include "HostChannel.h" | 
 | #include "LoadModuleMessage.h" | 
 | #include "LocalObjectTable.h" | 
 | #include "SessionHandler.h" | 
 | #include "HashMap.h" | 
 |  | 
 | using std::vector; | 
 |  | 
 | class JavaObject; | 
 | class JavaClass; | 
 | class Plugin; | 
 |  | 
 | class ScriptableInstance : public NPObjectWrapper<ScriptableInstance>, SessionHandler { | 
 |   friend class JavaObject; | 
 | public: | 
 |   ScriptableInstance(NPP npp); | 
 |   ~ScriptableInstance(); | 
 |  | 
 |   void pluginDeath() { | 
 |     // our local objects will get freed anyway when the plugin dies | 
 |     localObjects.freeAll(); | 
 |     localObjects.setDontFree(true); | 
 |     // TODO(jat): leaving this in causes SEGV upon plugin destruction in the | 
 |     // NPN_ReleaseObject call. | 
 | //    if (window) { | 
 | //      NPN_ReleaseObject(window); | 
 | //      window = 0; | 
 | //    } | 
 |   } | 
 |    | 
 |   // NPObjectWrapper methods | 
 |   bool enumeration(NPIdentifier** values, uint32_t* count); | 
 |   bool getProperty(NPIdentifier name, NPVariant* result); | 
 |   bool setProperty(NPIdentifier name, const NPVariant* value); | 
 |   bool invoke(NPIdentifier name, const NPVariant* args, unsigned argCount, NPVariant* result); | 
 |   bool invokeDefault(const NPVariant* args, unsigned argCount, NPVariant* result); | 
 |   bool hasMethod(NPIdentifier name); | 
 |   bool hasProperty(NPIdentifier name); | 
 |    | 
 |   void dumpJSresult(const char* js); | 
 |    | 
 |   int getLocalObjectRef(NPObject* obj); | 
 |   NPObject* getLocalObject(int refid) { return localObjects.get(refid); } | 
 |    | 
 |   bool tryGetStringPrimitive(NPObject* obj, NPVariant& result); | 
 |  | 
 |   JavaObject* createJavaWrapper(int objectId); | 
 |   void destroyJavaWrapper(JavaObject*); | 
 |  | 
 |   static const uint32_t VERSION = 1; | 
 |  | 
 | protected: | 
 |   virtual void disconnectDetectedImpl(); | 
 |  | 
 | private:   | 
 |   // Map of object ID to JavaObject | 
 |   hash_map<int, JavaObject*> javaObjects; | 
 |   std::set<int> javaObjectsToFree; | 
 |    | 
 |   vector<JavaClass*> classes; | 
 |    | 
 |   Plugin& plugin; | 
 |   HostChannel* _channel; | 
 |   LocalObjectTable localObjects; | 
 |  | 
 |   int savedValueIdx; | 
 |  | 
 |   // Identifiers | 
 |   const NPIdentifier _connectId; | 
 |   const NPIdentifier initID; | 
 |   const NPIdentifier toStringID; | 
 |  | 
 |   const NPIdentifier loadHostEntriesID; | 
 |   const NPIdentifier locationID; | 
 |   const NPIdentifier hrefID; | 
 |   const NPIdentifier urlID; | 
 |   const NPIdentifier includeID; | 
 |   const NPIdentifier getHostPermissionID; | 
 |    | 
 |   const NPIdentifier connectedID; | 
 |   const NPIdentifier statsID; | 
 |   const NPIdentifier gwtId; | 
 |  | 
 |   const NPIdentifier jsDisconnectedID; | 
 |   const NPIdentifier jsInvokeID; | 
 |   const NPIdentifier jsResultID; | 
 |   const NPIdentifier jsTearOffID; | 
 |   const NPIdentifier jsValueOfID; | 
 |   const NPIdentifier idx0; | 
 |   const NPIdentifier idx1; | 
 |    | 
 |   NPObject* window; | 
 |   void dupString(const char* str, NPString& npString); | 
 |   void dumpObjectBytes(NPObject* obj); | 
 |   bool makeResult(bool isException, const Value& value, NPVariant* result); | 
 |    | 
 |   // SessionHandler methods | 
 |   virtual bool invoke(HostChannel& channel, const Value& thisObj, | 
 |       const std::string& methodName, int numArgs, const Value* const args, | 
 |       Value* returnValue); | 
 |   virtual bool invokeSpecial(HostChannel& channel, SpecialMethodId dispatchId, | 
 |       int numArgs, const Value* const args, Value* returnValue); | 
 |   virtual void freeValue(HostChannel& channel, int idCount, const int* ids); | 
 |   virtual void sendFreeValues(HostChannel& channel); | 
 |   virtual void loadJsni(HostChannel& channel, const std::string& js); | 
 |   virtual void fatalError(HostChannel& channel, const std::string& message); | 
 |  | 
 |   void connect(const NPVariant* args, unsigned argCount, NPVariant* result); | 
 |   void init(const NPVariant* args, unsigned argCount, NPVariant* result); | 
 |   void loadHostEntries(const NPVariant* args, unsigned argCount, NPVariant* result); | 
 |   void getHostPermission(const NPVariant* args, unsigned argCount, NPVariant* result); | 
 |    | 
 |   Value clientMethod_getProperty(HostChannel& channel, int numArgs, const Value* const args); | 
 |   Value clientMethod_setProperty(HostChannel& channel, int numArgs, const Value* const args); | 
 |    | 
 |   void JavaObject_invalidate(int objectId); | 
 |   bool JavaObject_invoke(int objectId, int dispId, const NPVariant* args, | 
 |       uint32_t numArgs, NPVariant* result); | 
 |   bool JavaObject_getProperty(int objectId, int dispId, NPVariant* result); | 
 |   bool JavaObject_setProperty(int objectId, int dispId, const NPVariant* value); | 
 |   bool JavaObject_getToStringTearOff(NPVariant* result); | 
 |  | 
 | private: | 
 |   std::string computeTabIdentity(); | 
 |   std::string getLocationHref(); | 
 | }; | 
 |  | 
 | #endif |