aboutsummaryrefslogtreecommitdiff
path: root/Src/Winamp/updateService.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/Winamp/updateService.cpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/Winamp/updateService.cpp')
-rw-r--r--Src/Winamp/updateService.cpp232
1 files changed, 232 insertions, 0 deletions
diff --git a/Src/Winamp/updateService.cpp b/Src/Winamp/updateService.cpp
new file mode 100644
index 00000000..43c34157
--- /dev/null
+++ b/Src/Winamp/updateService.cpp
@@ -0,0 +1,232 @@
+#include "main.h"
+#include "./updateService.h"
+#include "./api.h"
+#include "./externalCOM.h"
+
+#include "../omBrowser/obj_ombrowser.h"
+#include "../omBrowser/ifc_omservice.h"
+#include "../omBrowser/browserPopup.h"
+#include "../omBrowser/ifc_omdebugconfig.h"
+
+HRESULT ServiceSubclass_Attach(HWND hwnd, UpdateService *service);
+
+UpdateService::UpdateService(obj_ombrowser *browserObject, LPWSTR pszUrl)
+: ref(1), url(pszUrl), browserManager(browserObject)
+{
+ if (NULL != browserManager)
+ browserManager->AddRef();
+}
+
+UpdateService::~UpdateService()
+{
+ Finish();
+}
+
+HRESULT UpdateService::CreateInstance(LPCSTR pszUrl, UpdateService **instance)
+{
+ if (NULL == instance)
+ return E_POINTER;
+
+ *instance = NULL;
+
+ waServiceFactory *sf = WASABI_API_SVC->service_getServiceByGuid(OBJ_OmBrowser);
+ if (NULL == sf) return E_FAIL;
+
+ obj_ombrowser *browserManager = reinterpret_cast<obj_ombrowser*>(sf->getInterface());
+ sf->Release();
+
+ if (NULL == browserManager)
+ return E_NOINTERFACE;
+
+ HRESULT hr = browserManager->Initialize(NULL, hMainWindow);
+ if (SUCCEEDED(hr))
+ {
+ LPWSTR url = NULL;
+ if (NULL != pszUrl)
+ {
+ UINT cchUrlMax = MultiByteToWideChar(CP_UTF8, 0, pszUrl, -1, NULL, 0);
+ if (0 != cchUrlMax)
+ {
+ cchUrlMax++;
+ url = (LPWSTR)calloc(cchUrlMax, sizeof(WCHAR));
+ if (NULL == url) hr = E_OUTOFMEMORY;
+ else
+ {
+ if (0 == MultiByteToWideChar(CP_UTF8, 0, pszUrl, -1, url, cchUrlMax))
+ hr = E_FAIL;
+ }
+ }
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ *instance = new UpdateService(browserManager, url);
+ if (NULL == *instance)
+ {
+ if (NULL != url) free(url);
+ hr = E_OUTOFMEMORY;
+ }
+ }
+ }
+
+ browserManager->Release();
+ return hr;
+}
+
+size_t UpdateService::AddRef()
+{
+ return InterlockedIncrement((LONG*)&ref);
+}
+
+size_t UpdateService::Release()
+{
+ if (0 == ref)
+ return ref;
+
+ LONG r = InterlockedDecrement((LONG*)&ref);
+ if (0 == r)
+ delete(this);
+
+ return r;
+}
+
+int UpdateService::QueryInterface(GUID interface_guid, void **object)
+{
+ if (NULL == object) return E_POINTER;
+
+ if (IsEqualIID(interface_guid, IFC_OmService))
+ *object = static_cast<ifc_omservice*>(this);
+ else
+ {
+ *object = NULL;
+ return E_NOINTERFACE;
+ }
+
+ if (NULL == *object)
+ return E_UNEXPECTED;
+
+ AddRef();
+ return S_OK;
+}
+
+unsigned int UpdateService::GetId()
+{
+ return 505;
+}
+
+HRESULT UpdateService::GetName(wchar_t *pszBuffer, int cchBufferMax)
+{
+ getStringW(IDS_WINAMP_UPDATE, pszBuffer, cchBufferMax);
+ return S_OK;
+}
+
+HRESULT UpdateService::GetUrl(wchar_t *pszBuffer, int cchBufferMax)
+{
+
+ return StringCchCopyExW(pszBuffer, cchBufferMax, url, NULL, NULL, STRSAFE_IGNORE_NULLS );
+}
+
+HRESULT UpdateService::GetIcon(wchar_t *pszBuffer, int cchBufferMax)
+{
+ return E_NOTIMPL;
+}
+
+HRESULT UpdateService::GetExternal(IDispatch **ppDispatch)
+{
+ if (NULL == ppDispatch)
+ return E_POINTER;
+
+ ExternalCOM *external;
+ HRESULT hr = JSAPI1_GetExternal(&external);
+ if (FAILED(hr)) external = NULL;
+
+ *ppDispatch = (IDispatch*)external;
+ return S_OK;
+}
+
+HRESULT UpdateService::Show()
+{
+ if (NULL == browserManager)
+ return E_UNEXPECTED;
+
+ LONG cx = 300;
+ LONG cy = 200;
+
+ RECT centerRect;
+ HWND hCenter = (NULL != g_dialog_box_parent) ? g_dialog_box_parent : hMainWindow;
+
+ if (NULL == hCenter ||
+ 0 == GetWindowRect(hCenter, &centerRect) ||
+ ((centerRect.right - centerRect.left) < cx) ||
+ ((centerRect.bottom - centerRect.top) < cy))
+ {
+ HMONITOR hMonitor = MonitorFromWindow(hCenter, MONITOR_DEFAULTTONEAREST);
+ MONITORINFO info;
+ info.cbSize = sizeof(info);
+
+ if (NULL != hMonitor && 0 != GetMonitorInfo(hMonitor, &info))
+ CopyRect(&centerRect, &info.rcWork);
+ else
+ SetRectEmpty(&centerRect);
+
+ }
+
+ LONG x = centerRect.left + (centerRect.right - centerRect.left - cx)/2;
+ LONG y = centerRect.top + (centerRect.bottom - centerRect.top - cy)/2;
+ if (x < centerRect.left) x = centerRect.left;
+ if (y < centerRect.top) y = centerRect.top;
+
+ UINT popupFlags = NBCS_NOTOOLBAR | NBCS_NOSTATUSBAR | NBCS_DIALOGMODE | NBCS_BLOCKPOPUP;
+
+ ifc_omdebugconfig *debugConfig;
+ if (SUCCEEDED(browserManager->GetConfig(&IFC_OmDebugConfig, (void**)&debugConfig)))
+ {
+ if (S_OK == debugConfig->GetMenuFilterEnabled())
+ popupFlags |= NBCS_DISABLECONTEXTMENU;
+ debugConfig->Release();
+ }
+
+ HWND hPopup;
+ HRESULT hr = browserManager->CreatePopup(this, x, y, cx, cy, hMainWindow, NULL, popupFlags, &hPopup);
+ if (SUCCEEDED(hr))
+ {
+ if (FAILED(ServiceSubclass_Attach(hPopup, this)))
+ {
+ ShowWindowAsync(hPopup, SW_SHOWNORMAL);
+ }
+ }
+
+ return hr;
+}
+
+HRESULT UpdateService::Finish()
+{
+ if (NULL != browserManager)
+ {
+ browserManager->Finish();
+ browserManager->Release();
+ browserManager = NULL;
+ }
+
+ if (NULL != url)
+ {
+ free(url);
+ url = NULL;
+ }
+
+ return S_OK;
+}
+
+#define CBCLASS UpdateService
+START_DISPATCH;
+CB(ADDREF, AddRef)
+CB(RELEASE, Release)
+CB(QUERYINTERFACE, QueryInterface)
+CB(API_GETID, GetId)
+CB(API_GETNAME, GetName)
+CB(API_GETURL, GetUrl)
+CB(API_GETICON, GetIcon)
+CB(API_GETEXTERNAL, GetExternal)
+END_DISPATCH;
+#undef CBCLASS
+