]> git.sesse.net Git - vlc/blobdiff - activex/main.cpp
Whitelisting.
[vlc] / activex / main.cpp
index de152411eb7cd1d1698428f86aa2241723207240..f3e3f5f6bfd7ad73339b7f044e5de34868339836 100644 (file)
@@ -29,6 +29,9 @@
 #include <windows.h>
 #include <shlwapi.h>
 
+#include <tchar.h>
+#include <guiddef.h>
+
 using namespace std;
 
 #define COMPANY_STR "VideoLAN"
@@ -43,22 +46,28 @@ using namespace std;
 #define GUID_STRLEN 39
 
 /*
-** MingW headers do not declare those
+** MingW headers & libs do not declare those
 */
-extern const CATID CATID_SafeForInitializing;
-extern const CATID CATID_SafeForScripting;
+static DEFINE_GUID(_CATID_InternetAware,       0x0DE86A58, 0x2BAA, 0x11CF, 0xA2, 0x29, 0x00,0xAA,0x00,0x3D,0x73,0x52);
+static DEFINE_GUID(_CATID_SafeForInitializing, 0x7DD95802, 0x9882, 0x11CF, 0x9F, 0xA9, 0x00,0xAA,0x00,0x6C,0x42,0xC4);
+static DEFINE_GUID(_CATID_SafeForScripting,    0x7DD95801, 0x9882, 0x11CF, 0x9F, 0xA9, 0x00,0xAA,0x00,0x6C,0x42,0xC4);
 
 static LONG i_class_ref= 0;
 static HINSTANCE h_instance= 0;
 
