aboutsummaryrefslogtreecommitdiff
path: root/Src/omBrowser/browserRegistry.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/omBrowser/browserRegistry.cpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/omBrowser/browserRegistry.cpp')
-rw-r--r--Src/omBrowser/browserRegistry.cpp356
1 files changed, 356 insertions, 0 deletions
diff --git a/Src/omBrowser/browserRegistry.cpp b/Src/omBrowser/browserRegistry.cpp
new file mode 100644
index 00000000..9c231f7d
--- /dev/null
+++ b/Src/omBrowser/browserRegistry.cpp
@@ -0,0 +1,356 @@
+#include "main.h"
+#include "./browserRegistry.h"
+#include "./obj_ombrowser.h"
+#include "./ifc_wasabihelper.h"
+#include "./ifc_skinhelper.h"
+#include "./ifc_skinnedbrowser.h"
+#include "./ifc_ombrowserclass.h"
+#include "./ifc_omconfig.h"
+#include "./ifc_omdebugconfig.h"
+
+#include "../Plugins/General/gen_ml/colors.h"
+
+#include <shlwapi.h>
+#include <strsafe.h>
+
+#define YES L"yes"
+#define NO L"no"
+
+#define REGVAL_DWORD(__regKey, __valueName, __data) { DWORD __iVal = (__data); RegSetValueExW((__regKey), (__valueName), NULL, REG_DWORD, (LPCBYTE)&__iVal, sizeof(DWORD)); }
+#define REGVAL_STR(__regKey, __valueName, __data, __cbData) RegSetValueExW((__regKey), (__valueName), NULL, REG_SZ, (LPCBYTE)(__data), (__cbData))
+
+#define REGVAL_ONE(__regKey, __valueName) REGVAL_DWORD(__regKey, __valueName, 1)
+#define REGVAL_ZERO(__regKey, __valueName) REGVAL_DWORD(__regKey, __valueName, 0)
+#define REGVAL_YES(__regKey, __valueName) REGVAL_STR(__regKey, __valueName, YES, sizeof(YES))
+#define REGVAL_NO(__regKey, __valueName) REGVAL_STR(__regKey, __valueName, NO, sizeof(NO))
+#define REGVAL_YESNO(__regKey, __valueName, __condition) ((0 != (__condition)) ? REGVAL_YES(__regKey, __valueName) : REGVAL_NO(__regKey, __valueName))
+#define REGVAL_RGB(__regKey, __valueName, __rgb)\
+ { WCHAR szRGB[64] = {0}; COLORREF c = (__rgb);\
+ StringCchPrintfW(szRGB, ARRAYSIZE(szRGB), L"%d,%d,%d", GetRValue(c), GetGValue(c), GetBValue(c));\
+ INT cbLen = lstrlenW(szRGB) * sizeof(WCHAR);\
+ REGVAL_STR(__regKey, __valueName, szRGB, cbLen);}
+
+
+OmBrowserRegistry::OmBrowserRegistry(LPCWSTR pszName)
+ : ref(1), name(NULL), path(NULL)
+{
+ name = Plugin_CopyString(pszName);
+}
+
+OmBrowserRegistry::~OmBrowserRegistry()
+{
+ Plugin_FreeString(name);
+ Plugin_FreeString(path);
+}
+
+HRESULT OmBrowserRegistry::CreateInstance(LPCWSTR pszName, OmBrowserRegistry **instance)
+{
+ if (NULL == instance) return E_POINTER;
+ *instance = NULL;
+
+ if (NULL == pszName || L'\0' == *pszName)
+ pszName = OMBROWSER_NAME;
+
+ *instance = new OmBrowserRegistry(pszName);
+ if (NULL == *instance) return E_OUTOFMEMORY;
+
+ return S_OK;
+}
+
+size_t OmBrowserRegistry::AddRef()
+{
+ return InterlockedIncrement((LONG*)&ref);
+}
+
+size_t OmBrowserRegistry::Release()
+{
+ if (0 == ref)
+ return ref;
+
+ LONG r = InterlockedDecrement((LONG*)&ref);
+ if (0 == r)
+ delete(this);
+
+ return r;
+}
+
+int OmBrowserRegistry::QueryInterface(GUID interface_guid, void **object)
+{
+ if (NULL == object) return E_POINTER;
+
+ if (IsEqualIID(interface_guid, IFC_OmBrowserRegistry))
+ *object = static_cast<ifc_ombrowserregistry*>(this);
+ else
+ {
+ *object = NULL;
+ return E_NOINTERFACE;
+ }
+
+ if (NULL == *object)
+ return E_UNEXPECTED;
+
+ AddRef();
+ return S_OK;
+}
+
+HRESULT OmBrowserRegistry::Write()
+{
+ HKEY hKey = NULL;
+ HKEY hKey2 = NULL;
+
+ LONG result;
+ DWORD disposition;
+
+ if (FAILED(CreateRoot(&hKey, NULL)))
+ return E_FAIL;
+
+ result = RegCreateKeyExW(hKey, L"Main", NULL, NULL, REG_OPTION_VOLATILE, KEY_SET_VALUE, NULL, &hKey2, &disposition);
+ if (ERROR_SUCCESS == result)
+ {
+ REGVAL_ONE(hKey2, L"AllowWindowReuse");
+
+
+ HRESULT hr(S_FALSE);
+
+
+ ifc_ombrowserclass *browserClass;
+ if (SUCCEEDED(Plugin_GetBrowserClass(name, &browserClass)))
+ {
+ ifc_omconfig *config;
+ if (SUCCEEDED(browserClass->GetConfig(&config)))
+ {
+ ifc_omdebugconfig *debugConfig;
+ if (SUCCEEDED(config->QueryInterface(IFC_OmDebugConfig, (void**)&debugConfig)))
+ {
+ hr = debugConfig->GetScriptDebuggerEnabled();
+ debugConfig->Release();
+ }
+ config->Release();
+ }
+ browserClass->Release();
+ }
+
+ REGVAL_YESNO(hKey2, L"Disable Script Debugger", (S_FALSE == hr));
+
+
+ REGVAL_NO(hKey2, L"Check_Associations");
+ REGVAL_ZERO(hKey2, L"EnableSearchPane");
+ REGVAL_NO(hKey2, L"Friendly http errors");
+ REGVAL_NO(hKey2, L"FullScreen");
+ REGVAL_NO(hKey2, L"Save_Session_History_On_Exit");
+ REGVAL_NO(hKey2, L"Use_DlgBox_Colors");
+ REGVAL_YES(hKey2, L"ShowedCheckBrowser");
+ REGVAL_STR(hKey2, L"Start Page", L"", sizeof(L""));
+ REGVAL_STR(hKey2, L"Default_Page_URL", L"about:blank", sizeof(L"about:blank"));
+ REGVAL_STR(hKey2, L"Default_Search_URL", L"about:blank", sizeof(L"about:blank"));
+ REGVAL_NO(hKey2, L"Enable Browser Extensions");
+ REGVAL_NO(hKey2, L"Error Dlg Details Pane Open");
+ REGVAL_NO(hKey2, L"Error Dlg Displayed On Every Error");
+ REGVAL_ONE(hKey2, L"NoUpdateCheck");
+ REGVAL_NO(hKey2, L"Save_Session_History_On_Exit");
+ REGVAL_ONE(hKey2, L"NoJITSetup");
+ REGVAL_ONE(hKey2, L"NoWebJITSetup");
+ REGVAL_ONE(hKey2, L"RunOnceComplete");
+ REGVAL_ONE(hKey2, L"RunOnceHasShown");
+ REGVAL_ONE(hKey2, L"SearchMigrated");
+
+ RegCloseKey(hKey2);
+ }
+
+ result = RegCreateKeyExW(hKey, L"MenuExt", NULL, NULL, REG_OPTION_VOLATILE, KEY_SET_VALUE, NULL, &hKey2, &disposition);
+ if (ERROR_SUCCESS == result)
+ {
+ RegCloseKey(hKey2);
+ }
+
+ result = RegCreateKeyExW(hKey, L"New Windows", NULL, NULL, REG_OPTION_VOLATILE, KEY_SET_VALUE, NULL, &hKey2, &disposition);
+ if (ERROR_SUCCESS == result)
+ {
+ REGVAL_ZERO(hKey2, L"PlaySound");
+ REGVAL_ONE(hKey2, L"PopupMgr");
+ RegCloseKey(hKey2);
+ }
+
+ result = RegCreateKeyExW(hKey, L"SearchScopes", NULL, NULL, REG_OPTION_VOLATILE, KEY_SET_VALUE, NULL, &hKey2, &disposition);
+ if (ERROR_SUCCESS == result)
+ {
+ RegCloseKey(hKey2);
+ }
+
+ result = RegCreateKeyExW(hKey, L"SearchUrl", NULL, NULL, REG_OPTION_VOLATILE, KEY_SET_VALUE, NULL, &hKey2, &disposition);
+ if (ERROR_SUCCESS == result)
+ {
+ RegCloseKey(hKey2);
+ }
+
+ result = RegCreateKeyExW(hKey, L"URLSearchHooks", NULL, NULL, REG_OPTION_VOLATILE, KEY_SET_VALUE, NULL, &hKey2, &disposition);
+ if (ERROR_SUCCESS == result)
+ {
+ RegCloseKey(hKey2);
+ }
+
+ HRESULT hr = WriteColors(hKey);
+
+ RegCloseKey(hKey);
+ return hr;
+}
+
+HRESULT OmBrowserRegistry::Delete()
+{
+ HRESULT hr;
+ WCHAR szBuffer[512] = {0};
+ hr = GetPath(szBuffer, ARRAYSIZE(szBuffer));
+ if (FAILED(hr)) return hr;
+
+ LONG result = SHDeleteKey(HKEY_CURRENT_USER, szBuffer);
+ hr = (ERROR_SUCCESS != result) ? E_FAIL : S_OK;
+ return hr;
+}
+
+HRESULT OmBrowserRegistry::UpdateColors()
+{
+ HKEY hKey;
+
+ HRESULT hr = CreateRoot(&hKey, NULL);
+ if (FAILED(hr)) return hr;
+
+ hr = WriteColors(hKey);
+
+ RegCloseKey(hKey);
+ return hr;
+}
+
+HRESULT OmBrowserRegistry::GetPath(LPWSTR pszBuffer, INT cchBufferMax)
+{
+ if (NULL == pszBuffer)
+ return E_POINTER;
+
+ if (NULL == path)
+ {
+ HRESULT hr = CreatePath(pszBuffer, cchBufferMax);
+ if (FAILED(hr)) return hr;
+
+ path = Plugin_CopyString(pszBuffer);
+ }
+
+ return StringCchPrintfW(pszBuffer, cchBufferMax, path);
+}
+
+HRESULT OmBrowserRegistry::CreatePath(LPWSTR pszBuffer, INT cchBufferMax)
+{
+ if (NULL == pszBuffer) return E_POINTER;
+ if (NULL == name || L'\0' == *name) return E_INVALIDARG;
+
+ HRESULT hr;
+ WCHAR szApp[128] = {0}, szSessionId[128] = {0};
+
+ ifc_wasabihelper *wasabi;
+ hr = Plugin_GetWasabiHelper(&wasabi);
+ if (SUCCEEDED(hr))
+ {
+ api_application *app;
+ hr = wasabi->GetApplicationApi(&app);
+ if (SUCCEEDED(hr))
+ {
+ if (FAILED(StringCchCopyEx(szApp, ARRAYSIZE(szApp), app->main_getAppName(), NULL, NULL, STRSAFE_IGNORE_NULLS)))
+ szApp[0] = L'\0';
+
+ UUID uid;
+ if (API_APPLICATION_SUCCESS == app->GetSessionID(&uid))
+ {
+ RPC_WSTR pszUid;
+ if (RPC_S_OK == UuidToString(&uid, &pszUid))
+ {
+ if(FAILED(StringCchCopy(szSessionId, ARRAYSIZE(szSessionId), (LPCWSTR)pszUid)))
+ szSessionId[0] = L'\0';
+ RpcStringFree(&pszUid);
+ }
+ }
+
+ app->Release();
+ }
+ wasabi->Release();
+ }
+
+ if (L'\0' == szApp[0])
+ hr = StringCchCopy(szApp, ARRAYSIZE(szApp), L"Winamp");
+
+ if (L'\0' == szSessionId[0])
+ hr = StringCchPrintf(szSessionId, ARRAYSIZE(szSessionId), L"%u", GetCurrentProcessId());
+
+ if (SUCCEEDED(hr))
+ hr = StringCchPrintfW(pszBuffer, cchBufferMax, L"Software\\%s\\%s\\%s", szApp, name, szSessionId);
+
+ if (FAILED(hr))
+ *pszBuffer = L'\0';
+
+ return hr;
+}
+HRESULT OmBrowserRegistry::CreateRoot(HKEY *hKey, DWORD *pDisposition)
+{
+ if (NULL == path)
+ {
+ WCHAR szBuffer[2048] = {0};
+ HRESULT hr = CreatePath(szBuffer, ARRAYSIZE(szBuffer));
+ if (FAILED(hr)) return hr;
+
+ path = Plugin_CopyString(szBuffer);
+ if (NULL == path) return E_OUTOFMEMORY;
+ }
+
+ if (NULL == path || L'\0' == *path)
+ return E_UNEXPECTED;
+
+ DWORD disposition;
+ LONG result = RegCreateKeyExW(HKEY_CURRENT_USER, path, NULL, NULL, REG_OPTION_VOLATILE, KEY_SET_VALUE, NULL, hKey, &disposition);
+ if (ERROR_SUCCESS != result)
+ {
+ return E_FAIL;
+ }
+
+ if (NULL != pDisposition)
+ *pDisposition = disposition;
+
+ return S_OK;
+}
+
+HRESULT OmBrowserRegistry::WriteColors(HKEY hKey)
+{
+ return S_OK;
+
+ ifc_skinnedbrowser *skinnedBrowser;
+ HRESULT hr = Plugin_GetBrowserSkin(&skinnedBrowser);
+ if (FAILED(hr)) return E_FAIL;
+
+ LONG result;
+ DWORD disposition;
+ HKEY hKey2 = NULL;
+
+ result = RegCreateKeyExW(hKey, L"Settings", NULL, NULL, REG_OPTION_VOLATILE, KEY_SET_VALUE, NULL, &hKey2, &disposition);
+ if (ERROR_SUCCESS == result)
+ {
+ REGVAL_RGB(hKey2, L"Text Color", skinnedBrowser->GetTextColor());
+ REGVAL_RGB(hKey2, L"Background Color", skinnedBrowser->GetBackColor());
+ REGVAL_RGB(hKey2, L"Anchor Color", skinnedBrowser->GetLinkColor());
+ REGVAL_RGB(hKey2, L"Anchor Color Hover", skinnedBrowser->GetHoveredLinkColor());
+ REGVAL_YES(hKey2, L"Use Anchor Hover Color");
+ REGVAL_RGB(hKey2, L"Anchor Color Visited", skinnedBrowser->GetVisitedLinkColor());
+
+ RegCloseKey(hKey2);
+ }
+
+ skinnedBrowser->Release();
+ return hr;
+}
+
+#define CBCLASS OmBrowserRegistry
+START_DISPATCH;
+CB(ADDREF, AddRef)
+CB(RELEASE, Release)
+CB(QUERYINTERFACE, QueryInterface)
+CB(API_GETPATH, GetPath)
+CB(API_WRITE, Write)
+CB(API_DELETE, Delete)
+CB(API_UPDATECOLORS, UpdateColors)
+END_DISPATCH;
+#undef CBCLASS \ No newline at end of file