]> git.sesse.net Git - vlc/commitdiff
- activex: backporting from 0.8.6
authorDamien Fouilleul <damienf@videolan.org>
Thu, 7 Dec 2006 00:29:02 +0000 (00:29 +0000)
committerDamien Fouilleul <damienf@videolan.org>
Thu, 7 Dec 2006 00:29:02 +0000 (00:29 +0000)
24 files changed:
activex/Makefile.am
activex/axvlc.idl
activex/axvlc.tlb
activex/axvlc_idl.c
activex/axvlc_idl.h
activex/connectioncontainer.cpp
activex/objectsafety.h
activex/oleinplaceobject.h
activex/oleobject.cpp
activex/oleobject.h
activex/persistpropbag.cpp
activex/persiststreaminit.cpp
activex/persiststreaminit.h
activex/plugin.cpp
activex/plugin.h
activex/provideclassinfo.cpp
activex/provideclassinfo.h
activex/supporterrorinfo.cpp
activex/utils.cpp
activex/utils.h
activex/vlccontrol.cpp
activex/vlccontrol.h
activex/vlccontrol2.cpp
activex/vlccontrol2.h

index 88ab4ac5f7126d70c7c1713fdf6c6380243cde9d..27cbb42a975dde059bb545ae544cb5a261953ddb 100644 (file)
@@ -46,6 +46,7 @@ SOURCES_activex = \
     plugin.h \
     axvlc_idl.c \
     axvlc_idl.h \
+    guiddef.h \
     $(NULL)
 
 DIST_rsrc = \
@@ -137,7 +138,7 @@ endif
 ###############################################################################
 
 clean-stamp:
-       rm -f stamp-pic
+       rm -f stamp-builtin
 
 if BUILD_SHARED
 stamp-builtin:
index b946e6e9c0e59765d9cbbe0b79a91395cb39f1f0..8faef08c2e04fb5b03884a7fe7571e507bfba3b4 100644 (file)
@@ -79,7 +79,6 @@ library AXVLC
       uuid(C2FA41D0-B113-476e-AC8C-9BD14999C1C1),\r
       helpstring("VLC Control (deprecated)"),\r
       dual,\r
-      hidden,\r
       oleautomation\r
     ]\r
     interface IVLCControl : IDispatch\r
@@ -165,7 +164,6 @@ library AXVLC
     [\r
       uuid(DF48072F-5EF8-434e-9B40-E2F3AE759B5F),\r
       helpstring("Event interface for VLC control"),\r
-      hidden\r
     ]\r
     dispinterface DVLCEvents\r
     {\r
@@ -183,9 +181,7 @@ library AXVLC
       odl,\r
       uuid(9E0BD17B-2D3C-4656-B94D-03084F3FD9D4),\r
       helpstring("VLC Audio APIs"),\r
-      hidden,\r
       dual,\r
-      nonextensible,\r
       oleautomation\r
     ]\r
     interface IVLCAudio : IDispatch\r
@@ -208,9 +204,7 @@ library AXVLC
       odl,\r
       uuid(49E0DBD1-9440-466C-9C97-95C67190C603),\r
       helpstring("VLC Input APIs"),\r
-      hidden,\r
       dual,\r
-      nonextensible,\r
       oleautomation\r
     ]\r
     interface IVLCInput : IDispatch\r
@@ -247,9 +241,7 @@ library AXVLC
       odl,\r
       uuid(9ED00AFA-7BCD-4FFF-8D48-7DD4DB2C800D),\r
       helpstring("VLC Log Message"),\r
-      hidden,\r
       dual,\r
-      nonextensible,\r
       oleautomation\r
     ]\r
     interface IVLCMessage: IDispatch\r
@@ -277,9 +269,7 @@ library AXVLC
       odl,\r
       uuid(15179CD8-CC12-4242-A58E-E412217FF343),\r
       helpstring("VLC Log iterator"),\r
-      hidden,\r
       dual,\r
-      nonextensible,\r
       oleautomation\r
     ]\r
     interface IVLCMessageIterator : IDispatch\r
@@ -294,10 +284,8 @@ library AXVLC
     [\r
       odl,\r
       uuid(6C5CE55D-2D6C-4AAD-8299-C62D2371F106),\r
-      helpstring("VLC Log APIs"),\r
-      hidden,\r
+      helpstring("VLC Log Messages Collection."),\r
       dual,\r
-      nonextensible,\r
       oleautomation\r
     ]\r
     interface IVLCMessages : IDispatch\r
@@ -319,9 +307,7 @@ library AXVLC
       odl,\r
       uuid(8E3BC3D9-62E9-48FB-8A6D-993F9ABC4A0A),\r
       helpstring("VLC Log APIs"),\r
-      hidden,\r
       dual,\r
-      nonextensible,\r
       oleautomation\r
     ]\r
     interface IVLCLog : IDispatch\r
@@ -335,31 +321,48 @@ library AXVLC
         HRESULT verbosity([in] long level);\r
     };\r
 \r
+    [\r
+      odl,\r
+      uuid(FD37FE32-82BC-4A25-B056-315F4DBB194D),\r
+      helpstring("VLC Playlist Items collection"),\r
+      dual,\r
+      oleautomation\r
+    ]\r
+    interface IVLCPlaylistItems : IDispatch\r
+    {\r
+        [propget, helpstring("Returns number of items in playlist.")]\r
+        HRESULT count([out, retval] long* count);\r
+\r
+        [helpstring("Remove all items from playlist.")]\r
+        HRESULT clear();\r
+\r
+        [helpstring("remove item from playlist.")]\r
+        HRESULT remove([in] long itemId);\r
+    };\r
+\r
     [\r
       odl,\r
       uuid(54613049-40BF-4035-9E70-0A9312C0188D),\r
       helpstring("VLC Playlist APIs"),\r
-      hidden,\r
       dual,\r
-      nonextensible,\r
       oleautomation\r
     ]\r
     interface IVLCPlaylist : IDispatch\r
     {\r
-        [propget, helpstring("Returns number of items in playlist.")]\r
+        [hidden, propget, helpstring("Returns number of items in playlist. (deprecated)")]\r
         HRESULT itemCount([out, retval] long* count);\r
 \r
         [propget, helpstring("Returns whether playback displays video.")]\r
         HRESULT isPlaying([out, retval] VARIANT_BOOL* playing);\r
 \r
         [helpstring("Add a playlist item.")]\r
-        HRESULT add([in] BSTR uri, [in, optional] VARIANT name, [in, optional] VARIANT options, [out, retval] long* item);\r
+        HRESULT add([in] BSTR uri, [in, optional] VARIANT name, [in, optional] VARIANT options, [out, retval] long* itemId);\r
 \r
         [helpstring("Play/Resume the playlist.")]\r
         HRESULT play();\r
 \r
         [helpstring("Play item in playlist.")]\r
-        HRESULT playItem([in] long item);\r
+        HRESULT playItem([in] long itemId);\r
 \r
         [helpstring("Play/Pause current clip.")]\r
         HRESULT togglePause();\r
@@ -373,20 +376,21 @@ library AXVLC
         [helpstring("Advance to previous item in playlist.")]\r
         HRESULT prev();\r
 \r
-        [helpstring("Remove all items from playlist.")]\r
+        [hidden, helpstring("Remove all items from playlist. (deprecated)")]\r
         HRESULT clear();\r
 \r
-        [helpstring("remove item from playlist.")]\r
+        [hidden, helpstring("Remove item from playlist. (deprecated)")]\r
         HRESULT removeItem([in] long item);\r
+\r
+        [propget, helpstring("Returns the playlist items collection object.")]\r
+        HRESULT items([out, retval] IVLCPlaylistItems** obj);\r
     };\r
 \r
     [\r
       odl,\r
       uuid(0AAEDF0B-D333-4B27-A0C6-BBF31413A42E),\r
       helpstring("VLC Video APIs"),\r
-      hidden,\r
       dual,\r
-      nonextensible,\r
       oleautomation\r
     ]\r
     interface IVLCVideo : IDispatch\r
