Commit fc9b8e56 authored by Damien Fouilleul's avatar Damien Fouilleul

- activex: backporting from 0.8.6

parent 344289ce
...@@ -46,6 +46,7 @@ SOURCES_activex = \ ...@@ -46,6 +46,7 @@ SOURCES_activex = \
plugin.h \ plugin.h \
axvlc_idl.c \ axvlc_idl.c \
axvlc_idl.h \ axvlc_idl.h \
guiddef.h \
$(NULL) $(NULL)
DIST_rsrc = \ DIST_rsrc = \
...@@ -137,7 +138,7 @@ endif ...@@ -137,7 +138,7 @@ endif
############################################################################### ###############################################################################
clean-stamp: clean-stamp:
rm -f stamp-pic rm -f stamp-builtin
if BUILD_SHARED if BUILD_SHARED
stamp-builtin: stamp-builtin:
......
...@@ -79,7 +79,6 @@ library AXVLC ...@@ -79,7 +79,6 @@ library AXVLC
uuid(C2FA41D0-B113-476e-AC8C-9BD14999C1C1), uuid(C2FA41D0-B113-476e-AC8C-9BD14999C1C1),
helpstring("VLC Control (deprecated)"), helpstring("VLC Control (deprecated)"),
dual, dual,
hidden,
oleautomation oleautomation
] ]
interface IVLCControl : IDispatch interface IVLCControl : IDispatch
...@@ -165,7 +164,6 @@ library AXVLC ...@@ -165,7 +164,6 @@ library AXVLC
[ [
uuid(DF48072F-5EF8-434e-9B40-E2F3AE759B5F), uuid(DF48072F-5EF8-434e-9B40-E2F3AE759B5F),
helpstring("Event interface for VLC control"), helpstring("Event interface for VLC control"),
hidden
] ]
dispinterface DVLCEvents dispinterface DVLCEvents
{ {
...@@ -183,9 +181,7 @@ library AXVLC ...@@ -183,9 +181,7 @@ library AXVLC
odl, odl,
uuid(9E0BD17B-2D3C-4656-B94D-03084F3FD9D4), uuid(9E0BD17B-2D3C-4656-B94D-03084F3FD9D4),
helpstring("VLC Audio APIs"), helpstring("VLC Audio APIs"),
hidden,
dual, dual,
nonextensible,
oleautomation oleautomation
] ]
interface IVLCAudio : IDispatch interface IVLCAudio : IDispatch
...@@ -208,9 +204,7 @@ library AXVLC ...@@ -208,9 +204,7 @@ library AXVLC
odl, odl,
uuid(49E0DBD1-9440-466C-9C97-95C67190C603), uuid(49E0DBD1-9440-466C-9C97-95C67190C603),
helpstring("VLC Input APIs"), helpstring("VLC Input APIs"),
hidden,
dual, dual,
nonextensible,
oleautomation oleautomation
] ]
interface IVLCInput : IDispatch interface IVLCInput : IDispatch
...@@ -247,9 +241,7 @@ library AXVLC ...@@ -247,9 +241,7 @@ library AXVLC
odl, odl,
uuid(9ED00AFA-7BCD-4FFF-8D48-7DD4DB2C800D), uuid(9ED00AFA-7BCD-4FFF-8D48-7DD4DB2C800D),
helpstring("VLC Log Message"), helpstring("VLC Log Message"),
hidden,
dual, dual,
nonextensible,
oleautomation oleautomation
] ]
interface IVLCMessage: IDispatch interface IVLCMessage: IDispatch
...@@ -277,9 +269,7 @@ library AXVLC ...@@ -277,9 +269,7 @@ library AXVLC
odl, odl,
uuid(15179CD8-CC12-4242-A58E-E412217FF343), uuid(15179CD8-CC12-4242-A58E-E412217FF343),
helpstring("VLC Log iterator"), helpstring("VLC Log iterator"),
hidden,
dual, dual,
nonextensible,
oleautomation oleautomation
] ]
interface IVLCMessageIterator : IDispatch interface IVLCMessageIterator : IDispatch
...@@ -294,10 +284,8 @@ library AXVLC ...@@ -294,10 +284,8 @@ library AXVLC
[ [
odl, odl,
uuid(6C5CE55D-2D6C-4AAD-8299-C62D2371F106), uuid(6C5CE55D-2D6C-4AAD-8299-C62D2371F106),
helpstring("VLC Log APIs"), helpstring("VLC Log Messages Collection."),
hidden,
dual, dual,
nonextensible,
oleautomation oleautomation
] ]
interface IVLCMessages : IDispatch interface IVLCMessages : IDispatch
...@@ -319,9 +307,7 @@ library AXVLC ...@@ -319,9 +307,7 @@ library AXVLC
odl, odl,
uuid(8E3BC3D9-62E9-48FB-8A6D-993F9ABC4A0A), uuid(8E3BC3D9-62E9-48FB-8A6D-993F9ABC4A0A),
helpstring("VLC Log APIs"), helpstring("VLC Log APIs"),
hidden,
dual, dual,
nonextensible,
oleautomation oleautomation
] ]
interface IVLCLog : IDispatch interface IVLCLog : IDispatch
...@@ -335,31 +321,48 @@ library AXVLC ...@@ -335,31 +321,48 @@ library AXVLC
HRESULT verbosity([in] long level); HRESULT verbosity([in] long level);
}; };
[
odl,
uuid(FD37FE32-82BC-4A25-B056-315F4DBB194D),
helpstring("VLC Playlist Items collection"),
dual,
oleautomation
]
interface IVLCPlaylistItems : IDispatch
{
[propget, helpstring("Returns number of items in playlist.")]
HRESULT count([out, retval] long* count);
[helpstring("Remove all items from playlist.")]
HRESULT clear();
[helpstring("remove item from playlist.")]
HRESULT remove([in] long itemId);
};
[ [
odl, odl,
uuid(54613049-40BF-4035-9E70-0A9312C0188D), uuid(54613049-40BF-4035-9E70-0A9312C0188D),
helpstring("VLC Playlist APIs"), helpstring("VLC Playlist APIs"),
hidden,
dual, dual,
nonextensible,
oleautomation oleautomation
] ]
interface IVLCPlaylist : IDispatch interface IVLCPlaylist : IDispatch
{ {
[propget, helpstring("Returns number of items in playlist.")] [hidden, propget, helpstring("Returns number of items in playlist. (deprecated)")]
HRESULT itemCount([out, retval] long* count); HRESULT itemCount([out, retval] long* count);
[propget, helpstring("Returns whether playback displays video.")] [propget, helpstring("Returns whether playback displays video.")]
HRESULT isPlaying([out, retval] VARIANT_BOOL* playing); HRESULT isPlaying([out, retval] VARIANT_BOOL* playing);
[helpstring("Add a playlist item.")] [helpstring("Add a playlist item.")]
HRESULT add([in] BSTR uri, [in, optional] VARIANT name, [in, optional] VARIANT options, [out, retval] long* item); HRESULT add([in] BSTR uri, [in, optional] VARIANT name, [in, optional] VARIANT options, [out, retval] long* itemId);
[helpstring("Play/Resume the playlist.")] [helpstring("Play/Resume the playlist.")]
HRESULT play(); HRESULT play();
[helpstring("Play item in playlist.")] [helpstring("Play item in playlist.")]
HRESULT playItem([in] long item); HRESULT playItem([in] long itemId);
[helpstring("Play/Pause current clip.")] [helpstring("Play/Pause current clip.")]
HRESULT togglePause(); HRESULT togglePause();
...@@ -373,20 +376,21 @@ library AXVLC ...@@ -373,20 +376,21 @@ library AXVLC
[helpstring("Advance to previous item in playlist.")] [helpstring("Advance to previous item in playlist.")]
HRESULT prev(); HRESULT prev();
[helpstring("Remove all items from playlist.")] [hidden, helpstring("Remove all items from playlist. (deprecated)")]
HRESULT clear(); HRESULT clear();
[helpstring("remove item from playlist.")] [hidden, helpstring("Remove item from playlist. (deprecated)")]
HRESULT removeItem([in] long item); HRESULT removeItem([in] long item);
[propget, helpstring("Returns the playlist items collection object.")]
HRESULT items([out, retval] IVLCPlaylistItems** obj);
}; };
[ [
odl, odl,
uuid(0AAEDF0B-D333-4B27-A0C6-BBF31413A42E), uuid(0AAEDF0B-D333-4B27-A0C6-BBF31413A42E),
helpstring("VLC Video APIs"), helpstring("VLC Video APIs"),
hidden,
dual, dual,
nonextensible,
oleautomation oleautomation
] ]
interface IVLCVideo : IDispatch interface IVLCVideo : IDispatch
...@@ -403,7 +407,7 @@ library AXVLC ...@@ -403,7 +407,7 @@ library AXVLC
HRESULT height([out, retval] long* height); HRESULT height([out, retval] long* height);
[propget, helpstring("Returns video aspect ratio.")] [propget, helpstring("Returns video aspect ratio.")]
HRESULT aspectRatio([out, retval] BSTR aspect); HRESULT aspectRatio([out, retval] BSTR* aspect);
[propput, helpstring("Sets video aspect ratio.")] [propput, helpstring("Sets video aspect ratio.")]
HRESULT aspectRatio([in] BSTR aspect); HRESULT aspectRatio([in] BSTR aspect);
...@@ -415,7 +419,6 @@ library AXVLC ...@@ -415,7 +419,6 @@ library AXVLC
odl, odl,
uuid(2D719729-5333-406C-BF12-8DE787FD65E3), uuid(2D719729-5333-406C-BF12-8DE787FD65E3),
helpstring("VLC Control"), helpstring("VLC Control"),
hidden,
dual, dual,
oleautomation oleautomation
] ]
...@@ -496,6 +499,5 @@ library AXVLC ...@@ -496,6 +499,5 @@ library AXVLC
{ {
[default] interface IVLCControl2; [default] interface IVLCControl2;
interface IVLCControl; interface IVLCControl;
[default, source] dispinterface DVLCEvents;
}; };
}; };
No preview for this file type
...@@ -19,6 +19,7 @@ DEFINE_GUID(IID_IVLCMessage, 0x9ed00afa, 0x7bcd, 0x4fff, 0x8d,0x48, 0x7d,0xd4,0x ...@@ -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_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_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_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_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_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); DEFINE_GUID(IID_IVLCControl2, 0x2d719729, 0x5333, 0x406c, 0xbf,0x12, 0x8d,0xe7,0x87,0xfd,0x65,0xe3);
......
...@@ -1757,6 +1757,139 @@ void __RPC_STUB IVLCLog_put_verbosity_Stub( ...@@ -1757,6 +1757,139 @@ void __RPC_STUB IVLCLog_put_verbosity_Stub(
#endif /* __IVLCLog_INTERFACE_DEFINED__ */ #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 * IVLCPlaylist interface
*/ */
...@@ -1777,13 +1910,13 @@ interface IVLCPlaylist : public IDispatch ...@@ -1777,13 +1910,13 @@ interface IVLCPlaylist : public IDispatch
BSTR uri, BSTR uri,
VARIANT name, VARIANT name,
VARIANT options, VARIANT options,
long* item) = 0; long* itemId) = 0;
virtual HRESULT STDMETHODCALLTYPE play( virtual HRESULT STDMETHODCALLTYPE play(
) = 0; ) = 0;
virtual HRESULT STDMETHODCALLTYPE playItem( virtual HRESULT STDMETHODCALLTYPE playItem(
long item) = 0; long itemId) = 0;
virtual HRESULT STDMETHODCALLTYPE togglePause( virtual HRESULT STDMETHODCALLTYPE togglePause(
) = 0; ) = 0;
...@@ -1803,6 +1936,9 @@ interface IVLCPlaylist : public IDispatch ...@@ -1803,6 +1936,9 @@ interface IVLCPlaylist : public IDispatch
virtual HRESULT STDMETHODCALLTYPE removeItem( virtual HRESULT STDMETHODCALLTYPE removeItem(
long item) = 0; long item) = 0;
virtual HRESULT STDMETHODCALLTYPE get_items(
IVLCPlaylistItems** obj) = 0;
}; };
#else #else
typedef struct IVLCPlaylistVtbl { typedef struct IVLCPlaylistVtbl {
...@@ -1864,14 +2000,14 @@ typedef struct IVLCPlaylistVtbl { ...@@ -1864,14 +2000,14 @@ typedef struct IVLCPlaylistVtbl {
BSTR uri, BSTR uri,
VARIANT name, VARIANT name,
VARIANT options, VARIANT options,
long* item); long* itemId);
HRESULT (STDMETHODCALLTYPE *play)( HRESULT (STDMETHODCALLTYPE *play)(
IVLCPlaylist* This); IVLCPlaylist* This);
HRESULT (STDMETHODCALLTYPE *playItem)( HRESULT (STDMETHODCALLTYPE *playItem)(
IVLCPlaylist* This, IVLCPlaylist* This,
long item); long itemId);
HRESULT (STDMETHODCALLTYPE *togglePause)( HRESULT (STDMETHODCALLTYPE *togglePause)(
IVLCPlaylist* This); IVLCPlaylist* This);
...@@ -1892,6 +2028,10 @@ typedef struct IVLCPlaylistVtbl { ...@@ -1892,6 +2028,10 @@ typedef struct IVLCPlaylistVtbl {
IVLCPlaylist* This, IVLCPlaylist* This,
long item); long item);
HRESULT (STDMETHODCALLTYPE *get_items)(
IVLCPlaylist* This,
IVLCPlaylistItems** obj);
END_INTERFACE END_INTERFACE
} IVLCPlaylistVtbl; } IVLCPlaylistVtbl;
interface IVLCPlaylist { interface IVLCPlaylist {
...@@ -1920,6 +2060,7 @@ interface IVLCPlaylist { ...@@ -1920,6 +2060,7 @@ interface IVLCPlaylist {
#define IVLCPlaylist_prev(p) (p)->lpVtbl->prev(p) #define IVLCPlaylist_prev(p) (p)->lpVtbl->prev(p)
#define IVLCPlaylist_clear(p) (p)->lpVtbl->clear(p) #define IVLCPlaylist_clear(p) (p)->lpVtbl->clear(p)
#define IVLCPlaylist_removeItem(p,a) (p)->lpVtbl->removeItem(p,a) #define IVLCPlaylist_removeItem(p,a) (p)->lpVtbl->removeItem(p,a)
#define IVLCPlaylist_get_items(p,a) (p)->lpVtbl->get_items(p,a)
#endif #endif
#endif #endif
...@@ -1945,7 +2086,7 @@ HRESULT CALLBACK IVLCPlaylist_add_Proxy( ...@@ -1945,7 +2086,7 @@ HRESULT CALLBACK IVLCPlaylist_add_Proxy(
BSTR uri, BSTR uri,
VARIANT name, VARIANT name,
VARIANT options, VARIANT options,
long* item); long* itemId);
void __RPC_STUB IVLCPlaylist_add_Stub( void __RPC_STUB IVLCPlaylist_add_Stub(
IRpcStubBuffer* This, IRpcStubBuffer* This,
IRpcChannelBuffer* pRpcChannelBuffer, IRpcChannelBuffer* pRpcChannelBuffer,
...@@ -1960,7 +2101,7 @@ void __RPC_STUB IVLCPlaylist_play_Stub( ...@@ -1960,7 +2101,7 @@ void __RPC_STUB IVLCPlaylist_play_Stub(
DWORD* pdwStubPhase); DWORD* pdwStubPhase);
HRESULT CALLBACK IVLCPlaylist_playItem_Proxy( HRESULT CALLBACK IVLCPlaylist_playItem_Proxy(
IVLCPlaylist* This, IVLCPlaylist* This,
long item); long itemId);
void __RPC_STUB IVLCPlaylist_playItem_Stub( void __RPC_STUB IVLCPlaylist_playItem_Stub(
IRpcStubBuffer* This, IRpcStubBuffer* This,
IRpcChannelBuffer* pRpcChannelBuffer, IRpcChannelBuffer* pRpcChannelBuffer,
...@@ -2009,6 +2150,14 @@ void __RPC_STUB IVLCPlaylist_removeItem_Stub( ...@@ -2009,6 +2150,14 @@ void __RPC_STUB IVLCPlaylist_removeItem_Stub(
IRpcChannelBuffer* pRpcChannelBuffer, IRpcChannelBuffer* pRpcChannelBuffer,
PRPC_MESSAGE pRpcMessage, PRPC_MESSAGE pRpcMessage,
DWORD* pdwStubPhase); 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__ */ #endif /* __IVLCPlaylist_INTERFACE_DEFINED__ */
...@@ -2035,7 +2184,7 @@ interface IVLCVideo : public IDispatch ...@@ -2035,7 +2184,7 @@ interface IVLCVideo : public IDispatch
long* height) = 0; long* height) = 0;
virtual HRESULT STDMETHODCALLTYPE get_aspectRatio( virtual HRESULT STDMETHODCALLTYPE get_aspectRatio(
BSTR aspect) = 0; BSTR* aspect) = 0;
virtual HRESULT STDMETHODCALLTYPE put_aspectRatio( virtual HRESULT STDMETHODCALLTYPE put_aspectRatio(
BSTR aspect) = 0; BSTR aspect) = 0;
...@@ -2109,7 +2258,7 @@ typedef struct IVLCVideoVtbl { ...@@ -2109,7 +2258,7 @@ typedef struct IVLCVideoVtbl {
HRESULT (STDMETHODCALLTYPE *get_aspectRatio)( HRESULT (STDMETHODCALLTYPE *get_aspectRatio)(
IVLCVideo* This, IVLCVideo* This,
BSTR aspect); BSTR* aspect);
HRESULT (STDMETHODCALLTYPE *put_aspectRatio)( HRESULT (STDMETHODCALLTYPE *put_aspectRatio)(
IVLCVideo* This, IVLCVideo* This,
...@@ -2180,7 +2329,7 @@ void __RPC_STUB IVLCVideo_get_height_Stub( ...@@ -2180,7 +2329,7 @@ void __RPC_STUB IVLCVideo_get_height_Stub(
DWORD* pdwStubPhase); DWORD* pdwStubPhase);
HRESULT CALLBACK IVLCVideo_get_aspectRatio_Proxy( HRESULT CALLBACK IVLCVideo_get_aspectRatio_Proxy(
IVLCVideo* This, IVLCVideo* This,
BSTR aspect); BSTR* aspect);
void __RPC_STUB IVLCVideo_get_aspectRatio_Stub( void __RPC_STUB IVLCVideo_get_aspectRatio_Stub(
IRpcStubBuffer* This, IRpcStubBuffer* This,
IRpcChannelBuffer* pRpcChannelBuffer, IRpcChannelBuffer* pRpcChannelBuffer,
......
...@@ -35,7 +35,7 @@ struct VLCEnumConnectionsDereference ...@@ -35,7 +35,7 @@ struct VLCEnumConnectionsDereference
CONNECTDATA operator()(const map<DWORD,LPUNKNOWN>::iterator& i) CONNECTDATA operator()(const map<DWORD,LPUNKNOWN>::iterator& i)
{ {
CONNECTDATA cd; CONNECTDATA cd;
cd.dwCookie = i->first; cd.dwCookie = i->first;
cd.pUnk = i->second; cd.pUnk = i->second;
return cd; return cd;
......
...@@ -42,13 +42,13 @@ extern "C" const IID IID_IObjectSafety; ...@@ -42,13 +42,13 @@ extern "C" const IID IID_IObjectSafety;
struct IObjectSafety : public IUnknown struct IObjectSafety : public IUnknown
{ {
virtual STDMETHODIMP GetInterfaceSafetyOptions( virtual STDMETHODIMP GetInterfaceSafetyOptions(
REFIID riid, REFIID riid,
DWORD __RPC_FAR *pdwSupportedOptions, DWORD __RPC_FAR *pdwSupportedOptions,
DWORD __RPC_FAR *pdwEnabledOptions DWORD __RPC_FAR *pdwEnabledOptions
) = 0; ) = 0;
virtual STDMETHODIMP SetInterfaceSafetyOptions( virtual STDMETHODIMP SetInterfaceSafetyOptions(
REFIID riid, REFIID riid,
DWORD dwSupportedOptions, DWORD dwSupportedOptions,
DWORD dwOptionSetMask DWORD dwOptionSetMask
...@@ -83,19 +83,19 @@ public: ...@@ -83,19 +83,19 @@ public:
STDMETHODIMP_(ULONG) Release(void) { return _p_instance->pUnkOuter->Release(); }; STDMETHODIMP_(ULONG) Release(void) { return _p_instance->pUnkOuter->Release(); };
// IUnknown methods // IUnknown methods
STDMETHODIMP GetInterfaceSafetyOptions( STDMETHODIMP GetInterfaceSafetyOptions(
REFIID riid, REFIID riid,
DWORD *pdwSupportedOptions, DWORD *pdwSupportedOptions,
DWORD *pdwEnabledOptions DWORD *pdwEnabledOptions
); );
STDMETHODIMP SetInterfaceSafetyOptions( STDMETHODIMP SetInterfaceSafetyOptions(
REFIID riid, REFIID riid,
DWORD dwOptionSetMask, DWORD dwOptionSetMask,
DWORD dwEnabledOptions DWORD dwEnabledOptions
); );
private: private:
VLCPlugin *_p_instance; VLCPlugin *_p_instance;
}; };
......
...@@ -35,10 +35,10 @@ public: ...@@ -35,10 +35,10 @@ public:
STDMETHODIMP QueryInterface(REFIID riid, void **ppv) STDMETHODIMP QueryInterface(REFIID riid, void **ppv)
{ {
if( NULL == ppv ) if( NULL == ppv )
return E_POINTER; return E_POINTER;
if( (IID_IUnknown == riid) if( (IID_IUnknown == riid)
|| (IID_IOleWindow == riid) || (IID_IOleWindow == riid)
|| (IID_IOleInPlaceObject == riid) ) || (IID_IOleInPlaceObject == riid) )
{ {
AddRef(); AddRef();
*ppv = reinterpret_cast<LPVOID>(this); *ppv = reinterpret_cast<LPVOID>(this);
...@@ -66,4 +66,3 @@ private: ...@@ -66,4 +66,3 @@ private:
}; };
#endif #endif
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
using namespace std; using namespace std;
VLCOleObject::VLCOleObject(VLCPlugin *p_instance) : VLCOleObject::VLCOleObject(VLCPlugin *p_instance) :
_p_clientsite(NULL), _p_instance(p_instance) _p_clientsite(NULL), _p_instance(p_instance)
{ {
CreateOleAdviseHolder(&_p_advise_holder); CreateOleAdviseHolder(&_p_advise_holder);
}; };
...@@ -242,7 +242,7 @@ STDMETHODIMP VLCOleObject::GetClientSite(LPOLECLIENTSITE *ppClientSite) ...@@ -242,7 +242,7 @@ STDMETHODIMP VLCOleObject::GetClientSite(LPOLECLIENTSITE *ppClientSite)
{ {
if( NULL == ppClientSite ) if( NULL == ppClientSite )
return E_POINTER; return E_POINTER;
if( NULL != _p_clientsite ) if( NULL != _p_clientsite )
_p_clientsite->AddRef(); _p_clientsite->AddRef();
...@@ -295,7 +295,7 @@ STDMETHODIMP VLCOleObject::GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker, LPMO ...@@ -295,7 +295,7 @@ STDMETHODIMP VLCOleObject::GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker, LPMO
{ {
if( NULL != _p_clientsite ) if( NULL != _p_clientsite )
return _p_clientsite->GetMoniker(dwAssign,dwWhichMoniker, ppMoniker); return _p_clientsite->GetMoniker(dwAssign,dwWhichMoniker, ppMoniker);
return E_UNEXPECTED; return E_UNEXPECTED;
}; };
......
...@@ -37,7 +37,7 @@ public: ...@@ -37,7 +37,7 @@ public:
if( NULL == ppv ) if( NULL == ppv )
return E_POINTER; return E_POINTER;
if( (IID_IUnknown == riid) if( (IID_IUnknown == riid)
|| (IID_IOleObject == riid) ) || (IID_IOleObject == riid) )
{ {
AddRef(); AddRef();
*ppv = reinterpret_cast<LPVOID>(this); *ppv = reinterpret_cast<LPVOID>(this);
......
...@@ -243,4 +243,3 @@ STDMETHODIMP VLCPersistPropertyBag::Save(LPPROPERTYBAG pPropBag, BOOL fClearDirt ...@@ -243,4 +243,3 @@ STDMETHODIMP VLCPersistPropertyBag::Save(LPPROPERTYBAG pPropBag, BOOL fClearDirt
return S_OK; return S_OK;
}; };
...@@ -48,9 +48,8 @@ public: ...@@ -48,9 +48,8 @@ public:
AxVLCVariant(VARIANTARG &v) AxVLCVariant(VARIANTARG &v)
{ {
//VariantInit(&_v); VariantInit(&_v);
//VariantCopy(&_v, &v); VariantCopy(&_v, &v);
_v = v;
}; };
AxVLCVariant(VARIANTARG *v) AxVLCVariant(VARIANTARG *v)
...@@ -276,7 +275,7 @@ public: ...@@ -276,7 +275,7 @@ public:
(*p.first).second = val.second; (*p.first).second = val.second;
return S_OK; return S_OK;
}; };
// custom methods // custom methods
HRESULT Load(LPSTREAM pStm) HRESULT Load(LPSTREAM pStm)
...@@ -292,7 +291,7 @@ public: ...@@ -292,7 +291,7 @@ public:
{ {
if( (val->first == L"(Count)") && (VT_I4 == V_VT(val->second.variantArg())) ) 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; delete val;
while( count-- ) while( count-- )
{ {
...@@ -551,7 +550,7 @@ STDMETHODIMP VLCPersistStreamInit::IsDirty(void) ...@@ -551,7 +550,7 @@ STDMETHODIMP VLCPersistStreamInit::IsDirty(void)
STDMETHODIMP VLCPersistStreamInit::GetSizeMax(ULARGE_INTEGER *pcbSize) STDMETHODIMP VLCPersistStreamInit::GetSizeMax(ULARGE_INTEGER *pcbSize)
{ {
pcbSize->HighPart = 0UL; pcbSize->HighPart = 0UL;
pcbSize->LowPart = 4096UL; // just a guess pcbSize->LowPart = 16384UL; // just a guess
return S_OK; return S_OK;
}; };
......
...@@ -69,4 +69,3 @@ private: ...@@ -69,4 +69,3 @@ private:
}; };
#endif #endif
...@@ -98,7 +98,7 @@ VLCPluginClass::VLCPluginClass(LONG *p_class_ref, HINSTANCE hInstance, REFCLSID ...@@ -98,7 +98,7 @@ VLCPluginClass::VLCPluginClass(LONG *p_class_ref, HINSTANCE hInstance, REFCLSID
wClass.hbrBackground = NULL; wClass.hbrBackground = NULL;
wClass.lpszMenuName = NULL; wClass.lpszMenuName = NULL;
wClass.lpszClassName = getInPlaceWndClassName(); wClass.lpszClassName = getInPlaceWndClassName();
_inplace_wndclass_atom = RegisterClass(&wClass); _inplace_wndclass_atom = RegisterClass(&wClass);
} }
else else
...@@ -258,6 +258,7 @@ VLCPlugin::~VLCPlugin() ...@@ -258,6 +258,7 @@ VLCPlugin::~VLCPlugin()
_p_pict->Release(); _p_pict->Release();
SysFreeString(_bstr_mrl); SysFreeString(_bstr_mrl);
SysFreeString(_bstr_baseurl);
_p_class->Release(); _p_class->Release();
}; };
...@@ -434,17 +435,17 @@ HRESULT VLCPlugin::getVLC(libvlc_instance_t** pp_libvlc) ...@@ -434,17 +435,17 @@ HRESULT VLCPlugin::getVLC(libvlc_instance_t** pp_libvlc)
if( RegOpenKeyEx( HKEY_LOCAL_MACHINE, "Software\\VideoLAN\\VLC", if( RegOpenKeyEx( HKEY_LOCAL_MACHINE, "Software\\VideoLAN\\VLC",
0, KEY_READ, &h_key ) == ERROR_SUCCESS ) 0, KEY_READ, &h_key ) == ERROR_SUCCESS )
{ {
if( RegQueryValueEx( h_key, "InstallDir", 0, &i_type, if( RegQueryValueEx( h_key, "InstallDir", 0, &i_type,
(LPBYTE)p_data, &i_data ) == ERROR_SUCCESS ) (LPBYTE)p_data, &i_data ) == ERROR_SUCCESS )
{ {
if( i_type == REG_SZ ) if( i_type == REG_SZ )
{ {
strcat( p_data, "\\plugins" ); strcat( p_data, "\\plugins" );
//ppsz_argv[ppsz_argc++] = "--plugin-path"; ppsz_argv[ppsz_argc++] = "--plugin-path";
//ppsz_argv[ppsz_argc++] = p_data; ppsz_argv[ppsz_argc++] = p_data;
} }
} }
RegCloseKey( h_key ); RegCloseKey( h_key );
} }
char p_path[MAX_PATH+1]; char p_path[MAX_PATH+1];
...@@ -496,7 +497,7 @@ HRESULT VLCPlugin::getVLC(libvlc_instance_t** pp_libvlc) ...@@ -496,7 +497,7 @@ HRESULT VLCPlugin::getVLC(libvlc_instance_t** pp_libvlc)
{ {
libvlc_audio_set_mute(_p_libvlc, TRUE, NULL); libvlc_audio_set_mute(_p_libvlc, TRUE, NULL);
} }
// initial playlist item // initial playlist item
if( SysStringLen(_bstr_mrl) > 0 ) if( SysStringLen(_bstr_mrl) > 0 )
{ {
...@@ -504,24 +505,19 @@ HRESULT VLCPlugin::getVLC(libvlc_instance_t** pp_libvlc) ...@@ -504,24 +505,19 @@ HRESULT VLCPlugin::getVLC(libvlc_instance_t** pp_libvlc)
if( SysStringLen(_bstr_baseurl) > 0 ) 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( NULL != abs_url )
{ {
/* psz_mrl = CStrFromWSTR(CP_UTF8, abs_url, wcslen(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);
}
CoTaskMemFree(abs_url); CoTaskMemFree(abs_url);
} }
else
{
psz_mrl = CStrFromBSTR(CP_UTF8, _bstr_mrl);
}
} }
else else
{ {
...@@ -648,6 +644,14 @@ HRESULT VLCPlugin::onClose(DWORD dwSaveOption) ...@@ -648,6 +644,14 @@ HRESULT VLCPlugin::onClose(DWORD dwSaveOption)
{ {
libvlc_instance_t* p_libvlc = _p_libvlc; 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; _p_libvlc = NULL;
vlcDataObject->onClose(); vlcDataObject->onClose();
...@@ -741,7 +745,7 @@ HRESULT VLCPlugin::onInPlaceDeactivate(void) ...@@ -741,7 +745,7 @@ HRESULT VLCPlugin::onInPlaceDeactivate(void)
DestroyWindow(_inplacewnd); DestroyWindow(_inplacewnd);
_inplacewnd = NULL; _inplacewnd = NULL;
return S_OK; return S_OK;
}; };
...@@ -984,4 +988,3 @@ void VLCPlugin::fireOnStopEvent(void) ...@@ -984,4 +988,3 @@ void VLCPlugin::fireOnStopEvent(void)
DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0}; DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0};
vlcConnectionPointContainer->fireEvent(DISPID_StopEvent, &dispparamsNoArgs); vlcConnectionPointContainer->fireEvent(DISPID_StopEvent, &dispparamsNoArgs);
}; };
...@@ -162,7 +162,7 @@ public: ...@@ -162,7 +162,7 @@ public:
_p_pict->AddRef(); _p_pict->AddRef();
return _p_pict; return _p_pict;
}; };
BOOL hasFocus(void); BOOL hasFocus(void);
void setFocus(BOOL fFocus); void setFocus(BOOL fFocus);
...@@ -268,4 +268,3 @@ private: ...@@ -268,4 +268,3 @@ private:
}; };
#endif #endif
...@@ -57,4 +57,3 @@ STDMETHODIMP VLCProvideClassInfo::GetGUID(DWORD dwGuidKind, GUID *pGUID) ...@@ -57,4 +57,3 @@ STDMETHODIMP VLCProvideClassInfo::GetGUID(DWORD dwGuidKind, GUID *pGUID)
return S_OK; return S_OK;
}; };
...@@ -64,4 +64,3 @@ private: ...@@ -64,4 +64,3 @@ private:
}; };
#endif #endif
...@@ -37,6 +37,7 @@ STDMETHODIMP VLCSupportErrorInfo::InterfaceSupportsErrorInfo(REFIID riid) ...@@ -37,6 +37,7 @@ STDMETHODIMP VLCSupportErrorInfo::InterfaceSupportsErrorInfo(REFIID riid)
|| (riid == IID_IVLCMessageIterator) || (riid == IID_IVLCMessageIterator)
|| (riid == IID_IVLCMessages) || (riid == IID_IVLCMessages)
|| (riid == IID_IVLCPlaylist) || (riid == IID_IVLCPlaylist)
|| (riid == IID_IVLCPlaylistItems)
|| (riid == IID_IVLCVideo) || (riid == IID_IVLCVideo)
|| (riid == IID_IVLCControl2) ) || (riid == IID_IVLCControl2) )
{ {
......
...@@ -22,24 +22,26 @@ ...@@ -22,24 +22,26 @@
#include "utils.h" #include "utils.h"
#include <wchar.h>
#include <wctype.h>
/* /*
** conversion facilities ** conversion facilities
*/ */
using namespace std; using namespace std;
char *CStrFromBSTR(UINT codePage, BSTR bstr) char *CStrFromWSTR(UINT codePage, LPCWSTR wstr, UINT len)
{ {
UINT len = SysStringLen(bstr);
if( len > 0 ) if( len > 0 )
{ {
size_t mblen = WideCharToMultiByte(codePage, size_t mblen = WideCharToMultiByte(codePage,
0, bstr, len, NULL, 0, NULL, NULL); 0, wstr, len, NULL, 0, NULL, NULL);
if( mblen > 0 ) if( mblen > 0 )
{ {
char *buffer = (char *)CoTaskMemAlloc(mblen+1); char *buffer = (char *)CoTaskMemAlloc(mblen+1);
ZeroMemory(buffer, 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'; buffer[mblen] = '\0';
return buffer; return buffer;
...@@ -49,6 +51,11 @@ char *CStrFromBSTR(UINT codePage, BSTR bstr) ...@@ -49,6 +51,11 @@ char *CStrFromBSTR(UINT codePage, BSTR bstr)
return NULL; return NULL;
}; };
char *CStrFromBSTR(UINT codePage, BSTR bstr)
{
return CStrFromWSTR(codePage, bstr, SysStringLen(bstr));
};
BSTR BSTRFromCStr(UINT codePage, LPCSTR s) BSTR BSTRFromCStr(UINT codePage, LPCSTR s)
{ {
int wideLen = MultiByteToWideChar(codePage, 0, s, -1, NULL, 0); int wideLen = MultiByteToWideChar(codePage, 0, s, -1, NULL, 0);
...@@ -61,7 +68,7 @@ BSTR BSTRFromCStr(UINT codePage, LPCSTR s) ...@@ -61,7 +68,7 @@ BSTR BSTRFromCStr(UINT codePage, LPCSTR s)
ZeroMemory(wideStr, wideLen*sizeof(WCHAR)); ZeroMemory(wideStr, wideLen*sizeof(WCHAR));
MultiByteToWideChar(codePage, 0, s, -1, wideStr, wideLen); MultiByteToWideChar(codePage, 0, s, -1, wideStr, wideLen);
bstr = SysAllocStringLen(wideStr, wideLen); bstr = SysAllocStringLen(wideStr, wideLen-1);
CoTaskMemFree(wideStr); CoTaskMemFree(wideStr);
return bstr; return bstr;
...@@ -126,11 +133,11 @@ HRESULT GetObjectProperty(LPUNKNOWN object, DISPID dispID, VARIANT& v) ...@@ -126,11 +133,11 @@ HRESULT GetObjectProperty(LPUNKNOWN object, DISPID dispID, VARIANT& v)
HDC CreateDevDC(DVTARGETDEVICE *ptd) HDC CreateDevDC(DVTARGETDEVICE *ptd)
{ {
HDC hdc=NULL; HDC hdc=NULL;
if( NULL == ptd ) if( NULL == ptd )
{ {
hdc = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL); hdc = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL);
} }
else else
{ {
LPDEVNAMES lpDevNames; LPDEVNAMES lpDevNames;
...@@ -156,7 +163,7 @@ HDC CreateDevDC(DVTARGETDEVICE *ptd) ...@@ -156,7 +163,7 @@ HDC CreateDevDC(DVTARGETDEVICE *ptd)
hdc = CreateDC(lpszDriverName, lpszDeviceName, lpszPortName, lpDevMode); hdc = CreateDC(lpszDriverName, lpszDeviceName, lpszPortName, lpDevMode);
} }
return hdc; return hdc;
}; };
#define HIMETRIC_PER_INCH 2540 #define HIMETRIC_PER_INCH 2540
...@@ -185,3 +192,155 @@ void HimetricFromDP(HDC hdc, LPPOINT pt, int count) ...@@ -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;
}
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include <vector> #include <vector>
// utilities // utilities
extern char *CStrFromWSTR(UINT codePage, LPCWSTR wstr, UINT len);
extern char *CStrFromBSTR(UINT codePage, BSTR bstr); extern char *CStrFromBSTR(UINT codePage, BSTR bstr);
extern BSTR BSTRFromCStr(UINT codePage, LPCSTR s); extern BSTR BSTRFromCStr(UINT codePage, LPCSTR s);
...@@ -41,6 +42,9 @@ extern HDC CreateDevDC(DVTARGETDEVICE *ptd); ...@@ -41,6 +42,9 @@ extern HDC CreateDevDC(DVTARGETDEVICE *ptd);
extern void DPFromHimetric(HDC hdc, LPPOINT pt, int count); extern void DPFromHimetric(HDC hdc, LPPOINT pt, int count);
extern void HimetricFromDP(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 */ /* this function object is used to dereference the iterator into a value */
......
...@@ -132,7 +132,7 @@ STDMETHODIMP VLCControl::play(void) ...@@ -132,7 +132,7 @@ STDMETHODIMP VLCControl::play(void)
} }
return result; return result;
}; };
STDMETHODIMP VLCControl::pause(void) STDMETHODIMP VLCControl::pause(void)
{ {
int i_vlc; int i_vlc;
...@@ -144,7 +144,7 @@ STDMETHODIMP VLCControl::pause(void) ...@@ -144,7 +144,7 @@ STDMETHODIMP VLCControl::pause(void)
} }
return result; return result;
}; };
STDMETHODIMP VLCControl::stop(void) STDMETHODIMP VLCControl::stop(void)
{ {
int i_vlc; int i_vlc;
...@@ -156,7 +156,7 @@ STDMETHODIMP VLCControl::stop(void) ...@@ -156,7 +156,7 @@ STDMETHODIMP VLCControl::stop(void)
} }
return result; return result;
}; };
STDMETHODIMP VLCControl::get_Playing(VARIANT_BOOL *isPlaying) STDMETHODIMP VLCControl::get_Playing(VARIANT_BOOL *isPlaying)
{ {
if( NULL == isPlaying ) if( NULL == isPlaying )
...@@ -176,7 +176,7 @@ STDMETHODIMP VLCControl::get_Playing(VARIANT_BOOL *isPlaying) ...@@ -176,7 +176,7 @@ STDMETHODIMP VLCControl::get_Playing(VARIANT_BOOL *isPlaying)
*isPlaying = VARIANT_FALSE; *isPlaying = VARIANT_FALSE;
return result; return result;
}; };
STDMETHODIMP VLCControl::get_Position(float *position) STDMETHODIMP VLCControl::get_Position(float *position)
{ {
if( NULL == position ) if( NULL == position )
...@@ -196,7 +196,7 @@ STDMETHODIMP VLCControl::get_Position(float *position) ...@@ -196,7 +196,7 @@ STDMETHODIMP VLCControl::get_Position(float *position)
*position = 0.0f; *position = 0.0f;
return result; return result;
}; };
STDMETHODIMP VLCControl::put_Position(float position) STDMETHODIMP VLCControl::put_Position(float position)
{ {
HRESULT result = E_UNEXPECTED; HRESULT result = E_UNEXPECTED;
...@@ -211,7 +211,7 @@ STDMETHODIMP VLCControl::put_Position(float position) ...@@ -211,7 +211,7 @@ STDMETHODIMP VLCControl::put_Position(float position)
} }
return result; return result;
}; };
STDMETHODIMP VLCControl::get_Time(int *seconds) STDMETHODIMP VLCControl::get_Time(int *seconds)
{ {
if( NULL == seconds ) if( NULL == seconds )
...@@ -232,14 +232,14 @@ STDMETHODIMP VLCControl::get_Time(int *seconds) ...@@ -232,14 +232,14 @@ STDMETHODIMP VLCControl::get_Time(int *seconds)
return result; return result;
}; };
STDMETHODIMP VLCControl::put_Time(int seconds) STDMETHODIMP VLCControl::put_Time(int seconds)
{ {
_p_instance->setTime(seconds); _p_instance->setTime(seconds);
return NOERROR; return NOERROR;
}; };
STDMETHODIMP VLCControl::shuttle(int seconds) STDMETHODIMP VLCControl::shuttle(int seconds)
{ {
HRESULT result = E_UNEXPECTED; HRESULT result = E_UNEXPECTED;
...@@ -254,7 +254,7 @@ STDMETHODIMP VLCControl::shuttle(int seconds) ...@@ -254,7 +254,7 @@ STDMETHODIMP VLCControl::shuttle(int seconds)
} }
return result; return result;
}; };
STDMETHODIMP VLCControl::fullscreen(void) STDMETHODIMP VLCControl::fullscreen(void)
{ {
HRESULT result = E_UNEXPECTED; HRESULT result = E_UNEXPECTED;
...@@ -269,7 +269,7 @@ STDMETHODIMP VLCControl::fullscreen(void) ...@@ -269,7 +269,7 @@ STDMETHODIMP VLCControl::fullscreen(void)
} }
return result; return result;
}; };
STDMETHODIMP VLCControl::get_Length(int *seconds) STDMETHODIMP VLCControl::get_Length(int *seconds)
{ {
if( NULL == seconds ) if( NULL == seconds )
...@@ -289,7 +289,7 @@ STDMETHODIMP VLCControl::get_Length(int *seconds) ...@@ -289,7 +289,7 @@ STDMETHODIMP VLCControl::get_Length(int *seconds)
*seconds = 0; *seconds = 0;
return result; return result;
}; };
STDMETHODIMP VLCControl::playFaster(void) STDMETHODIMP VLCControl::playFaster(void)
{ {
HRESULT result = E_UNEXPECTED; HRESULT result = E_UNEXPECTED;
...@@ -304,7 +304,7 @@ STDMETHODIMP VLCControl::playFaster(void) ...@@ -304,7 +304,7 @@ STDMETHODIMP VLCControl::playFaster(void)
} }
return result; return result;
}; };
STDMETHODIMP VLCControl::playSlower(void) STDMETHODIMP VLCControl::playSlower(void)
{ {
HRESULT result = E_UNEXPECTED; HRESULT result = E_UNEXPECTED;
...@@ -319,7 +319,7 @@ STDMETHODIMP VLCControl::playSlower(void) ...@@ -319,7 +319,7 @@ STDMETHODIMP VLCControl::playSlower(void)
} }
return result; return result;
}; };
STDMETHODIMP VLCControl::get_Volume(int *volume) STDMETHODIMP VLCControl::get_Volume(int *volume)
{ {
if( NULL == volume ) if( NULL == volume )
...@@ -328,13 +328,13 @@ STDMETHODIMP VLCControl::get_Volume(int *volume) ...@@ -328,13 +328,13 @@ STDMETHODIMP VLCControl::get_Volume(int *volume)
*volume = _p_instance->getVolume(); *volume = _p_instance->getVolume();
return NOERROR; return NOERROR;
}; };
STDMETHODIMP VLCControl::put_Volume(int volume) STDMETHODIMP VLCControl::put_Volume(int volume)
{ {
_p_instance->setVolume(volume); _p_instance->setVolume(volume);
return NOERROR; return NOERROR;
}; };
STDMETHODIMP VLCControl::toggleMute(void) STDMETHODIMP VLCControl::toggleMute(void)
{ {
int i_vlc; int i_vlc;
...@@ -362,7 +362,7 @@ STDMETHODIMP VLCControl::setVariable(BSTR name, VARIANT value) ...@@ -362,7 +362,7 @@ STDMETHODIMP VLCControl::setVariable(BSTR name, VARIANT value)
int i_type; int i_type;
vlc_value_t val; vlc_value_t val;
if( VLC_SUCCESS == VLC_VariableType(i_vlc, psz_varname, &i_type) ) if( VLC_SUCCESS == VLC_VariableType(i_vlc, psz_varname, &i_type) )
{ {
VARIANT arg; VARIANT arg;
...@@ -771,7 +771,7 @@ STDMETHODIMP VLCControl::addTarget( BSTR uri, VARIANT options, enum VLCPlaylistM ...@@ -771,7 +771,7 @@ STDMETHODIMP VLCControl::addTarget( BSTR uri, VARIANT options, enum VLCPlaylistM
} }
return hr; return hr;
}; };
STDMETHODIMP VLCControl::get_PlaylistIndex(int *index) STDMETHODIMP VLCControl::get_PlaylistIndex(int *index)
{ {
if( NULL == index ) if( NULL == index )
...@@ -787,7 +787,7 @@ STDMETHODIMP VLCControl::get_PlaylistIndex(int *index) ...@@ -787,7 +787,7 @@ STDMETHODIMP VLCControl::get_PlaylistIndex(int *index)
*index = 0; *index = 0;
return result; return result;
}; };
STDMETHODIMP VLCControl::get_PlaylistCount(int *count) STDMETHODIMP VLCControl::get_PlaylistCount(int *count)
{ {
int i_vlc; int i_vlc;
...@@ -800,7 +800,7 @@ STDMETHODIMP VLCControl::get_PlaylistCount(int *count) ...@@ -800,7 +800,7 @@ STDMETHODIMP VLCControl::get_PlaylistCount(int *count)
*count = 0; *count = 0;
return result; return result;
}; };
STDMETHODIMP VLCControl::playlistNext(void) STDMETHODIMP VLCControl::playlistNext(void)
{ {
int i_vlc; int i_vlc;
...@@ -812,7 +812,7 @@ STDMETHODIMP VLCControl::playlistNext(void) ...@@ -812,7 +812,7 @@ STDMETHODIMP VLCControl::playlistNext(void)
} }
return result; return result;
}; };
STDMETHODIMP VLCControl::playlistPrev(void) STDMETHODIMP VLCControl::playlistPrev(void)
{ {
int i_vlc; int i_vlc;
...@@ -824,7 +824,7 @@ STDMETHODIMP VLCControl::playlistPrev(void) ...@@ -824,7 +824,7 @@ STDMETHODIMP VLCControl::playlistPrev(void)
} }
return result; return result;
}; };
STDMETHODIMP VLCControl::playlistClear(void) STDMETHODIMP VLCControl::playlistClear(void)
{ {
int i_vlc; int i_vlc;
...@@ -836,7 +836,7 @@ STDMETHODIMP VLCControl::playlistClear(void) ...@@ -836,7 +836,7 @@ STDMETHODIMP VLCControl::playlistClear(void)
} }
return result; return result;
}; };
STDMETHODIMP VLCControl::get_VersionInfo(BSTR *version) STDMETHODIMP VLCControl::get_VersionInfo(BSTR *version)
{ {
if( NULL == version ) if( NULL == version )
...@@ -852,7 +852,7 @@ STDMETHODIMP VLCControl::get_VersionInfo(BSTR *version) ...@@ -852,7 +852,7 @@ STDMETHODIMP VLCControl::get_VersionInfo(BSTR *version)
*version = NULL; *version = NULL;
return E_FAIL; return E_FAIL;
}; };
STDMETHODIMP VLCControl::get_MRL(BSTR *mrl) STDMETHODIMP VLCControl::get_MRL(BSTR *mrl)
{ {
if( NULL == mrl ) if( NULL == mrl )
...@@ -899,4 +899,3 @@ STDMETHODIMP VLCControl::put_AutoLoop(VARIANT_BOOL autoloop) ...@@ -899,4 +899,3 @@ STDMETHODIMP VLCControl::put_AutoLoop(VARIANT_BOOL autoloop)
_p_instance->setAutoLoop((VARIANT_FALSE != autoloop) ? TRUE: FALSE); _p_instance->setAutoLoop((VARIANT_FALSE != autoloop) ? TRUE: FALSE);
return S_OK; return S_OK;
}; };
...@@ -27,7 +27,6 @@ ...@@ -27,7 +27,6 @@
class VLCControl : public IVLCControl class VLCControl : public IVLCControl
{ {
public: public:
VLCControl(VLCPlugin *p_instance) : _p_instance(p_instance), _p_typeinfo(NULL) {}; VLCControl(VLCPlugin *p_instance) : _p_instance(p_instance), _p_typeinfo(NULL) {};
...@@ -92,7 +91,7 @@ public: ...@@ -92,7 +91,7 @@ public:
STDMETHODIMP put_AutoLoop(VARIANT_BOOL autoloop); STDMETHODIMP put_AutoLoop(VARIANT_BOOL autoloop);
STDMETHODIMP get_AutoPlay(VARIANT_BOOL *autoplay); STDMETHODIMP get_AutoPlay(VARIANT_BOOL *autoplay);
STDMETHODIMP put_AutoPlay(VARIANT_BOOL autoplay); STDMETHODIMP put_AutoPlay(VARIANT_BOOL autoplay);
static HRESULT CreateTargetOptions(int codePage, VARIANT *options, char ***cOptions, int *cOptionCount); static HRESULT CreateTargetOptions(int codePage, VARIANT *options, char ***cOptions, int *cOptionCount);
static void FreeTargetOptions(char **cOptions, int cOptionCount); static void FreeTargetOptions(char **cOptions, int cOptionCount);
...@@ -102,8 +101,6 @@ private: ...@@ -102,8 +101,6 @@ private:
VLCPlugin *_p_instance; VLCPlugin *_p_instance;
ITypeInfo *_p_typeinfo; ITypeInfo *_p_typeinfo;
}; };
#endif
#endif
...@@ -26,6 +26,9 @@ ...@@ -26,6 +26,9 @@
#include "utils.h" #include "utils.h"
#include <shlwapi.h>
#include <wininet.h>
using namespace std; using namespace std;
VLCAudio::~VLCAudio() VLCAudio::~VLCAudio()
...@@ -581,6 +584,7 @@ STDMETHODIMP VLCInput::get_hasVout(VARIANT_BOOL* hasVout) ...@@ -581,6 +584,7 @@ STDMETHODIMP VLCInput::get_hasVout(VARIANT_BOOL* hasVout)
VLCLog::~VLCLog() VLCLog::~VLCLog()
{ {
delete _p_vlcmessages;
if( _p_log ) if( _p_log )
libvlc_log_close(_p_log, NULL); libvlc_log_close(_p_log, NULL);
...@@ -1202,8 +1206,157 @@ STDMETHODIMP VLCMessage::get_message(BSTR* message) ...@@ -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() VLCPlaylist::~VLCPlaylist()
{ {
delete _p_vlcplaylistitems;
if( _p_typeinfo ) if( _p_typeinfo )
_p_typeinfo->Release(); _p_typeinfo->Release();
}; };
...@@ -1344,18 +1497,44 @@ STDMETHODIMP VLCPlaylist::add(BSTR uri, VARIANT name, VARIANT options, long* ite ...@@ -1344,18 +1497,44 @@ STDMETHODIMP VLCPlaylist::add(BSTR uri, VARIANT name, VARIANT options, long* ite
libvlc_exception_t ex; libvlc_exception_t ex;
libvlc_exception_init(&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; int i_options;
char **ppsz_options; char **ppsz_options;
hr = VLCControl::CreateTargetOptions(CP_UTF8, &options, &ppsz_options, &i_options); hr = VLCControl::CreateTargetOptions(CP_UTF8, &options, &ppsz_options, &i_options);
if( FAILED(hr) ) if( FAILED(hr) )
return hr;
char *psz_uri = CStrFromBSTR(CP_UTF8, uri);
if( NULL == psz_uri )
{ {
VLCControl::FreeTargetOptions(ppsz_options, i_options); CoTaskMemFree(psz_uri);
return E_OUTOFMEMORY; return hr;
} }
char *psz_name = NULL; char *psz_name = NULL;
...@@ -1566,6 +1745,20 @@ STDMETHODIMP VLCPlaylist::removeItem(long item) ...@@ -1566,6 +1745,20 @@ STDMETHODIMP VLCPlaylist::removeItem(long item)
return hr; 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() VLCVideo::~VLCVideo()
...@@ -1758,7 +1951,7 @@ STDMETHODIMP VLCVideo::get_height(long* height) ...@@ -1758,7 +1951,7 @@ STDMETHODIMP VLCVideo::get_height(long* height)
return hr; return hr;
}; };
STDMETHODIMP VLCVideo::get_aspectRatio(BSTR aspect) STDMETHODIMP VLCVideo::get_aspectRatio(BSTR* aspect)
{ {
if( NULL == aspect ) if( NULL == aspect )
return E_POINTER; return E_POINTER;
...@@ -1776,17 +1969,17 @@ STDMETHODIMP VLCVideo::get_aspectRatio(BSTR aspect) ...@@ -1776,17 +1969,17 @@ STDMETHODIMP VLCVideo::get_aspectRatio(BSTR aspect)
char *psz_aspect = libvlc_video_get_aspect_ratio(p_input, &ex); char *psz_aspect = libvlc_video_get_aspect_ratio(p_input, &ex);
libvlc_input_free(p_input); libvlc_input_free(p_input);
if( NULL == psz_aspect )
return E_OUTOFMEMORY;
if( ! libvlc_exception_raised(&ex) ) 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 ); free( psz_aspect );
psz_aspect = NULL; psz_aspect = NULL;
return NOERROR; return NOERROR;
} }
if( psz_aspect ) free( psz_aspect ); if( psz_aspect ) free( psz_aspect );
} }
_p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex)); _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex));
libvlc_exception_clear(&ex); libvlc_exception_clear(&ex);
...@@ -1826,7 +2019,7 @@ STDMETHODIMP VLCVideo::put_aspectRatio(BSTR aspect) ...@@ -1826,7 +2019,7 @@ STDMETHODIMP VLCVideo::put_aspectRatio(BSTR aspect)
libvlc_input_free(p_input); libvlc_input_free(p_input);
if( libvlc_exception_raised(&ex) ) if( libvlc_exception_raised(&ex) )
{ {
_p_instance->setErrorInfo(IID_IVLCPlaylist, _p_instance->setErrorInfo(IID_IVLCVideo,
libvlc_exception_get_message(&ex)); libvlc_exception_get_message(&ex));
libvlc_exception_clear(&ex); libvlc_exception_clear(&ex);
return E_FAIL; return E_FAIL;
......
...@@ -261,9 +261,9 @@ class VLCMessages : public IVLCMessages ...@@ -261,9 +261,9 @@ class VLCMessages : public IVLCMessages
public: public:
VLCMessages(VLCPlugin *p_instance, VLCLog *p_vlclog) : VLCMessages(VLCPlugin *p_instance, VLCLog *p_vlclog) :
_p_vlclog(p_vlclog),
_p_instance(p_instance), _p_instance(p_instance),
_p_typeinfo(NULL), _p_typeinfo(NULL) {}
_p_vlclog(p_vlclog) {};
virtual ~VLCMessages(); virtual ~VLCMessages();
// IUnknown methods // IUnknown methods
...@@ -316,9 +316,10 @@ public: ...@@ -316,9 +316,10 @@ public:
friend class VLCMessageIterator; friend class VLCMessageIterator;
VLCLog(VLCPlugin *p_instance) : VLCLog(VLCPlugin *p_instance) :
_p_log(NULL),
_p_instance(p_instance), _p_instance(p_instance),
_p_typeinfo(NULL), _p_typeinfo(NULL),
_p_log(NULL) _p_vlcmessages(NULL)
{ {
_p_vlcmessages = new VLCMessages(p_instance, this); _p_vlcmessages = new VLCMessages(p_instance, this);
}; };
...@@ -367,11 +368,63 @@ private: ...@@ -367,11 +368,63 @@ private:
VLCMessages* _p_vlcmessages; 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 class VLCPlaylist : public IVLCPlaylist
{ {
public: public:
VLCPlaylist(VLCPlugin *p_instance) : 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(); virtual ~VLCPlaylist();
// IUnknown methods // IUnknown methods
...@@ -412,6 +465,7 @@ public: ...@@ -412,6 +465,7 @@ public:
STDMETHODIMP prev(); STDMETHODIMP prev();
STDMETHODIMP clear(); STDMETHODIMP clear();
STDMETHODIMP removeItem(long); STDMETHODIMP removeItem(long);
STDMETHODIMP get_items(IVLCPlaylistItems**);
protected: protected:
HRESULT loadTypeInfo(); HRESULT loadTypeInfo();
...@@ -420,6 +474,7 @@ private: ...@@ -420,6 +474,7 @@ private:
VLCPlugin* _p_instance; VLCPlugin* _p_instance;
ITypeInfo* _p_typeinfo; ITypeInfo* _p_typeinfo;
VLCPlaylistItems* _p_vlcplaylistitems;
}; };
class VLCVideo : public IVLCVideo class VLCVideo : public IVLCVideo
...@@ -460,7 +515,7 @@ public: ...@@ -460,7 +515,7 @@ public:
STDMETHODIMP put_fullscreen(VARIANT_BOOL); STDMETHODIMP put_fullscreen(VARIANT_BOOL);
STDMETHODIMP get_width(long*); STDMETHODIMP get_width(long*);
STDMETHODIMP get_height(long*); STDMETHODIMP get_height(long*);
STDMETHODIMP get_aspectRatio(BSTR); STDMETHODIMP get_aspectRatio(BSTR*);
STDMETHODIMP put_aspectRatio(BSTR); STDMETHODIMP put_aspectRatio(BSTR);
STDMETHODIMP toggleFullscreen(); STDMETHODIMP toggleFullscreen();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment