diff options
Diffstat (limited to 'Src/ie_plugin/Winamp.cpp')
-rw-r--r-- | Src/ie_plugin/Winamp.cpp | 409 |
1 files changed, 409 insertions, 0 deletions
diff --git a/Src/ie_plugin/Winamp.cpp b/Src/ie_plugin/Winamp.cpp new file mode 100644 index 00000000..7135dfb6 --- /dev/null +++ b/Src/ie_plugin/Winamp.cpp @@ -0,0 +1,409 @@ +#include "Winamp.h" +#include "../Winamp/JSAPI.h" +#include <mshtmdid.h> +#include <mshtmhst.h> +#include <stdio.h> +#include <shlwapi.h> +#include <malloc.h> + +#define BUFFER_LEN 1024 + +// {294DFA02-5A90-4dc7-872D-1EF54817078D} +static const GUID CLSID_WINAMP_CRAP = +{ 0x294dfa02, 0x5a90, 0x4dc7, { 0x87, 0x2d, 0x1e, 0xf5, 0x48, 0x17, 0x7, 0x8d } }; + +Winamp::Winamp() +{ + refCount=1; + + webBrowser_=0; + connectionPointContainer=0; + cookie_=0; + document_=0; + client_site = 0; +} +/* other things being asked for: +{00000008-0000-0000-C000-000000000046} (dunno what interface) +HTMLDocument +IOleControl B196B288-BAB4-101A-B69C-00AA00341D07 +IClientSecurity +IQuickActivate +IPersistPropertyBag2 +IPersistPropertyBag +IPersistStreamInit +IPersistStorage +IViewObjectEx +IViewObject +IActiveScript BB1A2AE1-A4F9-11CF-8F20-00805F2CD064 +IOleCommandTarget B722BCCB-4E68-101B-A2BC-00AA00404770 +IDispatchEx A6EF9860-C720-11D0-9337-00A0C90DCAA9 +CB5BDC81-93C1-11cf-8F20-00805F2CD064 +6D5140D3-7436-11CE-8034-00AA006009FA (dunno what interface) +*/ + +HRESULT Winamp::QueryInterface(REFIID riid, LPVOID FAR *ppvObj) +{ + //DebugBreak(); + if (!ppvObj) + return E_POINTER; + else if (IsEqualIID(riid, IID_IUnknown)) + *ppvObj = /*static_cast<IUnknown *>*/(this); + else if (IsEqualIID(riid, IID_IObjectWithSite)) + *ppvObj = static_cast<IObjectWithSite *>(this); + //else if (IsEqualIID(riid, __uuidof(IWinamp))) + //*ppvObj = static_cast<IWinamp *>(this); + else if (IsEqualIID(riid, IID_IDispatch)) + *ppvObj = (IDispatch *)this; + else if (IsEqualIID(riid, IID_IOleObject)) + *ppvObj = (IOleObject *)this; + else if (IsEqualIID(riid, IID_IPersistStorage)) + *ppvObj = (IPersistStorage *)this; + else if (IsEqualIID(riid, IID_IDataObject)) + *ppvObj = (IDataObject *)this; + else if (IsEqualIID(riid, IID_IObjectSafety)) + *ppvObj = (IObjectSafety *)this; + else + { + LPOLESTR guidstr; + StringFromIID(riid, &guidstr); + //MessageBox(NULL, guidstr, L"queryinterface", MB_OK); + *ppvObj = NULL; + return E_NOINTERFACE; + } + + AddRef(); + return S_OK; +} + +ULONG Winamp::AddRef(void) +{ + return ++refCount; +} + +ULONG Winamp::Release(void) +{ + if (refCount == 0) + return 0; + + ULONG retCount=--refCount; + if (refCount == 0) + delete this; + return retCount; +} + + +#define DISP_TABLE \ + CHECK_ID(Test)\ + CHECK_ID(getVersion)\ + +#define CHECK_ID(str) JSAPI_DISP_ENUMIFY(str), +enum { + DISP_TABLE +}; +#undef CHECK_ID +#define CHECK_ID(str) if (wcscmp(rgszNames[i], L## #str) == 0) { rgdispid[i] = JSAPI_DISP_ENUMIFY(str); continue; } + +HRESULT Winamp::GetIDsOfNames(REFIID riid, OLECHAR FAR* FAR* rgszNames, unsigned int cNames, LCID lcid, DISPID FAR* rgdispid) +{ + bool unknowns = false; + for (unsigned int i = 0;i != cNames;i++) + { + DISP_TABLE + + rgdispid[i] = DISPID_UNKNOWN; + unknowns = true; + + } + if (unknowns) + return DISP_E_UNKNOWNNAME; + else + return S_OK; +} + +HRESULT Winamp::GetTypeInfo(unsigned int itinfo, LCID lcid, ITypeInfo FAR* FAR* pptinfo) +{ + return E_NOTIMPL; +} + +HRESULT Winamp::GetTypeInfoCount(unsigned int FAR * pctinfo) +{ + return E_NOTIMPL; +} + + +#undef CHECK_ID +#define CHECK_ID(str) case JSAPI_DISP_ENUMIFY(str): return str(wFlags, pdispparams, pvarResult, puArgErr); +HRESULT Winamp::Invoke(DISPID dispid, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, EXCEPINFO FAR * pexecinfo, unsigned int FAR *puArgErr) +{ + switch (dispid) + { + DISP_TABLE + } + return DISP_E_MEMBERNOTFOUND; +} + +HRESULT Winamp::GetSite(REFIID riid, void** ppvSite) +{ + return E_NOINTERFACE; +} + +HRESULT Winamp::SetSite(IUnknown* iu) +{/* + if (! (iu->QueryInterface(IID_IWebBrowser2, (void**) &webBrowser_) == S_OK )) + { + return E_FAIL; + } + + if (! (iu->QueryInterface(IID_IConnectionPointContainer, (void**) &connectionPointContainer) == S_OK )) + { + return E_FAIL; + // ::MessageBox(0, "xxx", 0, 0); + } + + // make sure we\'re getting browser events + IConnectionPoint* spCP; + HRESULT hr = connectionPointContainer->FindConnectionPoint(DIID_DWebBrowserEvents2, &spCP); + if (FAILED(hr)) + { + return hr; + } + hr = spCP->Advise(static_cast<IDispatch*>(this), &cookie_); +*/ + return S_OK; +} + +HRESULT Winamp::Test(WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, unsigned int FAR *puArgErr) +{ + JSAPI_VERIFY_METHOD(wFlags); + JSAPI_VERIFY_PARAMCOUNT(pdispparams, 0); + + MessageBoxA(NULL,"test", "IWinamp", MB_OK); + + JSAPI_INIT_RESULT(pvarResult, VT_BOOL); + JSAPI_SET_VARIANT(pvarResult, V_BOOL, VARIANT_TRUE); + + return S_OK; +} + + +#if 0 + +HRESULT Winamp::getVersion(WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, unsigned int FAR *puArgErr) +{ + JSAPI_VERIFY_METHOD(wFlags); + JSAPI_VERIFY_PARAMCOUNT(pdispparams, 0); + + JSAPI_INIT_RESULT(pvarResult, VT_BSTR); + JSAPI_SET_RESULT(pvarResult, bstrVal, SysAllocString(L"7766")); + + return S_OK; +} +#endif + +HRESULT Winamp::getVersion(WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, unsigned int FAR *puArgErr) +{ + JSAPI_VERIFY_METHOD(wFlags); + JSAPI_VERIFY_PARAMCOUNT(pdispparams, 0); + + wchar_t csVersion[BUFFER_LEN]; + //////////////////////////////// + DWORD BufferSize = BUFFER_LEN; + DWORD cbData; + bool keyFound = false; + + wchar_t exeName[] = L"\\winamp.exe"; + wchar_t fileName[BUFFER_LEN]; + csVersion[0]=0; + 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 ERROR_PATH_NOT_FOUND; + } + + RegCloseKey (hKey); + if (StrStrW(fileNameTemp,L"winamp.exe")) { + int indexOfFirstQuote = StrCSpnW(fileNameTemp, L"\""); + int indexOfSecondQuote = StrCSpnW(&fileNameTemp[indexOfFirstQuote+1], L"\""); + + if (indexOfFirstQuote >= 0) { + keyFound = true; + lstrcpynW(fileName,&fileNameTemp[indexOfFirstQuote+1], indexOfSecondQuote+1); + } + } else { + // some other app (itunes ??) controlling the winamp:// protocol + // return error + return ERROR_PATH_NOT_FOUND; + } + } + + if (!keyFound) { + // See if the reg key exists + if (RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Software\\Winamp"), 0, KEY_READ, &hKey) != ERROR_SUCCESS) { + return ERROR_PATH_NOT_FOUND; + } + + cbData = BUFFER_LEN; + if ( RegQueryValueEx( hKey, + TEXT(""), + NULL, + NULL, + (LPBYTE) fileName, + &cbData ) != ERROR_SUCCESS) { + return ERROR_PATH_NOT_FOUND; + } + RegCloseKey (hKey); + keyFound = true; + wcscat(fileName,exeName); + } + + if (!keyFound) { + return ERROR_PATH_NOT_FOUND; + } + + + //////////////////////////////// + static TCHAR sBackSlash[] = {'\\','\0'}; + DWORD dwVersionDataLen = GetFileVersionInfoSize(fileName, NULL); + + if (dwVersionDataLen) + { + char* fvBuf = (char *)alloca(dwVersionDataLen);//new char[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; + //wsprintf(csVersion, L"%d.%d.%d.%d", + // HIWORD(pFixedFileInfo->dwFileVersionMS), LOWORD(pFixedFileInfo->dwFileVersionMS), + // HIWORD(pFixedFileInfo->dwFileVersionLS), LOWORD(pFixedFileInfo->dwFileVersionLS)); + wsprintf(csVersion, L"%d.%d%d", + HIWORD(pFixedFileInfo->dwFileVersionMS), LOWORD(pFixedFileInfo->dwFileVersionMS), + HIWORD(pFixedFileInfo->dwFileVersionLS)); + } + } + } + } + + JSAPI_INIT_RESULT(pvarResult, VT_BSTR); + JSAPI_SET_RESULT(pvarResult, bstrVal, SysAllocString(csVersion)); + + return S_OK; +} + + HRESULT Winamp::SetClientSite(IOleClientSite *pClientSite) +{ + // TODO + client_site = pClientSite; + return S_OK; + } + + HRESULT Winamp::GetClientSite(IOleClientSite **ppClientSite) +{ return E_NOTIMPL; } + HRESULT Winamp::SetHostNames(LPCOLESTR szContainerApp,LPCOLESTR szContainerObj) +{ return S_OK; } + HRESULT Winamp::Close(DWORD dwSaveOption) +{ return S_OK; } + HRESULT Winamp::SetMoniker(DWORD dwWhichMoniker,IMoniker *pmk) +{ return E_NOTIMPL; } + HRESULT Winamp::GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker,IMoniker **ppmk) +{ return E_NOTIMPL; } + HRESULT Winamp::InitFromData(IDataObject *pDataObject,BOOL fCreation,DWORD dwReserved) +{ return E_NOTIMPL; } + HRESULT Winamp::GetClipboardData(DWORD dwReserved,IDataObject **ppDataObject) +{ return E_NOTIMPL; } + HRESULT Winamp::DoVerb(LONG iVerb,LPMSG lpmsg,IOleClientSite *pActiveSite,LONG lindex, HWND hwndParent, LPCRECT lprcPosRect) +{ return S_OK; } + HRESULT Winamp::EnumVerbs(IEnumOLEVERB **ppEnumOleVerb) +{ return E_NOTIMPL; } + HRESULT Winamp::Update(void) +{ return E_NOTIMPL; } + HRESULT Winamp::IsUpToDate(void) +{ return E_NOTIMPL; } + HRESULT Winamp::GetUserClassID(CLSID *pClsid) +{ return E_NOTIMPL; } + HRESULT Winamp::GetUserType(DWORD dwFormOfType,LPOLESTR *pszUserType) +{ return E_NOTIMPL; } + HRESULT Winamp::SetExtent(DWORD dwDrawAspect,SIZEL *psizel) +{ return E_NOTIMPL; } + + HRESULT Winamp::GetExtent(DWORD dwDrawAspect,SIZEL *psizel) +{ + // TODO + return E_NOTIMPL; + } + + HRESULT Winamp::Advise(IAdviseSink *pAdvSink,DWORD *pdwConnection) +{ return E_NOTIMPL; } + HRESULT Winamp::Unadvise(DWORD dwConnection) +{ return E_NOTIMPL; } + HRESULT Winamp::EnumAdvise(IEnumSTATDATA **ppenumAdvise) +{ return E_NOTIMPL; } + HRESULT Winamp::GetMiscStatus(DWORD dwAspect,DWORD *pdwStatus) +{ + *pdwStatus = OLEMISC_INVISIBLEATRUNTIME; + return S_OK; + } + HRESULT Winamp::SetColorScheme(LOGPALETTE *pLogpal) +{ return E_NOTIMPL; } + + HRESULT Winamp::GetClassID(CLSID *pClassID) +{ *pClassID = CLSID_WINAMP_CRAP; return S_OK; } + HRESULT Winamp::IsDirty(void) +{ return E_NOTIMPL; } + HRESULT Winamp::InitNew(IStorage *pStg) +{ return E_NOTIMPL; } + HRESULT Winamp::Load(IStorage *pStg) +{ return E_NOTIMPL; } + HRESULT Winamp::Save(IStorage *pStgSave, BOOL fSameAsLoad) +{ return E_NOTIMPL; } + HRESULT Winamp::SaveCompleted(IStorage *pStgNew) +{ return E_NOTIMPL; } + HRESULT Winamp::HandsOffStorage(void) +{ return E_NOTIMPL; } + +HRESULT Winamp::GetData(FORMATETC *pformatetcIn,STGMEDIUM *pmedium) +{ return E_NOTIMPL; } + HRESULT Winamp::GetDataHere(FORMATETC *pformatetc,STGMEDIUM *pmedium) +{ return E_NOTIMPL; } + HRESULT Winamp::QueryGetData(FORMATETC *pformatetc) +{ return E_NOTIMPL; } + HRESULT Winamp::GetCanonicalFormatEtc(FORMATETC *pformatectIn,FORMATETC *pformatetcOut) +{ return E_NOTIMPL; } + HRESULT Winamp::SetData(FORMATETC *pformatetc,STGMEDIUM *pmedium,BOOL fRelease) +{ return E_NOTIMPL; } + HRESULT Winamp::EnumFormatEtc(DWORD dwDirection,IEnumFORMATETC **ppenumFormatEtc) +{ return E_NOTIMPL; } + HRESULT Winamp::DAdvise(FORMATETC *pformatetc,DWORD advf,IAdviseSink *pAdvSink,DWORD *pdwConnection) +{ return E_NOTIMPL; } + HRESULT Winamp::DUnadvise(DWORD dwConnection) +{ return E_NOTIMPL; } + HRESULT Winamp::EnumDAdvise(IEnumSTATDATA **ppenumAdvise) +{ return E_NOTIMPL; } + + HRESULT Winamp::GetInterfaceSafetyOptions(REFIID riid, DWORD *pdwSupportedOptions, DWORD *pdwEnabledOptions) + { + *pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA; + *pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA; + + return S_OK; + } + HRESULT Winamp::SetInterfaceSafetyOptions(REFIID riid, DWORD dwOptionSetMask, DWORD dwEnabledOptions) + { + + return S_OK; + }
\ No newline at end of file |