aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Library/ml_wire/service.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/Plugins/Library/ml_wire/service.cpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/Plugins/Library/ml_wire/service.cpp')
-rw-r--r--Src/Plugins/Library/ml_wire/service.cpp273
1 files changed, 273 insertions, 0 deletions
diff --git a/Src/Plugins/Library/ml_wire/service.cpp b/Src/Plugins/Library/ml_wire/service.cpp
new file mode 100644
index 00000000..80d7b71c
--- /dev/null
+++ b/Src/Plugins/Library/ml_wire/service.cpp
@@ -0,0 +1,273 @@
+#include "main.h"
+#include "./service.h"
+#include "api__ml_wire.h"
+#include "./util.h"
+#include "./resource.h"
+#include "./externalCOM.h"
+
+#include "../winamp/wa_ipc.h"
+#include <strsafe.h>
+
+#define IS_INVALIDISPATCH(__disp) (((IDispatch *)1) == (__disp) || NULL == (__disp))
+
+OmService::OmService( UINT nId ) : id( nId )
+{}
+
+OmService::~OmService()
+{
+ Plugin_FreeResString( name );
+ Plugin_FreeResString( url );
+ Plugin_FreeResString( icon );
+}
+
+
+HRESULT OmService::CreateRemote( UINT nId, LPCWSTR pszName, LPCWSTR pszIcon, LPCWSTR pszUrl, OmService **instance )
+{
+ if ( instance == NULL )
+ return E_POINTER;
+
+ *instance = NULL;
+
+ if ( nId == 0 || pszName == NULL )
+ return E_INVALIDARG;
+
+ OmService *service = new OmService( nId );
+ if ( service == NULL )
+ return E_OUTOFMEMORY;
+
+ service->SetName( pszName );
+ service->SetIcon( pszIcon );
+ service->SetUrl( pszUrl );
+
+ *instance = service;
+
+ return S_OK;
+}
+
+HRESULT OmService::CreateLocal( UINT nId, LPCWSTR pszName, LPCWSTR pszIcon, SVCWNDCREATEPROC windowCreator, OmService **instance )
+{
+ if ( instance == NULL )
+ return E_POINTER;
+
+ *instance = NULL;
+
+ if ( nId == 0 || pszName == NULL )
+ return E_INVALIDARG;
+
+ OmService *service = new OmService( nId );
+ if ( service == NULL )
+ return E_OUTOFMEMORY;
+
+ service->SetFlags( flagLocal, flagLocal );
+ service->SetName( pszName );
+ service->SetIcon( pszIcon );
+ service->SetWindowCreator( windowCreator );
+
+ *instance = service;
+
+ return S_OK;
+}
+
+
+size_t OmService::AddRef()
+{
+ return _ref.fetch_add( 1 );
+}
+
+size_t OmService::Release()
+{
+ if ( _ref.load() == 0 )
+ return _ref.load();
+
+ LONG r = _ref.fetch_sub( 1 );
+ if ( r == 0 )
+ delete( this );
+
+ return r;
+}
+
+
+int OmService::QueryInterface( GUID interface_guid, void **object )
+{
+ if ( object == NULL )
+ return E_POINTER;
+
+ if ( IsEqualIID( interface_guid, IFC_OmService ) )
+ *object = static_cast<ifc_omservice *>( this );
+ else
+ {
+ *object = NULL;
+
+ return E_NOINTERFACE;
+ }
+
+ if ( *object == NULL )
+ return E_UNEXPECTED;
+
+ AddRef();
+
+ return S_OK;
+}
+
+
+unsigned int OmService::GetId()
+{
+ return id;
+}
+
+HRESULT OmService::GetName( wchar_t *pszBuffer, int cchBufferMax )
+{
+ return Plugin_CopyResString( pszBuffer, cchBufferMax, name );
+}
+
+HRESULT OmService::GetUrl( wchar_t *pszBuffer, int cchBufferMax )
+{
+ return Plugin_CopyResString( pszBuffer, cchBufferMax, url );
+}
+
+HRESULT OmService::GetIcon( wchar_t *pszBuffer, int cchBufferMax )
+{
+ if ( icon != NULL && IS_INTRESOURCE( icon ) )
+ {
+ WCHAR szPath[ 2 * MAX_PATH ] = { 0 };
+ if ( GetModuleFileName( plugin.hDllInstance, szPath, ARRAYSIZE( szPath ) ) == 0 )
+ return E_FAIL;
+
+ return StringCchPrintf( pszBuffer, cchBufferMax, L"res://%s/#%d/#%d", szPath, RT_RCDATA, icon );
+ }
+
+ return StringCchCopyEx( pszBuffer, cchBufferMax, icon, NULL, NULL, STRSAFE_IGNORE_NULLS );
+}
+
+HRESULT OmService::GetExternal( IDispatch **ppDispatch )
+{
+ if ( ppDispatch == NULL )
+ return E_POINTER;
+
+ *ppDispatch = NULL;
+
+ HWND hWinamp = plugin.hwndWinampParent;
+ if ( hWinamp == NULL )
+ return E_UNEXPECTED;
+
+ //////*ppDispatch = (IDispatch*)SENDWAIPC(hWinamp, IPC_GET_DISPATCH_OBJECT, 0);
+
+ WCHAR szBuffer[ 64 ] = { 0 };
+ if ( SUCCEEDED( StringCchPrintfW( szBuffer, ARRAYSIZE( szBuffer ), L"%u", id ) ) )
+ *ppDispatch = (IDispatch *) SENDWAIPC( hWinamp, IPC_JSAPI2_GET_DISPATCH_OBJECT, (WPARAM) szBuffer );
+
+
+ if (IS_INVALIDISPATCH(*ppDispatch) && FAILED(ExternalCOM::CreateInstance((ExternalCOM**)ppDispatch)))
+ {
+ *ppDispatch = NULL;
+ return E_FAIL;
+ }
+
+
+ return S_OK;
+}
+
+
+HRESULT OmService::SetName( LPCWSTR pszName )
+{
+ Plugin_FreeResString( name );
+ name = Plugin_DuplicateResString( pszName );
+
+ return S_OK;
+}
+
+HRESULT OmService::SetUrl( LPCWSTR pszUrl )
+{
+ Plugin_FreeResString( url );
+ url = Plugin_DuplicateResString( pszUrl );
+
+ return S_OK;
+}
+
+HRESULT OmService::SetIcon( LPCWSTR pszIcon )
+{
+ Plugin_FreeResString( icon );
+ icon = Plugin_DuplicateResString( pszIcon );
+
+ return S_OK;
+}
+
+void OmService::SetFlags( UINT mask, UINT newFlags )
+{
+ flags = ( flags & ~mask ) | ( mask & newFlags );
+}
+
+UINT OmService::GetFlags( void )
+{
+ return flags;
+}
+
+
+HRESULT OmService::SetWindowCreator( SVCWNDCREATEPROC proc )
+{
+ windowCreator = proc;
+
+ return S_OK;
+}
+
+HRESULT OmService::GetWindowCreator( SVCWNDCREATEPROC *proc )
+{
+ if ( proc == NULL )
+ return E_INVALIDARG;
+
+ *proc = windowCreator;
+
+ return S_OK;
+}
+
+
+HRESULT OmService::CreateView( HWND hParent, HWND *hView )
+{
+ if ( hView == NULL )
+ return E_POINTER;
+
+ *hView = NULL;
+ HRESULT hr = S_OK;
+
+ if ( ( flagLocal & flags ) != 0 )
+ {
+ if ( windowCreator != NULL )
+ {
+ *hView = windowCreator( hParent, this );
+ if ( *hView == NULL )
+ hr = E_FAIL;
+ }
+ else
+ hr = E_INVALIDARG;
+ }
+ else
+ {
+ if ( OMBROWSERMNGR != NULL )
+ {
+ hr = OMBROWSERMNGR->Initialize( NULL, plugin.hwndWinampParent );
+ if ( SUCCEEDED( hr ) )
+ hr = OMBROWSERMNGR->CreateView( this, hParent, NULL, 0, hView );
+ }
+ else
+ hr = E_UNEXPECTED;
+
+ }
+
+ return hr;
+}
+
+
+#define CBCLASS OmService
+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
+
+ \ No newline at end of file