Replace CFX_MapPtrTemplate with std::map.
[pdfium.git] / fpdfsdk / include / javascript / JS_Object.h
index 8b91f8c..3898d18 100644 (file)
-// Copyright 2014 PDFium Authors. All rights reserved.\r
-// Use of this source code is governed by a BSD-style license that can be\r
-// found in the LICENSE file.\r
\r
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\r
-\r
-#ifndef _JS_OBJECT_H_\r
-#define _JS_OBJECT_H_\r
-\r
-class CJS_Object;\r
-class CJS_Timer;\r
-class CJS_Context;\r
-\r
-class CJS_EmbedObj : public CFX_Object\r
-{\r
-public:\r
-       CJS_EmbedObj(CJS_Object* pJSObject);\r
-       virtual ~CJS_EmbedObj();\r
-\r
-       virtual void                            TimerProc(CJS_Timer* pTimer){};\r
-\r
-       CJS_Timer*                                      BeginTimer(CPDFDoc_Environment * pApp, FX_UINT nElapse);\r
-       void                                            EndTimer(CJS_Timer* pTimer);\r
-\r
-       CJS_Object*                                     GetJSObject(){return m_pJSObject;};\r
-       operator                                        CJS_Object* (){return m_pJSObject;};\r
-\r
-       CPDFSDK_PageView *                      JSGetPageView(IFXJS_Context* cc);\r
-       int                                                     MsgBox(CPDFDoc_Environment* pApp, CPDFSDK_PageView* pPageView, FX_LPCWSTR swMsg, FX_LPCWSTR swTitle = NULL, FX_UINT nType = 0, FX_UINT nIcon = 0);\r
-       void                                            Alert(CJS_Context* pContext, FX_LPCWSTR swMsg);\r
-       FX_BOOL                                         IsSafeMode(IFXJS_Context* cc);\r
-\r
-protected:\r
-\r
-       CJS_Object*                                     m_pJSObject;\r
-};\r
-\r
-class CJS_Object : public CFX_Object\r
-{\r
-public:\r
-       CJS_Object(JSFXObject pObject);\r
-       virtual ~CJS_Object(void);\r
-       \r
-       void                                            MakeWeak();\r
-\r
-       virtual FX_BOOL                         IsType(FX_LPCSTR sClassName){return TRUE;};\r
-       virtual CFX_ByteString          GetClassName(){return "";};\r
-\r
-       virtual FX_BOOL                         InitInstance(IFXJS_Context* cc){return TRUE;};\r
-       virtual FX_BOOL                         ExitInstance(){return TRUE;};\r
-\r
-       operator                                        JSFXObject () {return v8::Local<v8::Object>::New(m_pIsolate, m_pObject);}\r
-       operator                                        CJS_EmbedObj* (){return m_pEmbedObj;};\r
-\r
-       void                                            SetEmbedObject(CJS_EmbedObj* pObj){m_pEmbedObj = pObj;};\r
-       CJS_EmbedObj *                          GetEmbedObject(){return m_pEmbedObj;};\r
-\r
-       static CPDFSDK_PageView *       JSGetPageView(IFXJS_Context* cc);\r
-       static int                                      MsgBox(CPDFDoc_Environment* pApp, CPDFSDK_PageView* pPageView, FX_LPCWSTR swMsg, FX_LPCWSTR swTitle = NULL, FX_UINT nType = 0,FX_UINT nIcon = 0);\r
-       static void                                     Alert(CJS_Context* pContext, FX_LPCWSTR swMsg);\r
-\r
-       v8::Isolate*                                    GetIsolate() {return m_pIsolate;}\r
-protected:\r
-       CJS_EmbedObj *                          m_pEmbedObj;\r
-       v8::Persistent<v8::Object>                      m_pObject;\r
-       v8::Isolate*                                    m_pIsolate;\r
-};\r
-\r
-struct JS_TIMER_MAP\r
-{\r
-       FX_UINT nID;\r
-       CJS_Timer * pTimer;\r
-};\r
-\r
-typedef CFX_ArrayTemplate<JS_TIMER_MAP*>       CTimerMapArray;\r
-\r
-struct JS_TIMER_MAPARRAY\r
-{\r
-public:\r
-       JS_TIMER_MAPARRAY()\r
-       {\r
-       }\r
-\r
-       ~JS_TIMER_MAPARRAY()\r
-       {\r
-               Reset();\r
-       }\r
-\r
-       void Reset()\r
-       {\r
-               for (int i=0,sz=m_Array.GetSize(); i<sz; i++)\r
-                       delete m_Array.GetAt(i);\r
-\r
-               m_Array.RemoveAll();\r
-       }\r
-\r
-       void SetAt(FX_UINT nIndex,CJS_Timer * pTimer)\r
-       {\r
-               int i = Find(nIndex);\r
-\r
-               if (i>=0)\r
-               {\r
-                       if (JS_TIMER_MAP * pMap = m_Array.GetAt(i))\r
-                               pMap->pTimer = pTimer;\r
-               }\r
-               else\r
-               {\r
-                       if (JS_TIMER_MAP * pMap = new JS_TIMER_MAP)\r
-                       {\r
-                               pMap->nID = nIndex;\r
-                               pMap->pTimer = pTimer;\r
-                               m_Array.Add(pMap);\r
-                       }\r
-               }\r
-       }\r
-\r
-       CJS_Timer * GetAt(FX_UINT nIndex)\r
-       {\r
-               int i = Find(nIndex);\r
-\r
-               if (i>=0)\r
-               {\r
-                       if (JS_TIMER_MAP * pMap = m_Array.GetAt(i))\r
-                               return pMap->pTimer;\r
-               }\r
-               return NULL;\r
-       }\r
-\r
-       void RemoveAt(FX_UINT nIndex)\r
-       {\r
-               int i = Find(nIndex);\r
-\r
-               if (i>=0)\r
-               {\r
-                       delete m_Array.GetAt(i);\r
-                       m_Array.RemoveAt(i);\r
-               }\r
-               //To prevent potential fake memory leak reported by vc6.\r
-               if(m_Array.GetSize() == 0)\r
-                       m_Array.RemoveAll();\r
-       }\r
-\r
-       int Find(FX_UINT nIndex)\r
-       {               \r
-               for (int i=0,sz=m_Array.GetSize(); i<sz; i++)\r
-               {                       \r
-                       if (JS_TIMER_MAP * pMap = m_Array.GetAt(i))\r
-                       {\r
-                               if (pMap->nID == nIndex)\r
-                                       return i;\r
-                       }\r
-               }\r
-\r
-               return -1;\r
-       }\r
-\r
-       CTimerMapArray          m_Array;\r
-};\r
-\r
-static JS_TIMER_MAPARRAY       m_sTimeMap;\r
-\r
-class CJS_Runtime;\r
-\r
-class CJS_Timer\r
-{\r
-public:\r
-       CJS_Timer(CJS_EmbedObj * pObj,CPDFDoc_Environment* pApp): m_pEmbedObj(pObj), \r
-               m_nTimerID(0), \r
-               m_bProcessing(FALSE),\r
-               m_dwStartTime(0),\r
-               m_dwTimeOut(0),\r
-               m_dwElapse(0),\r
-               m_pRuntime(NULL),\r
-               m_nType(0),\r
-               m_pApp(pApp)\r
-       {\r
-       }\r
-       \r
-       virtual ~CJS_Timer()\r
-       {\r
-               KillJSTimer();\r
-       }\r
-\r
-public:\r
-       FX_UINT SetJSTimer(FX_UINT nElapse)\r
-       {       \r
-               if (m_nTimerID)KillJSTimer();\r
-               IFX_SystemHandler* pHandler = m_pApp->GetSysHandler();\r
-               m_nTimerID = pHandler->SetTimer(nElapse,TimerProc);\r
-               m_sTimeMap.SetAt(m_nTimerID,this);\r
-               m_dwElapse = nElapse;\r
-               return m_nTimerID;\r
-       };\r
-\r
-       void KillJSTimer()\r
-       {\r
-               if (m_nTimerID)\r
-               {\r
-                       IFX_SystemHandler* pHandler = m_pApp->GetSysHandler();\r
-                       pHandler->KillTimer(m_nTimerID);\r
-                       m_sTimeMap.RemoveAt(m_nTimerID);\r
-                       m_nTimerID = 0;\r
-               }\r
-       };\r
-\r
-       void SetType(int nType)\r
-       {\r
-               m_nType = nType;\r
-       }\r
-\r
-       int GetType() const\r
-       {\r
-               return m_nType;\r
-       }\r
-\r
-       void SetStartTime(FX_DWORD dwStartTime)\r
-       {\r
-               m_dwStartTime = dwStartTime;\r
-       }\r
-\r
-       FX_DWORD GetStartTime() const\r
-       {\r
-               return m_dwStartTime;\r
-       }\r
-\r
-       void SetTimeOut(FX_DWORD dwTimeOut)\r
-       {\r
-               m_dwTimeOut = dwTimeOut;\r
-       }\r
-\r
-       FX_DWORD GetTimeOut() const\r
-       {\r
-               return m_dwTimeOut;\r
-       }\r
-\r
-       void SetRuntime(CJS_Runtime* pRuntime)\r
-       {\r
-               m_pRuntime = pRuntime;\r
-       }\r
-       \r
-       CJS_Runtime* GetRuntime() const\r
-       {\r
-               return m_pRuntime;\r
-       }\r
-\r
-       void SetJScript(const CFX_WideString& script)\r
-       {\r
-               m_swJScript = script;\r
-       }\r
-\r
-       CFX_WideString GetJScript() const\r
-       {\r
-               return m_swJScript;\r
-       }\r
-\r
-       static void TimerProc(int idEvent)\r
-       {\r
-               if (CJS_Timer * pTimer = m_sTimeMap.GetAt(idEvent))\r
-               {\r
-                       if (!pTimer->m_bProcessing)\r
-                       {\r
-                               pTimer->m_bProcessing = TRUE;\r
-                               if (pTimer->m_pEmbedObj) pTimer->m_pEmbedObj->TimerProc(pTimer);\r
-                               pTimer->m_bProcessing = FALSE;\r
-                       }\r
-                       else\r
-                       {\r
-                       //      TRACE(L"BUSY!\n");\r
-                       }\r
-               }\r
-       };\r
-\r
-private:\r
-       FX_UINT                                                 m_nTimerID;     \r
-       CJS_EmbedObj*                                   m_pEmbedObj;\r
-       FX_BOOL                                                 m_bProcessing;\r
-\r
-       //data\r
-       FX_DWORD                                                        m_dwStartTime;\r
-       FX_DWORD                                                        m_dwTimeOut;\r
-       FX_DWORD                                                m_dwElapse;\r
-       CJS_Runtime*                                    m_pRuntime;\r
-       CFX_WideString                                  m_swJScript;\r
-       int                                                             m_nType; //0:Interval; 1:TimeOut\r
-\r
-       CPDFDoc_Environment*                    m_pApp;\r
-};\r
-#endif //_JS_OBJECT_H_\r
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef FPDFSDK_INCLUDE_JAVASCRIPT_JS_OBJECT_H_
+#define FPDFSDK_INCLUDE_JAVASCRIPT_JS_OBJECT_H_
+
+#include "../fsdk_define.h"  // For FX_UINT
+#include "../fsdk_mgr.h"  // For CPDFDoc_Environment
+#include "../fx_systemhandler.h"  // For IFX_SystemHandler
+#include "../jsapi/fxjs_v8.h"
+
+class CPDFSDK_PageView;
+class CJS_Object;
+class CJS_Timer;
+class CJS_Context;
+
+class CJS_EmbedObj
+{
+public:
+       CJS_EmbedObj(CJS_Object* pJSObject);
+       virtual ~CJS_EmbedObj();
+
+       virtual void                            TimerProc(CJS_Timer* pTimer){};
+
+       CJS_Timer*                                      BeginTimer(CPDFDoc_Environment * pApp, FX_UINT nElapse);
+       void                                            EndTimer(CJS_Timer* pTimer);
+
+       CJS_Object*                                     GetJSObject(){return m_pJSObject;};
+       operator                                        CJS_Object* (){return m_pJSObject;};
+
+       CPDFSDK_PageView *                      JSGetPageView(IFXJS_Context* cc);
+       int                                                     MsgBox(CPDFDoc_Environment* pApp, CPDFSDK_PageView* pPageView, const FX_WCHAR* swMsg, const FX_WCHAR* swTitle = NULL, FX_UINT nType = 0, FX_UINT nIcon = 0);
+       void                                            Alert(CJS_Context* pContext, const FX_WCHAR* swMsg);
+
+protected:
+       CJS_Object*                                     m_pJSObject;
+};
+
+class CJS_Object
+{
+public:
+       CJS_Object(JSFXObject pObject);
+       virtual ~CJS_Object(void);
+
+       void                                            MakeWeak();
+        void                                            Dispose();
+
+       virtual FX_BOOL                         IsType(const FX_CHAR* sClassName){return TRUE;};
+       virtual CFX_ByteString          GetClassName(){return "";};
+
+       virtual FX_BOOL                         InitInstance(IFXJS_Context* cc){return TRUE;};
+       virtual FX_BOOL                         ExitInstance(){return TRUE;};
+
+       operator                                        JSFXObject () {return v8::Local<v8::Object>::New(m_pIsolate, m_pObject);}
+       operator                                        CJS_EmbedObj* (){return m_pEmbedObj;};
+
+       void                                            SetEmbedObject(CJS_EmbedObj* pObj){m_pEmbedObj = pObj;};
+       CJS_EmbedObj *                          GetEmbedObject(){return m_pEmbedObj;};
+
+       static CPDFSDK_PageView *       JSGetPageView(IFXJS_Context* cc);
+       static int                                      MsgBox(CPDFDoc_Environment* pApp, CPDFSDK_PageView* pPageView, const FX_WCHAR* swMsg, const FX_WCHAR* swTitle = NULL, FX_UINT nType = 0,FX_UINT nIcon = 0);
+       static void                                     Alert(CJS_Context* pContext, const FX_WCHAR* swMsg);
+
+       v8::Isolate*                                    GetIsolate() {return m_pIsolate;}
+protected:
+       CJS_EmbedObj *                          m_pEmbedObj;
+       v8::Global<v8::Object>                  m_pObject;
+       v8::Isolate*                                    m_pIsolate;
+};
+
+struct JS_TIMER_MAP
+{
+       FX_UINT nID;
+       CJS_Timer * pTimer;
+};
+
+typedef CFX_ArrayTemplate<JS_TIMER_MAP*>       CTimerMapArray;
+
+struct JS_TIMER_MAPARRAY
+{
+public:
+       JS_TIMER_MAPARRAY()
+       {
+       }
+
+       ~JS_TIMER_MAPARRAY()
+       {
+               Reset();
+       }
+
+       void Reset()
+       {
+               for (int i=0,sz=m_Array.GetSize(); i<sz; i++)
+                       delete m_Array.GetAt(i);
+
+               m_Array.RemoveAll();
+       }
+
+       void SetAt(FX_UINT nIndex,CJS_Timer * pTimer)
+       {
+               int i = Find(nIndex);
+
+               if (i>=0)
+               {
+                       if (JS_TIMER_MAP * pMap = m_Array.GetAt(i))
+                               pMap->pTimer = pTimer;
+               }
+               else
+               {
+                       if (JS_TIMER_MAP * pMap = new JS_TIMER_MAP)
+                       {
+                               pMap->nID = nIndex;
+                               pMap->pTimer = pTimer;
+                               m_Array.Add(pMap);
+                       }
+               }
+       }
+
+       CJS_Timer * GetAt(FX_UINT nIndex)
+       {
+               int i = Find(nIndex);
+
+               if (i>=0)
+               {
+                       if (JS_TIMER_MAP * pMap = m_Array.GetAt(i))
+                               return pMap->pTimer;
+               }
+               return NULL;
+       }
+
+       void RemoveAt(FX_UINT nIndex)
+       {
+               int i = Find(nIndex);
+
+               if (i>=0)
+               {
+                       delete m_Array.GetAt(i);
+                       m_Array.RemoveAt(i);
+               }
+               //To prevent potential fake memory leak reported by vc6.
+               if(m_Array.GetSize() == 0)
+                       m_Array.RemoveAll();
+       }
+
+       int Find(FX_UINT nIndex)
+       {
+               for (int i=0,sz=m_Array.GetSize(); i<sz; i++)
+               {
+                       if (JS_TIMER_MAP * pMap = m_Array.GetAt(i))
+                       {
+                               if (pMap->nID == nIndex)
+                                       return i;
+                       }
+               }
+
+               return -1;
+       }
+
+       CTimerMapArray          m_Array;
+};
+
+JS_TIMER_MAPARRAY& GetTimeMap();
+
+class CJS_Runtime;
+
+class CJS_Timer
+{
+public:
+       CJS_Timer(CJS_EmbedObj * pObj,CPDFDoc_Environment* pApp):
+               m_nTimerID(0),
+               m_pEmbedObj(pObj),
+               m_bProcessing(FALSE),
+               m_dwStartTime(0),
+               m_dwTimeOut(0),
+               m_dwElapse(0),
+               m_pRuntime(NULL),
+               m_nType(0),
+               m_pApp(pApp)
+       {
+       }
+
+       virtual ~CJS_Timer()
+       {
+               KillJSTimer();
+       }
+
+public:
+       FX_UINT SetJSTimer(FX_UINT nElapse)
+       {
+               if (m_nTimerID)KillJSTimer();
+               IFX_SystemHandler* pHandler = m_pApp->GetSysHandler();
+               m_nTimerID = pHandler->SetTimer(nElapse,TimerProc);
+               GetTimeMap().SetAt(m_nTimerID,this);
+               m_dwElapse = nElapse;
+               return m_nTimerID;
+       };
+
+       void KillJSTimer()
+       {
+               if (m_nTimerID)
+               {
+                       IFX_SystemHandler* pHandler = m_pApp->GetSysHandler();
+                       pHandler->KillTimer(m_nTimerID);
+                       GetTimeMap().RemoveAt(m_nTimerID);
+                       m_nTimerID = 0;
+               }
+       };
+
+       void SetType(int nType)
+       {
+               m_nType = nType;
+       }
+
+       int GetType() const
+       {
+               return m_nType;
+       }
+
+       void SetStartTime(FX_DWORD dwStartTime)
+       {
+               m_dwStartTime = dwStartTime;
+       }
+
+       FX_DWORD GetStartTime() const
+       {
+               return m_dwStartTime;
+       }
+
+       void SetTimeOut(FX_DWORD dwTimeOut)
+       {
+               m_dwTimeOut = dwTimeOut;
+       }
+
+       FX_DWORD GetTimeOut() const
+       {
+               return m_dwTimeOut;
+       }
+
+       void SetRuntime(CJS_Runtime* pRuntime)
+       {
+               m_pRuntime = pRuntime;
+       }
+
+       CJS_Runtime* GetRuntime() const
+       {
+               return m_pRuntime;
+       }
+
+       void SetJScript(const CFX_WideString& script)
+       {
+               m_swJScript = script;
+       }
+
+       CFX_WideString GetJScript() const
+       {
+               return m_swJScript;
+       }
+
+       static void TimerProc(int idEvent)
+       {
+               if (CJS_Timer * pTimer = GetTimeMap().GetAt(idEvent))
+               {
+                       if (!pTimer->m_bProcessing)
+                       {
+                               pTimer->m_bProcessing = TRUE;
+                               if (pTimer->m_pEmbedObj) pTimer->m_pEmbedObj->TimerProc(pTimer);
+                               pTimer->m_bProcessing = FALSE;
+                       }
+                       else
+                       {
+                       //      TRACE(L"BUSY!\n");
+                       }
+               }
+       };
+
+private:
+       FX_UINT                                                 m_nTimerID;
+       CJS_EmbedObj*                                   m_pEmbedObj;
+       FX_BOOL                                                 m_bProcessing;
+
+       //data
+       FX_DWORD                                                        m_dwStartTime;
+       FX_DWORD                                                        m_dwTimeOut;
+       FX_DWORD                                                m_dwElapse;
+       CJS_Runtime*                                    m_pRuntime;
+       CFX_WideString                                  m_swJScript;
+       int                                                             m_nType; //0:Interval; 1:TimeOut
+
+       CPDFDoc_Environment*                    m_pApp;
+};
+
+#endif  // FPDFSDK_INCLUDE_JAVASCRIPT_JS_OBJECT_H_