+HMODULE DllGetModule()
+{
+    return h_instance;
+};
+
 STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
 {
     HRESULT hr = CLASS_E_CLASSNOTAVAILABLE;
 
     *ppv = NULL;
 
-    if( (CLSID_VLCPlugin == rclsid)
-     || (CLSID_VLCPlugin2 == rclsid) )
+    if( (CLSID_VLCPlugin == rclsid )
+     || ( CLSID_VLCPlugin2 == rclsid) )
     {
         VLCPluginClass *plugin = new VLCPluginClass(&i_class_ref, h_instance, rclsid);
         hr = plugin->QueryInterface(riid, ppv);
@@ -72,10 +81,10 @@ STDAPI DllCanUnloadNow(VOID)
     return (0 == i_class_ref) ? S_OK: S_FALSE;
 };
 
-static inline HKEY keyCreate(HKEY parentKey, LPCSTR keyName)
+static inline HKEY keyCreate(HKEY parentKey, LPCTSTR keyName)
 {
     HKEY childKey;
-    if( ERROR_SUCCESS == RegCreateKeyExA(parentKey, keyName, 0, NULL,
+    if( ERROR_SUCCESS == RegCreateKeyEx(parentKey, keyName, 0, NULL,
                 REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &childKey, NULL) )
     {
         return childKey;
@@ -83,24 +92,24 @@ static inline HKEY keyCreate(HKEY parentKey, LPCSTR keyName)
     return NULL;
 };
 
-static inline HKEY keySet(HKEY hKey, LPCSTR valueName, const void *s, size_t len)
+static inline HKEY keySet(HKEY hKey, LPCTSTR valueName, const void *s, size_t len, DWORD dwType = REG_SZ)
 {
     if( NULL != hKey )
     {
-        RegSetValueExA(hKey, valueName, 0, REG_SZ,
+        RegSetValueEx(hKey, valueName, 0, dwType,
             (const BYTE*)s, len);
     }
     return hKey;
 };
 
-static inline HKEY keySetDef(HKEY hKey, const void *s, size_t len)
+static inline HKEY keySetDef(HKEY hKey, const void *s, size_t len, DWORD dwType = REG_SZ)
 {
-    return keySet(hKey, NULL, s, len);
+    return keySet(hKey, NULL, s, len, dwType);
 };
 
-static inline HKEY keySetDef(HKEY hKey, LPCSTR s)
+static inline HKEY keySetDef(HKEY hKey, LPCTSTR s)
 {
-    return keySetDef(hKey, s, strlen(s)+1);
+    return keySetDef(hKey, s, sizeof(TCHAR)*(_tcslen(s)+1), REG_SZ);
 };
 
 static inline HKEY keyClose(HKEY hKey)
@@ -112,25 +121,23 @@ static inline HKEY keyClose(HKEY hKey)
     return NULL;
 };
 
-static HRESULT UnregisterProgID(REFCLSID rclsid, unsigned int version)
+static void UnregisterProgID(REFCLSID rclsid, unsigned int version)
 {
-    LPCSTR psz_CLSID = CStrFromGUID(rclsid);
+    OLECHAR szCLSID[GUID_STRLEN];
 
-    if( NULL == psz_CLSID )
-        return E_OUTOFMEMORY;
+    StringFromGUID2(rclsid, szCLSID, GUID_STRLEN);
 
-    char progId[sizeof(PROGID_STR)+16];
-    sprintf(progId, "%s.%u", PROGID_STR, version);
+    TCHAR progId[sizeof(PROGID_STR)+16];
+    _stprintf(progId, TEXT("%s.%u"), TEXT(PROGID_STR), version);
 
-    SHDeleteKeyA(HKEY_CLASSES_ROOT, progId);
+    SHDeleteKey(HKEY_CLASSES_ROOT, progId);
 
     HKEY hClsIDKey;
-    if( ERROR_SUCCESS == RegOpenKeyExA(HKEY_CLASSES_ROOT, "CLSID", 0, KEY_WRITE, &hClsIDKey) )
+    if( ERROR_SUCCESS == RegOpenKeyEx(HKEY_CLASSES_ROOT, TEXT("CLSID"), 0, KEY_WRITE, &hClsIDKey) )
     {
-        SHDeleteKey(hClsIDKey, psz_CLSID);
+        SHDeleteKey(hClsIDKey, szCLSID);
         RegCloseKey(hClsIDKey);
     }
-    CoTaskMemFree((void *)psz_CLSID);
 };
 
 STDAPI DllUnregisterServer(VOID)
@@ -140,13 +147,14 @@ STDAPI DllUnregisterServer(VOID)
 
     // remove component categories we supports
     ICatRegister *pcr;
-    if( SUCCEEDED(CoCreateInstance(CLSID_StdComponentCategoriesMgr, 
+    if( SUCCEEDED(CoCreateInstance(CLSID_StdComponentCategoriesMgr,
             NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr)) ) {
         CATID implCategories[] = {
             CATID_Control,
             CATID_PersistsToPropertyBag,
-            CATID_SafeForInitializing,
-            CATID_SafeForScripting,
+            _CATID_InternetAware,
+            _CATID_SafeForInitializing,
+            _CATID_SafeForScripting,
         };
 
         pcr->UnRegisterClassImplCategories(CLSID_VLCPlugin,
@@ -158,196 +166,162 @@ STDAPI DllUnregisterServer(VOID)
 
     SHDeleteKey(HKEY_CLASSES_ROOT, TEXT(PROGID_STR));
 
-    UnregisterProgID(CLSID_VLCPlugin, 1);
+    UnregisterProgID(CLSID_VLCPlugin, 2);
     UnregisterProgID(CLSID_VLCPlugin2, 1);
 
     return S_OK;
 };
 
-static HRESULT RegisterClassID(HKEY hParent, REFCLSID rclsid, unsigned int version, const char *path, size_t pathLen)
+static HRESULT RegisterClassID(HKEY hParent, REFCLSID rclsid, unsigned int version, BOOL isDefault, LPCTSTR path, size_t pathLen)
 {
+    TCHAR progId[sizeof(PROGID_STR)+16];
+    _stprintf(progId, TEXT("%s.%u"), TEXT(PROGID_STR), version);
+
+    TCHAR description[sizeof(DESCRIPTION)+16];
+    _stprintf(description, TEXT("%s v%u"), TEXT(DESCRIPTION), version);
+
     HKEY hClassKey;
     {
-        LPCSTR psz_CLSID = CStrFromGUID(rclsid);
+        OLECHAR szCLSID[GUID_STRLEN];
+
+        StringFromGUID2(rclsid, szCLSID, GUID_STRLEN);
+
+        HKEY hProgKey = keyCreate(HKEY_CLASSES_ROOT, progId);
+        if( NULL != hProgKey )
+        {
+            // default key value
+            keySetDef(hProgKey, description);
 
-        if( NULL == psz_CLSID )
-            return E_OUTOFMEMORY;
+            keyClose(keySetDef(keyCreate(hProgKey, TEXT("CLSID")),
+                szCLSID,
+                sizeof(szCLSID)));
 
-        hClassKey = keyCreate(hParent, psz_CLSID);
-        CoTaskMemFree((void *)psz_CLSID);
+            //hSubKey = keyClose(keyCreate(hBaseKey, "Insertable"));
+            RegCloseKey(hProgKey);
+        }
+        if( isDefault )
+        {
+            hProgKey = keyCreate(HKEY_CLASSES_ROOT, TEXT(PROGID_STR));
+            if( NULL != hProgKey )
+            {
+                // default key value
+                keySetDef(hProgKey, description);
+
+                keyClose(keySetDef(keyCreate(hProgKey, TEXT("CLSID")),
+                    szCLSID,
+                    sizeof(szCLSID)));
+
+                keyClose(keySetDef(keyCreate(hProgKey, TEXT("CurVer")),
+                    progId));
+            }
+        }
+        hClassKey = keyCreate(hParent, szCLSID);
     }
     if( NULL != hClassKey )
     {
         // default key value
-        keySetDef(hClassKey, DESCRIPTION, sizeof(DESCRIPTION));
+        keySetDef(hClassKey, description);
 
         // Control key value
-        keyClose(keyCreate(hClassKey, "Control"));
+        keyClose(keyCreate(hClassKey, TEXT("Control")));
 
         // Insertable key value
-        //keyClose(keyCreate(hClassKey, "Insertable"));
+        //keyClose(keyCreate(hClassKey, TEXT("Insertable")));
 
         // ToolboxBitmap32 key value
         {
-            char iconPath[pathLen+3];
-            memcpy(iconPath, path, pathLen);
-            strcpy(iconPath+pathLen, ",1");
+            TCHAR iconPath[pathLen+3];
+            memcpy(iconPath, path, sizeof(TCHAR)*pathLen);
+            _tcscpy(iconPath+pathLen, TEXT(",1"));
             keyClose(keySetDef(keyCreate(hClassKey,
-                "ToolboxBitmap32"),
+                TEXT("ToolboxBitmap32")),
                 iconPath, sizeof(iconPath)));
         }
 
 #ifdef BUILD_LOCALSERVER
         // LocalServer32 key value
         keyClose(keySetDef(keyCreate(hClassKey,
-            "LocalServer32", path, pathLen+1)));
+            TEXT("LocalServer32"), path, sizeof(TCHAR)*(pathLen+1))));
 #else
         // InprocServer32 key value
         {
             HKEY hSubKey = keySetDef(keyCreate(hClassKey,
-                "InprocServer32"),
-                path, pathLen+1);
+                TEXT("InprocServer32")),
+                path, sizeof(TCHAR)*(pathLen+1));
             keySet(hSubKey,
-                "ThreadingModel",
-                THREADING_MODEL, sizeof(THREADING_MODEL));
+                TEXT("ThreadingModel"),
+                TEXT(THREADING_MODEL), sizeof(TEXT(THREADING_MODEL)));
             keyClose(hSubKey);
         }
 #endif
 
         // MiscStatus key value
         keyClose(keySetDef(keyCreate(hClassKey,
-            "MiscStatus\\1"),
-            MISC_STATUS, sizeof(MISC_STATUS)));
+            TEXT("MiscStatus\\1")),
+            TEXT(MISC_STATUS), sizeof(TEXT(MISC_STATUS))));
 
         // Programmable key value