@@ -403,7 +407,7 @@ library AXVLC
         HRESULT height([out, retval] long* height);\r
 \r
         [propget, helpstring("Returns video aspect ratio.")]\r
-        HRESULT aspectRatio([out, retval] BSTR aspect);\r
+        HRESULT aspectRatio([out, retval] BSTR* aspect);\r
         [propput, helpstring("Sets video aspect ratio.")]\r
         HRESULT aspectRatio([in] BSTR aspect);\r
 \r
@@ -415,7 +419,6 @@ library AXVLC
       odl,\r
       uuid(2D719729-5333-406C-BF12-8DE787FD65E3),\r
       helpstring("VLC Control"),\r
-      hidden,\r
       dual,\r
       oleautomation\r
     ]\r
@@ -496,6 +499,5 @@ library AXVLC
     {\r
         [default] interface IVLCControl2;\r
         interface IVLCControl;\r
-        [default, source] dispinterface DVLCEvents;\r
     };\r
 };\r
index 7d16cb6dc63e697f372715e9d2fec122048d685d..75173b2ff650136d2a4c2b43bf32d8bb825f96f8 100644 (file)
Binary files a/activex/axvlc.tlb and b/activex/axvlc.tlb differ
index 456cfca222c98fc6128269633fb68c3d9aab72a1..76166cc5bff53e855ce765fe14f4cb9789ca76a7 100644 (file)
@@ -19,6 +19,7 @@ DEFINE_GUID(IID_IVLCMessage, 0x9ed00afa, 0x7bcd, 0x4fff, 0x8d,0x48, 0x7d,0xd4,0x
 DEFINE_GUID(IID_IVLCMessageIterator, 0x15179cd8, 0xcc12, 0x4242, 0xa5,0x8e, 0xe4,0x12,0x21,0x7f,0xf3,0x43);
 DEFINE_GUID(IID_IVLCMessages, 0x6c5ce55d, 0x2d6c, 0x4aad, 0x82,0x99, 0xc6,0x2d,0x23,0x71,0xf1,0x06);
 DEFINE_GUID(IID_IVLCLog, 0x8e3bc3d9, 0x62e9, 0x48fb, 0x8a,0x6d, 0x99,0x3f,0x9a,0xbc,0x4a,0x0a);
+DEFINE_GUID(IID_IVLCPlaylistItems, 0xfd37fe32, 0x82bc, 0x4a25, 0xb0,0x56, 0x31,0x5f,0x4d,0xbb,0x19,0x4d);
 DEFINE_GUID(IID_IVLCPlaylist, 0x54613049, 0x40bf, 0x4035, 0x9e,0x70, 0x0a,0x93,0x12,0xc0,0x18,0x8d);
 DEFINE_GUID(IID_IVLCVideo, 0x0aaedf0b, 0xd333, 0x4b27, 0xa0,0xc6, 0xbb,0xf3,0x14,0x13,0xa4,0x2e);
 DEFINE_GUID(IID_IVLCControl2, 0x2d719729, 0x5333, 0x406c, 0xbf,0x12, 0x8d,0xe7,0x87,0xfd,0x65,0xe3);
index 6b779a45dd60a6455808d0238d611b22da63e774..3093a2e8149583ee9bd60f0c94827a3bba13f325 100644 (file)
@@ -1757,6 +1757,139 @@ void __RPC_STUB IVLCLog_put_verbosity_Stub(
 
 #endif  /* __IVLCLog_INTERFACE_DEFINED__ */
 
+#ifndef __IVLCPlaylistItems_FWD_DEFINED__
+#define __IVLCPlaylistItems_FWD_DEFINED__
+typedef interface IVLCPlaylistItems IVLCPlaylistItems;
+#endif
+
+/*****************************************************************************
+ * IVLCPlaylistItems interface
+ */
+#ifndef __IVLCPlaylistItems_INTERFACE_DEFINED__
+#define __IVLCPlaylistItems_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IVLCPlaylistItems, 0xfd37fe32, 0x82bc, 0x4a25, 0xb0,0x56, 0x31,0x5f,0x4d,0xbb,0x19,0x4d);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+interface IVLCPlaylistItems : public IDispatch
+{
+    virtual HRESULT STDMETHODCALLTYPE get_count(
+        long* count) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE clear(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE remove(
+        long itemId) = 0;
+
+};
+#else
+typedef struct IVLCPlaylistItemsVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IVLCPlaylistItems* This,
+        REFIID riid,
+        void** ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IVLCPlaylistItems* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IVLCPlaylistItems* This);
+
+    /*** IDispatch methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
+        IVLCPlaylistItems* This,
+        UINT* pctinfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
+        IVLCPlaylistItems* This,
+        UINT iTInfo,
+        LCID lcid,
+        ITypeInfo** ppTInfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
+        IVLCPlaylistItems* This,
+        REFIID riid,
+        LPOLESTR* rgszNames,
+        UINT cNames,
+        LCID lcid,
+        DISPID* rgDispId);
+
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        IVLCPlaylistItems* This,
+        DISPID dispIdMember,
+        REFIID riid,
+        LCID lcid,
+        WORD wFlags,
+        DISPPARAMS* pDispParams,
+        VARIANT* pVarResult,
+        EXCEPINFO* pExcepInfo,
+        UINT* puArgErr);
+
+    /*** IVLCPlaylistItems methods ***/
+    HRESULT (STDMETHODCALLTYPE *get_count)(
+        IVLCPlaylistItems* This,
+        long* count);
+
+    HRESULT (STDMETHODCALLTYPE *clear)(
+        IVLCPlaylistItems* This);
+
+    HRESULT (STDMETHODCALLTYPE *remove)(
+        IVLCPlaylistItems* This,
+        long itemId);
+
+    END_INTERFACE
+} IVLCPlaylistItemsVtbl;
+interface IVLCPlaylistItems {
+    const IVLCPlaylistItemsVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+/*** IUnknown methods ***/
+#define IVLCPlaylistItems_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IVLCPlaylistItems_AddRef(p) (p)->lpVtbl->AddRef(p)
+#define IVLCPlaylistItems_Release(p) (p)->lpVtbl->Release(p)
+/*** IDispatch methods ***/
+#define IVLCPlaylistItems_GetTypeInfoCount(p,a) (p)->lpVtbl->GetTypeInfoCount(p,a)
+#define IVLCPlaylistItems_GetTypeInfo(p,a,b,c) (p)->lpVtbl->GetTypeInfo(p,a,b,c)
+#define IVLCPlaylistItems_GetIDsOfNames(p,a,b,c,d,e) (p)->lpVtbl->GetIDsOfNames(p,a,b,c,d,e)
+#define IVLCPlaylistItems_Invoke(p,a,b,c,d,e,f,g,h) (p)->lpVtbl->Invoke(p,a,b,c,d,e,f,g,h)
+/*** IVLCPlaylistItems methods ***/
+#define IVLCPlaylistItems_get_count(p,a) (p)->lpVtbl->get_count(p,a)
+#define IVLCPlaylistItems_clear(p) (p)->lpVtbl->clear(p)
+#define IVLCPlaylistItems_remove(p,a) (p)->lpVtbl->remove(p,a)
+#endif
+
+#endif
+
+HRESULT CALLBACK IVLCPlaylistItems_get_count_Proxy(
+    IVLCPlaylistItems* This,
+    long* count);
+void __RPC_STUB IVLCPlaylistItems_get_count_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IVLCPlaylistItems_clear_Proxy(
+    IVLCPlaylistItems* This);
+void __RPC_STUB IVLCPlaylistItems_clear_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IVLCPlaylistItems_remove_Proxy(
+    IVLCPlaylistItems* This,
+    long itemId);
+void __RPC_STUB IVLCPlaylistItems_remove_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IVLCPlaylistItems_INTERFACE_DEFINED__ */
+
 /*****************************************************************************
  * IVLCPlaylist interface
  */
@@ -1777,13 +1910,13 @@ interface IVLCPlaylist : public IDispatch
         BSTR uri,
         VARIANT name,
         VARIANT options,
-        long* item) = 0;
+        long* itemId) = 0;
 
     virtual HRESULT STDMETHODCALLTYPE play(
         ) = 0;
 
     virtual HRESULT STDMETHODCALLTYPE playItem(
-        long item) = 0;
+        long itemId) = 0;
 
     virtual HRESULT STDMETHODCALLTYPE togglePause(
         ) = 0;
