]> git.sesse.net Git - vlc/blobdiff - activex/oleobject.cpp
mkv.cpp: support the new A_AAC codec ID and SBR for older IDs (more tests needed)
[vlc] / activex / oleobject.cpp
index bf6a76246fc12c88c90688fe2b3d38b94828e656..0c95bd5795f86966647746d76378a271d83dd4ea 100644 (file)
@@ -1,7 +1,7 @@
 /*****************************************************************************
  * oleobject.cpp: ActiveX control for VLC
  *****************************************************************************
- * Copyright (C) 2005 VideoLAN
+ * Copyright (C) 2005 the VideoLAN team
  *
  * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>
  *
@@ -37,8 +37,9 @@ _p_clientsite(NULL), _p_instance(p_instance)
 
 VLCOleObject::~VLCOleObject()
 {
+    SetClientSite(NULL);
+    Close(OLECLOSE_NOSAVE);
     _p_advise_holder->Release();
-    SetClientSite(NULL); 
 };
 
 STDMETHODIMP VLCOleObject::Advise(IAdviseSink *pAdvSink, DWORD *dwConnection)
@@ -48,9 +49,12 @@ STDMETHODIMP VLCOleObject::Advise(IAdviseSink *pAdvSink, DWORD *dwConnection)
 
 STDMETHODIMP VLCOleObject::Close(DWORD dwSaveOption)
 {
-    _p_advise_holder->SendOnClose();
-    OleFlushClipboard();
-    return _p_instance->onClose(dwSaveOption);
+    if( _p_instance->isRunning() )
+    {
+        _p_advise_holder->SendOnClose();
+        return _p_instance->onClose(dwSaveOption);
+    }
+    return S_OK;
 };
 
 STDMETHODIMP VLCOleObject::DoVerb(LONG iVerb, LPMSG lpMsg, LPOLECLIENTSITE pActiveSite,
@@ -61,6 +65,8 @@ STDMETHODIMP VLCOleObject::DoVerb(LONG iVerb, LPMSG lpMsg, LPOLECLIENTSITE pActi
         case OLEIVERB_PRIMARY:
         case OLEIVERB_SHOW:
         case OLEIVERB_OPEN:
+            // force control to be visible when activating in place
+            _p_instance->setVisible(TRUE);
         case OLEIVERB_INPLACEACTIVATE:
             return doInPlaceActivate(lpMsg, pActiveSite, hwndParent, lprcPosRect);
 
@@ -75,7 +81,12 @@ STDMETHODIMP VLCOleObject::DoVerb(LONG iVerb, LPMSG lpMsg, LPOLECLIENTSITE pActi
             return S_OK;
 
         default:
-            return OLEOBJ_S_INVALIDVERB;
+            if( iVerb > 0 ) {
+                _p_instance->setVisible(TRUE);
+                doInPlaceActivate(lpMsg, pActiveSite, hwndParent, lprcPosRect);
+                return OLEOBJ_S_INVALIDVERB;
+            }
+            return E_NOTIMPL;
     }
 };
 
@@ -91,8 +102,8 @@ HRESULT VLCOleObject::doInPlaceActivate(LPMSG lpMsg, LPOLECLIENTSITE pActiveSite
         if( _p_instance->isInPlaceActive() )
         {
             // just attempt to show object then
-            pActiveSite->ShowObject();
-            _p_instance->setVisible(TRUE);
+            if( _p_instance->getVisible() )
+                pActiveSite->ShowObject();
             return S_OK;
         }
 
@@ -109,6 +120,7 @@ HRESULT VLCOleObject::doInPlaceActivate(LPMSG lpMsg, LPOLECLIENTSITE pActiveSite
             LPOLEINPLACEUIWINDOW p_inPlaceUIWindow;
             OLEINPLACEFRAMEINFO oleFrameInfo;
 
+            oleFrameInfo.cb = sizeof(OLEINPLACEFRAMEINFO);
             if( SUCCEEDED(p_inPlaceSite->GetWindowContext(&p_inPlaceFrame, &p_inPlaceUIWindow, &posRect, &clipRect, &oleFrameInfo)) )
             {
                 lprcPosRect = &posRect;
@@ -204,7 +216,8 @@ STDMETHODIMP VLCOleObject::EnumAdvise(IEnumSTATDATA **ppEnumAdvise)
 
 STDMETHODIMP VLCOleObject::EnumVerbs(IEnumOleVerb **ppEnumOleVerb)
 {
-    return OLE_S_USEREG;
+    return OleRegEnumVerbs(_p_instance->getClassID(),
+        ppEnumOleVerb);
 };
 
 STDMETHODIMP VLCOleObject::GetClientSite(LPOLECLIENTSITE *ppClientSite)
@@ -221,7 +234,7 @@ STDMETHODIMP VLCOleObject::GetClientSite(LPOLECLIENTSITE *ppClientSite)
 
 STDMETHODIMP VLCOleObject::GetClipboardData(DWORD dwReserved, LPDATAOBJECT *ppDataObject)
 {
-    return E_NOTIMPL;
+    return _p_instance->pUnkOuter->QueryInterface(IID_IDataObject, (void **)ppDataObject);
 };
 
 STDMETHODIMP VLCOleObject::GetExtent(DWORD dwDrawAspect, SIZEL *pSizel)
@@ -241,7 +254,7 @@ STDMETHODIMP VLCOleObject::GetExtent(DWORD dwDrawAspect, SIZEL *pSizel)
 
 STDMETHODIMP VLCOleObject::GetMiscStatus(DWORD dwAspect, DWORD *pdwStatus)
 {
-    if( NULL != pdwStatus )
+    if( NULL == pdwStatus )
         return E_POINTER;
 
     switch( dwAspect )
@@ -273,13 +286,14 @@ STDMETHODIMP VLCOleObject::GetUserClassID(LPCLSID pClsid)
     if( NULL == pClsid )
         return E_POINTER;
  
-    pClsid = const_cast<LPCLSID>(&_p_instance->getClassID()); 
+    *pClsid = _p_instance->getClassID(); 
     return S_OK;
 };
 
 STDMETHODIMP VLCOleObject::GetUserType(DWORD dwFormOfType, LPOLESTR *pszUserType)
 {
-    return OLE_S_USEREG;
+    return OleRegGetUserType(_p_instance->getClassID(),
+        dwFormOfType, pszUserType);
 };
 
 STDMETHODIMP VLCOleObject::InitFromData(LPDATAOBJECT pDataObject, BOOL fCreation, DWORD dwReserved)
@@ -294,30 +308,16 @@ STDMETHODIMP VLCOleObject::IsUpToDate(void)
 
 STDMETHODIMP VLCOleObject::SetClientSite(LPOLECLIENTSITE pClientSite)
 {
-    if( NULL != pClientSite )
-    {
-        pClientSite->AddRef();
-
-        /*
-        ** retrieve container ambient properties
-        */
-        VARIANT v;
-        VariantInit(&v);
-        V_VT(&v) = VT_I4;
-        if( SUCCEEDED(GetObjectProperty(pClientSite, DISPID_AMBIENT_CODEPAGE, v)) )
-        {
-            _p_instance->setCodePage(V_I4(&v));
-            VariantClear(&v);
-        }
-    }
-
     if( NULL != _p_clientsite )
         _p_clientsite->Release();
 
     _p_clientsite = pClientSite;
-    _p_instance->onClientSiteChanged(pClientSite);
 
+    if( NULL != pClientSite )
+    {
+        pClientSite->AddRef();
+        _p_instance->onAmbientChanged(pClientSite, DISPID_UNKNOWN);
+    }
     return S_OK;
 };