-        keyClose(keyCreate(hClassKey, "Programmable"));
+        keyClose(keyCreate(hClassKey, TEXT("Programmable")));
 
         // ProgID key value
-        {
-            char progId[sizeof(PROGID_STR)+16];
-            sprintf(progId, "%s.%u", PROGID_STR, version);
-            keyClose(keySetDef(keyCreate(hClassKey,
-                TEXT("ProgID")),
-                progId));
-        }
+        keyClose(keySetDef(keyCreate(hClassKey,
+            TEXT("ProgID")),
+            progId));
 
         // VersionIndependentProgID key value
         keyClose(keySetDef(keyCreate(hClassKey,
-            "VersionIndependentProgID"),
-            PROGID_STR, sizeof(PROGID_STR)));
+            TEXT("VersionIndependentProgID")),
+            TEXT(PROGID_STR), sizeof(TEXT(PROGID_STR))));
 
         // Version key value
-        {
-            char ver[32];
-            sprintf(ver, "%u.0", version);
-            keyClose(keySetDef(keyCreate(hClassKey,
-                "Version"),
-                ver));
-        }
+        keyClose(keySetDef(keyCreate(hClassKey,
+            TEXT("Version")),
+            TEXT("1.0")));
 
         // TypeLib key value
-        LPCSTR psz_LIBID = CStrFromGUID(LIBID_AXVLC);
-        if( NULL != psz_LIBID )
-        {
-            keyClose(keySetDef(keyCreate(hClassKey,
-                    "TypeLib"),
-                    psz_LIBID, GUID_STRLEN));
-            CoTaskMemFree((void *)psz_LIBID);
-        }
-        RegCloseKey(hClassKey);
-    }
-    return S_OK;
-}
-
-static HRESULT RegisterProgID(REFCLSID rclsid, unsigned int version)
-{
-    LPCSTR psz_CLSID = CStrFromGUID(rclsid);
+        OLECHAR szLIBID[GUID_STRLEN];
 
-    if( NULL == psz_CLSID )
-        return E_OUTOFMEMORY;
-
-    char progId[sizeof(PROGID_STR)+16];
-    sprintf(progId, "%s.%u", PROGID_STR, version);
-
-    HKEY hBaseKey = keyCreate(HKEY_CLASSES_ROOT, progId);
-    if( NULL != hBaseKey )
-    {
-        // default key value
-        keySetDef(hBaseKey, DESCRIPTION, sizeof(DESCRIPTION));
+        StringFromGUID2(LIBID_AXVLC, szLIBID, GUID_STRLEN);
 
-        keyClose(keySetDef(keyCreate(hBaseKey, "CLSID"),
-            psz_CLSID,
-            GUID_STRLEN));
-        //hSubKey = keyClose(keyCreate(hBaseKey, "Insertable"));
+        keyClose(keySetDef(keyCreate(hClassKey,
+                TEXT("TypeLib")),
+                szLIBID, sizeof(szLIBID)));
  
-        RegCloseKey(hBaseKey);
+        RegCloseKey(hClassKey);
     }
-    CoTaskMemFree((void *)psz_CLSID);
-
     return S_OK;
 }
 