@@ -1803,6 +1936,9 @@ interface IVLCPlaylist : public IDispatch
     virtual HRESULT STDMETHODCALLTYPE removeItem(
         long item) = 0;
 
+    virtual HRESULT STDMETHODCALLTYPE get_items(
+        IVLCPlaylistItems** obj) = 0;
+
 };
 #else
 typedef struct IVLCPlaylistVtbl {
@@ -1864,14 +2000,14 @@ typedef struct IVLCPlaylistVtbl {
         BSTR uri,
         VARIANT name,
         VARIANT options,
-        long* item);
+        long* itemId);
 
     HRESULT (STDMETHODCALLTYPE *play)(
         IVLCPlaylist* This);
 
     HRESULT (STDMETHODCALLTYPE *playItem)(
         IVLCPlaylist* This,
-        long item);
+        long itemId);
 
     HRESULT (STDMETHODCALLTYPE *togglePause)(
         IVLCPlaylist* This);
@@ -1892,6 +2028,10 @@ typedef struct IVLCPlaylistVtbl {
         IVLCPlaylist* This,
         long item);
 
+    HRESULT (STDMETHODCALLTYPE *get_items)(
+        IVLCPlaylist* This,
+        IVLCPlaylistItems** obj);
+
     END_INTERFACE
 } IVLCPlaylistVtbl;
 interface IVLCPlaylist {
@@ -1920,6 +2060,7 @@ interface IVLCPlaylist {
 #define IVLCPlaylist_prev(p) (p)->lpVtbl->prev(p)
 #define IVLCPlaylist_clear(p) (p)->lpVtbl->clear(p)
 #define IVLCPlaylist_removeItem(p,a) (p)->lpVtbl->removeItem(p,a)
+#define IVLCPlaylist_get_items(p,a) (p)->lpVtbl->get_items(p,a)
 #endif
 
 #endif
@@ -1945,7 +2086,7 @@ HRESULT CALLBACK IVLCPlaylist_add_Proxy(
     BSTR uri,
     VARIANT name,
     VARIANT options,
-    long* item);
+    long* itemId);
 void __RPC_STUB IVLCPlaylist_add_Stub(
     IRpcStubBuffer* This,
     IRpcChannelBuffer* pRpcChannelBuffer,
@@ -1960,7 +2101,7 @@ void __RPC_STUB IVLCPlaylist_play_Stub(
     DWORD* pdwStubPhase);
 HRESULT CALLBACK IVLCPlaylist_playItem_Proxy(
     IVLCPlaylist* This,
-    long item);
+    long itemId);
 void __RPC_STUB IVLCPlaylist_playItem_Stub(
     IRpcStubBuffer* This,
     IRpcChannelBuffer* pRpcChannelBuffer,
@@ -2009,6 +2150,14 @@ void __RPC_STUB IVLCPlaylist_removeItem_Stub(
     IRpcChannelBuffer* pRpcChannelBuffer,
     PRPC_MESSAGE pRpcMessage,
     DWORD* pdwStubPhase);
+HRESULT CALLBACK IVLCPlaylist_get_items_Proxy(
+    IVLCPlaylist* This,
+    IVLCPlaylistItems** obj);
+void __RPC_STUB IVLCPlaylist_get_items_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
 
 #endif  /* __IVLCPlaylist_INTERFACE_DEFINED__ */
 
@@ -2035,7 +2184,7 @@ interface IVLCVideo : public IDispatch
         long* height) = 0;
 
     virtual HRESULT STDMETHODCALLTYPE get_aspectRatio(
-        BSTR aspect) = 0;
+        BSTR* aspect) = 0;
 
     virtual HRESULT STDMETHODCALLTYPE put_aspectRatio(
         BSTR aspect) = 0;
@@ -2109,7 +2258,7 @@ typedef struct IVLCVideoVtbl {
 
     HRESULT (STDMETHODCALLTYPE *get_aspectRatio)(
         IVLCVideo* This,
-        BSTR aspect);
+        BSTR* aspect);
 
     HRESULT (STDMETHODCALLTYPE *put_aspectRatio)(
         IVLCVideo* This,
@@ -2180,7 +2329,7 @@ void __RPC_STUB IVLCVideo_get_height_Stub(
     DWORD* pdwStubPhase);
 HRESULT CALLBACK IVLCVideo_get_aspectRatio_Proxy(
     IVLCVideo* This,
-    BSTR aspect);
+    BSTR* aspect);
 void __RPC_STUB IVLCVideo_get_aspectRatio_Stub(
     IRpcStubBuffer* This,
     IRpcChannelBuffer* pRpcChannelBuffer,
index 36e8eba8053319b9211c222888dcb1d864dfe874..d73a06f3bea083602579bad99ba3eea293d3ac65 100644 (file)
@@ -35,7 +35,7 @@ struct VLCEnumConnectionsDereference
     CONNECTDATA operator()(const map<DWORD,LPUNKNOWN>::iterator& i)
     {
         CONNECTDATA cd;
-        
+
         cd.dwCookie = i->first;
         cd.pUnk     = i->second;
         return cd;
index e3533aa5bda1963b7f66f3c74fdfff7f23ac89cd..9a3bff92cd5feed4cbe281e2f0bb95aa44019af1 100644 (file)
@@ -42,13 +42,13 @@ extern "C" const IID IID_IObjectSafety;
 
 struct IObjectSafety : public IUnknown
 {
-    virtual STDMETHODIMP GetInterfaceSafetyOptions(      
+    virtual STDMETHODIMP GetInterfaceSafetyOptions(
         REFIID riid,
         DWORD __RPC_FAR *pdwSupportedOptions,
         DWORD __RPC_FAR *pdwEnabledOptions
     ) = 0;
 
-    virtual STDMETHODIMP SetInterfaceSafetyOptions(      
+    virtual STDMETHODIMP SetInterfaceSafetyOptions(
         REFIID riid,
         DWORD dwSupportedOptions,
         DWORD dwOptionSetMask
@@ -83,19 +83,19 @@ public:
     STDMETHODIMP_(ULONG) Release(void) { return _p_instance->pUnkOuter->Release(); };
 
     // IUnknown methods
-    STDMETHODIMP GetInterfaceSafetyOptions(      
+    STDMETHODIMP GetInterfaceSafetyOptions(
         REFIID riid,
         DWORD *pdwSupportedOptions,
         DWORD *pdwEnabledOptions
     );
 
-    STDMETHODIMP SetInterfaceSafetyOptions(      
+    STDMETHODIMP SetInterfaceSafetyOptions(
         REFIID riid,
         DWORD dwOptionSetMask,
         DWORD dwEnabledOptions
     );
 
-private: 
+private:
 
     VLCPlugin *_p_instance;
 };
index 6dcf3f3623b9c2cc9a260045811951de32d76b21..83fc7d8c67d4e10ad625d74aa2c73182337466b8 100644 (file)
@@ -35,10 +35,10 @@ public:
     STDMETHODIMP QueryInterface(REFIID riid, void **ppv)
     {
         if( NULL == ppv )
-           return E_POINTER;
+            return E_POINTER;
         if( (IID_IUnknown == riid)
          || (IID_IOleWindow == riid)
-         || (IID_IOleInPlaceObject == riid) ) 
+         || (IID_IOleInPlaceObject == riid) )
         {
             AddRef();
             *ppv = reinterpret_cast<LPVOID>(this);
@@ -66,4 +66,3 @@ private:
 };
 
 #endif
-
index 11d82e2c3da7f2a4284f6debe731e225aff2ec9a..b7ef8867d0ecb1d957a8c20a5560fdfc99827460 100644 (file)
@@ -30,7 +30,7 @@
 using namespace std;
 
 VLCOleObject::VLCOleObject(VLCPlugin *p_instance) :
-_p_clientsite(NULL), _p_instance(p_instance) 
+_p_clientsite(NULL), _p_instance(p_instance)
 {
     CreateOleAdviseHolder(&_p_advise_holder);
 };
@@ -242,7 +242,7 @@ STDMETHODIMP VLCOleObject::GetClientSite(LPOLECLIENTSITE *ppClientSite)
 {
     if( NULL == ppClientSite )
         return E_POINTER;
+
     if( NULL != _p_clientsite )
         _p_clientsite->AddRef(); 
 
@@ -295,7 +295,7 @@ STDMETHODIMP VLCOleObject::GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker, LPMO
 {
     if( NULL != _p_clientsite )
         return _p_clientsite->GetMoniker(dwAssign,dwWhichMoniker, ppMoniker);
+
     return E_UNEXPECTED;
 };
 
index 567a10897bcc97d319ea779afbf1112bd2450051..9e5485601cc201fa547b3dc40316e4bea3b51cf6 100644 (file)
@@ -37,7 +37,7 @@ public:
         if( NULL == ppv )
             return E_POINTER;
         if( (IID_IUnknown == riid)
-         || (IID_IOleObject == riid) ) 
+         || (IID_IOleObject == riid) )
         {
             AddRef();
             *ppv = reinterpret_cast<LPVOID>(this);
index 6d3a529833b3dd985bffb7e0862af0917c117070..ef6531a6833eb7f359962609495841ca40994f7b 100644 (file)
@@ -243,4 +243,3 @@ STDMETHODIMP VLCPersistPropertyBag::Save(LPPROPERTYBAG pPropBag, BOOL fClearDirt
 
     return S_OK;
 };
-
index ad45bb31fb90959220eeb0d88c2ecaf9219acd7a..8d41fb2bff5b8a74869281245a8bfec177580392 100644 (file)
@@ -48,9 +48,8 @@ public:
 
     AxVLCVariant(VARIANTARG &v)
     {
-        //VariantInit(&_v);
-        //VariantCopy(&_v, &v);
-        _v = v;
+        VariantInit(&_v);
+        VariantCopy(&_v, &v);
     };
 
     AxVLCVariant(VARIANTARG *v)
@@ -276,7 +275,7 @@ public:
             (*p.first).second = val.second;
         return S_OK;
     };
-   
+
     // custom methods
 
     HRESULT Load(LPSTREAM pStm)
@@ -292,7 +291,7 @@ public:
         {
             if( (val->first == L"(Count)") && (VT_I4 == V_VT(val->second.variantArg())) )
             {
-                size_t count =  V_I4(val->second.variantArg());
+                size_t count = V_I4(val->second.variantArg());
                 delete val;
                 while( count-- )
                 {
@@ -551,7 +550,7 @@ STDMETHODIMP VLCPersistStreamInit::IsDirty(void)
 STDMETHODIMP VLCPersistStreamInit::GetSizeMax(ULARGE_INTEGER *pcbSize)
 {
     pcbSize->HighPart = 0UL;
-    pcbSize->LowPart  = 4096UL; // just a guess
+    pcbSize->LowPart  = 16384UL; // just a guess
 
     return S_OK;
 };
index 619f1a3456e931c04f4d3de59bfb4d770dd98a8e..9bd2478cd710d5419b12ae7406033684e082d0c9 100644 (file)
@@ -69,4 +69,3 @@ private:
 };
 
 #endif
-
index cc289b92459643095f3e826a738b704b0e17d1bc..eed61162602e6f06af4592db2416c0298afec097 100644 (file)
@@ -98,7 +98,7 @@ VLCPluginClass::VLCPluginClass(LONG *p_class_ref, HINSTANCE hInstance, REFCLSID
         wClass.hbrBackground  = NULL;
         wClass.lpszMenuName   = NULL;
         wClass.lpszClassName  = getInPlaceWndClassName();
-       
+
         _inplace_wndclass_atom = RegisterClass(&wClass);
     }
     else
@@ -258,6 +258,7 @@ VLCPlugin::~VLCPlugin()
         _p_pict->Release();
 
     SysFreeString(_bstr_mrl);
+    SysFreeString(_bstr_baseurl);
 
     _p_class->Release();
 };
@@ -434,17 +435,17 @@ HRESULT VLCPlugin::getVLC(libvlc_instance_t** pp_libvlc)
         if( RegOpenKeyEx( HKEY_LOCAL_MACHINE, "Software\\VideoLAN\\VLC",
                           0, KEY_READ, &h_key ) == ERROR_SUCCESS )
         {
-             if( RegQueryValueEx( h_key, "InstallDir", 0, &i_type,
-                                  (LPBYTE)p_data, &i_data ) == ERROR_SUCCESS )
-             {
-                 if( i_type == REG_SZ )
-                 {
-                     strcat( p_data, "\\plugins" );
-                     //ppsz_argv[ppsz_argc++] = "--plugin-path";
-                     //ppsz_argv[ppsz_argc++] = p_data;
-                 }
-             }
-             RegCloseKey( h_key );
+            if( RegQueryValueEx( h_key, "InstallDir", 0, &i_type,
+                                 (LPBYTE)p_data, &i_data ) == ERROR_SUCCESS )
+            {
+                if( i_type == REG_SZ )
+                {
+                    strcat( p_data, "\\plugins" );
+                    ppsz_argv[ppsz_argc++] = "--plugin-path";
+                    ppsz_argv[ppsz_argc++] = p_data;
+                }
+            }
+            RegCloseKey( h_key );
         }
 
         char p_path[MAX_PATH+1];
@@ -496,7 +497,7 @@ HRESULT VLCPlugin::getVLC(libvlc_instance_t** pp_libvlc)
         {
             libvlc_audio_set_mute(_p_libvlc, TRUE, NULL);
         }
-            
+
         // initial playlist item
         if( SysStringLen(_bstr_mrl) > 0 )
         {
@@ -504,24 +505,19 @@ HRESULT VLCPlugin::getVLC(libvlc_instance_t** pp_libvlc)
 
             if( SysStringLen(_bstr_baseurl) > 0 )
             {
-                DWORD len = INTERNET_MAX_URL_LENGTH;
-                LPOLESTR abs_url = (LPOLESTR)CoTaskMemAlloc(sizeof(OLECHAR)*len);
+                /*
+                ** if the MRL a relative URL, we should end up with an absolute URL
+                */
+                LPWSTR abs_url = CombineURL(_bstr_baseurl, _bstr_mrl);
                 if( NULL != abs_url )
                 {
-                    /*
-                    ** if the MRL a relative URL, we should end up with an absolute URL
-                    */
-                    if( SUCCEEDED(UrlCombineW(_bstr_baseurl, _bstr_mrl, abs_url, &len,
-                                    URL_ESCAPE_UNSAFE|URL_PLUGGABLE_PROTOCOL)) )
-                    {
-                        psz_mrl = CStrFromBSTR(CP_UTF8, abs_url);
-                    }
-                    else
-                    {
-                        psz_mrl = CStrFromBSTR(CP_UTF8, _bstr_mrl);
-                    }
+                    psz_mrl = CStrFromWSTR(CP_UTF8, abs_url, wcslen(abs_url));
                     CoTaskMemFree(abs_url);
                 }
+                else
+                {
+                    psz_mrl = CStrFromBSTR(CP_UTF8, _bstr_mrl);
+                }
             }
             else
             {
@@ -648,6 +644,14 @@ HRESULT VLCPlugin::onClose(DWORD dwSaveOption)
     {
         libvlc_instance_t* p_libvlc = _p_libvlc;
 
+        IVLCLog *p_log;
+       if( SUCCEEDED(vlcControl2->get_log(&p_log)) )
+        {
+            // make sure the log is disabled
+            p_log->put_verbosity(-1);
+            p_log->Release();
+        }
+
         _p_libvlc = NULL;
         vlcDataObject->onClose();
 
@@ -741,7 +745,7 @@ HRESULT VLCPlugin::onInPlaceDeactivate(void)
 
     DestroyWindow(_inplacewnd);
     _inplacewnd = NULL;
+
     return S_OK;
 };
 
@@ -984,4 +988,3 @@ void VLCPlugin::fireOnStopEvent(void)
     DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0};
     vlcConnectionPointContainer->fireEvent(DISPID_StopEvent, &dispparamsNoArgs); 
 };
-
index 456583be78274d6d268304902693272b2f199296..864fac43f7183ce21c3fff39fa2ace86bd7a1339 100644 (file)
@@ -162,7 +162,7 @@ public:
             _p_pict->AddRef();
         return _p_pict;
     };
-    
+
     BOOL hasFocus(void);
     void setFocus(BOOL fFocus);
 
@@ -268,4 +268,3 @@ private:
 };
 
 #endif
-
index 2e7546ec0e6738d376a2f77a46eb0a3a1969b98d..c5b97315d64d239c6d618f4a30c35499289b8a28 100644 (file)
@@ -57,4 +57,3 @@ STDMETHODIMP VLCProvideClassInfo::GetGUID(DWORD dwGuidKind, GUID *pGUID)
 
     return S_OK;
 };
-
index 82b43e7ab474498088ac2f04553f6dc1f44c0a88..6286868deee2266faa5039a0aedce543a96358b7 100644 (file)
@@ -64,4 +64,3 @@ private:
 };
 
 #endif
-
index 37136ddfd46bcfee56a17bf13a7d5caad8abc788..531a567fdacf62b3ea4111860f1ccf7ce93197cd 100755 (executable)
@@ -37,6 +37,7 @@ STDMETHODIMP VLCSupportErrorInfo::InterfaceSupportsErrorInfo(REFIID  riid)
      || (riid == IID_IVLCMessageIterator)
      || (riid == IID_IVLCMessages)
      || (riid == IID_IVLCPlaylist)
+     || (riid == IID_IVLCPlaylistItems)
      || (riid == IID_IVLCVideo)
      || (riid == IID_IVLCControl2) )
     {
index fdad6d4173573238bd4b91f3a52790f9b06b463a..15040bf233eac7d6df1eb21bbf7849ac73ff3dcc 100644 (file)
 
 #include "utils.h"
 
+#include <wchar.h>
+#include <wctype.h>
+
 /*
 ** conversion facilities
 */
 
 using namespace std;
 
-char *CStrFromBSTR(UINT codePage, BSTR bstr)
+char *CStrFromWSTR(UINT codePage, LPCWSTR wstr, UINT len)
 {
-    UINT len = SysStringLen(bstr);
     if( len > 0 )
     {
         size_t mblen = WideCharToMultiByte(codePage,
-                0, bstr, len, NULL, 0, NULL, NULL);
+                0, wstr, len, NULL, 0, NULL, NULL);
         if( mblen > 0 )
         {
             char *buffer = (char *)CoTaskMemAlloc(mblen+1);
             ZeroMemory(buffer, mblen+1);
-            if( WideCharToMultiByte(codePage, 0, bstr, len, buffer, mblen, NULL, NULL) )
+            if( WideCharToMultiByte(codePage, 0, wstr, len, buffer, mblen, NULL, NULL) )
             {
                 buffer[mblen] = '\0';
                 return buffer;
@@ -49,6 +51,11 @@ char *CStrFromBSTR(UINT codePage, BSTR bstr)
     return NULL;
 };
 
+char *CStrFromBSTR(UINT codePage, BSTR bstr)
+{
+    return CStrFromWSTR(codePage, bstr, SysStringLen(bstr));
+};
+
 BSTR BSTRFromCStr(UINT codePage, LPCSTR s)
 {
     int wideLen = MultiByteToWideChar(codePage, 0, s, -1, NULL, 0);
@@ -61,7 +68,7 @@ BSTR BSTRFromCStr(UINT codePage, LPCSTR s)
 
             ZeroMemory(wideStr, wideLen*sizeof(WCHAR));
             MultiByteToWideChar(codePage, 0, s, -1, wideStr, wideLen);
-            bstr = SysAllocStringLen(wideStr, wideLen);
+            bstr = SysAllocStringLen(wideStr, wideLen-1);
             CoTaskMemFree(wideStr);
 
             return bstr;
@@ -126,11 +133,11 @@ HRESULT GetObjectProperty(LPUNKNOWN object, DISPID dispID, VARIANT& v)
 
 HDC CreateDevDC(DVTARGETDEVICE *ptd)
 {
-       HDC hdc=NULL;
-       if( NULL == ptd )
+    HDC hdc=NULL;
+    if( NULL == ptd )
     {
-               hdc = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL);
-       }
+        hdc = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL);
+    }
     else
     {
         LPDEVNAMES lpDevNames;
@@ -156,7 +163,7 @@ HDC CreateDevDC(DVTARGETDEVICE *ptd)
 
         hdc = CreateDC(lpszDriverName, lpszDeviceName, lpszPortName, lpDevMode);
     }
-       return hdc;
+        return hdc;
 };
 
 #define HIMETRIC_PER_INCH 2540
@@ -185,3 +192,155 @@ void HimetricFromDP(HDC hdc, LPPOINT pt, int count)
     }
 };
 
+
+LPWSTR CombineURL(LPCWSTR baseUrl, LPCWSTR url)
+{
+    if( NULL != url )
+    {
+        // check whether URL is already absolute
+        const wchar_t *end=wcschr(url, L':');
+        if( (NULL != end) && (end != url) )
+        {
+            // validate protocol header
+            const wchar_t *start = url;
+            while( start != end ) {
+                wchar_t c = towlower(*start);
+                if( (c < L'a') || (c > L'z') )
+                    // not a valid protocol header, assume relative URL
+                    goto relativeurl;
+                ++start;
+            }
+            /* we have a protocol header, therefore URL is absolute */
+            UINT len = wcslen(url);
+            wchar_t *href = (LPWSTR)CoTaskMemAlloc((len+1)*sizeof(wchar_t));
+            if( href )
+            {
+                memcpy(href, url, len*sizeof(wchar_t));
+                href[len] = L'\0';
+            }
+            return href;
+        }
+
+relativeurl:
+
+        if( baseUrl )
+        {
+            size_t baseLen = wcslen(baseUrl);
+            wchar_t *href = (LPWSTR)CoTaskMemAlloc((baseLen+wcslen(url)+1)*sizeof(wchar_t));
+            if( href )
+            {
+                /* prepend base URL */
+                wcscpy(href, baseUrl);
+
+                /*
+                ** relative url could be empty,
+                ** in which case return base URL
+                */
+                if( L'\0' == *url )
+                    return href;
+
+                /*
+                ** locate pathname part of base URL
+                */
+
+                /* skip over protocol part  */
+                wchar_t *pathstart = wcschr(href, L':');
+                wchar_t *pathend;
+                if( pathstart )
+                {
+                    if( L'/' == *(++pathstart) )
+                    {
+                        if( L'/' == *(++pathstart) )
+                        {
+                            ++pathstart;
+                        }
+                    }
+                    /* skip over host part */
+                    pathstart = wcschr(pathstart, L'/');
+                    pathend = href+baseLen;
+                    if( ! pathstart )
+                    {
+                        // no path, add a / past end of url (over '\0')
+                        pathstart = pathend;
+                        *pathstart = L'/';
+                    }
+                }
+                else
+                {
+                    /* baseURL is just a UNIX file path */
+                    if( L'/' != *href )
+                    {
+                        /* baseURL is not an absolute path */
+                        return NULL;
+                    }
+                    pathstart = href;
+                    pathend = href+baseLen;
+                }
+
+                /* relative URL made of an absolute path ? */
+                if( L'/' == *url )
+                {
+                    /* replace path completely */
+                    wcscpy(pathstart, url);
+                    return href;
+                }
+
+                /* find last path component and replace it */ 
+                while( L'/' != *pathend )
+                    --pathend;
+
+                /*
+                ** if relative url path starts with one or more './' or '../',
+                ** factor them out of href so that we return a
+                ** normalized URL
+                */
+                while( pathend > pathstart )
+                {
+                    const wchar_t *p = url;
+                    if( L'.' != *p )
+                        break;
+                    ++p;
+                    if( L'\0' == *p  )
+                    {
+                        /* relative url is just '.' */
+                        url = p;
+                        break;
+                    }
+                    if( L'/' == *p  )
+                    {
+                        /* relative url starts with './' */
+                        url = ++p;
+                        continue;
+                    }
+                    if( L'.' != *p ) 
+                        break;
+                    ++p;
+                    if( L'\0' == *p )
+                    {
+                        /* relative url is '..' */
+                    }
+                    else
+                    {
+                        if( L'/' != *p ) 
+                            break;
+                        /* relative url starts with '../' */
+                        ++p;
+                    }
+                    url = p;
+                    do
+                    {
+                        --pathend;
+                    }
+                    while( L'/' != *pathend );
+                }
+                /* skip over '/' separator */
+                ++pathend;
+                /* concatenate remaining base URL and relative URL */
+                wcscpy(pathend, url);
+            }
+            return href;
+        }
+    }
+    return NULL;
+}
+
index f4a9c4f55020fab2c650875034886ab75a6c0c27..7b1e217c13044b07b23716bdce9011cd58c2617b 100644 (file)
@@ -28,6 +28,7 @@
 #include <vector>
 
 // utilities
+extern char *CStrFromWSTR(UINT codePage, LPCWSTR wstr, UINT len);
 extern char *CStrFromBSTR(UINT codePage, BSTR bstr);
 extern BSTR BSTRFromCStr(UINT codePage, LPCSTR s);
 
@@ -41,6 +42,9 @@ extern HDC CreateDevDC(DVTARGETDEVICE *ptd);
 extern void DPFromHimetric(HDC hdc, LPPOINT pt, int count);
 extern void HimetricFromDP(HDC hdc, LPPOINT pt, int count);
 
+// URL
+extern LPWSTR CombineURL(LPCWSTR baseUrl, LPCWSTR url);
+
 /**************************************************************************************************/
 
 /* this function object is used to dereference the iterator into a value */
index 66b01092627485a3fe89ca88df12b540320eed96..5cf109f7449b61d9c69630544ba458e2b835fadd 100644 (file)
@@ -132,7 +132,7 @@ STDMETHODIMP VLCControl::play(void)
     }
     return result;
 };
