aboutsummaryrefslogtreecommitdiff
path: root/Src/nprt_plugin/plugin.cpp
diff options
context:
space:
mode:
authorJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
committerJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
commit20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/nprt_plugin/plugin.cpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/nprt_plugin/plugin.cpp')
-rw-r--r--Src/nprt_plugin/plugin.cpp470
1 files changed, 470 insertions, 0 deletions
diff --git a/Src/nprt_plugin/plugin.cpp b/Src/nprt_plugin/plugin.cpp
new file mode 100644
index 00000000..4dd0c980
--- /dev/null
+++ b/Src/nprt_plugin/plugin.cpp
@@ -0,0 +1,470 @@
+/* -*- 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 ***** */
+
+//////////////////////////////////////////////////
+//
+// CPlugin class implementation
+//
+#include <windows.h>
+#include <windowsx.h>
+#include "plugin.h"
+#include "npupp.h"
+#include "nsError.h"
+#include <malloc.h>
+
+static NPIdentifier sGetVersion_id;
+//static NPObject *sWindowObj;
+
+#define BUFFER_LEN 1024
+
+// Helper class that can be used to map calls to the NPObject hooks
+// into virtual methods on instances of classes that derive from this
+// class.
+class ScriptablePluginObjectBase : public NPObject
+{
+public:
+ ScriptablePluginObjectBase(NPP npp)
+ : mNpp(npp)
+ {
+ }
+
+ virtual ~ScriptablePluginObjectBase()
+ {
+ }
+
+ // Virtual NPObject hooks called through this base class. Override
+ // as you see fit.
+ virtual void Invalidate();
+ virtual bool HasMethod(NPIdentifier name);
+ virtual bool Invoke(NPIdentifier name, const NPVariant *args,
+ uint32_t argCount, NPVariant *result);
+ virtual bool InvokeDefault(const NPVariant *args, uint32_t argCount,
+ NPVariant *result);
+ virtual bool HasProperty(NPIdentifier name);
+ virtual bool GetProperty(NPIdentifier name, NPVariant *result);
+ virtual bool SetProperty(NPIdentifier name, const NPVariant *value);
+ virtual bool RemoveProperty(NPIdentifier name);
+
+public:
+ static void _Deallocate(NPObject *npobj);
+ static void _Invalidate(NPObject *npobj);
+ static bool _HasMethod(NPObject *npobj, NPIdentifier name);
+ static bool _Invoke(NPObject *npobj, NPIdentifier name,
+ const NPVariant *args, uint32_t argCount,
+ NPVariant *result);
+ static bool _InvokeDefault(NPObject *npobj, const NPVariant *args,
+ uint32_t argCount, NPVariant *result);
+ static bool _HasProperty(NPObject * npobj, NPIdentifier name);
+ static bool _GetProperty(NPObject *npobj, NPIdentifier name,
+ NPVariant *result);
+ static bool _SetProperty(NPObject *npobj, NPIdentifier name,
+ const NPVariant *value);
+ static bool _RemoveProperty(NPObject *npobj, NPIdentifier name);
+
+protected:
+ NPP mNpp;
+};
+
+#define DECLARE_NPOBJECT_CLASS_WITH_BASE(_class, ctor) \
+static NPClass s##_class##_NPClass = { \
+ NP_CLASS_STRUCT_VERSION, \
+ ctor, \
+ ScriptablePluginObjectBase::_Deallocate, \
+ ScriptablePluginObjectBase::_Invalidate, \
+ ScriptablePluginObjectBase::_HasMethod, \
+ ScriptablePluginObjectBase::_Invoke, \
+ ScriptablePluginObjectBase::_InvokeDefault, \
+ ScriptablePluginObjectBase::_HasProperty, \
+ ScriptablePluginObjectBase::_GetProperty, \
+ ScriptablePluginObjectBase::_SetProperty, \
+ ScriptablePluginObjectBase::_RemoveProperty, \
+}
+
+#define GET_NPOBJECT_CLASS(_class) &s##_class##_NPClass
+
+void
+ScriptablePluginObjectBase::Invalidate()
+{
+}
+
+bool
+ScriptablePluginObjectBase::HasMethod(NPIdentifier name)
+{
+ return false;
+}
+
+bool
+ScriptablePluginObjectBase::Invoke(NPIdentifier name, const NPVariant *args,
+ uint32_t argCount, NPVariant *result)
+{
+ return false;
+}
+
+bool
+ScriptablePluginObjectBase::InvokeDefault(const NPVariant *args,
+ uint32_t argCount, NPVariant *result)
+{
+ return false;
+}
+
+bool
+ScriptablePluginObjectBase::HasProperty(NPIdentifier name)
+{
+ return false;
+}
+
+bool
+ScriptablePluginObjectBase::GetProperty(NPIdentifier name, NPVariant *result)
+{
+ return false;
+}
+
+bool
+ScriptablePluginObjectBase::SetProperty(NPIdentifier name,
+ const NPVariant *value)
+{
+ return false;
+}
+
+bool
+ScriptablePluginObjectBase::RemoveProperty(NPIdentifier name)
+{
+ return false;
+}
+
+// static
+void
+ScriptablePluginObjectBase::_Deallocate(NPObject *npobj)
+{
+ // Call the virtual destructor.
+ delete (ScriptablePluginObjectBase *)npobj;
+}
+
+// static
+void
+ScriptablePluginObjectBase::_Invalidate(NPObject *npobj)
+{
+ ((ScriptablePluginObjectBase *)npobj)->Invalidate();
+}
+
+// static
+bool
+ScriptablePluginObjectBase::_HasMethod(NPObject *npobj, NPIdentifier name)
+{
+ return ((ScriptablePluginObjectBase *)npobj)->HasMethod(name);
+}
+
+// static
+bool
+ScriptablePluginObjectBase::_Invoke(NPObject *npobj, NPIdentifier name,
+ const NPVariant *args, uint32_t argCount,
+ NPVariant *result)
+{
+ return ((ScriptablePluginObjectBase *)npobj)->Invoke(name, args, argCount,
+ result);
+}
+
+// static
+bool
+ScriptablePluginObjectBase::_InvokeDefault(NPObject *npobj,
+ const NPVariant *args,
+ uint32_t argCount,
+ NPVariant *result)
+{
+ return ((ScriptablePluginObjectBase *)npobj)->InvokeDefault(args, argCount,
+ result);
+}
+
+// static
+bool
+ScriptablePluginObjectBase::_HasProperty(NPObject * npobj, NPIdentifier name)
+{
+ return ((ScriptablePluginObjectBase *)npobj)->HasProperty(name);
+}
+
+// static
+bool
+ScriptablePluginObjectBase::_GetProperty(NPObject *npobj, NPIdentifier name,
+ NPVariant *result)
+{
+ return ((ScriptablePluginObjectBase *)npobj)->GetProperty(name, result);
+}
+
+// static
+bool
+ScriptablePluginObjectBase::_SetProperty(NPObject *npobj, NPIdentifier name,
+ const NPVariant *value)
+{
+ return ((ScriptablePluginObjectBase *)npobj)->SetProperty(name, value);
+}
+
+// static
+bool
+ScriptablePluginObjectBase::_RemoveProperty(NPObject *npobj, NPIdentifier name)
+{
+ return ((ScriptablePluginObjectBase *)npobj)->RemoveProperty(name);
+}
+
+class ScriptablePluginObject : public ScriptablePluginObjectBase
+{
+public:
+ ScriptablePluginObject(NPP npp)
+ : ScriptablePluginObjectBase(npp)
+ {
+ }
+
+ virtual bool HasMethod(NPIdentifier name);
+ virtual bool HasProperty(NPIdentifier name);
+ virtual bool GetProperty(NPIdentifier name, NPVariant *result);
+ virtual bool Invoke(NPIdentifier name, const NPVariant *args,
+ uint32_t argCount, NPVariant *result);
+ virtual bool InvokeDefault(const NPVariant *args, uint32_t argCount,
+ NPVariant *result);
+};
+
+static NPObject *
+AllocateScriptablePluginObject(NPP npp, NPClass *aClass)
+{
+ return new ScriptablePluginObject(npp);
+}
+
+DECLARE_NPOBJECT_CLASS_WITH_BASE(ScriptablePluginObject,
+ AllocateScriptablePluginObject);
+
+bool
+ScriptablePluginObject::HasMethod(NPIdentifier name)
+{
+ return name == sGetVersion_id;
+}
+
+bool
+ScriptablePluginObject::HasProperty(NPIdentifier name)
+{
+ return PR_FALSE;
+}
+
+bool
+ScriptablePluginObject::GetProperty(NPIdentifier name, NPVariant *result)
+{
+ VOID_TO_NPVARIANT(*result);
+
+ return PR_FALSE;
+}
+
+bool
+ScriptablePluginObject::Invoke(NPIdentifier name, const NPVariant *args,
+ uint32_t argCount, NPVariant *result)
+{
+ VOID_TO_NPVARIANT(*result);
+
+ if (name == sGetVersion_id) {
+ char csVersion[BUFFER_LEN];
+ memset(&csVersion[0], '\0', BUFFER_LEN);
+
+ DWORD BufferSize = BUFFER_LEN;
+ DWORD cbData;
+ bool keyFound = false;
+
+ wchar_t exeName[] = L"\\winamp.exe";
+ wchar_t fileName[BUFFER_LEN];
+ memset(&fileName[0],'\0',BUFFER_LEN);
+ wchar_t fileNameTemp[BUFFER_LEN];
+
+ HKEY hKey;
+ cbData = BUFFER_LEN;
+
+ // first check the protocol handler registry key, we're looking for
+ // the winamp:// protocol handler. If we find this, then this is the
+ // "right" exe for winamp we need to get the version number on
+ if (RegOpenKeyEx(HKEY_CLASSES_ROOT, TEXT("winamp\\shell\\open\\command"), 0, KEY_READ, &hKey) == ERROR_SUCCESS) {
+ if ( RegQueryValueEx( hKey,
+ TEXT(""),
+ NULL,
+ NULL,
+ (LPBYTE) fileNameTemp,
+ &cbData ) != ERROR_SUCCESS) {
+ return PR_FALSE;
+ }
+
+ RegCloseKey (hKey);
+ if (wcsstr(fileNameTemp,L"winamp.exe")) {
+ int indexOfFirstQuote = wcscspn(fileNameTemp, L"\"");
+ int indexOfSecondQuote = wcscspn(&fileNameTemp[indexOfFirstQuote+1], L"\"");
+ if (indexOfFirstQuote >= 0) {
+ keyFound = true;
+ wcsncpy(fileName,&fileNameTemp[indexOfFirstQuote+1], indexOfSecondQuote);
+ }
+ } else {
+ // some other app (itunes ??) controlling the winamp:// protocol
+ // return error
+ return PR_FALSE;
+ }
+ }
+
+ if (!keyFound) {
+ // See if the reg key exists
+ if (RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Software\\Winamp"), 0, KEY_READ, &hKey) != ERROR_SUCCESS) {
+ return PR_FALSE;
+ }
+
+ cbData = BUFFER_LEN;
+ if ( RegQueryValueEx( hKey,
+ TEXT(""),
+ NULL,
+ NULL,
+ (LPBYTE) fileName,
+ &cbData ) != ERROR_SUCCESS) {
+ return PR_FALSE;
+ }
+ RegCloseKey (hKey);
+ keyFound = true;
+ wcscat(fileName,exeName);
+ }
+
+ if (!keyFound) {
+ return PR_FALSE;
+ }
+
+ static TCHAR sBackSlash[] = {'\\','\0'};
+ DWORD dwVersionDataLen = GetFileVersionInfoSize(fileName, NULL);
+
+ if (dwVersionDataLen) {
+ char* fvBuf = (char *)alloca(dwVersionDataLen);
+ if (GetFileVersionInfo(fileName, 0, dwVersionDataLen, fvBuf)) {
+
+ LPVOID pVal;
+ UINT nValLen;
+ if (VerQueryValue(fvBuf, sBackSlash, &pVal, &nValLen)) {
+ if (nValLen == sizeof(VS_FIXEDFILEINFO)) {
+ VS_FIXEDFILEINFO* pFixedFileInfo = (VS_FIXEDFILEINFO*)pVal;
+ //sprintf(csVersion, "%d.%d.%d.%d",
+ //HIWORD(pFixedFileInfo->dwFileVersionMS), LOWORD(pFixedFileInfo->dwFileVersionMS),
+ //HIWORD(pFixedFileInfo->dwFileVersionLS), LOWORD(pFixedFileInfo->dwFileVersionLS));
+ sprintf(csVersion, "%d.%d%d",
+ HIWORD(pFixedFileInfo->dwFileVersionMS), LOWORD(pFixedFileInfo->dwFileVersionMS),
+ HIWORD(pFixedFileInfo->dwFileVersionLS));
+ }
+ }
+ }
+ }
+
+ size_t versionLen = (uint32)strlen(&csVersion[0]) + 1;
+ char *targetResult = (char *) NPN_MemAlloc(versionLen);
+
+ if (targetResult != NULL )
+ memcpy(targetResult, csVersion, versionLen);
+ else
+ return PR_FALSE;
+
+ STRINGZ_TO_NPVARIANT(targetResult, *result);
+ return PR_TRUE;
+ }
+
+ return PR_FALSE;
+}
+
+bool
+ScriptablePluginObject::InvokeDefault(const NPVariant *args, uint32_t argCount,
+ NPVariant *result)
+{
+ VOID_TO_NPVARIANT(*result);
+
+ return PR_FALSE;
+}
+
+CPlugin::CPlugin(NPP pNPInstance) :
+ m_pNPInstance(pNPInstance),
+ m_bInitialized(FALSE),
+ m_pScriptableObject(NULL)
+{
+ //NPN_GetValue(m_pNPInstance, NPNVWindowNPObject, &sWindowObj);
+
+ sGetVersion_id = NPN_GetStringIdentifier("getVersion");
+}
+
+CPlugin::~CPlugin()
+{
+ //if (sWindowObj)
+ // NPN_ReleaseObject(sWindowObj);
+ if (m_pScriptableObject)
+ NPN_ReleaseObject(m_pScriptableObject);
+
+ //sWindowObj = 0;
+}
+
+NPBool CPlugin::init(NPWindow* pNPWindow)
+{
+ if(pNPWindow == NULL)
+ return FALSE;
+
+ m_Window = pNPWindow;
+
+ m_bInitialized = TRUE;
+ return TRUE;
+}
+
+void CPlugin::shut()
+{
+ m_bInitialized = FALSE;
+}
+
+NPBool CPlugin::isInitialized()
+{
+ return m_bInitialized;
+}
+
+
+int16 CPlugin::handleEvent(void* event)
+{
+ return 0;
+}
+
+NPObject *
+CPlugin::GetScriptableObject()
+{
+ if (!m_pScriptableObject) {
+ m_pScriptableObject =
+ NPN_CreateObject(m_pNPInstance,
+ GET_NPOBJECT_CLASS(ScriptablePluginObject));
+ }
+
+ if (m_pScriptableObject) {
+ NPN_RetainObject(m_pScriptableObject);
+ }
+
+ return m_pScriptableObject;
+} \ No newline at end of file