-static HRESULT RegisterDefaultProgID(REFCLSID rclsid, unsigned int version)
-{
-    LPCSTR psz_CLSID = CStrFromGUID(rclsid);
-
-    if( NULL == psz_CLSID )
-        return E_OUTOFMEMORY;
-
-    HKEY hBaseKey = keyCreate(HKEY_CLASSES_ROOT, PROGID_STR);
-    if( NULL != hBaseKey )
-    {
-        // default key value
-        keySetDef(hBaseKey, DESCRIPTION, sizeof(DESCRIPTION));
-
-        keyClose(keySetDef(keyCreate(hBaseKey, "CLSID"),
-            psz_CLSID,
-            GUID_STRLEN));
-        char progId[sizeof(PROGID_STR)+16];
-        sprintf(progId, "%s.%u", PROGID_STR, version);
-
-        keyClose(keySetDef(keyCreate(hBaseKey, "CurVer"),
-            progId));
-    }
-    CoTaskMemFree((void *)psz_CLSID);
-}
-
 STDAPI DllRegisterServer(VOID)
 {
     DllUnregisterServer();
 
-    char DllPath[MAX_PATH];
-    DWORD DllPathLen=GetModuleFileNameA(h_instance, DllPath, sizeof(DllPath)) ;
-       if( 0 == DllPathLen )
+    TCHAR DllPath[MAX_PATH];
+    DWORD DllPathLen=GetModuleFileName(h_instance, DllPath, MAX_PATH) ;
+    if( 0 == DllPathLen )
         return E_UNEXPECTED;
 
     HKEY hBaseKey;
 
-    if( ERROR_SUCCESS != RegOpenKeyExA(HKEY_CLASSES_ROOT, "CLSID", 0, KEY_CREATE_SUB_KEY, &hBaseKey) )
+    if( ERROR_SUCCESS != RegOpenKeyEx(HKEY_CLASSES_ROOT, TEXT("CLSID"), 0, KEY_CREATE_SUB_KEY, &hBaseKey) )
         return SELFREG_E_CLASS;
-    
-    RegisterClassID(hBaseKey, CLSID_VLCPlugin, 1, DllPath, DllPathLen);
-    RegisterClassID(hBaseKey, CLSID_VLCPlugin2, 2, DllPath, DllPathLen);
-
-    RegCloseKey(hBaseKey);
 
-    RegisterProgID(CLSID_VLCPlugin, 1);
-    RegisterProgID(CLSID_VLCPlugin2, 2);
+    RegisterClassID(hBaseKey, CLSID_VLCPlugin, 1, FALSE, DllPath, DllPathLen);
+    RegisterClassID(hBaseKey, CLSID_VLCPlugin2, 2, TRUE, DllPath, DllPathLen);
 
-    /* default control */
-    RegisterDefaultProgID(CLSID_VLCPlugin2, 2);
+    RegCloseKey(hBaseKey);
 
     // indicate which component categories we support
     ICatRegister *pcr;
-    if( SUCCEEDED(CoCreateInstance(CLSID_StdComponentCategoriesMgr, 
+    if( SUCCEEDED(CoCreateInstance(CLSID_StdComponentCategoriesMgr,
             NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr)) ) {
         CATID implCategories[] = {
             CATID_Control,
             CATID_PersistsToPropertyBag,
-            CATID_SafeForInitializing,
-            CATID_SafeForScripting,
+            _CATID_InternetAware,
+            _CATID_SafeForInitializing,
+            _CATID_SafeForScripting,
         };
 
         pcr->RegisterClassImplCategories(CLSID_VLCPlugin,
@@ -357,34 +331,19 @@ STDAPI DllRegisterServer(VOID)
         pcr->Release();
     }
 
-    // register type lib into the registry
-    ITypeLib *typeLib;
-
 #ifdef BUILD_LOCALSERVER
     // replace .exe by .tlb
-    strcpy(DllPath+DllPathLen-4, ".tlb");
+    _tcscpy(DllPath+DllPathLen-4, TEXT(".tlb"));
 #endif
-    
-#ifndef OLE2ANSI
-    size_t typeLibPathLen = MultiByteToWideChar(CP_ACP, 0, DllPath, -1, NULL, 0);
-    if( typeLibPathLen > 0 )
-    {
-        LPOLESTR typeLibPath = (LPOLESTR)CoTaskMemAlloc(typeLibPathLen*sizeof(wchar_t));
-        MultiByteToWideChar(CP_ACP, 0, DllPath, DllPathLen, typeLibPath, typeLibPathLen);
-        if( FAILED(LoadTypeLibEx(typeLibPath, REGKIND_REGISTER, &typeLib)) )
-#ifndef BUILD_LOCALSERVER
-            return SELFREG_E_TYPELIB;
+
+    // register type lib into the registry
+    ITypeLib *typeLib;
+
+    HRESULT result = LoadTypeLibEx(DllPath, REGKIND_REGISTER, &typeLib);
+    if( SUCCEEDED(result) )
         typeLib->Release();
-#endif
-        CoTaskMemFree((void *)typeLibPath);
-    }
-#else
-    if( FAILED(LoadTypeLibEx((LPOLESTR)DllPath, REGKIND_REGISTER, &typeLib)) )
-        return SELFREG_E_TYPELIB;
-    typeLib->Release();
-#endif
 
-    return S_OK;
+    return result;
 };
 
 #ifdef BUILD_LOCALSERVER
@@ -418,6 +377,7 @@ STDAPI_(int) WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw)
         return 0;
  
     DWORD dwRegisterClassObject;
+    DWORD dwRegisterClassObject2;
 
     if( FAILED(CoRegisterClassObject(CLSID_VLCPlugin, classProc,
         CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE, &dwRegisterClassObject)) )
@@ -429,6 +389,10 @@ STDAPI_(int) WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw)
                     ACTIVEOBJECT_WEAK, &dwRegisterActiveObject)) )
         return 0;
 