+
 STDMETHODIMP VLCControl::pause(void)
 {
     int i_vlc;
@@ -144,7 +144,7 @@ STDMETHODIMP VLCControl::pause(void)
     }
     return result;
 };
-        
+
 STDMETHODIMP VLCControl::stop(void)
 {
     int i_vlc;
@@ -156,7 +156,7 @@ STDMETHODIMP VLCControl::stop(void)
     }
     return result;
 };
-        
+
 STDMETHODIMP VLCControl::get_Playing(VARIANT_BOOL *isPlaying)
 {
     if( NULL == isPlaying )
@@ -176,7 +176,7 @@ STDMETHODIMP VLCControl::get_Playing(VARIANT_BOOL *isPlaying)
     *isPlaying = VARIANT_FALSE;
     return result;
 };
-        
+
 STDMETHODIMP VLCControl::get_Position(float *position)
 {
     if( NULL == position )
@@ -196,7 +196,7 @@ STDMETHODIMP VLCControl::get_Position(float *position)
     *position = 0.0f;
     return result;
 };
-        
+
 STDMETHODIMP VLCControl::put_Position(float position)
 {
     HRESULT result = E_UNEXPECTED;
@@ -211,7 +211,7 @@ STDMETHODIMP VLCControl::put_Position(float position)
     }
     return result;
 };
-        
+
 STDMETHODIMP VLCControl::get_Time(int *seconds)
 {
     if( NULL == seconds )
@@ -232,14 +232,14 @@ STDMETHODIMP VLCControl::get_Time(int *seconds)
 
     return result;
 };
-     
+
 STDMETHODIMP VLCControl::put_Time(int seconds)
 {
     _p_instance->setTime(seconds);
 
     return NOERROR;
 };
-        
+
 STDMETHODIMP VLCControl::shuttle(int seconds)
 {
     HRESULT result = E_UNEXPECTED;
@@ -254,7 +254,7 @@ STDMETHODIMP VLCControl::shuttle(int seconds)
     }
     return result;
 };
-        
+
 STDMETHODIMP VLCControl::fullscreen(void)
 {
     HRESULT result = E_UNEXPECTED;
@@ -269,7 +269,7 @@ STDMETHODIMP VLCControl::fullscreen(void)
     }
     return result;
 };
-        
+
 STDMETHODIMP VLCControl::get_Length(int *seconds)
 {
     if( NULL == seconds )
@@ -289,7 +289,7 @@ STDMETHODIMP VLCControl::get_Length(int *seconds)
     *seconds = 0;
     return result;
 };
-        
+
 STDMETHODIMP VLCControl::playFaster(void)
 {
     HRESULT result = E_UNEXPECTED;
@@ -304,7 +304,7 @@ STDMETHODIMP VLCControl::playFaster(void)
     }
     return result;
 };
-        
+
 STDMETHODIMP VLCControl::playSlower(void)
 {
     HRESULT result = E_UNEXPECTED;
@@ -319,7 +319,7 @@ STDMETHODIMP VLCControl::playSlower(void)
     }
     return result;
 };
-        
+
 STDMETHODIMP VLCControl::get_Volume(int *volume)
 {
     if( NULL == volume )
@@ -328,13 +328,13 @@ STDMETHODIMP VLCControl::get_Volume(int *volume)
     *volume  = _p_instance->getVolume();
     return NOERROR;
 };
-        
+
 STDMETHODIMP VLCControl::put_Volume(int volume)
 {
     _p_instance->setVolume(volume);
     return NOERROR;
 };
-        
+
 STDMETHODIMP VLCControl::toggleMute(void)
 {
     int i_vlc;
@@ -362,7 +362,7 @@ STDMETHODIMP VLCControl::setVariable(BSTR name, VARIANT value)
 
         int i_type;
         vlc_value_t val;
-        
+
         if( VLC_SUCCESS == VLC_VariableType(i_vlc, psz_varname, &i_type) )
         {
             VARIANT arg;
@@ -771,7 +771,7 @@ STDMETHODIMP VLCControl::addTarget( BSTR uri, VARIANT options, enum VLCPlaylistM
     }
     return hr;
 };
-        
+
 STDMETHODIMP VLCControl::get_PlaylistIndex(int *index)
 {
     if( NULL == index )
@@ -787,7 +787,7 @@ STDMETHODIMP VLCControl::get_PlaylistIndex(int *index)
     *index = 0;
     return result;
 };
-        
+
 STDMETHODIMP VLCControl::get_PlaylistCount(int *count)
 {
     int i_vlc;
@@ -800,7 +800,7 @@ STDMETHODIMP VLCControl::get_PlaylistCount(int *count)
     *count = 0;
     return result;
 };
-        
+
 STDMETHODIMP VLCControl::playlistNext(void)
 {
     int i_vlc;
@@ -812,7 +812,7 @@ STDMETHODIMP VLCControl::playlistNext(void)
     }
     return result;
 };
-        
+
 STDMETHODIMP VLCControl::playlistPrev(void)
 {
     int i_vlc;
@@ -824,7 +824,7 @@ STDMETHODIMP VLCControl::playlistPrev(void)
     }
     return result;
 };
-        
+
 STDMETHODIMP VLCControl::playlistClear(void)
 {
     int i_vlc;
@@ -836,7 +836,7 @@ STDMETHODIMP VLCControl::playlistClear(void)
     }
     return result;
 };
-        
+
 STDMETHODIMP VLCControl::get_VersionInfo(BSTR *version)
 {
     if( NULL == version )
@@ -852,7 +852,7 @@ STDMETHODIMP VLCControl::get_VersionInfo(BSTR *version)
     *version = NULL;
     return E_FAIL;
 };
+
 STDMETHODIMP VLCControl::get_MRL(BSTR *mrl)
 {
     if( NULL == mrl )
@@ -899,4 +899,3 @@ STDMETHODIMP VLCControl::put_AutoLoop(VARIANT_BOOL autoloop)
     _p_instance->setAutoLoop((VARIANT_FALSE != autoloop) ? TRUE: FALSE);
     return S_OK;
 };
-
index 79a30397eebb4b2da8e58755b65cadfc5239456d..fa19b31fac53c8fffaa162fec1231de5fc39e906 100644 (file)
@@ -27,7 +27,6 @@
 
 class VLCControl : public IVLCControl
 {
-    
 public:
 
     VLCControl(VLCPlugin *p_instance) :  _p_instance(p_instance), _p_typeinfo(NULL) {};
@@ -92,7 +91,7 @@ public:
     STDMETHODIMP put_AutoLoop(VARIANT_BOOL autoloop);
     STDMETHODIMP get_AutoPlay(VARIANT_BOOL *autoplay);
     STDMETHODIMP put_AutoPlay(VARIANT_BOOL autoplay);
+
     static HRESULT CreateTargetOptions(int codePage, VARIANT *options, char ***cOptions, int *cOptionCount);
     static void FreeTargetOptions(char **cOptions, int cOptionCount);
 
@@ -102,8 +101,6 @@ private:
 
     VLCPlugin *_p_instance;
     ITypeInfo *_p_typeinfo;
-
 };
-#endif
 
+#endif
index cf27691b36365c8b45edcf1c02f9057a46a0dcd4..54709ee4a7b14c8785be1f5e579281d1abe50f6f 100755 (executable)
@@ -26,6 +26,9 @@
 
 #include "utils.h"
 
+#include <shlwapi.h>
+#include <wininet.h>
+
 using namespace std;
 
 VLCAudio::~VLCAudio()
@@ -581,6 +584,7 @@ STDMETHODIMP VLCInput::get_hasVout(VARIANT_BOOL* hasVout)
 
 VLCLog::~VLCLog()
 {
+    delete _p_vlcmessages;
     if( _p_log )
         libvlc_log_close(_p_log, NULL);
 
@@ -1202,8 +1206,157 @@ STDMETHODIMP VLCMessage::get_message(BSTR* message)
 
 /*******************************************************************************/
 
+VLCPlaylistItems::~VLCPlaylistItems()
+{
+    if( _p_typeinfo )
+        _p_typeinfo->Release();
+};
+
+HRESULT VLCPlaylistItems::loadTypeInfo(void)
+{
+    HRESULT hr = NOERROR;
+    if( NULL == _p_typeinfo )
+    {
+        ITypeLib *p_typelib;
+
+        hr = _p_instance->getTypeLib(LOCALE_USER_DEFAULT, &p_typelib);
+        if( SUCCEEDED(hr) )
+        {
+            hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCPlaylistItems, &_p_typeinfo);
+            if( FAILED(hr) )
+            {
+                _p_typeinfo = NULL;
+            }
+            p_typelib->Release();
+        }
+    }
+    return hr;
+};
+
+STDMETHODIMP VLCPlaylistItems::GetTypeInfoCount(UINT* pctInfo)
+{
+    if( NULL == pctInfo )
+        return E_INVALIDARG;
+
+    if( SUCCEEDED(loadTypeInfo()) )
+        *pctInfo = 1;
+    else
+        *pctInfo = 0;
+
+    return NOERROR;
+};
+
+STDMETHODIMP VLCPlaylistItems::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)
+{
+    if( NULL == ppTInfo )
+        return E_INVALIDARG;
+
+    if( SUCCEEDED(loadTypeInfo()) )
+    {
+        _p_typeinfo->AddRef();
+        *ppTInfo = _p_typeinfo;
+        return NOERROR;
+    }
+    *ppTInfo = NULL;
+    return E_NOTIMPL;
+};
+
+STDMETHODIMP VLCPlaylistItems::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, 
+        UINT cNames, LCID lcid, DISPID* rgDispID)
+{
+    if( SUCCEEDED(loadTypeInfo()) )
+    {
+        return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);
+    }
+    return E_NOTIMPL;
+};
+
+STDMETHODIMP VLCPlaylistItems::Invoke(DISPID dispIdMember, REFIID riid,
+        LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,
+        VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)
+{
+    if( SUCCEEDED(loadTypeInfo()) )
+    {
+        return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,
+                pVarResult, pExcepInfo, puArgErr);
+    }
+    return E_NOTIMPL;
+};
+
+STDMETHODIMP VLCPlaylistItems::get_count(long* count)
+{
+    if( NULL == count )
+        return E_POINTER;
+
+    libvlc_instance_t* p_libvlc;
+    HRESULT hr = _p_instance->getVLC(&p_libvlc);
+    if( SUCCEEDED(hr) )
+    {
+        libvlc_exception_t ex;
+        libvlc_exception_init(&ex);
+
+        *count = libvlc_playlist_items_count(p_libvlc, &ex);
+        if( libvlc_exception_raised(&ex) )
+        {
+            _p_instance->setErrorInfo(IID_IVLCPlaylistItems,
+                libvlc_exception_get_message(&ex));
+            libvlc_exception_clear(&ex);
+            return E_FAIL;
+        }
+        return NOERROR;
+    }
+    return hr;
+};
+
+STDMETHODIMP VLCPlaylistItems::clear()
+{
+    libvlc_instance_t* p_libvlc;
+    HRESULT hr = _p_instance->getVLC(&p_libvlc);
+    if( SUCCEEDED(hr) )
+    {
+        libvlc_exception_t ex;
+        libvlc_exception_init(&ex);
+
+        libvlc_playlist_clear(p_libvlc, &ex);
+        if( libvlc_exception_raised(&ex) )
+        {
+            _p_instance->setErrorInfo(IID_IVLCPlaylistItems,
+                libvlc_exception_get_message(&ex));
+            libvlc_exception_clear(&ex);
+            return E_FAIL;
+        }
+        return NOERROR;
+    }
+    return hr;
+};
+
+STDMETHODIMP VLCPlaylistItems::remove(long item)
+{
+    libvlc_instance_t* p_libvlc;
+    HRESULT hr = _p_instance->getVLC(&p_libvlc);
+    if( SUCCEEDED(hr) )
+    {
+        libvlc_exception_t ex;
+        libvlc_exception_init(&ex);
+
+        libvlc_playlist_delete_item(p_libvlc, item, &ex);
+        if( libvlc_exception_raised(&ex) )
+        {
+            _p_instance->setErrorInfo(IID_IVLCPlaylistItems,
+                libvlc_exception_get_message(&ex));
+            libvlc_exception_clear(&ex);
+            return E_FAIL;
+        }
+        return NOERROR;
+    }
+    return hr;
+};
+
+/*******************************************************************************/
+
 VLCPlaylist::~VLCPlaylist()
 {
+    delete _p_vlcplaylistitems;
     if( _p_typeinfo )
         _p_typeinfo->Release();
 };