+    if( FAILED(RegisterActiveObject(classProc, CLSID_VLCPlugin2,
+                    ACTIVEOBJECT_WEAK, &dwRegisterActiveObject2)) )
+        return 0;
+
     classProc->Release();
 
     /*
@@ -439,7 +403,7 @@ STDAPI_(int) WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw)
         while( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) )
         {
             if( msg.message == WM_QUIT )
-                break;  // Leave the PeekMessage while() loop
+                break;  // break out PeekMessage loop
 
             /*if(TranslateAccelerator(ghwndApp, ghAccel, &msg))
                 continue;*/
@@ -449,7 +413,7 @@ STDAPI_(int) WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw)
         }
 
         if(msg.message == WM_QUIT)
-            break;  // Leave the for() loop
+            break;  // break out main loop
 
         WaitMessage();
     }
@@ -457,8 +421,11 @@ STDAPI_(int) WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw)
     if( SUCCEEDED(RevokeActiveObject(dwRegisterActiveObject, NULL)) )
         CoRevokeClassObject(dwRegisterClassObject);
 
+    if( SUCCEEDED(RevokeActiveObject(dwRegisterActiveObject2, NULL)) )
+        CoRevokeClassObject(dwRegisterClassObject2);
+
     // Reached on WM_QUIT message
-    CoUninitialize();
+    OleUninitialize();
     return ((int) msg.wParam);
 };