@@ -1344,18 +1497,44 @@ STDMETHODIMP VLCPlaylist::add(BSTR uri, VARIANT name, VARIANT options, long* ite
         libvlc_exception_t ex;
         libvlc_exception_init(&ex);
 
+        char *psz_uri = NULL;
+        if( SysStringLen(_p_instance->getBaseURL()) > 0 )
+        {
+            /*
+            ** if the MRL a relative URL, we should end up with an absolute URL
+            */
+            LPWSTR abs_url = CombineURL(_p_instance->getBaseURL(), uri);
+            if( NULL != abs_url )
+            {
+                psz_uri = CStrFromWSTR(CP_UTF8, abs_url, wcslen(abs_url));
+                CoTaskMemFree(abs_url);
+            }
+            else
+            {
+                psz_uri = CStrFromBSTR(CP_UTF8, uri);
+            }
+        }
+        else
+        {
+            /*
+            ** baseURL is empty, assume MRL is absolute
+            */
+            psz_uri = CStrFromBSTR(CP_UTF8, uri);
+        }
+
+        if( NULL == psz_uri )
+        {
+            return E_OUTOFMEMORY;
+        }
+
         int i_options;
         char **ppsz_options;
 
         hr = VLCControl::CreateTargetOptions(CP_UTF8, &options, &ppsz_options, &i_options);
         if( FAILED(hr) )
-            return hr;
-
-        char *psz_uri = CStrFromBSTR(CP_UTF8, uri);
-        if( NULL == psz_uri )
         {
-            VLCControl::FreeTargetOptions(ppsz_options, i_options);
-            return E_OUTOFMEMORY;
+            CoTaskMemFree(psz_uri);
+            return hr;
         }
 
         char *psz_name = NULL;
@@ -1566,6 +1745,20 @@ STDMETHODIMP VLCPlaylist::removeItem(long item)
     return hr;
 };
 
+STDMETHODIMP VLCPlaylist::get_items(IVLCPlaylistItems** obj)
+{
+    if( NULL == obj )
+        return E_POINTER;
+
+    *obj = _p_vlcplaylistitems;
+    if( NULL != _p_vlcplaylistitems )
+    {
+        _p_vlcplaylistitems->AddRef();
+        return NOERROR;
+    }
+    return E_OUTOFMEMORY;
+};
+
 /*******************************************************************************/
 
 VLCVideo::~VLCVideo()
@@ -1758,7 +1951,7 @@ STDMETHODIMP VLCVideo::get_height(long* height)
     return hr;
 };
 
-STDMETHODIMP VLCVideo::get_aspectRatio(BSTR aspect)
+STDMETHODIMP VLCVideo::get_aspectRatio(BSTR* aspect)
 {
     if( NULL == aspect )
         return E_POINTER;
@@ -1776,17 +1969,17 @@ STDMETHODIMP VLCVideo::get_aspectRatio(BSTR aspect)
             char *psz_aspect = libvlc_video_get_aspect_ratio(p_input, &ex);
 
             libvlc_input_free(p_input);
-            if( NULL == psz_aspect )
-                return E_OUTOFMEMORY;
-
             if( ! libvlc_exception_raised(&ex) )
             {
-                aspect = SysAllocStringByteLen(psz_aspect, strlen(psz_aspect));
+                if( NULL == psz_aspect )
+                    return E_OUTOFMEMORY;
+
+                *aspect = SysAllocStringByteLen(psz_aspect, strlen(psz_aspect));
                 free( psz_aspect );
                 psz_aspect = NULL;
                 return NOERROR;
-           }
-           if( psz_aspect ) free( psz_aspect );
+            }
+            if( psz_aspect ) free( psz_aspect );
         }
         _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
         libvlc_exception_clear(&ex);
@@ -1826,7 +2019,7 @@ STDMETHODIMP VLCVideo::put_aspectRatio(BSTR aspect)
             libvlc_input_free(p_input);
             if( libvlc_exception_raised(&ex) )
             {
-                _p_instance->setErrorInfo(IID_IVLCPlaylist,
+                _p_instance->setErrorInfo(IID_IVLCVideo,
                     libvlc_exception_get_message(&ex));
                 libvlc_exception_clear(&ex);
                 return E_FAIL;
index f2ba69a541a0c93389862754d1aa2b1b8bb3286b..2d0fd750767f380cf0e55b3ec78b62a1f403363e 100755 (executable)
@@ -261,9 +261,9 @@ class VLCMessages : public IVLCMessages
 public:
 
     VLCMessages(VLCPlugin *p_instance, VLCLog *p_vlclog) :
+        _p_vlclog(p_vlclog),
         _p_instance(p_instance),
-        _p_typeinfo(NULL),
-        _p_vlclog(p_vlclog) {};
+        _p_typeinfo(NULL) {}
     virtual ~VLCMessages();
 
     // IUnknown methods
@@ -316,9 +316,10 @@ public:
     friend class VLCMessageIterator;
 
     VLCLog(VLCPlugin *p_instance) :
+        _p_log(NULL),
         _p_instance(p_instance),
         _p_typeinfo(NULL),
-        _p_log(NULL)
+        _p_vlcmessages(NULL)
     {
         _p_vlcmessages = new VLCMessages(p_instance, this);
     };
@@ -367,11 +368,63 @@ private:
     VLCMessages*    _p_vlcmessages;
 };
  
+class VLCPlaylistItems : public IVLCPlaylistItems
+{
+public:
+    VLCPlaylistItems(VLCPlugin *p_instance) :
+        _p_instance(p_instance), _p_typeinfo(NULL) {};
+    virtual ~VLCPlaylistItems();
+
+    // IUnknown methods
+    STDMETHODIMP QueryInterface(REFIID riid, void **ppv)
+    {
+        if( NULL == ppv )
+          return E_POINTER;
+        if( (IID_IUnknown == riid)
+         || (IID_IDispatch == riid)
+         || (IID_IVLCPlaylistItems == riid) )
+        {
+            AddRef();
+            *ppv = reinterpret_cast<LPVOID>(this);
+            return NOERROR;
+        }
+        // behaves as a standalone object
+        return E_NOINTERFACE;
+    };
+
+    STDMETHODIMP_(ULONG) AddRef(void) { return _p_instance->pUnkOuter->AddRef(); };
+    STDMETHODIMP_(ULONG) Release(void) { return _p_instance->pUnkOuter->Release(); };
+
+    // IDispatch methods
+    STDMETHODIMP GetTypeInfoCount(UINT*);
+    STDMETHODIMP GetTypeInfo(UINT, LCID, LPTYPEINFO*);
+    STDMETHODIMP GetIDsOfNames(REFIID,LPOLESTR*,UINT,LCID,DISPID*);
+    STDMETHODIMP Invoke(DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*);
+
+    // IVLCPlaylistItems methods
+    STDMETHODIMP get_count(long*);
+    STDMETHODIMP clear();
+    STDMETHODIMP remove(long);
+protected:
+    HRESULT loadTypeInfo();
+
+private:
+    VLCPlugin*  _p_instance;
+    ITypeInfo*  _p_typeinfo;
+
+};
 class VLCPlaylist : public IVLCPlaylist
 {
 public:
     VLCPlaylist(VLCPlugin *p_instance) :
-        _p_instance(p_instance), _p_typeinfo(NULL) {};
+        _p_instance(p_instance),
+        _p_typeinfo(NULL),
+        _p_vlcplaylistitems(NULL)
+    {
+        _p_vlcplaylistitems = new VLCPlaylistItems(p_instance);
+    };
     virtual ~VLCPlaylist();
 
     // IUnknown methods
@@ -412,6 +465,7 @@ public:
     STDMETHODIMP prev();
     STDMETHODIMP clear();
     STDMETHODIMP removeItem(long);
+    STDMETHODIMP get_items(IVLCPlaylistItems**);
  
 protected:
     HRESULT loadTypeInfo();
@@ -420,6 +474,7 @@ private:
     VLCPlugin*  _p_instance;
     ITypeInfo*  _p_typeinfo;
 
+    VLCPlaylistItems*    _p_vlcplaylistitems;
 };
  
 class VLCVideo : public IVLCVideo
@@ -460,7 +515,7 @@ public:
     STDMETHODIMP put_fullscreen(VARIANT_BOOL);
     STDMETHODIMP get_width(long*);
     STDMETHODIMP get_height(long*);
-    STDMETHODIMP get_aspectRatio(BSTR);
+    STDMETHODIMP get_aspectRatio(BSTR*);
     STDMETHODIMP put_aspectRatio(BSTR);
     STDMETHODIMP toggleFullscreen();