]> git.sesse.net Git - vlc/commitdiff
Initial version of ActiveX plugin for VLC
authorDamien Fouilleul <damienf@videolan.org>
Wed, 19 Jan 2005 17:14:16 +0000 (17:14 +0000)
committerDamien Fouilleul <damienf@videolan.org>
Wed, 19 Jan 2005 17:14:16 +0000 (17:14 +0000)
40 files changed:
Makefile.am
activex/Makefile.am [new file with mode: 0644]
activex/README.TXT [new file with mode: 0644]
activex/axvlc.def [new file with mode: 0644]
activex/axvlc.idl [new file with mode: 0644]
activex/axvlc.reg [new file with mode: 0644]
activex/axvlc.tlb [new file with mode: 0755]
activex/axvlc_idl.c [new file with mode: 0644]
activex/axvlc_idl.h [new file with mode: 0644]
activex/axvlc_rc.rc [new file with mode: 0644]
activex/connectioncontainer.cpp [new file with mode: 0644]
activex/connectioncontainer.h [new file with mode: 0644]
activex/inplace.bmp [new file with mode: 0755]
activex/main.cpp [new file with mode: 0644]
activex/objectsafety.cpp [new file with mode: 0644]
activex/objectsafety.h [new file with mode: 0644]
activex/olecontrol.cpp [new file with mode: 0644]
activex/olecontrol.h [new file with mode: 0644]
activex/oleinplaceactiveobject.cpp [new file with mode: 0644]
activex/oleinplaceactiveobject.h [new file with mode: 0644]
activex/oleinplaceobject.cpp [new file with mode: 0644]
activex/oleinplaceobject.h [new file with mode: 0644]
activex/oleobject.cpp [new file with mode: 0644]
activex/oleobject.h [new file with mode: 0644]
activex/persistpropbag.cpp [new file with mode: 0644]
activex/persistpropbag.h [new file with mode: 0644]
activex/persiststorage.cpp [new file with mode: 0644]
activex/persiststorage.h [new file with mode: 0644]
activex/persiststreaminit.cpp [new file with mode: 0644]
activex/persiststreaminit.h [new file with mode: 0644]
activex/plugin.cpp [new file with mode: 0644]
activex/plugin.h [new file with mode: 0644]
activex/provideclassinfo.cpp [new file with mode: 0644]
activex/provideclassinfo.h [new file with mode: 0644]
activex/test.html [new file with mode: 0644]
activex/utils.cpp [new file with mode: 0644]
activex/utils.h [new file with mode: 0644]
activex/vlccontrol.cpp [new file with mode: 0644]
activex/vlccontrol.h [new file with mode: 0644]
configure.ac

index c9e0e0b102009e40bc428729ca20c3255e376b1c..ab37f2b4f7e2baf702dc989fe44419e3070e729e 100644 (file)
@@ -11,7 +11,7 @@ NULL =
 #  - modules should come before . because vlc needs the builtins
 #  - . should come before mozilla because the plugin needs libvlc_pic.a
 #  - po should come before . because VLC.app needs the pofiles
-SUBDIRS = intl modules po . mozilla share m4 doc
+SUBDIRS = intl modules po . mozilla activex share m4 doc
 DIST_SUBDIRS = $(SUBDIRS) src debian ipkg lib
 
 EXTRA_DIST = \
diff --git a/activex/Makefile.am b/activex/Makefile.am
new file mode 100644 (file)
index 0000000..2798c65
--- /dev/null
@@ -0,0 +1,117 @@
+###############################################################################
+# Building the Activex plugin
+###############################################################################
+
+noinst_LIBRARIES = $(noinst_LIBRARIES_activex)
+
+MOSTLYCLEANFILES = $(LIBRARIES_activex)
+EXTRA_DIST = $(SOURCES_activex) $(DIST_rsrc) 
+BUILT_SOURCES = $(BUILT_SOURCES_activex)
+
+SOURCES_activex = \
+    main.cpp \
+    utils.cpp \
+    utils.h \
+    olecontrol.cpp \
+    olecontrol.h \
+    oleinplaceactiveobject.cpp \
+    oleinplaceactiveobject.h \
+    oleinplaceobject.cpp \
+    oleinplaceobject.h \
+    oleobject.cpp \
+    oleobject.h \
+    persistpropbag.cpp \
+    persistpropbag.h \
+    persiststorage.cpp \
+    persiststorage.h \
+    persiststreaminit.cpp \
+    persiststreaminit.h \
+    provideclassinfo.cpp \
+    provideclassinfo.h \
+    connectioncontainer.cpp \
+    connectioncontainer.h \
+    objectsafety.cpp \
+    objectsafety.h \
+    vlccontrol.cpp \
+    vlccontrol.h \
+    plugin.cpp \
+    plugin.h \
+    axvlc_idl.c \
+    axvlc_idl.h \
+       $(NULL)
+
+DIST_rsrc = \
+       axvlc_rc.rc \
+       $(NULL)
+
+LIBRARIES_libvlc = $(top_builddir)/lib/libvlc.a
+
+noinst_LIBRARIES_activex = libaxvlc.a
+axvlc_DATA = axvlc$(LIBEXT)
+axvlcdir = $(libdir)
+
+LDFLAGS_activex = `$(VLC_CONFIG) --libs vlc activex builtin`
+
+libaxvlc_a_SOURCES = $(SOURCES_activex) $(SOURCE_dll)
+libaxvlc_a_CFLAGS = `$(VLC_CONFIG) --cflags activex`
+libaxvlc_a_CXXFLAGS = `$(VLC_CONFIG) --cxxflags activex`
+libaxvlc_a_DEPENDENCIES = axvlc.def $(DATA_axvlc_rc)
+
+axvlc$(LIBEXT): $(libaxvlc_a_OBJECTS) \
+                     $(libaxvlc_a_DEPENDENCIES) stamp-pic
+       $(CXXLINK) $(libaxvlc_a_OBJECTS) $(DATA_axvlc_rc) -Wl,--enable-stdcall-fixup axvlc.def \
+         $(LIBRARIES_libvlc) -shared $(LDFLAGS_activex)
+
+
+DATA_axvlc_tlb = $(axvlc_tlb_DATA)
+noinst_axvlc_tlb_DATA = axvlc.tlb
+noinst_axvlc_tlbdir = $(libdir)
+
+if HAS_MIDL_COMPILER
+
+axvlc.tlb axvlc_idl.c axvlc_idl.h: axvlc.idl
+       $(MIDL) -Oicf -error all -env win32 -tlb axvlc.tlb -iid axvlc_idl.c -h axvlc_idl.h axvlc.idl
+
+clean-tlb:
+       -rm axvlc.tlb axvlc_idl.c axvlc_idl.h
+
+else
+
+clean-tlb:
+
+endif
+
+DATA_axvlc_rc = $(noinst_axvlc_rc_DATA)
+noinst_axvlc_rc_DATA = axvlc_rc.$(OBJEXT)
+noinst_axvlc_rcdir = $(libdir)
+axvlc_rc.$(OBJEXT): axvlc_rc.rc inplace.bmp $(axvlc_tlb_DATA)
+       $(WINDRES) -DVERSION=$(VERSION) -DVERSION_NUMBER=`echo $(VERSION).0.0.0 | sed 's/\([0-9]*\)[^.]*\.*\([0-9]*\)[^.]*\.*\([0-9]*\)[^.]*\.*\([0-9]*\).*/\1,\2,\3,\4/'` --include-dir $(srcdir) -i $< -o $@
+
+###############################################################################
+# Stamp rules
+###############################################################################
+
+clean-stamp:
+       rm -f stamp-pic
+
+stamp-pic: FORCE
+       @for dep in "" `$(VLC_CONFIG) --target builtin`; do \
+         if test "$${dep}" -nt "$(LIBRARIES_activex)"; then \
+           rm -f $@; \
+           break; \
+         fi; \
+       done
+       @if test ! -f $@; then printf "" > $@; fi
+
+###############################################################################
+# Clean rules
+###############################################################################
+
+clean-local: clean-stamp clean-tlb
+       -rm axvlc$(LIBEXT)
+
+###############################################################################
+# Force rule
+###############################################################################
+FORCE:
+
diff --git a/activex/README.TXT b/activex/README.TXT
new file mode 100644 (file)
index 0000000..40bd005
--- /dev/null
@@ -0,0 +1,45 @@
+== ACTIVEX Control for VLC ==
+
+The VLC ActiveX Control has been primary designed to work with Internet Explorer.
+however it may also work with Visual Basic and/or .NET
+Please note, that this code does not rely upon MFC/ATL, hence good compatibility
+is not guaranteed
+
+== Compiling ==
+
+In order to script the ActiveX Control on Internet Explorer, a type library is required.
+This type library is usually generated from an IDL file using Microsoft MIDL compiler.
+However, for convenience I have checked in the output of the MIDL compiler in the
+repository so that you will only need the MIDL compiler if you change axvlc.idl.
+the generated files are as follow:
+
+axvlc_idl.c
+axvlc_idl.h
+axvlc.tlb
+
+To use the MIDL compiler on cygwin, you will need to set some environment variables
+before configuring vlc. If you have a copy of 'Microsoft Visual C++ 6.0' installed,
+the following settings are correct:
+
+export PATH=$PATH:"/cygdrive/c/Program Files/Microsoft Visual Studio/COMMON/MSDev98/Bin":"/cygdrive/c/Program Files/Microsoft Visual Studio/VC98/Bin"
+export INCLUDE='C:\Program Files\Microsoft Visual Studio\VC98\Include'
+export MIDL="midl"
+
+if you are cross-compiling on Linux, you may be able to use 'widl' which is part of
+the WINE project (http://www.winehq.com), however I have not tested it.
+
+== Installing ==
+
+The ActiveX control is built as axvlc.dll, which is the only file that needs be
+distributed and it may be installed anywhere on the target machine as long as 
+its path is correct within the registry.
+the necessary registry settings are stored in axvlc.reg
+
+in order to use the plugin, you will need to VLC properly installed on your system
+otherwise make sure that the plugin path is set in the registry as indicated below
+
+[HKEY_LOCAL_MACHINE\Software\VideoLAN\VLC]
+InstallDir="path\\dir\\"
+
+regards,
+    Damien Fouilleul <Damien dot Fouilleul at laposte dot net>
diff --git a/activex/axvlc.def b/activex/axvlc.def
new file mode 100644 (file)
index 0000000..431a9a1
--- /dev/null
@@ -0,0 +1,8 @@
+LIBRARY AXVLC.DLL
+EXPORTS
+    CLSID_VLCPlugin data
+    DllMain DllMain@12
+    DllCanUnloadNow DllCanUnloadNow@0
+    DllGetClassObject DllGetClassObject@12
+    DllRegisterServer DllRegisterServer@0
+    DllUnregisterServer DllUnregisterServer@0
diff --git a/activex/axvlc.idl b/activex/axvlc.idl
new file mode 100644 (file)
index 0000000..727d7af
--- /dev/null
@@ -0,0 +1,145 @@
+/*****************************************************************************\r
+ * axvlc.idl: ActiveX control for VLC\r
+ *****************************************************************************\r
+ * Copyright (C) 2005 VideoLAN\r
+ *\r
+ * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.\r
+ *****************************************************************************/\r
+\r
+[\r
+  uuid(DF2BBE39-40A8-433b-A279-073F48DA94B6),\r
+  version(1.0),\r
+  helpstring("VideoLAN VLC ActiveX Plugin"),\r
+]\r
+library AXVLC\r
+{\r
+    importlib("stdole2.tlb");\r
+\r
+    // Forward declare all types defined in this typelib\r
+    interface IVLCControl;\r
+    dispinterface DVLCEvents;\r
+\r
+    enum VLCPlaylistMode {\r
+        VLCPlayListInsert      =  1,\r
+        VLCPlayListReplace     =  2,\r
+        VLCPlayListAppend      =  4,\r
+        VLCPlayListGo          =  8,\r
+        VLCPlayListCheckInsert = 16\r
+    };\r
+\r
+    // playlist target position\r
+    const int VLCPlayListEnd = -666;\r
+\r
+    [\r
+      odl,\r
+      uuid(C2FA41D0-B113-476e-AC8C-9BD14999C1C1),\r
+      helpstring("VLC Control"),\r
+      dual,\r
+      hidden,\r
+      oleautomation\r
+    ]\r
+    interface IVLCControl : IDispatch {\r
+        [id(0), bindable, defaultbind, propget, helpstring("Specifies current target in playlist")]\r
+        HRESULT Value([out, retval] VARIANT* pvarValue);\r
+        [id(0), bindable, defaultbind, propput, helpstring("Specifies current target in playlist")]\r
+        HRESULT Value([in] VARIANT pvarValue);\r
+        [propget, bindable, helpstring("Shows or hides plugin.")]\r
+        HRESULT Visible([out, retval] VARIANT_BOOL* visible);\r
+        [propput, bindable, helpstring("Shows or hides plugin.")]\r
+        HRESULT Visible([in] VARIANT_BOOL visible);\r
+        [helpstring("Play current target in playlist.")]\r
+        HRESULT play();\r
+        [helpstring("Pause playback.")]\r
+        HRESULT pause();\r
+        [helpstring("Stop playback.")]\r
+        HRESULT stop();\r
+        [propget, helpstring("Specifies whether VLC is playing.")]\r
+        HRESULT Playing([out, retval] VARIANT_BOOL* isPlaying);\r
+        [propput, helpstring("Specifies whether VLC is playing.")]\r
+        HRESULT Playing([in] VARIANT_BOOL isPlaying);\r
+        [propget, helpstring("Specifies playback position within current target in playlist, position is a relative value ranging from 0.0 to 1.0.")]\r
+        HRESULT Position([out, retval] float* position);\r
+        [propput, helpstring("Specifies playback position within current target in playlist, position is a relative value ranging from 0.0 to 1.0.")]\r
+        HRESULT Position([in] float position);\r
+        [propget, helpstring("Specifies playback time relative to the start of current target in playlist.")]\r
+        HRESULT Time([out, retval] int* seconds);\r
+        [propput, helpstring("Specifies playback time relative to the start of current target in playlist.")]\r
+        HRESULT Time([in] int seconds);\r
+        [helpstring("Advance or backtrack playback time, relative to current time.")]\r
+        HRESULT shuttle([in] int seconds);\r
+        [helpstring("Switch between normal and fullscreen video.")]\r
+        HRESULT fullscreen();\r
+        [propget, helpstring("Returns total length in seconds of current target in playlist, may be unknown.")]\r
+        HRESULT Length([out, retval] int* seconds);\r
+        [helpstring("Increases playback speed, one of 1x, 2x, 4x, 8x.")]\r
+        HRESULT playFaster();\r
+        [helpstring("Decreases playback speed, one of 1x, 2x, 4x, 8x.")]\r
+        HRESULT playSlower();\r
+        [propget, helpstring("Specifies playback sound volume, ranges from 0 to 200%.")]\r
+        HRESULT Volume([out, retval] int* volume);\r
+        [propput, helpstring("Specifies playback sound volume, ranges from 0 to 200%.")]\r
+        HRESULT Volume([in] int volume);\r
+        [helpstring("Mute/unmute playback sound volume.")]\r
+        HRESULT toggleMute();\r
+        [helpstring("Add a target to the current playlist.")]\r
+\r
+/*\r
+** use VARIANT rather than a SAFEARRAY as argument type\r
+** for compatibility with some scripting language (JScript)\r
+*/\r
+\r
+        HRESULT addTarget([in] BSTR uri, [in] VARIANT options, [in] enum VLCPlaylistMode mode, [in] int position);\r
+        [propget, helpstring("Returns index of current target in playlist.")]\r
+        HRESULT PlaylistIndex([out, retval] int* index);\r
+        [propget, helpstring("Returns number of items in playlist.")]\r
+        HRESULT PlaylistCount([out, retval] int* index);\r
+        [helpstring("Advance to next item in playlist.")]\r
+        HRESULT playlistNext();\r
+        [helpstring("Advance to previous item in playlist.")]\r
+        HRESULT playlistPrev();\r
+        [helpstring("Remove all items from playlist.")]\r
+        HRESULT playlistClear();\r
+        [propget, helpstring("Returns VLC Version.")]\r
+        HRESULT VersionInfo([out, retval] BSTR* version);\r
+    };\r
+\r
+    [\r
+      uuid(DF48072F-5EF8-434e-9B40-E2F3AE759B5F),\r
+      helpstring("Event interface for VLC control"),\r
+      hidden\r
+    ]\r
+    dispinterface DVLCEvents {\r
+        properties:\r
+        methods:\r
+            [id(1), helpstring("Playback in progress")]\r
+            void OnPlay();\r
+            [id(2), helpstring("Playback has paused")]\r
+            void OnPause();\r
+            [id(3), helpstring("Playback has stopped")]\r
+            void OnStop();\r
+    };\r
+\r
+    [\r
+      uuid(E23FE9C6-778E-49D4-B537-38FCDE4887D8),\r
+      helpstring("VLC control"),\r
+      control\r
+    ]\r
+    coclass VLCPlugin {\r
+        [default] interface IVLCControl;\r
+        [default, source] dispinterface DVLCEvents;\r
+    };\r
+};\r
diff --git a/activex/axvlc.reg b/activex/axvlc.reg
new file mode 100644 (file)
index 0000000..5f9ba97
--- /dev/null
@@ -0,0 +1,62 @@
+REGEDIT4\r
+\r
+[HKEY_CLASSES_ROOT\VideoLAN.VLCPlugin]\r
+@="VideoLAN VLC ActiveX Plugin"\r
+\r
+[HKEY_CLASSES_ROOT\VideoLAN.VLCPlugin\CLSID]\r
+@="{E23FE9C6-778E-49d4-B537-38FCDE4887D8}"\r
+\r
+[HKEY_CLASSES_ROOT\VideoLAN.VLCPlugin.1]\r
+@="VideoLAN VLC ActiveX Plugin"\r
+\r
+[HKEY_CLASSES_ROOT\VideoLAN.VLCPlugin.1\CLSID]\r
+@="{E23FE9C6-778E-49d4-B537-38FCDE4887D8}"\r
+\r
+[HKEY_CLASSES_ROOT\AppID\{E23FE9C6-778E-49d4-B537-38FCDE4887D8}]\r
+@="VideoLAN VLC ActiveX Plugin"\r
+\r
+[HKEY_CLASSES_ROOT\CLSID\{E23FE9C6-778E-49d4-B537-38FCDE4887D8}]\r
+@="VideoLAN VLC ActiveX Plugin"\r
+"AppID"="{E23FE9C6-778E-49d4-B537-38FCDE4887D8}"\r
+\r
+[HKEY_CLASSES_ROOT\CLSID\{E23FE9C6-778E-49d4-B537-38FCDE4887D8}\ProgID]\r
+@="VideoLAN.VLCPlugin.1"\r
+\r
+[HKEY_CLASSES_ROOT\CLSID\{E23FE9C6-778E-49d4-B537-38FCDE4887D8}\VersionIndependentProgID]\r
+@="VideoLAN.VLCPlugin"\r
+\r
+[HKEY_CLASSES_ROOT\CLSID\{E23FE9C6-778E-49d4-B537-38FCDE4887D8}\InprocServer32]\r
+@="axvlc.dll"\r
+"ThreadingModel"="Both"\r
+\r
+[HKEY_CLASSES_ROOT\CLSID\{E23FE9C6-778E-49d4-B537-38FCDE4887D8}\Implemented Categories\{40FC6ED4-2438-11CF-A3DB-080036F12502}]\r
+[HKEY_CLASSES_ROOT\CLSID\{E23FE9C6-778E-49d4-B537-38FCDE4887D8}\Implemented Categories\{40FC6ED5-2438-11CF-A3DB-080036F12502}]\r
+[HKEY_CLASSES_ROOT\CLSID\{E23FE9C6-778E-49d4-B537-38FCDE4887D8}\Implemented Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4}]\r
+[HKEY_CLASSES_ROOT\CLSID\{E23FE9C6-778E-49d4-B537-38FCDE4887D8}\Implemented Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}]\r
+\r
+[HKEY_CLASSES_ROOT\CLSID\{E23FE9C6-778E-49d4-B537-38FCDE4887D8}\Version]\r
+@="1.0"\r
+\r
+[HKEY_CLASSES_ROOT\CLSID\{E23FE9C6-778E-49d4-B537-38FCDE4887D8}\Control]\r
+@=""\r
+\r
+[HKEY_CLASSES_ROOT\CLSID\{E23FE9C6-778E-49d4-B537-38FCDE4887D8}\Insertable]\r
+@=""\r
+\r
+[HKEY_CLASSES_ROOT\CLSID\{E23FE9C6-778E-49d4-B537-38FCDE4887D8}\MiscStatus]\r
+@="0"\r
+\r
+[HKEY_CLASSES_ROOT\CLSID\{E23FE9C6-778E-49d4-B537-38FCDE4887D8}\MiscStatus\1]\r
+@="131473"\r
+\r
+[HKEY_CLASSES_ROOT\CLSID\{E23FE9C6-778E-49d4-B537-38FCDE4887D8}\TypeLib]\r
+@="{DF2BBE39-40A8-433b-A279-073F48DA94B6}"\r
+\r
+[HKEY_CLASSES_ROOT\TypeLib\{DF2BBE39-40A8-433b-A279-073F48DA94B6}\1.0]\r
+@="VideoLAN VLC ActiveX Plugin"\r
+\r
+[HKEY_CLASSES_ROOT\TypeLib\{DF2BBE39-40A8-433b-A279-073F48DA94B6}\1.0\0\win32]\r
+@="axvlc.dll"\r
+\r
+[HKEY_CLASSES_ROOT\TypeLib\{DF2BBE39-40A8-433b-A279-073F48DA94B6}\1.0\FLAGS]\r
+@="2"\r
diff --git a/activex/axvlc.tlb b/activex/axvlc.tlb
new file mode 100755 (executable)
index 0000000..3868b78
Binary files /dev/null and b/activex/axvlc.tlb differ
diff --git a/activex/axvlc_idl.c b/activex/axvlc_idl.c
new file mode 100644 (file)
index 0000000..1d96f93
--- /dev/null
@@ -0,0 +1,61 @@
+/*****************************************************************************\r
+ * axvlc_idl.c: ActiveX control for VLC\r
+ *****************************************************************************\r
+ * Copyright (C) 2005 VideoLAN\r
+ *\r
+ * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.\r
+ *****************************************************************************/\r
+\r
+#ifdef __cplusplus\r
+extern "C"{\r
+#endif \r
+\r
+\r
+#ifndef __IID_DEFINED__\r
+#define __IID_DEFINED__\r
+\r
+typedef struct _IID\r
+{\r
+    unsigned long x;\r
+    unsigned short s1;\r
+    unsigned short s2;\r
+    unsigned char  c[8];\r
+} IID;\r
+\r
+#endif // __IID_DEFINED__\r
+\r
+#ifndef CLSID_DEFINED\r
+#define CLSID_DEFINED\r
+typedef IID CLSID;\r
+#endif // CLSID_DEFINED\r
+\r
+const IID LIBID_AXVLC = {0xDF2BBE39,0x40A8,0x433b,{0xA2,0x79,0x07,0x3F,0x48,0xDA,0x94,0xB6}};\r
+\r
+\r
+const IID IID_IVLCControl = {0xC2FA41D0,0xB113,0x476e,{0xAC,0x8C,0x9B,0xD1,0x49,0x99,0xC1,0xC1}};\r
+\r
+\r
+const IID DIID_DVLCEvents = {0xDF48072F,0x5EF8,0x434e,{0x9B,0x40,0xE2,0xF3,0xAE,0x75,0x9B,0x5F}};\r
+\r
+\r
+const CLSID CLSID_VLCPlugin = {0xE23FE9C6,0x778E,0x49D4,{0xB5,0x37,0x38,0xFC,0xDE,0x48,0x87,0xD8}};\r
+\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
diff --git a/activex/axvlc_idl.h b/activex/axvlc_idl.h
new file mode 100644 (file)
index 0000000..b201f71
--- /dev/null
@@ -0,0 +1,917 @@
+/*****************************************************************************\r
+ * axvlc_idl.h: ActiveX control for VLC\r
+ *****************************************************************************\r
+ * Copyright (C) 2005 VideoLAN\r
+ *\r
+ * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.\r
+ *****************************************************************************/\r
+\r
+/* verify that the <rpcndr.h> version is high enough to compile this file*/\r
+#ifndef __REQUIRED_RPCNDR_H_VERSION__\r
+#define __REQUIRED_RPCNDR_H_VERSION__ 440\r
+#endif\r
+\r
+#include "rpc.h"\r
+#include "rpcndr.h"\r
+\r
+#ifndef __axvlc_idl_h__\r
+#define __axvlc_idl_h__\r
+\r
+#ifdef __cplusplus\r
+extern "C"{\r
+#endif \r
+\r
+/* Forward Declarations */ \r
+\r
+#ifndef __IVLCControl_FWD_DEFINED__\r
+#define __IVLCControl_FWD_DEFINED__\r
+typedef interface IVLCControl IVLCControl;\r
+#endif         /* __IVLCControl_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __DVLCEvents_FWD_DEFINED__\r
+#define __DVLCEvents_FWD_DEFINED__\r
+typedef interface DVLCEvents DVLCEvents;\r
+#endif         /* __DVLCEvents_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __VLCPlugin_FWD_DEFINED__\r
+#define __VLCPlugin_FWD_DEFINED__\r
+\r
+#ifdef __cplusplus\r
+typedef class VLCPlugin VLCPlugin;\r
+#else\r
+typedef struct VLCPlugin VLCPlugin;\r
+#endif /* __cplusplus */\r
+\r
+#endif         /* __VLCPlugin_FWD_DEFINED__ */\r
+\r
+\r
+void __RPC_FAR * __RPC_USER MIDL_user_allocate(size_t);\r
+void __RPC_USER MIDL_user_free( void __RPC_FAR * ); \r
+\r
+\r
+#ifndef __AXVLC_LIBRARY_DEFINED__\r
+#define __AXVLC_LIBRARY_DEFINED__\r
+\r
+/* library AXVLC */\r
+/* [helpstring][version][uuid] */ \r
+\r
+\r
+\r
+\r
+enum VLCPlaylistMode\r
+    {  VLCPlayListInsert       = 1,\r
+       VLCPlayListReplace      = 2,\r
+       VLCPlayListAppend       = 4,\r
+       VLCPlayListGo   = 8,\r
+       VLCPlayListCheckInsert  = 16\r
+    };\r
+#define        VLCPlayListEnd  ( -666 )\r
+\r
+\r
+EXTERN_C const IID LIBID_AXVLC;\r
+\r
+#ifndef __IVLCControl_INTERFACE_DEFINED__\r
+#define __IVLCControl_INTERFACE_DEFINED__\r
+\r
+/* interface IVLCControl */\r
+/* [object][oleautomation][hidden][dual][helpstring][uuid] */ \r
+\r
+\r
+EXTERN_C const IID IID_IVLCControl;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+    \r
+    MIDL_INTERFACE("C2FA41D0-B113-476e-AC8C-9BD14999C1C1")\r
+    IVLCControl : public IDispatch\r
+    {\r
+    public:\r
+        virtual /* [helpstring][propget][defaultbind][bindable][id] */ HRESULT STDMETHODCALLTYPE get_Value( \r
+            /* [retval][out] */ VARIANT __RPC_FAR *pvarValue) = 0;\r
+        \r
+        virtual /* [helpstring][propput][defaultbind][bindable][id] */ HRESULT STDMETHODCALLTYPE put_Value( \r
+            /* [in] */ VARIANT pvarValue) = 0;\r
+        \r
+        virtual /* [helpstring][bindable][propget] */ HRESULT STDMETHODCALLTYPE get_Visible( \r
+            /* [retval][out] */ VARIANT_BOOL __RPC_FAR *visible) = 0;\r
+        \r
+        virtual /* [helpstring][bindable][propput] */ HRESULT STDMETHODCALLTYPE put_Visible( \r
+            /* [in] */ VARIANT_BOOL visible) = 0;\r
+        \r
+        virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE play( void) = 0;\r
+        \r
+        virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE pause( void) = 0;\r
+        \r
+        virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE stop( void) = 0;\r
+        \r
+        virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Playing( \r
+            /* [retval][out] */ VARIANT_BOOL __RPC_FAR *isPlaying) = 0;\r
+        \r
+        virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_Playing( \r
+            /* [in] */ VARIANT_BOOL isPlaying) = 0;\r
+        \r
+        virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Position( \r
+            /* [retval][out] */ float __RPC_FAR *position) = 0;\r
+        \r
+        virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_Position( \r
+            /* [in] */ float position) = 0;\r
+        \r
+        virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Time( \r
+            /* [retval][out] */ int __RPC_FAR *seconds) = 0;\r
+        \r
+        virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_Time( \r
+            /* [in] */ int seconds) = 0;\r
+        \r
+        virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE shuttle( \r
+            /* [in] */ int seconds) = 0;\r
+        \r
+        virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE fullscreen( void) = 0;\r
+        \r
+        virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Length( \r
+            /* [retval][out] */ int __RPC_FAR *seconds) = 0;\r
+        \r
+        virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE playFaster( void) = 0;\r
+        \r
+        virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE playSlower( void) = 0;\r
+        \r
+        virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Volume( \r
+            /* [retval][out] */ int __RPC_FAR *volume) = 0;\r
+        \r
+        virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_Volume( \r
+            /* [in] */ int volume) = 0;\r
+        \r
+        virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE toggleMute( void) = 0;\r
+        \r
+        virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE addTarget( \r
+            /* [in] */ BSTR uri,\r
+            /* [in] */ VARIANT options,\r
+            /* [in] */ enum VLCPlaylistMode mode,\r
+            /* [in] */ int position) = 0;\r
+        \r
+        virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_PlaylistIndex( \r
+            /* [retval][out] */ int __RPC_FAR *index) = 0;\r
+        \r
+        virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_PlaylistCount( \r
+            /* [retval][out] */ int __RPC_FAR *index) = 0;\r
+        \r
+        virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE playlistNext( void) = 0;\r
+        \r
+        virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE playlistPrev( void) = 0;\r
+        \r
+        virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE playlistClear( void) = 0;\r
+        \r
+        virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_VersionInfo( \r
+            /* [retval][out] */ BSTR __RPC_FAR *version) = 0;\r
+        \r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct IVLCControlVtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( \r
+            IVLCControl __RPC_FAR * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( \r
+            IVLCControl __RPC_FAR * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( \r
+            IVLCControl __RPC_FAR * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfoCount )( \r
+            IVLCControl __RPC_FAR * This,\r
+            /* [out] */ UINT __RPC_FAR *pctinfo);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfo )( \r
+            IVLCControl __RPC_FAR * This,\r
+            /* [in] */ UINT iTInfo,\r
+            /* [in] */ LCID lcid,\r
+            /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetIDsOfNames )( \r
+            IVLCControl __RPC_FAR * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames,\r
+            /* [in] */ UINT cNames,\r
+            /* [in] */ LCID lcid,\r
+            /* [size_is][out] */ DISPID __RPC_FAR *rgDispId);\r
+        \r
+        /* [local] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Invoke )( \r
+            IVLCControl __RPC_FAR * This,\r
+            /* [in] */ DISPID dispIdMember,\r
+            /* [in] */ REFIID riid,\r
+            /* [in] */ LCID lcid,\r
+            /* [in] */ WORD wFlags,\r
+            /* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams,\r
+            /* [out] */ VARIANT __RPC_FAR *pVarResult,\r
+            /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo,\r
+            /* [out] */ UINT __RPC_FAR *puArgErr);\r
+        \r
+        /* [helpstring][propget][defaultbind][bindable][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Value )( \r
+            IVLCControl __RPC_FAR * This,\r
+            /* [retval][out] */ VARIANT __RPC_FAR *pvarValue);\r
+        \r
+        /* [helpstring][propput][defaultbind][bindable][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *put_Value )( \r
+            IVLCControl __RPC_FAR * This,\r
+            /* [in] */ VARIANT pvarValue);\r
+        \r
+        /* [helpstring][bindable][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Visible )( \r
+            IVLCControl __RPC_FAR * This,\r
+            /* [retval][out] */ VARIANT_BOOL __RPC_FAR *visible);\r
+        \r
+        /* [helpstring][bindable][propput] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *put_Visible )( \r
+            IVLCControl __RPC_FAR * This,\r
+            /* [in] */ VARIANT_BOOL visible);\r
+        \r
+        /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *play )( \r
+            IVLCControl __RPC_FAR * This);\r
+        \r
+        /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *pause )( \r
+            IVLCControl __RPC_FAR * This);\r
+        \r
+        /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *stop )( \r
+            IVLCControl __RPC_FAR * This);\r
+        \r
+        /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Playing )( \r
+            IVLCControl __RPC_FAR * This,\r
+            /* [retval][out] */ VARIANT_BOOL __RPC_FAR *isPlaying);\r
+        \r
+        /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *put_Playing )( \r
+            IVLCControl __RPC_FAR * This,\r
+            /* [in] */ VARIANT_BOOL isPlaying);\r
+        \r
+        /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Position )( \r
+            IVLCControl __RPC_FAR * This,\r
+            /* [retval][out] */ float __RPC_FAR *position);\r
+        \r
+        /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *put_Position )( \r
+            IVLCControl __RPC_FAR * This,\r
+            /* [in] */ float position);\r
+        \r
+        /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Time )( \r
+            IVLCControl __RPC_FAR * This,\r
+            /* [retval][out] */ int __RPC_FAR *seconds);\r
+        \r
+        /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *put_Time )( \r
+            IVLCControl __RPC_FAR * This,\r
+            /* [in] */ int seconds);\r
+        \r
+        /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *shuttle )( \r
+            IVLCControl __RPC_FAR * This,\r
+            /* [in] */ int seconds);\r
+        \r
+        /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *fullscreen )( \r
+            IVLCControl __RPC_FAR * This);\r
+        \r
+        /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Length )( \r
+            IVLCControl __RPC_FAR * This,\r
+            /* [retval][out] */ int __RPC_FAR *seconds);\r
+        \r
+        /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *playFaster )( \r
+            IVLCControl __RPC_FAR * This);\r
+        \r
+        /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *playSlower )( \r
+            IVLCControl __RPC_FAR * This);\r
+        \r
+        /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_Volume )( \r
+            IVLCControl __RPC_FAR * This,\r
+            /* [retval][out] */ int __RPC_FAR *volume);\r
+        \r
+        /* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *put_Volume )( \r
+            IVLCControl __RPC_FAR * This,\r
+            /* [in] */ int volume);\r
+        \r
+        /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *toggleMute )( \r
+            IVLCControl __RPC_FAR * This);\r
+        \r
+        /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *addTarget )( \r
+            IVLCControl __RPC_FAR * This,\r
+            /* [in] */ BSTR uri,\r
+            /* [in] */ VARIANT options,\r
+            /* [in] */ enum VLCPlaylistMode mode,\r
+            /* [in] */ int position);\r
+        \r
+        /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_PlaylistIndex )( \r
+            IVLCControl __RPC_FAR * This,\r
+            /* [retval][out] */ int __RPC_FAR *index);\r
+        \r
+        /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_PlaylistCount )( \r
+            IVLCControl __RPC_FAR * This,\r
+            /* [retval][out] */ int __RPC_FAR *index);\r
+        \r
+        /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *playlistNext )( \r
+            IVLCControl __RPC_FAR * This);\r
+        \r
+        /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *playlistPrev )( \r
+            IVLCControl __RPC_FAR * This);\r
+        \r
+        /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *playlistClear )( \r
+            IVLCControl __RPC_FAR * This);\r
+        \r
+        /* [helpstring][propget] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *get_VersionInfo )( \r
+            IVLCControl __RPC_FAR * This,\r
+            /* [retval][out] */ BSTR __RPC_FAR *version);\r
+        \r
+        END_INTERFACE\r
+    } IVLCControlVtbl;\r
+\r
+    interface IVLCControl\r
+    {\r
+        CONST_VTBL struct IVLCControlVtbl __RPC_FAR *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define IVLCControl_QueryInterface(This,riid,ppvObject)        \\r
+    (This)->lpVtbl -> QueryInterface(This,riid,ppvObject)\r
+\r
+#define IVLCControl_AddRef(This)       \\r
+    (This)->lpVtbl -> AddRef(This)\r
+\r
+#define IVLCControl_Release(This)      \\r
+    (This)->lpVtbl -> Release(This)\r
+\r
+\r
+#define IVLCControl_GetTypeInfoCount(This,pctinfo)     \\r
+    (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo)\r
+\r
+#define IVLCControl_GetTypeInfo(This,iTInfo,lcid,ppTInfo)      \\r
+    (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo)\r
+\r
+#define IVLCControl_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)    \\r
+    (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\r
+\r
+#define IVLCControl_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)      \\r
+    (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\r
+\r
+\r
+#define IVLCControl_get_Value(This,pvarValue)  \\r
+    (This)->lpVtbl -> get_Value(This,pvarValue)\r
+\r
+#define IVLCControl_put_Value(This,pvarValue)  \\r
+    (This)->lpVtbl -> put_Value(This,pvarValue)\r
+\r
+#define IVLCControl_get_Visible(This,visible)  \\r
+    (This)->lpVtbl -> get_Visible(This,visible)\r
+\r
+#define IVLCControl_put_Visible(This,visible)  \\r
+    (This)->lpVtbl -> put_Visible(This,visible)\r
+\r
+#define IVLCControl_play(This) \\r
+    (This)->lpVtbl -> play(This)\r
+\r
+#define IVLCControl_pause(This)        \\r
+    (This)->lpVtbl -> pause(This)\r
+\r
+#define IVLCControl_stop(This) \\r
+    (This)->lpVtbl -> stop(This)\r
+\r
+#define IVLCControl_get_Playing(This,isPlaying)        \\r
+    (This)->lpVtbl -> get_Playing(This,isPlaying)\r
+\r
+#define IVLCControl_put_Playing(This,isPlaying)        \\r
+    (This)->lpVtbl -> put_Playing(This,isPlaying)\r
+\r
+#define IVLCControl_get_Position(This,position)        \\r
+    (This)->lpVtbl -> get_Position(This,position)\r
+\r
+#define IVLCControl_put_Position(This,position)        \\r
+    (This)->lpVtbl -> put_Position(This,position)\r
+\r
+#define IVLCControl_get_Time(This,seconds)     \\r
+    (This)->lpVtbl -> get_Time(This,seconds)\r
+\r
+#define IVLCControl_put_Time(This,seconds)     \\r
+    (This)->lpVtbl -> put_Time(This,seconds)\r
+\r
+#define IVLCControl_shuttle(This,seconds)      \\r
+    (This)->lpVtbl -> shuttle(This,seconds)\r
+\r
+#define IVLCControl_fullscreen(This)   \\r
+    (This)->lpVtbl -> fullscreen(This)\r
+\r
+#define IVLCControl_get_Length(This,seconds)   \\r
+    (This)->lpVtbl -> get_Length(This,seconds)\r
+\r
+#define IVLCControl_playFaster(This)   \\r
+    (This)->lpVtbl -> playFaster(This)\r
+\r
+#define IVLCControl_playSlower(This)   \\r
+    (This)->lpVtbl -> playSlower(This)\r
+\r
+#define IVLCControl_get_Volume(This,volume)    \\r
+    (This)->lpVtbl -> get_Volume(This,volume)\r
+\r
+#define IVLCControl_put_Volume(This,volume)    \\r
+    (This)->lpVtbl -> put_Volume(This,volume)\r
+\r
+#define IVLCControl_toggleMute(This)   \\r
+    (This)->lpVtbl -> toggleMute(This)\r
+\r
+#define IVLCControl_addTarget(This,uri,options,mode,position)  \\r
+    (This)->lpVtbl -> addTarget(This,uri,options,mode,position)\r
+\r
+#define IVLCControl_get_PlaylistIndex(This,index)      \\r
+    (This)->lpVtbl -> get_PlaylistIndex(This,index)\r
+\r
+#define IVLCControl_get_PlaylistCount(This,index)      \\r
+    (This)->lpVtbl -> get_PlaylistCount(This,index)\r
+\r
+#define IVLCControl_playlistNext(This) \\r
+    (This)->lpVtbl -> playlistNext(This)\r
+\r
+#define IVLCControl_playlistPrev(This) \\r
+    (This)->lpVtbl -> playlistPrev(This)\r
+\r
+#define IVLCControl_playlistClear(This)        \\r
+    (This)->lpVtbl -> playlistClear(This)\r
+\r
+#define IVLCControl_get_VersionInfo(This,version)      \\r
+    (This)->lpVtbl -> get_VersionInfo(This,version)\r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+\r
+/* [helpstring][propget][defaultbind][bindable][id] */ HRESULT STDMETHODCALLTYPE IVLCControl_get_Value_Proxy( \r
+    IVLCControl __RPC_FAR * This,\r
+    /* [retval][out] */ VARIANT __RPC_FAR *pvarValue);\r
+\r
+\r
+void __RPC_STUB IVLCControl_get_Value_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propput][defaultbind][bindable][id] */ HRESULT STDMETHODCALLTYPE IVLCControl_put_Value_Proxy( \r
+    IVLCControl __RPC_FAR * This,\r
+    /* [in] */ VARIANT pvarValue);\r
+\r
+\r
+void __RPC_STUB IVLCControl_put_Value_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][bindable][propget] */ HRESULT STDMETHODCALLTYPE IVLCControl_get_Visible_Proxy( \r
+    IVLCControl __RPC_FAR * This,\r
+    /* [retval][out] */ VARIANT_BOOL __RPC_FAR *visible);\r
+\r
+\r
+void __RPC_STUB IVLCControl_get_Visible_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][bindable][propput] */ HRESULT STDMETHODCALLTYPE IVLCControl_put_Visible_Proxy( \r
+    IVLCControl __RPC_FAR * This,\r
+    /* [in] */ VARIANT_BOOL visible);\r
+\r
+\r
+void __RPC_STUB IVLCControl_put_Visible_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring] */ HRESULT STDMETHODCALLTYPE IVLCControl_play_Proxy( \r
+    IVLCControl __RPC_FAR * This);\r
+\r
+\r
+void __RPC_STUB IVLCControl_play_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring] */ HRESULT STDMETHODCALLTYPE IVLCControl_pause_Proxy( \r
+    IVLCControl __RPC_FAR * This);\r
+\r
+\r
+void __RPC_STUB IVLCControl_pause_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring] */ HRESULT STDMETHODCALLTYPE IVLCControl_stop_Proxy( \r
+    IVLCControl __RPC_FAR * This);\r
+\r
+\r
+void __RPC_STUB IVLCControl_stop_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE IVLCControl_get_Playing_Proxy( \r
+    IVLCControl __RPC_FAR * This,\r
+    /* [retval][out] */ VARIANT_BOOL __RPC_FAR *isPlaying);\r
+\r
+\r
+void __RPC_STUB IVLCControl_get_Playing_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE IVLCControl_put_Playing_Proxy( \r
+    IVLCControl __RPC_FAR * This,\r
+    /* [in] */ VARIANT_BOOL isPlaying);\r
+\r
+\r
+void __RPC_STUB IVLCControl_put_Playing_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE IVLCControl_get_Position_Proxy( \r
+    IVLCControl __RPC_FAR * This,\r
+    /* [retval][out] */ float __RPC_FAR *position);\r
+\r
+\r
+void __RPC_STUB IVLCControl_get_Position_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE IVLCControl_put_Position_Proxy( \r
+    IVLCControl __RPC_FAR * This,\r
+    /* [in] */ float position);\r
+\r
+\r
+void __RPC_STUB IVLCControl_put_Position_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE IVLCControl_get_Time_Proxy( \r
+    IVLCControl __RPC_FAR * This,\r
+    /* [retval][out] */ int __RPC_FAR *seconds);\r
+\r
+\r
+void __RPC_STUB IVLCControl_get_Time_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE IVLCControl_put_Time_Proxy( \r
+    IVLCControl __RPC_FAR * This,\r
+    /* [in] */ int seconds);\r
+\r
+\r
+void __RPC_STUB IVLCControl_put_Time_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring] */ HRESULT STDMETHODCALLTYPE IVLCControl_shuttle_Proxy( \r
+    IVLCControl __RPC_FAR * This,\r
+    /* [in] */ int seconds);\r
+\r
+\r
+void __RPC_STUB IVLCControl_shuttle_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring] */ HRESULT STDMETHODCALLTYPE IVLCControl_fullscreen_Proxy( \r
+    IVLCControl __RPC_FAR * This);\r
+\r
+\r
+void __RPC_STUB IVLCControl_fullscreen_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE IVLCControl_get_Length_Proxy( \r
+    IVLCControl __RPC_FAR * This,\r
+    /* [retval][out] */ int __RPC_FAR *seconds);\r
+\r
+\r
+void __RPC_STUB IVLCControl_get_Length_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring] */ HRESULT STDMETHODCALLTYPE IVLCControl_playFaster_Proxy( \r
+    IVLCControl __RPC_FAR * This);\r
+\r
+\r
+void __RPC_STUB IVLCControl_playFaster_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring] */ HRESULT STDMETHODCALLTYPE IVLCControl_playSlower_Proxy( \r
+    IVLCControl __RPC_FAR * This);\r
+\r
+\r
+void __RPC_STUB IVLCControl_playSlower_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE IVLCControl_get_Volume_Proxy( \r
+    IVLCControl __RPC_FAR * This,\r
+    /* [retval][out] */ int __RPC_FAR *volume);\r
+\r
+\r
+void __RPC_STUB IVLCControl_get_Volume_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE IVLCControl_put_Volume_Proxy( \r
+    IVLCControl __RPC_FAR * This,\r
+    /* [in] */ int volume);\r
+\r
+\r
+void __RPC_STUB IVLCControl_put_Volume_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring] */ HRESULT STDMETHODCALLTYPE IVLCControl_toggleMute_Proxy( \r
+    IVLCControl __RPC_FAR * This);\r
+\r
+\r
+void __RPC_STUB IVLCControl_toggleMute_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring] */ HRESULT STDMETHODCALLTYPE IVLCControl_addTarget_Proxy( \r
+    IVLCControl __RPC_FAR * This,\r
+    /* [in] */ BSTR uri,\r
+    /* [in] */ VARIANT options,\r
+    /* [in] */ enum VLCPlaylistMode mode,\r
+    /* [in] */ int position);\r
+\r
+\r
+void __RPC_STUB IVLCControl_addTarget_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE IVLCControl_get_PlaylistIndex_Proxy( \r
+    IVLCControl __RPC_FAR * This,\r
+    /* [retval][out] */ int __RPC_FAR *index);\r
+\r
+\r
+void __RPC_STUB IVLCControl_get_PlaylistIndex_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE IVLCControl_get_PlaylistCount_Proxy( \r
+    IVLCControl __RPC_FAR * This,\r
+    /* [retval][out] */ int __RPC_FAR *index);\r
+\r
+\r
+void __RPC_STUB IVLCControl_get_PlaylistCount_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring] */ HRESULT STDMETHODCALLTYPE IVLCControl_playlistNext_Proxy( \r
+    IVLCControl __RPC_FAR * This);\r
+\r
+\r
+void __RPC_STUB IVLCControl_playlistNext_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring] */ HRESULT STDMETHODCALLTYPE IVLCControl_playlistPrev_Proxy( \r
+    IVLCControl __RPC_FAR * This);\r
+\r
+\r
+void __RPC_STUB IVLCControl_playlistPrev_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring] */ HRESULT STDMETHODCALLTYPE IVLCControl_playlistClear_Proxy( \r
+    IVLCControl __RPC_FAR * This);\r
+\r
+\r
+void __RPC_STUB IVLCControl_playlistClear_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE IVLCControl_get_VersionInfo_Proxy( \r
+    IVLCControl __RPC_FAR * This,\r
+    /* [retval][out] */ BSTR __RPC_FAR *version);\r
+\r
+\r
+void __RPC_STUB IVLCControl_get_VersionInfo_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+\r
+#endif         /* __IVLCControl_INTERFACE_DEFINED__ */\r
+\r
+\r
+#ifndef __DVLCEvents_DISPINTERFACE_DEFINED__\r
+#define __DVLCEvents_DISPINTERFACE_DEFINED__\r
+\r
+/* dispinterface DVLCEvents */\r
+/* [hidden][helpstring][uuid] */ \r
+\r
+\r
+EXTERN_C const IID DIID_DVLCEvents;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+\r
+    MIDL_INTERFACE("DF48072F-5EF8-434e-9B40-E2F3AE759B5F")\r
+    DVLCEvents : public IDispatch\r
+    {\r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct DVLCEventsVtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( \r
+            DVLCEvents __RPC_FAR * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( \r
+            DVLCEvents __RPC_FAR * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( \r
+            DVLCEvents __RPC_FAR * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfoCount )( \r
+            DVLCEvents __RPC_FAR * This,\r
+            /* [out] */ UINT __RPC_FAR *pctinfo);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfo )( \r
+            DVLCEvents __RPC_FAR * This,\r
+            /* [in] */ UINT iTInfo,\r
+            /* [in] */ LCID lcid,\r
+            /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetIDsOfNames )( \r
+            DVLCEvents __RPC_FAR * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames,\r
+            /* [in] */ UINT cNames,\r
+            /* [in] */ LCID lcid,\r
+            /* [size_is][out] */ DISPID __RPC_FAR *rgDispId);\r
+        \r
+        /* [local] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Invoke )( \r
+            DVLCEvents __RPC_FAR * This,\r
+            /* [in] */ DISPID dispIdMember,\r
+            /* [in] */ REFIID riid,\r
+            /* [in] */ LCID lcid,\r
+            /* [in] */ WORD wFlags,\r
+            /* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams,\r
+            /* [out] */ VARIANT __RPC_FAR *pVarResult,\r
+            /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo,\r
+            /* [out] */ UINT __RPC_FAR *puArgErr);\r
+        \r
+        END_INTERFACE\r
+    } DVLCEventsVtbl;\r
+\r
+    interface DVLCEvents\r
+    {\r
+        CONST_VTBL struct DVLCEventsVtbl __RPC_FAR *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define DVLCEvents_QueryInterface(This,riid,ppvObject) \\r
+    (This)->lpVtbl -> QueryInterface(This,riid,ppvObject)\r
+\r
+#define DVLCEvents_AddRef(This)        \\r
+    (This)->lpVtbl -> AddRef(This)\r
+\r
+#define DVLCEvents_Release(This)       \\r
+    (This)->lpVtbl -> Release(This)\r
+\r
+\r
+#define DVLCEvents_GetTypeInfoCount(This,pctinfo)      \\r
+    (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo)\r
+\r
+#define DVLCEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo)       \\r
+    (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo)\r
+\r
+#define DVLCEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)     \\r
+    (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\r
+\r
+#define DVLCEvents_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)       \\r
+    (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+#endif         /* __DVLCEvents_DISPINTERFACE_DEFINED__ */\r
+\r
+\r
+EXTERN_C const CLSID CLSID_VLCPlugin;\r
+\r
+#ifdef __cplusplus\r
+\r
+class DECLSPEC_UUID("E23FE9C6-778E-49D4-B537-38FCDE4887D8")\r
+VLCPlugin;\r
+#endif\r
+#endif /* __AXVLC_LIBRARY_DEFINED__ */\r
+\r
+/* Additional Prototypes for ALL interfaces */\r
+\r
+/* end of Additional Prototypes */\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif\r
diff --git a/activex/axvlc_rc.rc b/activex/axvlc_rc.rc
new file mode 100644 (file)
index 0000000..1162751
--- /dev/null
@@ -0,0 +1,36 @@
+#ifndef VERSION_NUMBER
+#define VERSION_NUMBER 0,0,0,0
+#endif
+#ifndef VERSION
+#define VERSION 0.0.0
+#endif
+
+#define STRINGIFY( z ) UGLY_KLUDGE( z )
+#define UGLY_KLUDGE( z ) #z
+
+1 VERSIONINFO
+FILETYPE 1
+FILEOS 4
+PRODUCTVERSION VERSION_NUMBER
+FILEVERSION VERSION_NUMBER
+BEGIN
+  BLOCK "StringFileInfo"
+  BEGIN
+    BLOCK "040904E4"
+    BEGIN
+      VALUE "CompanyName", "VideoLAN Team"
+      VALUE "FileVersion", STRINGIFY( VERSION )
+      VALUE "FileDescription", "VLC media player"
+      VALUE "LegalCopyright", "(c) 1996-2003 VideoLAN"
+    END
+  END
+  BLOCK "VarFileInfo"
+  BEGIN
+    VALUE "Translation", 0x409, 1200
+  END
+END
+
+INPLACE-PICT BITMAP DISCARDABLE "inplace.bmp"
+
+1 TYPELIB "axvlc.tlb"
+
diff --git a/activex/connectioncontainer.cpp b/activex/connectioncontainer.cpp
new file mode 100644 (file)
index 0000000..9908f94
--- /dev/null
@@ -0,0 +1,293 @@
+/*****************************************************************************\r
+ * connectioncontainer.cpp: ActiveX control for VLC\r
+ *****************************************************************************\r
+ * Copyright (C) 2005 VideoLAN\r
+ *\r
+ * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.\r
+ *****************************************************************************/\r
+\r
+#include "plugin.h"\r
+#include "connectioncontainer.h"\r
+\r
+#include "utils.h"\r
+\r
+using namespace std;\r
+\r
+////////////////////////////////////////////////////////////////////////////////////////////////\r
+\r
+class VLCEnumConnections : public IEnumConnections\r
+{\r
+public:\r
+    VLCEnumConnections(vector<CONNECTDATA> &v) :\r
+        e(VLCEnum<CONNECTDATA>(IID_IEnumConnections, v))\r
+    { e.setRetainOperation((VLCEnum<CONNECTDATA>::retainer)&retain); };\r
+\r
+    VLCEnumConnections(const VLCEnumConnections &vlcEnum) : e(vlcEnum.e) {};\r
+\r
+    virtual ~VLCEnumConnections() {};\r
+\r
+    // IUnknown methods\r
+    STDMETHODIMP QueryInterface(REFIID riid, void **ppv)\r
+        { return e.QueryInterface(riid, ppv); };\r
+    STDMETHODIMP_(ULONG) AddRef(void)\r
+        { return e.AddRef(); };\r
+    STDMETHODIMP_(ULONG) Release(void)\r
+        {return e.Release(); };\r
+\r
+    //IEnumConnectionPoints\r
+    STDMETHODIMP Next(ULONG celt, LPCONNECTDATA rgelt, ULONG *pceltFetched)\r
+        { return e.Next(celt, rgelt, pceltFetched); };\r
+    STDMETHODIMP Skip(ULONG celt)\r
+        { return e.Skip(celt);};\r
+    STDMETHODIMP Reset(void)\r
+        { return e.Reset();};\r
+    STDMETHODIMP Clone(LPENUMCONNECTIONS *ppenum)\r
+        { if( NULL == ppenum ) return E_POINTER;\r
+          *ppenum = dynamic_cast<LPENUMCONNECTIONS>(new VLCEnumConnections(*this));\r
+          return (NULL != *ppenum) ? S_OK : E_OUTOFMEMORY;\r
+        };\r
+\r
+private:\r
+\r
+    static void retain(CONNECTDATA cd)\r
+    {\r
+        cd.pUnk->AddRef();\r
+    };\r
+\r
+    VLCEnum<CONNECTDATA> e;\r
+};\r
+\r
+////////////////////////////////////////////////////////////////////////////////////////////////\r
+\r
+STDMETHODIMP VLCConnectionPoint::GetConnectionInterface(IID *iid)\r
+{\r
+    if( NULL == iid )\r
+        return E_POINTER;\r
+\r
+    *iid = _iid;\r
+    return S_OK;\r
+};\r
+\r
+STDMETHODIMP VLCConnectionPoint::GetConnectionPointContainer(LPCONNECTIONPOINTCONTAINER *ppCPC)\r
+{\r
+    if( NULL == ppCPC )\r
+        return E_POINTER;\r
+\r
+    _p_cpc->AddRef();\r
+    *ppCPC = _p_cpc;\r
+    return S_OK;\r
+};\r
+\r
+STDMETHODIMP VLCConnectionPoint::Advise(IUnknown *pUnk, DWORD *pdwCookie)\r
+{\r
+    if( (NULL == pUnk) || (NULL == pdwCookie) )\r
+        return E_POINTER;\r
+\r
+    CONNECTDATA cd;\r
+\r
+    pUnk->AddRef();\r
+    cd.pUnk = pUnk;\r
+    *pdwCookie = cd.dwCookie = _connections.size();\r
+\r
+    _connections.push_back(cd);\r
+\r
+    return S_OK;\r
+};\r
+\r
+STDMETHODIMP VLCConnectionPoint::Unadvise(DWORD pdwCookie)\r
+{\r
+    if( pdwCookie < _connections.size() )\r
+    {\r
+        CONNECTDATA cd = _connections[pdwCookie];\r
+        if( NULL != cd.pUnk )\r
+        {\r
+            cd.pUnk->Release();\r
+            cd.pUnk = NULL;\r
+            return S_OK;\r
+        }\r
+    }\r
+    return CONNECT_E_NOCONNECTION;\r
+};\r
+\r
+STDMETHODIMP VLCConnectionPoint::EnumConnections(IEnumConnections **ppEnum)\r
+{\r
+    if( NULL == ppEnum )\r
+        return E_POINTER;\r
+\r
+    *ppEnum = dynamic_cast<LPENUMCONNECTIONS>(new VLCEnumConnections(_connections));\r
+\r
+    return (NULL != *ppEnum ) ? S_OK : E_OUTOFMEMORY;\r
+};\r
+\r
+void VLCConnectionPoint::fireEvent(DISPID dispId, LCID lcid, DISPPARAMS* pDispParams)\r
+{\r
+    vector<CONNECTDATA>::iterator end = _connections.end();\r
+    vector<CONNECTDATA>::iterator iter = _connections.begin();\r
+\r
+    while( iter != end )\r
+    {\r
+        CONNECTDATA cd = *iter;\r
+        if( NULL != cd.pUnk )\r
+        {\r
+            IDispatch *pDisp;\r
+            if( SUCCEEDED(cd.pUnk->QueryInterface(IID_IDispatch, (LPVOID *)&pDisp)) )\r
+            {\r
+                unsigned int puArgErr;\r
+                VARIANT vRes;\r
+\r
+                if( SUCCEEDED(pDisp->Invoke(dispId, IID_NULL, lcid, DISPATCH_METHOD, pDispParams, &vRes, NULL, &puArgErr)) )\r
+                {\r
+                    VariantClear(&vRes);\r
+                }\r
+                pDisp->Release();\r
+            }\r
+        }\r
+        ++iter;\r
+    }\r
+};\r
+\r
+void VLCConnectionPoint::firePropChangedEvent(DISPID dispId)\r
+{\r
+    vector<CONNECTDATA>::iterator end = _connections.end();\r
+    vector<CONNECTDATA>::iterator iter = _connections.begin();\r
+\r
+    while( iter != end )\r
+    {\r
+        CONNECTDATA cd = *iter;\r
+        if( NULL != cd.pUnk )\r
+        {\r
+            IPropertyNotifySink *pPropSink;\r
+            if( SUCCEEDED(cd.pUnk->QueryInterface(IID_IPropertyNotifySink, (LPVOID *)&pPropSink)) )\r
+            {\r
+                pPropSink->OnChanged(dispId);\r
+                pPropSink->Release();\r
+            }\r
+        }\r
+        ++iter;\r
+    }\r
+};\r
+\r
+////////////////////////////////////////////////////////////////////////////////////////////////\r
+\r
+class VLCEnumConnectionPoints : public IEnumConnectionPoints\r
+{\r
+public:\r
+    VLCEnumConnectionPoints(vector<LPCONNECTIONPOINT> &v) :\r
+        e(VLCEnum<LPCONNECTIONPOINT>(IID_IEnumConnectionPoints, v))\r
+    { e.setRetainOperation((VLCEnum<LPCONNECTIONPOINT>::retainer)&retain); };\r
+\r
+    VLCEnumConnectionPoints(const VLCEnumConnectionPoints &vlcEnum) : e(vlcEnum.e) {};\r
+\r
+    virtual ~VLCEnumConnectionPoints() {};\r
+\r
+    // IUnknown methods\r
+    STDMETHODIMP QueryInterface(REFIID riid, void **ppv)\r
+        { return e.QueryInterface(riid, ppv); };\r
+    STDMETHODIMP_(ULONG) AddRef(void)\r
+        { return e.AddRef(); };\r
+    STDMETHODIMP_(ULONG) Release(void)\r
+        {return e.Release(); };\r
+\r
+    //IEnumConnectionPoints\r
+    STDMETHODIMP Next(ULONG celt, LPCONNECTIONPOINT *rgelt, ULONG *pceltFetched)\r
+        { return e.Next(celt, rgelt, pceltFetched); };\r
+    STDMETHODIMP Skip(ULONG celt)\r
+        { return e.Skip(celt);};\r
+    STDMETHODIMP Reset(void)\r
+        { return e.Reset();};\r
+    STDMETHODIMP Clone(LPENUMCONNECTIONPOINTS *ppenum)\r
+        { if( NULL == ppenum ) return E_POINTER;\r
+          *ppenum = dynamic_cast<LPENUMCONNECTIONPOINTS>(new VLCEnumConnectionPoints(*this));\r
+          return (NULL != *ppenum) ? S_OK : E_OUTOFMEMORY;\r
+        };\r
+\r
+private:\r
+\r
+    static void retain(LPCONNECTIONPOINT cp)\r
+    {\r
+        cp->AddRef();\r
+    };\r
+\r
+    VLCEnum<LPCONNECTIONPOINT> e;\r
+};\r
+\r
+////////////////////////////////////////////////////////////////////////////////////////////////\r
+\r
+VLCConnectionPointContainer::VLCConnectionPointContainer(VLCPlugin *p_instance) :\r
+    _p_instance(p_instance)\r
+{\r
+    _p_events = new VLCConnectionPoint(dynamic_cast<LPCONNECTIONPOINTCONTAINER>(this),\r
+            _p_instance->getDispEventID());\r
+\r
+    _v_cps.push_back(dynamic_cast<LPCONNECTIONPOINT>(_p_events));\r
+\r
+    _p_props = new VLCConnectionPoint(dynamic_cast<LPCONNECTIONPOINTCONTAINER>(this),\r
+            IID_IPropertyNotifySink);\r
+\r
+    _v_cps.push_back(dynamic_cast<LPCONNECTIONPOINT>(_p_props));\r
+};\r
+\r
+VLCConnectionPointContainer::~VLCConnectionPointContainer()\r
+{\r
+    _v_cps.clear();\r
+    delete _p_props;\r
+    delete _p_events;\r
+};\r
+\r
+STDMETHODIMP VLCConnectionPointContainer::EnumConnectionPoints(LPENUMCONNECTIONPOINTS *ppEnum)\r
+{\r
+    if( NULL == ppEnum )\r
+        return E_POINTER;\r
+\r
+    *ppEnum = dynamic_cast<LPENUMCONNECTIONPOINTS>(new VLCEnumConnectionPoints(_v_cps));\r
+\r
+    return (NULL != *ppEnum ) ? S_OK : E_OUTOFMEMORY;\r
+};\r
+\r
+STDMETHODIMP VLCConnectionPointContainer::FindConnectionPoint(REFIID riid, IConnectionPoint **ppCP)\r
+{\r
+    if( NULL == ppCP )\r
+        return E_POINTER;\r
+\r
+    *ppCP = NULL;\r
+\r
+    if( IID_IPropertyNotifySink == riid )\r
+    {\r
+        _p_props->AddRef();\r
+        *ppCP = dynamic_cast<LPCONNECTIONPOINT>(_p_props);\r
+    }\r
+    else if( _p_instance->getDispEventID() == riid )\r
+    {\r
+        _p_events->AddRef();\r
+        *ppCP = dynamic_cast<LPCONNECTIONPOINT>(_p_events);\r
+    }\r
+    else\r
+        return CONNECT_E_NOCONNECTION;\r
+\r
+    return NOERROR;\r
+};\r
+\r
+void VLCConnectionPointContainer::fireEvent(DISPID dispId, LCID lcid, DISPPARAMS* pDispParams)\r
+{\r
+    _p_events->fireEvent(dispId,lcid, pDispParams);\r
+};\r
+\r
+void VLCConnectionPointContainer::firePropChangedEvent(DISPID dispId)\r
+{\r
+    _p_props->firePropChangedEvent(dispId);\r
+};\r
+\r
diff --git a/activex/connectioncontainer.h b/activex/connectioncontainer.h
new file mode 100644 (file)
index 0000000..e5b6fa8
--- /dev/null
@@ -0,0 +1,116 @@
+/*****************************************************************************\r
+ * connectioncontainer.h: ActiveX control for VLC\r
+ *****************************************************************************\r
+ * Copyright (C) 2005 VideoLAN\r
+ *\r
+ * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.\r
+ *****************************************************************************/\r
+\r
+#ifndef __CONNECTIONCONTAINER_H__\r
+#define __CONNECTIONCONTAINER_H__\r
+\r
+#include <ocidl.h>\r
+#include <vector>\r
+\r
+using namespace std;\r
+\r
+class VLCConnectionPoint : public IConnectionPoint\r
+{\r
+\r
+public:\r
+\r
+    VLCConnectionPoint(IConnectionPointContainer *p_cpc, REFIID iid) :\r
+        _iid(iid), _p_cpc(p_cpc) {};\r
+    virtual ~VLCConnectionPoint() {};\r
+\r
+    // IUnknown methods\r
+    STDMETHODIMP QueryInterface(REFIID riid, void **ppv)\r
+    {\r
+        if( NULL == ppv ) return E_POINTER;\r
+        if( (IID_IUnknown == riid) \r
+         && (IID_IConnectionPoint == riid) ) {\r
+            AddRef();\r
+            *ppv = reinterpret_cast<LPVOID>(this);\r
+            return NOERROR;\r
+        }\r
+        // must be a standalone object\r
+        return E_NOINTERFACE;\r
+    };\r
+\r
+    STDMETHODIMP_(ULONG) AddRef(void) { return _p_cpc->AddRef(); };\r
+    STDMETHODIMP_(ULONG) Release(void) { return _p_cpc->Release(); };\r
+\r
+    // IConnectionPoint methods\r
+    STDMETHODIMP GetConnectionInterface(IID *);\r
+    STDMETHODIMP GetConnectionPointContainer(LPCONNECTIONPOINTCONTAINER *);\r
+    STDMETHODIMP Advise(IUnknown *, DWORD *);\r
+    STDMETHODIMP Unadvise(DWORD);\r
+    STDMETHODIMP EnumConnections(LPENUMCONNECTIONS *);\r
+\r
+    void fireEvent(DISPID dispIdMember, LCID lcid, DISPPARAMS* pDispParams);\r
+    void firePropChangedEvent(DISPID dispId);\r
+\r
+private:\r
+\r
+    REFIID _iid;\r
+    IConnectionPointContainer *_p_cpc;\r
+    vector<CONNECTDATA> _connections;\r
+};\r
+\r
+//////////////////////////////////////////////////////////////////////////\r
+\r
+class VLCConnectionPointContainer : public IConnectionPointContainer\r
+{\r
+\r
+public:\r
+\r
+    VLCConnectionPointContainer(VLCPlugin *p_instance);\r
+    virtual ~VLCConnectionPointContainer();\r
+\r
+    // IUnknown methods\r
+    STDMETHODIMP QueryInterface(REFIID riid, void **ppv)\r
+    {\r
+        if( (NULL != ppv)\r
+         && (IID_IUnknown == riid) \r
+         && (IID_IConnectionPointContainer == riid) ) {\r
+            AddRef();\r
+            *ppv = reinterpret_cast<LPVOID>(this);\r
+            return NOERROR;\r
+        }\r
+        return _p_instance->QueryInterface(riid, ppv);\r
+    };\r
+\r
+    STDMETHODIMP_(ULONG) AddRef(void) { return _p_instance->AddRef(); };\r
+    STDMETHODIMP_(ULONG) Release(void) { return _p_instance->Release(); };\r
+\r
+    // IConnectionPointContainer methods\r
+    STDMETHODIMP EnumConnectionPoints(LPENUMCONNECTIONPOINTS *);\r
+    STDMETHODIMP FindConnectionPoint(REFIID, LPCONNECTIONPOINT *);\r
+\r
+    void fireEvent(DISPID, LCID, DISPPARAMS*);\r
+    void firePropChangedEvent(DISPID dispId);\r
+\r
+private:\r
+\r
+    VLCPlugin *_p_instance;\r
+    VLCConnectionPoint *_p_events;\r
+    VLCConnectionPoint *_p_props;\r
+    vector<LPCONNECTIONPOINT> _v_cps;\r
+};\r
+\r
+#endif\r
+\r
diff --git a/activex/inplace.bmp b/activex/inplace.bmp
new file mode 100755 (executable)
index 0000000..1db314f
Binary files /dev/null and b/activex/inplace.bmp differ
diff --git a/activex/main.cpp b/activex/main.cpp
new file mode 100644 (file)
index 0000000..954b761
--- /dev/null
@@ -0,0 +1,147 @@
+/*****************************************************************************\r
+ * main.cpp: ActiveX control for VLC\r
+ *****************************************************************************\r
+ * Copyright (C) 2005 VideoLAN\r
+ *\r
+ * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.\r
+ *****************************************************************************/\r
+\r
+#include "plugin.h"\r
+\r
+#include <comcat.h>\r
+\r
+using namespace std;\r
+\r
+static LONG i_class_ref= 0;\r
+static HINSTANCE h_instance= 0;\r
+\r
+STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)\r
+{\r
+    HRESULT hr = CLASS_E_CLASSNOTAVAILABLE;\r
+\r
+    *ppv = NULL;\r
+\r
+    if( CLSID_VLCPlugin == rclsid )\r
+    {\r
+        VLCPluginClass *plugin = new VLCPluginClass(&i_class_ref, h_instance);\r
+        hr = plugin->QueryInterface(riid, ppv);\r
+        plugin->Release();\r
+    }\r
+    return hr;\r
+};\r
+\r
+STDAPI DllCanUnloadNow(VOID)\r
+{\r
+    return (0 == i_class_ref) ? S_OK: S_FALSE;\r
+};\r
+\r
+STDAPI DllRegisterServer(VOID)\r
+{\r
+    return S_OK;\r
+};\r
+\r
+STDAPI DllUnregisterServer(VOID)\r
+{\r
+    return S_OK;\r
+};\r
+\r
+#ifdef BUILD_LOCALSERVER\r
+\r
+/*\r
+** easier to debug an application than a DLL on cygwin GDB :)\r
+*/\r
+\r
+#include <iostream>\r
+\r
+STDAPI_(int) WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw)\r
+{\r
+    MSG msg;\r
+\r
+    if( FAILED(OleInitialize(NULL)) )\r
+    {\r
+        cerr << "cannot initialize OLE" << endl;\r
+        return 1;\r
+    }\r
+\r
+    IUnknown *classProc = NULL;\r
+\r
+    if( FAILED(DllGetClassObject(CLSID_VLCPlugin, IID_IUnknown, (LPVOID *)&classProc)) )\r
+        return 0;\r
\r
+    DWORD dwRegisterClassObject;\r
+\r
+    if( FAILED(CoRegisterClassObject(CLSID_VLCPlugin, classProc,\r
+        CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE, &dwRegisterClassObject)) )\r
+        return 0;\r
+\r
+    DWORD dwRegisterActiveObject;\r
+\r
+    if( FAILED(RegisterActiveObject(classProc, CLSID_VLCPlugin,\r
+                    ACTIVEOBJECT_WEAK, &dwRegisterActiveObject)) )\r
+        return 0;\r
+\r
+    classProc->Release();\r
+\r
+    /*\r
+    * Polling messages from event queue\r
+    */\r
+    while( S_FALSE == DllCanUnloadNow() )\r
+    {\r
+        while( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) )\r
+        {\r
+            if( msg.message == WM_QUIT )\r
+                break;  // Leave the PeekMessage while() loop\r
+\r
+            /*if(TranslateAccelerator(ghwndApp, ghAccel, &msg))\r
+                continue;*/\r
+\r
+            TranslateMessage(&msg);\r
+            DispatchMessage(&msg);\r
+        }\r
+\r
+        if(msg.message == WM_QUIT)\r
+            break;  // Leave the for() loop\r
+\r
+        WaitMessage();\r
+    }\r
+\r
+    if( SUCCEEDED(RevokeActiveObject(dwRegisterActiveObject, NULL)) )\r
+        CoRevokeClassObject(dwRegisterClassObject);\r
+\r
+    // Reached on WM_QUIT message\r
+    CoUninitialize();\r
+    return ((int) msg.wParam);\r
+};\r
+\r
+#else\r
+\r
+STDAPI_(BOOL) DllMain(HANDLE hModule, DWORD fdwReason, LPVOID lpReserved )\r
+{\r
+    switch( fdwReason )\r
+    {\r
+        case DLL_PROCESS_ATTACH:\r
+            h_instance = (HINSTANCE)hModule;\r
+            break;\r
+\r
+        default:\r
+            break;\r
+    }\r
+    return TRUE;\r
+};\r
+\r
+#endif\r
+\r
diff --git a/activex/objectsafety.cpp b/activex/objectsafety.cpp
new file mode 100644 (file)
index 0000000..0cfc678
--- /dev/null
@@ -0,0 +1,92 @@
+/*****************************************************************************\r
+ * objectsafety.cpp: ActiveX control for VLC\r
+ *****************************************************************************\r
+ * Copyright (C) 2005 VideoLAN\r
+ *\r
+ * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.\r
+ *****************************************************************************/\r
+\r
+#include "plugin.h"\r
+#include "objectsafety.h"\r
+\r
+#include "axvlc_idl.h"\r
+\r
+#if 0\r
+const GUID IID_IObjectSafety = \r
+    {0xCB5BDC81,0x93C1,0x11cf,{0x8F,0x20,0x00,0x80,0x5F,0x2C,0xD0,0x64}}; \r
+#endif\r
+\r
+STDMETHODIMP VLCObjectSafety::GetInterfaceSafetyOptions(      \r
+    REFIID riid,\r
+    DWORD *pdwSupportedOptions,\r
+    DWORD *pdwEnabledOptions\r
+)\r
+{\r
+    if( (NULL == pdwSupportedOptions) || (NULL == pdwEnabledOptions) )\r
+        return E_POINTER;\r
+\r
+    *pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACESAFE_FOR_UNTRUSTED_CALLER;\r
+\r
+    if( (IID_IDispatch == riid)\r
+     || (IID_IVLCControl == riid) )\r
+    {\r
+        *pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER;\r
+        return NOERROR;\r
+    }\r
+    else if( (IID_IPersist == riid)\r
+          || (IID_IPersistStreamInit == riid)\r
+          || (IID_IPersistStorage == riid)\r
+          || (IID_IPersistPropertyBag == riid) )\r
+    {\r
+        *pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA;\r
+        return NOERROR;\r
+    }\r
+    *pdwEnabledOptions = 0;\r
+    return E_NOINTERFACE;\r
+};\r
+\r
+STDMETHODIMP VLCObjectSafety::SetInterfaceSafetyOptions(      \r
+    REFIID riid,\r
+    DWORD dwOptionSetMask,\r
+    DWORD dwEnabledOptions\r
+)\r
+{\r
+    if( (IID_IDispatch == riid)\r
+     || (IID_IVLCControl == riid) )\r
+    {\r
+        if( (INTERFACESAFE_FOR_UNTRUSTED_CALLER == dwOptionSetMask)\r
+         && (INTERFACESAFE_FOR_UNTRUSTED_CALLER == dwEnabledOptions) )\r
+        {\r
+            return NOERROR;\r
+        }\r
+        return E_FAIL;\r
+    }\r
+    else if( (IID_IPersist == riid)\r
+          || (IID_IPersistStreamInit == riid)\r
+          || (IID_IPersistStorage == riid)\r
+          || (IID_IPersistPropertyBag == riid) )\r
+    {\r
+        if( (INTERFACESAFE_FOR_UNTRUSTED_DATA == dwOptionSetMask)\r
+         && (INTERFACESAFE_FOR_UNTRUSTED_DATA == dwEnabledOptions) )\r
+        {\r
+            return NOERROR;\r
+        }\r
+        return E_FAIL;\r
+    }\r
+    return E_FAIL;\r
+};\r
+\r
diff --git a/activex/objectsafety.h b/activex/objectsafety.h
new file mode 100644 (file)
index 0000000..3644050
--- /dev/null
@@ -0,0 +1,99 @@
+/*****************************************************************************\r
+ * objectsafety.h: ActiveX control for VLC\r
+ *****************************************************************************\r
+ * Copyright (C) 2005 VideoLAN\r
+ *\r
+ * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.\r
+ *****************************************************************************/\r
+\r
+#ifndef __OBJECTSAFETY_H__\r
+#define __OBJECTSAFETY_H__\r
+\r
+#if HAVE_OBJSAFE_HEADER\r
+/*\r
+** at last, a version of mingw that supports this header\r
+*/\r
+#include <objsafe.h>\r
+\r
+#else\r
+\r
+// {CB5BDC81-93C1-11cf-8F20-00805F2CD064}\r
+extern "C" const IID IID_IObjectSafety;\r
+\r
+#define INTERFACESAFE_FOR_UNTRUSTED_CALLER 1L\r
+#define INTERFACESAFE_FOR_UNTRUSTED_DATA   2L\r
+\r
+struct IObjectSafety : public IUnknown\r
+{\r
+    virtual STDMETHODIMP GetInterfaceSafetyOptions(      \r
+        REFIID riid,\r
+        DWORD __RPC_FAR *pdwSupportedOptions,\r
+        DWORD __RPC_FAR *pdwEnabledOptions\r
+    ) = 0;\r
+\r
+    virtual STDMETHODIMP SetInterfaceSafetyOptions(      \r
+        REFIID riid,\r
+        DWORD dwSupportedOptions,\r
+        DWORD dwOptionSetMask\r
+    ) = 0;\r
+};\r
+\r
+#endif\r
+\r
+class VLCObjectSafety : public IObjectSafety\r
+{\r
+public:\r
+\r
+    VLCObjectSafety(VLCPlugin *p_instance) : _p_instance(p_instance) {};\r
+    virtual ~VLCObjectSafety() {};\r
+\r
+    // IUnknown methods\r
+    STDMETHODIMP QueryInterface(REFIID riid, void **ppv)\r
+    {\r
+        if( (NULL != ppv)\r
+         && (IID_IUnknown == riid)\r
+         && (IID_IObjectSafety == riid) ) \r
+        {\r
+            AddRef();\r
+            *ppv = reinterpret_cast<LPVOID>(this);\r
+            return NOERROR;\r
+        }\r
+        return _p_instance->QueryInterface(riid, ppv);\r
+    };\r
+\r
+    STDMETHODIMP_(ULONG) AddRef(void) { return _p_instance->AddRef(); };\r
+    STDMETHODIMP_(ULONG) Release(void) { return _p_instance->Release(); };\r
+\r
+    // IUnknown methods\r
+    STDMETHODIMP GetInterfaceSafetyOptions(      \r
+        REFIID riid,\r
+        DWORD *pdwSupportedOptions,\r
+        DWORD *pdwEnabledOptions\r
+    );\r
+\r
+    STDMETHODIMP SetInterfaceSafetyOptions(      \r
+        REFIID riid,\r
+        DWORD dwOptionSetMask,\r
+        DWORD dwEnabledOptions\r
+    );\r
+\r
+private: \r
+\r
+    VLCPlugin *_p_instance;\r
+};\r
+\r
+#endif\r
diff --git a/activex/olecontrol.cpp b/activex/olecontrol.cpp
new file mode 100644 (file)
index 0000000..7dde4cc
--- /dev/null
@@ -0,0 +1,133 @@
+/*****************************************************************************\r
+ * olecontrol.cpp: ActiveX control for VLC\r
+ *****************************************************************************\r
+ * Copyright (C) 2005 VideoLAN\r
+ *\r
+ * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.\r
+ *****************************************************************************/\r
+\r
+#include "plugin.h"\r
+#include "olecontrol.h"\r
+\r
+#include "utils.h"\r
+\r
+using namespace std;\r
+\r
+STDMETHODIMP VLCOleControl::GetControlInfo(CONTROLINFO *pCI)\r
+{\r
+    if( NULL == pCI )\r
+        return E_POINTER;\r
+\r
+    pCI->cb      = sizeof(CONTROLINFO);\r
+    pCI->hAccel  = NULL;\r
+    pCI->cAccel  = 0;\r
+    pCI->dwFlags = 0;\r
+\r
+    return S_OK;\r
+};\r
+\r
+STDMETHODIMP VLCOleControl::OnMnemonic(LPMSG pMsg)\r
+{\r
+    return E_NOTIMPL;\r
+};\r
+\r
+static HRESULT getAmbientProperty(VLCPlugin& instance, DISPID dispID, VARIANT& v)\r
+{\r
+    HRESULT hr;\r
+    IOleObject *oleObj;\r
+\r
+    hr = instance.QueryInterface(IID_IOleObject, (LPVOID *)&oleObj);\r
+    if( SUCCEEDED(hr) )\r
+    {\r
+        IOleClientSite *clientSite;\r
+\r
+        hr = oleObj->GetClientSite(&clientSite);\r
+        if( SUCCEEDED(hr) && (NULL != clientSite) )\r
+        {\r
+            hr = GetObjectProperty(clientSite, dispID, v);\r
+            clientSite->Release();\r
+        }\r
+        oleObj->Release();\r
+    }\r
+    return hr;\r
+};\r
+\r
+STDMETHODIMP VLCOleControl::OnAmbientPropertyChange(DISPID dispID)\r
+{\r
+    switch( dispID )\r
+    {\r
+        case DISPID_AMBIENT_BACKCOLOR:\r
+            break;\r
+        case DISPID_AMBIENT_DISPLAYNAME:\r
+            break;\r
+        case DISPID_AMBIENT_FONT:\r
+            break;\r
+        case DISPID_AMBIENT_FORECOLOR:\r
+            break;\r
+        case DISPID_AMBIENT_LOCALEID:\r
+            break;\r
+        case DISPID_AMBIENT_MESSAGEREFLECT:\r
+            break;\r
+        case DISPID_AMBIENT_SCALEUNITS:\r
+            break;\r
+        case DISPID_AMBIENT_TEXTALIGN:\r
+            break;\r
+        case DISPID_AMBIENT_USERMODE:\r
+            break;\r
+        case DISPID_AMBIENT_UIDEAD:\r
+            break;\r
+        case DISPID_AMBIENT_SHOWGRABHANDLES:\r
+            break;\r
+        case DISPID_AMBIENT_SHOWHATCHING:\r
+            break;\r
+        case DISPID_AMBIENT_DISPLAYASDEFAULT:\r
+            break;\r
+        case DISPID_AMBIENT_SUPPORTSMNEMONICS:\r
+            break;\r
+        case DISPID_AMBIENT_AUTOCLIP:\r
+            break;\r
+        case DISPID_AMBIENT_APPEARANCE:\r
+            break;\r
+        case DISPID_AMBIENT_CODEPAGE:\r
+            VARIANT v;\r
+            VariantInit(&v);\r
+            V_VT(&v) = VT_I4;\r
+            if( SUCCEEDED(getAmbientProperty(*_p_instance, dispID, v)) )\r
+            {\r
+                _p_instance->setCodePage(V_I4(&v));\r
+            }\r
+            break;\r
+        case DISPID_AMBIENT_PALETTE:\r
+            break;\r
+        case DISPID_AMBIENT_CHARSET:\r
+            break;\r
+        case DISPID_AMBIENT_RIGHTTOLEFT:\r
+            break;\r
+        case DISPID_AMBIENT_TOPTOBOTTOM:\r
+            break;\r
+        default:\r
+            break;\r
+    }\r
+    return S_OK;\r
+};\r
+\r
+STDMETHODIMP VLCOleControl::FreezeEvents(BOOL bFreeze)\r
+{\r
+    _p_instance->setSendEvents(! bFreeze);\r
+    return S_OK;\r
+};\r
+\r
diff --git a/activex/olecontrol.h b/activex/olecontrol.h
new file mode 100644 (file)
index 0000000..7173105
--- /dev/null
@@ -0,0 +1,65 @@
+/*****************************************************************************\r
+ * olecontrol.h: ActiveX control for VLC\r
+ *****************************************************************************\r
+ * Copyright (C) 2005 VideoLAN\r
+ *\r
+ * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.\r
+ *****************************************************************************/\r
+\r
+#ifndef __OLECONTROL_H__\r
+#define __OLECONTROL_H__\r
+\r
+#include <olectl.h>\r
+\r
+class VLCOleControl : public IOleControl\r
+{\r
+\r
+public:\r
+\r
+    VLCOleControl(VLCPlugin *p_instance) : _p_instance(p_instance) {};\r
+    virtual ~VLCOleControl() {};\r
+\r
+    // IUnknown methods\r
+    STDMETHODIMP QueryInterface(REFIID riid, void **ppv)\r
+    {\r
+        if( (NULL != ppv)\r
+         && (IID_IUnknown == riid)\r
+         && (IID_IOleControl == riid) ) \r
+        {\r
+            AddRef();\r
+            *ppv = reinterpret_cast<LPVOID>(this);\r
+            return NOERROR;\r
+        }\r
+        return _p_instance->QueryInterface(riid, ppv);\r
+    };\r
+\r
+    STDMETHODIMP_(ULONG) AddRef(void) { return _p_instance->AddRef(); };\r
+    STDMETHODIMP_(ULONG) Release(void) { return _p_instance->Release(); };\r
+\r
+    // IOleControl methods\r
+    STDMETHODIMP GetControlInfo(CONTROLINFO *pCI);\r
+    STDMETHODIMP OnMnemonic(LPMSG pMsg);\r
+    STDMETHODIMP OnAmbientPropertyChange(DISPID dispID);\r
+    STDMETHODIMP FreezeEvents(BOOL bFreeze);\r
+\r
+private:\r
+\r
+    VLCPlugin *_p_instance;\r
+};\r
+\r
+#endif\r
+\r
diff --git a/activex/oleinplaceactiveobject.cpp b/activex/oleinplaceactiveobject.cpp
new file mode 100644 (file)
index 0000000..4239a4d
--- /dev/null
@@ -0,0 +1,74 @@
+/*****************************************************************************\r
+ * oleinplaceactiveobject.cpp: ActiveX control for VLC\r
+ *****************************************************************************\r
+ * Copyright (C) 2005 VideoLAN\r
+ *\r
+ * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.\r
+ *****************************************************************************/\r
+\r
+#include "plugin.h"\r
+#include "oleinplaceactiveobject.h"\r
+\r
+using namespace std;\r
+\r
+STDMETHODIMP VLCOleInPlaceActiveObject::GetWindow(HWND *pHwnd)\r
+{\r
+    if( NULL == pHwnd )\r
+        return E_INVALIDARG;\r
+\r
+    if( _p_instance->isInPlaceActive() )\r
+    {\r
+        if( NULL != (*pHwnd = _p_instance->getInPlaceWindow()) )\r
+            return S_OK;\r
+\r
+        return E_FAIL;\r
+    }\r
+    *pHwnd = NULL;\r
+\r
+    return E_UNEXPECTED;\r
+};\r
+\r
+STDMETHODIMP VLCOleInPlaceActiveObject::EnableModeless(BOOL fEnable)\r
+{\r
+    return E_NOTIMPL;\r
+};\r
+\r
+STDMETHODIMP VLCOleInPlaceActiveObject::ContextSensitiveHelp(BOOL fEnterMode)\r
+{\r
+    return E_NOTIMPL;\r
+};\r
+\r
+STDMETHODIMP VLCOleInPlaceActiveObject::TranslateAccelerator(LPMSG lpmsg)\r
+{\r
+    return E_NOTIMPL;\r
+};\r
+\r
+STDMETHODIMP VLCOleInPlaceActiveObject::OnFrameWindowActivate(BOOL fActivate)\r
+{\r
+    return E_NOTIMPL;\r
+};\r
+\r
+STDMETHODIMP VLCOleInPlaceActiveObject::OnDocWindowActivate(BOOL fActivate)\r
+{\r
+    return E_NOTIMPL;\r
+};\r
+\r
+STDMETHODIMP VLCOleInPlaceActiveObject::ResizeBorder(LPCRECT prcBorder, LPOLEINPLACEUIWINDOW pUIWindow, BOOL fFrameWindow)\r
+{\r
+    return E_NOTIMPL;\r
+};\r
+\r
diff --git a/activex/oleinplaceactiveobject.h b/activex/oleinplaceactiveobject.h
new file mode 100644 (file)
index 0000000..267e9d2
--- /dev/null
@@ -0,0 +1,71 @@
+/*****************************************************************************\r
+ * oleinplaceactiveobject.h: ActiveX control for VLC\r
+ *****************************************************************************\r
+ * Copyright (C) 2005 VideoLAN\r
+ *\r
+ * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.\r
+ *****************************************************************************/\r
+\r
+#ifndef __OLEINPLACEACTIVEOBJECT_H__\r
+#define __OLEINPLACEACTIVEOBJECT_H__\r
+\r
+#include "oleidl.h"\r
+\r
+class VLCOleInPlaceActiveObject : public IOleInPlaceActiveObject\r
+{\r
+\r
+public:\r
+\r
+    VLCOleInPlaceActiveObject(VLCPlugin *p_instance) : _p_instance(p_instance) {};\r
+    virtual ~VLCOleInPlaceActiveObject() {};\r
+\r
+    // IUnknown methods\r
+    STDMETHODIMP QueryInterface(REFIID riid, void **ppv)\r
+    {\r
+        if( (NULL != ppv)\r
+         && (IID_IUnknown == riid) \r
+         && (IID_IOleWindow == riid) \r
+         && (IID_IOleInPlaceActiveObject == riid) )\r
+        {\r
+            AddRef();\r
+            *ppv = reinterpret_cast<LPVOID>(this);\r
+            return NOERROR;\r
+        }\r
+        return _p_instance->QueryInterface(riid, ppv);\r
+    };\r
+\r
+    STDMETHODIMP_(ULONG) AddRef(void) { return _p_instance->AddRef(); };\r
+    STDMETHODIMP_(ULONG) Release(void) { return _p_instance->Release(); };\r
+\r
+    // IOleWindow methods\r
+    STDMETHODIMP GetWindow(HWND *);\r
+    STDMETHODIMP ContextSensitiveHelp(BOOL);\r
+\r
+    // IOleInPlaceActiveObject methods\r
+    STDMETHODIMP EnableModeless(BOOL);\r
+    STDMETHODIMP TranslateAccelerator(LPMSG);\r
+    STDMETHODIMP OnFrameWindowActivate(BOOL);\r
+    STDMETHODIMP OnDocWindowActivate(BOOL);\r
+    STDMETHODIMP ResizeBorder(LPCRECT, LPOLEINPLACEUIWINDOW, BOOL);\r
+\r
+private:\r
+\r
+    VLCPlugin *_p_instance;\r
+};\r
+\r
+#endif\r
+\r
diff --git a/activex/oleinplaceobject.cpp b/activex/oleinplaceobject.cpp
new file mode 100644 (file)
index 0000000..97db723
--- /dev/null
@@ -0,0 +1,126 @@
+/*****************************************************************************\r
+ * oleinplaceobject.cpp: ActiveX control for VLC\r
+ *****************************************************************************\r
+ * Copyright (C) 2005 VideoLAN\r
+ *\r
+ * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.\r
+ *****************************************************************************/\r
+\r
+#include "plugin.h"\r
+#include "oleinplaceobject.h"\r
+\r
+#include <docobj.h>\r
+\r
+using namespace std;\r
+\r
+STDMETHODIMP VLCOleInPlaceObject::GetWindow(HWND *pHwnd)\r
+{\r
+    if( NULL == pHwnd )\r
+        return E_INVALIDARG;\r
+\r
+    if( _p_instance->isInPlaceActive() )\r
+    {\r
+        if( NULL != (*pHwnd = _p_instance->getInPlaceWindow()) )\r
+            return S_OK;\r
+\r
+        return E_FAIL;\r
+    }\r
+    *pHwnd = NULL;\r
+\r
+    return E_UNEXPECTED;\r
+};\r
+\r
+STDMETHODIMP VLCOleInPlaceObject::ContextSensitiveHelp(BOOL fEnterMode)\r
+{\r
+    return E_NOTIMPL;\r
+};\r
+\r
+STDMETHODIMP VLCOleInPlaceObject::InPlaceDeactivate(void)\r
+{\r
+    if( _p_instance->isInPlaceActive() )\r
+    {\r
+        UIDeactivate();\r
+        _p_instance->onInPlaceDeactivate();\r
+\r
+        LPOLEOBJECT p_oleObject;\r
+        if( SUCCEEDED(QueryInterface(IID_IOleObject, (void**)&p_oleObject)) ) \r
+        {\r
+            LPOLECLIENTSITE p_clientSite;\r
+            if( SUCCEEDED(p_oleObject->GetClientSite(&p_clientSite)) )\r
+            {\r
+                LPOLEINPLACESITE p_inPlaceSite;\r
+\r
+                if( SUCCEEDED(p_clientSite->QueryInterface(IID_IOleInPlaceSite, (void**)&p_inPlaceSite)) )\r
+                {\r
+                    p_inPlaceSite->OnInPlaceDeactivate();\r
+                    p_inPlaceSite->Release();\r
+                }\r
+                p_clientSite->Release();\r
+            }\r
+            p_oleObject->Release();\r
+        }\r
+        return S_OK;\r
+    }\r
+    return E_UNEXPECTED;\r
+};\r
+\r
+STDMETHODIMP VLCOleInPlaceObject::UIDeactivate(void)\r
+{\r
+    if( _p_instance->isInPlaceActive() )\r
+    {\r
+        if( _p_instance->hasFocus() )\r
+        {\r
+            _p_instance->setFocus(FALSE);\r
+\r
+            LPOLEOBJECT p_oleObject;\r
+            if( SUCCEEDED(QueryInterface(IID_IOleObject, (void**)&p_oleObject)) ) \r
+            {\r
+                LPOLECLIENTSITE p_clientSite;\r
+                if( SUCCEEDED(p_oleObject->GetClientSite(&p_clientSite)) )\r
+                {\r
+                    LPOLEINPLACESITE p_inPlaceSite;\r
+\r
+                    if( SUCCEEDED(p_clientSite->QueryInterface(IID_IOleInPlaceSite, (void**)&p_inPlaceSite)) )\r
+                    {\r
+                        p_inPlaceSite->OnUIDeactivate(FALSE);\r
+                        p_inPlaceSite->Release();\r
+                    }\r
+                    p_clientSite->Release();\r
+                }\r
+                p_oleObject->Release();\r
+            }\r
+            return S_OK;\r
+        }\r
+    }\r
+    return E_UNEXPECTED;\r
+};\r
+\r
+STDMETHODIMP VLCOleInPlaceObject::SetObjectRects(LPCRECT lprcPosRect, LPCRECT lprcClipRect)\r
+{\r
+    if( _p_instance->isInPlaceActive() )\r
+    {\r
+        _p_instance->onPositionChange(lprcPosRect, lprcClipRect);\r
+        return S_OK;\r
+    }\r
+    return E_UNEXPECTED;\r
+};\r
+\r
+STDMETHODIMP VLCOleInPlaceObject::ReactivateAndUndo(void)\r
+{\r
+    return INPLACE_E_NOTUNDOABLE;\r
+};\r
+\r
diff --git a/activex/oleinplaceobject.h b/activex/oleinplaceobject.h
new file mode 100644 (file)
index 0000000..96a91f8
--- /dev/null
@@ -0,0 +1,68 @@
+/*****************************************************************************\r
+ * oleinplaceobject.h: ActiveX control for VLC\r
+ *****************************************************************************\r
+ * Copyright (C) 2005 VideoLAN\r
+ *\r
+ * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.\r
+ *****************************************************************************/\r
+\r
+#ifndef __OLEINPLACEOBJECT_H__\r
+#define __OLEINPLACEOBJECT_H__\r
+\r
+class VLCOleInPlaceObject : public IOleInPlaceObject\r
+{\r
+\r
+public:\r
+\r
+    VLCOleInPlaceObject(VLCPlugin *p_instance) : _p_instance(p_instance) {};\r
+    virtual ~VLCOleInPlaceObject() {};\r
+\r
+    // IUnknown methods\r
+    STDMETHODIMP QueryInterface(REFIID riid, void **ppv)\r
+    {\r
+        if( (NULL != ppv)\r
+         && (IID_IUnknown == riid)\r
+         && (IID_IOleWindow == riid)\r
+         && (IID_IOleInPlaceObject == riid) ) \r
+        {\r
+            AddRef();\r
+            *ppv = reinterpret_cast<LPVOID>(this);\r
+            return NOERROR;\r
+        }\r
+        return _p_instance->QueryInterface(riid, ppv);\r
+    };\r
+\r
+    STDMETHODIMP_(ULONG) AddRef(void) { return _p_instance->AddRef(); };\r
+    STDMETHODIMP_(ULONG) Release(void) { return _p_instance->Release(); };\r
+\r
+    // IOleWindow methods\r
+    STDMETHODIMP GetWindow(HWND *);\r
+    STDMETHODIMP ContextSensitiveHelp(BOOL);\r
+\r
+    // IOleInPlaceObject methods\r
+    STDMETHODIMP InPlaceDeactivate(void);\r
+    STDMETHODIMP UIDeactivate(void);\r
+    STDMETHODIMP SetObjectRects(LPCRECT, LPCRECT);\r
+    STDMETHODIMP ReactivateAndUndo(void);\r
+\r
+private:\r
+\r
+    VLCPlugin *_p_instance;\r
+};\r
+\r
+#endif\r
+\r
diff --git a/activex/oleobject.cpp b/activex/oleobject.cpp
new file mode 100644 (file)
index 0000000..6089bbd
--- /dev/null
@@ -0,0 +1,331 @@
+/*****************************************************************************\r
+ * oleobject.cpp: ActiveX control for VLC\r
+ *****************************************************************************\r
+ * Copyright (C) 2005 VideoLAN\r
+ *\r
+ * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.\r
+ *****************************************************************************/\r
+\r
+#include "plugin.h"\r
+#include "oleobject.h"\r
+\r
+#include "utils.h"\r
+\r
+#include <docobj.h>\r
+\r
+using namespace std;\r
+\r
+VLCOleObject::VLCOleObject(VLCPlugin *p_instance) :\r
+_p_clientsite(NULL), _p_instance(p_instance) \r
+{\r
+    CreateOleAdviseHolder(&_p_advise_holder);\r
+};\r
+\r
+VLCOleObject::~VLCOleObject()\r
+{\r
+    _p_advise_holder->Release();\r
+    SetClientSite(NULL); \r
+};\r
+\r
+STDMETHODIMP VLCOleObject::Advise(IAdviseSink *pAdvSink, DWORD *dwConnection)\r
+{\r
+    return _p_advise_holder->Advise(pAdvSink, dwConnection);\r
+};\r
+\r
+STDMETHODIMP VLCOleObject::Close(DWORD dwSaveOption)\r
+{\r
+    _p_advise_holder->SendOnClose();\r
+    OleFlushClipboard();\r
+    return _p_instance->onClose(dwSaveOption);\r
+};\r
+\r
+STDMETHODIMP VLCOleObject::DoVerb(LONG iVerb, LPMSG lpMsg, LPOLECLIENTSITE pActiveSite,\r
+                                    LONG lIndex, HWND hwndParent, LPCRECT lprcPosRect)\r
+{\r
+    if( 0 != lIndex )\r
+        return DV_E_LINDEX;\r
+\r
+    switch( iVerb )\r
+    {\r
+        case OLEIVERB_PRIMARY:\r
+        case OLEIVERB_SHOW:\r
+        case OLEIVERB_OPEN:\r
+        case OLEIVERB_INPLACEACTIVATE:\r
+            if( NULL == hwndParent )\r
+                return OLEOBJ_S_INVALIDHWND;\r
+\r
+            if( SUCCEEDED(doInPlaceActivate(lpMsg, pActiveSite, hwndParent, lprcPosRect)) )\r
+                return S_OK;\r
+\r
+            return OLEOBJ_S_CANNOT_DOVERB_NOW;\r
+\r
+        case OLEIVERB_HIDE:\r
+            _p_instance->setVisible(FALSE);\r
+            return S_OK;\r
+\r
+        case OLEIVERB_UIACTIVATE:\r
+            return doUIActivate(lpMsg, pActiveSite, hwndParent, lprcPosRect);\r
+\r
+        case OLEIVERB_DISCARDUNDOSTATE:\r
+            return S_OK;\r
+\r
+        default:\r
+            if( NULL == hwndParent )\r
+                return OLEOBJ_S_INVALIDHWND;\r
+\r
+            if( SUCCEEDED(doInPlaceActivate(lpMsg, pActiveSite, hwndParent, lprcPosRect)) )\r
+                return OLEOBJ_S_INVALIDVERB;\r
+\r
+            return OLEOBJ_S_CANNOT_DOVERB_NOW;\r
+    }\r
+};\r
+\r
+HRESULT VLCOleObject::doInPlaceActivate(LPMSG lpMsg, LPOLECLIENTSITE pActiveSite, HWND hwndParent, LPCRECT lprcPosRect)\r
+{\r
+    RECT posRect;\r
+    RECT clipRect;\r
+    LPCRECT lprcClipRect = lprcPosRect;\r
+\r
+    if( NULL != pActiveSite )\r
+    {\r
+        // check if already activated\r
+        if( _p_instance->isInPlaceActive() )\r
+        {\r
+            // just attempt to show object then\r
+            pActiveSite->ShowObject();\r
+            _p_instance->setVisible(TRUE);\r
+            return S_OK;\r
+        }\r
+\r
+        LPOLEINPLACESITE p_inPlaceSite;\r
+\r
+        if( SUCCEEDED(pActiveSite->QueryInterface(IID_IOleInPlaceSite, (void**)&p_inPlaceSite)) )\r
+        {\r
+            if( S_OK != p_inPlaceSite->CanInPlaceActivate() )\r
+                return E_FAIL;\r
+\r
+            LPOLEINPLACEFRAME p_inPlaceFrame;\r
+            LPOLEINPLACEUIWINDOW p_inPlaceUIWindow;\r
+            OLEINPLACEFRAMEINFO oleFrameInfo;\r
+\r
+            if( SUCCEEDED(p_inPlaceSite->GetWindowContext(&p_inPlaceFrame, &p_inPlaceUIWindow, &posRect, &clipRect, &oleFrameInfo)) )\r
+            {\r
+                lprcPosRect = &posRect;\r
+                lprcClipRect = &clipRect;\r
+\r
+                if( NULL != p_inPlaceFrame )\r
+                    p_inPlaceFrame->Release();\r
+                if( NULL != p_inPlaceUIWindow )\r
+                    p_inPlaceUIWindow->Release();\r
+            }\r
+        }\r
+\r
+        if( FAILED(_p_instance->onActivateInPlace(lpMsg, hwndParent, lprcPosRect, lprcClipRect)) )\r
+            return E_FAIL;\r
+\r
+        if( NULL != p_inPlaceSite )\r
+            p_inPlaceSite->OnPosRectChange(lprcPosRect);\r
+\r
+        pActiveSite->ShowObject();\r
+        _p_instance->setVisible(TRUE);\r
+\r
+        if( NULL != p_inPlaceSite )\r
+        {\r
+            p_inPlaceSite->OnInPlaceActivate();\r
+            p_inPlaceSite->Release();\r
+        }\r
+\r
+        if( NULL != lpMsg )\r
+        {\r
+            switch( lpMsg->message )\r
+            {\r
+                case WM_LBUTTONDOWN:\r
+                case WM_LBUTTONDBLCLK:\r
+                    doUIActivate(lpMsg, pActiveSite, hwndParent, lprcPosRect);\r
+                    break;\r
+                default:\r
+                    break;\r
+            }\r
+        }\r
+        return S_OK;\r
+    }\r
+    return E_FAIL;\r
+};\r
+\r
+HRESULT VLCOleObject::doUIActivate(LPMSG lpMsg, LPOLECLIENTSITE pActiveSite, HWND hwndParent, LPCRECT lprcPosRect)\r
+{\r
+    if( NULL != pActiveSite )\r
+    {\r
+        // check if already activated\r
+        if( ! _p_instance->isInPlaceActive() )\r
+            return OLE_E_NOT_INPLACEACTIVE;\r
+\r
+        LPOLEINPLACESITE p_inPlaceSite;\r
+\r
+        if( SUCCEEDED(pActiveSite->QueryInterface(IID_IOleInPlaceSite, (void**)&p_inPlaceSite)) )\r
+        {\r
+            p_inPlaceSite->OnUIActivate();\r
+\r
+            if( NULL != lprcPosRect )\r
+            {\r
+                p_inPlaceSite->OnPosRectChange(lprcPosRect);\r
+            }\r
+            p_inPlaceSite->Release();\r
+        }\r
+\r
+        pActiveSite->ShowObject();\r
+        _p_instance->setVisible(TRUE);\r
+        _p_instance->setFocus(TRUE);\r
+\r
+        return S_OK;\r
+    }\r
+    return E_FAIL;\r
+};\r
+\r
+STDMETHODIMP VLCOleObject::EnumAdvise(IEnumSTATDATA **ppEnumAdvise)\r
+{\r
+    return _p_advise_holder->EnumAdvise(ppEnumAdvise);\r
+};\r
+\r
+STDMETHODIMP VLCOleObject::EnumVerbs(IEnumOleVerb **ppEnumOleVerb)\r
+{\r
+    return OLE_S_USEREG;\r
+};\r
+\r
+STDMETHODIMP VLCOleObject::GetClientSite(LPOLECLIENTSITE *ppClientSite)\r
+{\r
+    if( NULL == ppClientSite )\r
+        return E_POINTER;\r
\r
+    if( NULL != _p_clientsite )\r
+        _p_clientsite->AddRef(); \r
+\r
+    *ppClientSite= _p_clientsite;\r
+    return S_OK;\r
+};\r
+\r
+STDMETHODIMP VLCOleObject::GetClipboardData(DWORD dwReserved, LPDATAOBJECT *ppDataObject)\r
+{\r
+    return E_NOTIMPL;\r
+};\r
+\r
+STDMETHODIMP VLCOleObject::GetExtent(DWORD dwDrawAspect, SIZEL *pSizel)\r
+{\r
+    return E_NOTIMPL;\r
+};\r
+\r
+STDMETHODIMP VLCOleObject::GetMiscStatus(DWORD dwAspect, DWORD *pdwStatus)\r
+{\r
+    if( NULL != pdwStatus )\r
+        return E_POINTER;\r
\r
+    *pdwStatus = OLEMISC_RECOMPOSEONRESIZE\r
+        | OLEMISC_CANTLINKINSIDE\r
+        | OLEMISC_INSIDEOUT\r
+        | OLEMISC_ACTIVATEWHENVISIBLE\r
+        | OLEMISC_SETCLIENTSITEFIRST;\r
+    return S_OK;\r
+};\r
+\r
+STDMETHODIMP VLCOleObject::GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker, LPMONIKER *ppMoniker)\r
+{\r
+    if( NULL != _p_clientsite )\r
+        return _p_clientsite->GetMoniker(dwAssign,dwWhichMoniker, ppMoniker);\r
\r
+    return E_UNEXPECTED;\r
+};\r
+\r
+STDMETHODIMP VLCOleObject::GetUserClassID(LPCLSID pClsid)\r
+{\r
+    if( NULL == pClsid )\r
+        return E_POINTER;\r
\r
+    pClsid = const_cast<LPCLSID>(&_p_instance->getClassID()); \r
+    return S_OK;\r
+};\r
+\r
+STDMETHODIMP VLCOleObject::GetUserType(DWORD dwFormOfType, LPOLESTR *pszUserType)\r
+{\r
+    return OLE_S_USEREG;\r
+};\r
+\r
+STDMETHODIMP VLCOleObject::InitFromData(LPDATAOBJECT pDataObject, BOOL fCreation, DWORD dwReserved)\r
+{\r
+    return E_NOTIMPL;\r
+};\r
+\r
+STDMETHODIMP VLCOleObject::IsUpToDate(void)\r
+{\r
+    return S_OK;\r
+};\r
+\r
+STDMETHODIMP VLCOleObject::SetClientSite(LPOLECLIENTSITE pClientSite)\r
+{\r
+    if( NULL != _p_clientsite )\r
+        _p_clientsite->Release(); \r
\r
+    if( NULL != pClientSite )\r
+    {\r
+        pClientSite->AddRef();\r
+\r
+        /*\r
+        ** retrieve container ambient properties\r
+        */\r
+        VARIANT v;\r
+        VariantInit(&v);\r
+        V_VT(&v) = VT_I4;\r
+        if( SUCCEEDED(GetObjectProperty(pClientSite, DISPID_AMBIENT_CODEPAGE, v)) )\r
+        {\r
+            _p_instance->setCodePage(V_I4(&v));\r
+            VariantClear(&v);\r
+        }\r
+    }\r
+\r
+    _p_clientsite = pClientSite;\r
+    return S_OK;\r
+};\r
+\r
+STDMETHODIMP VLCOleObject::SetColorScheme(LOGPALETTE *pLogpal)\r
+{\r
+    return E_NOTIMPL;\r
+};\r
+\r
+STDMETHODIMP VLCOleObject::SetExtent(DWORD dwDrawAspect, SIZEL *pSizel)\r
+{\r
+    return E_NOTIMPL;\r
+};\r
+\r
+STDMETHODIMP VLCOleObject::SetHostNames(LPCOLESTR szContainerApp, LPCOLESTR szContainerObj)\r
+{\r
+    return S_OK;\r
+};\r
+\r
+STDMETHODIMP VLCOleObject::SetMoniker(DWORD dwWhichMoniker, LPMONIKER pMoniker)\r
+{\r
+    return _p_advise_holder->SendOnRename(pMoniker);\r
+};\r
+\r
+STDMETHODIMP VLCOleObject::Unadvise(DWORD dwConnection)\r
+{\r
+    return _p_advise_holder->Unadvise(dwConnection);\r
+};\r
+\r
+STDMETHODIMP VLCOleObject::Update(void)\r
+{\r
+    return S_OK;\r
+};\r
+\r
diff --git a/activex/oleobject.h b/activex/oleobject.h
new file mode 100644 (file)
index 0000000..428e7f1
--- /dev/null
@@ -0,0 +1,86 @@
+/*****************************************************************************\r
+ * oleobject.h: ActiveX control for VLC\r
+ *****************************************************************************\r
+ * Copyright (C) 2005 VideoLAN\r
+ *\r
+ * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.\r
+ *****************************************************************************/\r
+\r
+#ifndef __OLEOBJECT_H__\r
+#define __OLEOBJECT_H__\r
+\r
+class VLCOleObject : public IOleObject\r
+{\r
+\r
+public:\r
+\r
+    VLCOleObject(VLCPlugin *p_instance);\r
+    virtual ~VLCOleObject();\r
+\r
+    // IUnknown methods\r
+    STDMETHODIMP QueryInterface(REFIID riid, void **ppv)\r
+    {\r
+        if( (NULL != ppv)\r
+         && (IID_IUnknown == riid)\r
+         && (IID_IOleObject == riid) ) \r
+        {\r
+            AddRef();\r
+            *ppv = reinterpret_cast<LPVOID>(this);\r
+            return NOERROR;\r
+        }\r
+        return _p_instance->QueryInterface(riid, ppv);\r
+    };\r
+\r
+    STDMETHODIMP_(ULONG) AddRef(void) { return _p_instance->AddRef(); };\r
+    STDMETHODIMP_(ULONG) Release(void) { return _p_instance->Release(); };\r
+\r
+    // IOleObject methods\r
+    STDMETHODIMP Advise(IAdviseSink *, LPDWORD);\r
+    STDMETHODIMP Close(DWORD);\r
+    STDMETHODIMP DoVerb(LONG, LPMSG, LPOLECLIENTSITE, LONG, HWND, LPCRECT);\r
+    STDMETHODIMP EnumAdvise(IEnumSTATDATA **);\r
+    STDMETHODIMP EnumVerbs(IEnumOleVerb **);\r
+    STDMETHODIMP GetClientSite(LPOLECLIENTSITE *);\r
+    STDMETHODIMP GetClipboardData(DWORD, LPDATAOBJECT *);\r
+    STDMETHODIMP GetExtent(DWORD, SIZEL *);\r
+    STDMETHODIMP GetMiscStatus(DWORD, DWORD *);\r
+    STDMETHODIMP GetMoniker(DWORD, DWORD, LPMONIKER *);\r
+    STDMETHODIMP GetUserClassID(CLSID *);\r
+    STDMETHODIMP GetUserType(DWORD, LPOLESTR *);\r
+    STDMETHODIMP InitFromData(IDataObject *, BOOL, DWORD);\r
+    STDMETHODIMP IsUpToDate(void);\r
+    STDMETHODIMP SetClientSite(LPOLECLIENTSITE);\r
+    STDMETHODIMP SetColorScheme(LOGPALETTE *);\r
+    STDMETHODIMP SetExtent(DWORD, SIZEL *);\r
+    STDMETHODIMP SetHostNames(LPCOLESTR, LPCOLESTR) ;\r
+    STDMETHODIMP SetMoniker(DWORD, LPMONIKER);\r
+    STDMETHODIMP Unadvise(DWORD);\r
+    STDMETHODIMP Update(void);\r
+\r
+private:\r
+\r
+    HRESULT doInPlaceActivate(LPMSG lpMsg, LPOLECLIENTSITE pActiveSite, HWND hwndParent, LPCRECT lprcPosRect);\r
+    HRESULT doUIActivate(LPMSG lpMsg, LPOLECLIENTSITE pActiveSite, HWND hwndParent, LPCRECT lprcPosRect);\r
+\r
+    IOleAdviseHolder *_p_advise_holder;\r
+    IOleClientSite *_p_clientsite;\r
+\r
+    VLCPlugin *_p_instance;\r
+};\r
+\r
+#endif\r
+\r
diff --git a/activex/persistpropbag.cpp b/activex/persistpropbag.cpp
new file mode 100644 (file)
index 0000000..76c5941
--- /dev/null
@@ -0,0 +1,125 @@
+/*****************************************************************************\r
+ * persistpropbag.cpp: ActiveX control for VLC\r
+ *****************************************************************************\r
+ * Copyright (C) 2005 VideoLAN\r
+ *\r
+ * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.\r
+ *****************************************************************************/\r
+\r
+#include "plugin.h"\r
+#include "persistpropbag.h"\r
+\r
+#include "utils.h"\r
+\r
+using namespace std;\r
+\r
+STDMETHODIMP VLCPersistPropertyBag::GetClassID(LPCLSID pClsID)\r
+{\r
+    if( NULL == pClsID )\r
+        return E_POINTER;\r
+\r
+    *pClsID = _p_instance->getClassID();\r
+\r
+    return S_OK;\r
+};\r
+\r
+STDMETHODIMP VLCPersistPropertyBag::InitNew(void)\r
+{\r
+    return _p_instance->onInitNew();\r
+};\r
+\r
+STDMETHODIMP VLCPersistPropertyBag::Load(LPPROPERTYBAG pPropBag, LPERRORLOG pErrorLog)\r
+{\r
+    if( NULL == pPropBag )\r
+        return E_POINTER;\r
+\r
+    HRESULT hr = _p_instance->onInitNew();\r
+    if( FAILED(hr) )\r
+        return hr;\r
+\r
+    VARIANT value;\r
+\r
+    V_VT(&value) = VT_BSTR;\r
+    if( S_OK == pPropBag->Read(OLESTR("filename"), &value, pErrorLog) )\r
+    {\r
+        char *src = CStrFromBSTR(_p_instance->getCodePage(), V_BSTR(&value));\r
+        if( NULL != src )\r
+        {\r
+            _p_instance->setSourceURL(src);\r
+            free(src);\r
+        }\r
+        VariantClear(&value);\r
+    }\r
+\r
+    V_VT(&value) = VT_BSTR;\r
+    if( S_OK == pPropBag->Read(OLESTR("src"), &value, pErrorLog) )\r
+    {\r
+        char *src = CStrFromBSTR(_p_instance->getCodePage(), V_BSTR(&value));\r
+        if( NULL != src )\r
+        {\r
+            _p_instance->setSourceURL(src);\r
+            free(src);\r
+        }\r
+        VariantClear(&value);\r
+    }\r
+\r
+    V_VT(&value) = VT_BOOL;\r
+    if( S_OK == pPropBag->Read(OLESTR("autoplay"), &value, pErrorLog) )\r
+    {\r
+        _p_instance->setAutoStart(V_BOOL(&value) != VARIANT_FALSE);\r
+        VariantClear(&value);\r
+    }\r
+\r
+    V_VT(&value) = VT_BOOL;\r
+    if( S_OK == pPropBag->Read(OLESTR("autostart"), &value, pErrorLog) )\r
+    {\r
+        _p_instance->setAutoStart(V_BOOL(&value) != VARIANT_FALSE);\r
+        VariantClear(&value);\r
+    }\r
+\r
+    V_VT(&value) = VT_BOOL;\r
+    if( S_OK == pPropBag->Read(OLESTR("loop"), &value, pErrorLog) )\r
+    {\r
+        _p_instance->setLoopMode(V_BOOL(&value) != VARIANT_FALSE);\r
+        VariantClear(&value);\r
+    }\r
+\r
+    V_VT(&value) = VT_BOOL;\r
+    if( S_OK == pPropBag->Read(OLESTR("mute"), &value, pErrorLog) )\r
+    {\r
+        _p_instance->setMute(V_BOOL(&value) != VARIANT_FALSE);\r
+        VariantClear(&value);\r
+    }\r
+\r
+    V_VT(&value) = VT_BOOL;\r
+    if( S_OK == pPropBag->Read(OLESTR("showdisplay"), &value, pErrorLog) )\r
+    {\r
+        _p_instance->setShowDisplay(V_BOOL(&value) != VARIANT_FALSE);\r
+        VariantClear(&value);\r
+    }\r
+\r
+    return S_OK;\r
+};\r
+\r
+STDMETHODIMP VLCPersistPropertyBag::Save(LPPROPERTYBAG pPropBag, BOOL fClearDiry, BOOL fSaveAllProperties)\r
+{\r
+    if( NULL == pPropBag )\r
+        return E_POINTER;\r
+\r
+    return S_OK;\r
+};\r
+\r
diff --git a/activex/persistpropbag.h b/activex/persistpropbag.h
new file mode 100644 (file)
index 0000000..c042547
--- /dev/null
@@ -0,0 +1,67 @@
+/*****************************************************************************\r
+ * persistpropbag.h: ActiveX control for VLC\r
+ *****************************************************************************\r
+ * Copyright (C) 2005 VideoLAN\r
+ *\r
+ * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.\r
+ *****************************************************************************/\r
+\r
+#ifndef __PERSISTPROPBAG_H__\r
+#define __PERSISTPROPBAG_H__\r
+\r
+#include <ocidl.h>\r
+\r
+class VLCPersistPropertyBag : public IPersistPropertyBag\r
+{\r
+\r
+public:\r
+\r
+    VLCPersistPropertyBag(VLCPlugin *p_instance) : _p_instance(p_instance) {};\r
+    virtual ~VLCPersistPropertyBag() {};\r
+\r
+    // IUnknown methods\r
+    STDMETHODIMP QueryInterface(REFIID riid, void **ppv)\r
+    {\r
+        if( (NULL != ppv)\r
+         && (IID_IUnknown == riid) \r
+         && (IID_IPersist == riid) \r
+         && (IID_IPersistPropertyBag == riid) ) {\r
+            AddRef();\r
+            *ppv = reinterpret_cast<LPVOID>(this);\r
+            return NOERROR;\r
+        }\r
+        return _p_instance->QueryInterface(riid, ppv);\r
+    };\r
+\r
+    STDMETHODIMP_(ULONG) AddRef(void) { return _p_instance->AddRef(); };\r
+    STDMETHODIMP_(ULONG) Release(void) { return _p_instance->Release(); };\r
+\r
+    // IPersist methods\r
+    STDMETHODIMP GetClassID(LPCLSID);\r
+\r
+    // IPersistPropertyBag methods\r
+    STDMETHODIMP InitNew(void);\r
+    STDMETHODIMP Load(LPPROPERTYBAG, LPERRORLOG);\r
+    STDMETHODIMP Save(LPPROPERTYBAG, BOOL, BOOL);\r
+\r
+private:\r
+\r
+    VLCPlugin *_p_instance;\r
+};\r
+\r
+#endif\r
+\r
diff --git a/activex/persiststorage.cpp b/activex/persiststorage.cpp
new file mode 100644 (file)
index 0000000..b1bf657
--- /dev/null
@@ -0,0 +1,79 @@
+/*****************************************************************************\r
+ * persiststorage.cpp: ActiveX control for VLC\r
+ *****************************************************************************\r
+ * Copyright (C) 2005 VideoLAN\r
+ *\r
+ * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.\r
+ *****************************************************************************/\r
+\r
+#include "plugin.h"\r
+#include "persiststorage.h"\r
+\r
+using namespace std;\r
+\r
+STDMETHODIMP VLCPersistStorage::GetClassID(LPCLSID pClsID)\r
+{\r
+    if( NULL == pClsID )\r
+        return E_POINTER;\r
+\r
+    *pClsID = _p_instance->getClassID();\r
+\r
+    return S_OK;\r
+};\r
+\r
+STDMETHODIMP VLCPersistStorage::IsDirty(void)\r
+{\r
+    return S_FALSE;\r
+};\r
+\r
+STDMETHODIMP VLCPersistStorage::InitNew(IStorage *pStg)\r
+{\r
+    if( NULL == pStg )\r
+        return E_POINTER;\r
+\r
+    return _p_instance->onInitNew();\r
+};\r
+\r
+STDMETHODIMP VLCPersistStorage::Load(IStorage *pStg)\r
+{\r
+    if( NULL == pStg )\r
+        return E_POINTER;\r
+\r
+    return _p_instance->onInitNew();\r
+};\r
+\r
+STDMETHODIMP VLCPersistStorage::Save(IStorage *pStg, BOOL fSameAsLoad)\r
+{\r
+    if( NULL == pStg )\r
+        return E_POINTER;\r
+\r
+    return S_OK;\r
+};\r
+\r
+STDMETHODIMP VLCPersistStorage::SaveCompleted(IStorage *pStg)\r
+{\r
+    if( NULL == pStg )\r
+        return E_POINTER;\r
+\r
+    return S_OK;\r
+};\r
+\r
+STDMETHODIMP VLCPersistStorage::HandsOffStorage(void)\r
+{\r
+    return S_OK;\r
+};\r
+\r
diff --git a/activex/persiststorage.h b/activex/persiststorage.h
new file mode 100644 (file)
index 0000000..c20599a
--- /dev/null
@@ -0,0 +1,70 @@
+/*****************************************************************************\r
+ * persiststorage.h: ActiveX control for VLC\r
+ *****************************************************************************\r
+ * Copyright (C) 2005 VideoLAN\r
+ *\r
+ * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.\r
+ *****************************************************************************/\r
+\r
+#ifndef __PERSISTSTORAGE_H__\r
+#define __PERSISTSTORAGE_H__\r
+\r
+#include <ocidl.h>\r
+\r
+class VLCPersistStorage : public IPersistStorage\r
+{\r
+\r
+public:\r
+\r
+    VLCPersistStorage(VLCPlugin *p_instance) : _p_instance(p_instance) {};\r
+    virtual ~VLCPersistStorage() {};\r
+\r
+    // IUnknown methods\r
+    STDMETHODIMP QueryInterface(REFIID riid, void **ppv)\r
+    {\r
+        if( (NULL != ppv)\r
+         && (IID_IUnknown == riid) \r
+         && (IID_IPersist == riid) \r
+         && (IID_IPersistStorage == riid) ) {\r
+            AddRef();\r
+            *ppv = reinterpret_cast<LPVOID>(this);\r
+            return NOERROR;\r
+        }\r
+        return _p_instance->QueryInterface(riid, ppv);\r
+    };\r
+\r
+    STDMETHODIMP_(ULONG) AddRef(void) { return _p_instance->AddRef(); };\r
+    STDMETHODIMP_(ULONG) Release(void) { return _p_instance->Release(); };\r
+\r
+    // IPersist methods\r
+    STDMETHODIMP GetClassID(LPCLSID);\r
+\r
+    // IPersistStorage methods\r
+    STDMETHODIMP IsDirty(void);\r
+    STDMETHODIMP InitNew(IStorage *);\r
+    STDMETHODIMP Load(IStorage *);\r
+    STDMETHODIMP Save(IStorage *, BOOL);\r
+    STDMETHODIMP SaveCompleted(IStorage *);\r
+    STDMETHODIMP HandsOffStorage(void);\r
+\r
+private:\r
+\r
+    VLCPlugin *_p_instance;\r
+};\r
+\r
+#endif\r
+\r
diff --git a/activex/persiststreaminit.cpp b/activex/persiststreaminit.cpp
new file mode 100644 (file)
index 0000000..421036f
--- /dev/null
@@ -0,0 +1,70 @@
+/*****************************************************************************\r
+ * persiststreaminit.cpp: ActiveX control for VLC\r
+ *****************************************************************************\r
+ * Copyright (C) 2005 VideoLAN\r
+ *\r
+ * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.\r
+ *****************************************************************************/\r
+\r
+#include "plugin.h"\r
+#include "persiststreaminit.h"\r
+\r
+using namespace std;\r
+\r
+STDMETHODIMP VLCPersistStreamInit::GetClassID(LPCLSID pClsID)\r
+{\r
+    if( NULL == pClsID )\r
+        return E_POINTER;\r
+\r
+    *pClsID = _p_instance->getClassID();\r
+\r
+    return S_OK;\r
+};\r
+\r
+STDMETHODIMP VLCPersistStreamInit::InitNew(void)\r
+{\r
+    return _p_instance->onInitNew();\r
+};\r
+\r
+STDMETHODIMP VLCPersistStreamInit::Load(LPSTREAM pStm)\r
+{\r
+    if( NULL == pStm )\r
+        return E_POINTER;\r
+\r
+    return _p_instance->onInitNew();\r
+};\r
+\r
+STDMETHODIMP VLCPersistStreamInit::Save(LPSTREAM pStm, BOOL fClearDirty)\r
+{\r
+    if( NULL == pStm )\r
+        return E_POINTER;\r
+\r
+    return S_OK;\r
+};\r
+\r
+STDMETHODIMP VLCPersistStreamInit::IsDirty(void)\r
+{\r
+    return S_FALSE;\r
+};\r
+\r
+STDMETHODIMP VLCPersistStreamInit::GetSizeMax(ULARGE_INTEGER *pcbSize)\r
+{\r
+    pcbSize->QuadPart = 0ULL;\r
+\r
+    return S_OK;\r
+};\r
+\r
diff --git a/activex/persiststreaminit.h b/activex/persiststreaminit.h
new file mode 100644 (file)
index 0000000..bfead1b
--- /dev/null
@@ -0,0 +1,69 @@
+/*****************************************************************************\r
+ * persiststreaminit.h: ActiveX control for VLC\r
+ *****************************************************************************\r
+ * Copyright (C) 2005 VideoLAN\r
+ *\r
+ * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.\r
+ *****************************************************************************/\r
+\r
+#ifndef __PERSISTSTREAMINIT_H__\r
+#define __PERSISTSTREAMINIT_H__\r
+\r
+#include <ocidl.h>\r
+\r
+class VLCPersistStreamInit : public IPersistStreamInit\r
+{\r
+\r
+public:\r
+\r
+    VLCPersistStreamInit(VLCPlugin *p_instance) : _p_instance(p_instance) {};\r
+    virtual ~VLCPersistStreamInit() {};\r
+\r
+    // IUnknown methods\r
+    STDMETHODIMP QueryInterface(REFIID riid, void **ppv)\r
+    {\r
+        if( (NULL != ppv)\r
+         && (IID_IUnknown == riid) \r
+         && (IID_IPersist == riid) \r
+         && (IID_IPersistStreamInit == riid) ) {\r
+            AddRef();\r
+            *ppv = reinterpret_cast<LPVOID>(this);\r
+            return NOERROR;\r
+        }\r
+        return _p_instance->QueryInterface(riid, ppv);\r
+    };\r
+\r
+    STDMETHODIMP_(ULONG) AddRef(void) { return _p_instance->AddRef(); };\r
+    STDMETHODIMP_(ULONG) Release(void) { return _p_instance->Release(); };\r
+\r
+    // IPersist methods\r
+    STDMETHODIMP GetClassID(LPCLSID);\r
+\r
+    // IPersistStreamInit methods\r
+    STDMETHODIMP IsDirty(void);\r
+    STDMETHODIMP InitNew(void);\r
+    STDMETHODIMP Load(LPSTREAM);\r
+    STDMETHODIMP Save(LPSTREAM, BOOL);\r
+    STDMETHODIMP GetSizeMax(ULARGE_INTEGER *);\r
+\r
+private:\r
+\r
+    VLCPlugin *_p_instance;\r
+};\r
+\r
+#endif\r
+\r
diff --git a/activex/plugin.cpp b/activex/plugin.cpp
new file mode 100644 (file)
index 0000000..0b0cef2
--- /dev/null
@@ -0,0 +1,767 @@
+/*****************************************************************************\r
+ * plugin.cpp: ActiveX control for VLC\r
+ *****************************************************************************\r
+ * Copyright (C) 2005 VideoLAN\r
+ *\r
+ * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.\r
+ *****************************************************************************/\r
+\r
+#include "plugin.h"\r
+\r
+#include "oleobject.h"\r
+#include "olecontrol.h"\r
+#include "oleinplaceobject.h"\r
+#include "oleinplaceactiveobject.h"\r
+#include "persistpropbag.h"\r
+#include "persiststreaminit.h"\r
+#include "persiststorage.h"\r
+#include "provideclassinfo.h"\r
+#include "connectioncontainer.h"\r
+#include "objectsafety.h"\r
+#include "vlccontrol.h"\r
+\r
+#include "utils.h"\r
+\r
+#include <string.h>\r
+#include <winreg.h>\r
+\r
+using namespace std;\r
+\r
+////////////////////////////////////////////////////////////////////////\r
+//class factory\r
+\r
+// {E23FE9C6-778E-49d4-B537-38FCDE4887D8}\r
+//const GUID CLSID_VLCPlugin = \r
+//    { 0xe23fe9c6, 0x778e, 0x49d4, { 0xb5, 0x37, 0x38, 0xfc, 0xde, 0x48, 0x87, 0xd8 } };\r
+\r
+static LRESULT CALLBACK VLCInPlaceClassWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {\r
+    switch( uMsg )\r
+    {\r
+        case WM_ERASEBKGND:\r
+            return 1L;\r
+\r
+        case WM_PAINT:\r
+            PAINTSTRUCT ps;\r
+            if( GetUpdateRect(hWnd, NULL, FALSE) )\r
+            {\r
+                BeginPaint(hWnd, &ps);\r
+                EndPaint(hWnd, &ps);\r
+            }\r
+            return 0L;\r
+\r
+        default:\r
+            return DefWindowProc(hWnd, uMsg, wParam, lParam);\r
+    }\r
+};\r
+\r
+static LRESULT CALLBACK VLCVideoClassWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {\r
+    VLCPlugin *p_instance = reinterpret_cast<VLCPlugin *>(GetWindowLongPtr(hWnd, GWLP_USERDATA));\r
+\r
+    switch( uMsg )\r
+    {\r
+        case WM_ERASEBKGND:\r
+            return 1L;\r
+\r
+        case WM_PAINT:\r
+            PAINTSTRUCT ps;\r
+            RECT pr;\r
+            if( GetUpdateRect(hWnd, &pr, FALSE) )\r
+            {\r
+                BeginPaint(hWnd, &ps);\r
+                p_instance->onPaint(ps, pr);\r
+                EndPaint(hWnd, &ps);\r
+            }\r
+            return 0L;\r
+\r
+        default:\r
+            return DefWindowProc(hWnd, uMsg, wParam, lParam);\r
+    }\r
+};\r
+\r
+VLCPluginClass::VLCPluginClass(LONG *p_class_ref, HINSTANCE hInstance) :\r
+    _p_class_ref(p_class_ref),\r
+    _hinstance(hInstance)\r
+{\r
+    WNDCLASS wClass;\r
+\r
+    if( ! GetClassInfo(hInstance, getInPlaceWndClassName(), &wClass) )\r
+    {\r
+        wClass.style          = CS_NOCLOSE|CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;\r
+        wClass.lpfnWndProc    = VLCInPlaceClassWndProc;\r
+        wClass.cbClsExtra     = 0;\r
+        wClass.cbWndExtra     = 0;\r
+        wClass.hInstance      = hInstance;\r
+        wClass.hIcon          = NULL;\r
+        wClass.hCursor        = LoadCursor(NULL, IDC_ARROW);\r
+        wClass.hbrBackground  = NULL;\r
+        wClass.lpszMenuName   = NULL;\r
+        wClass.lpszClassName  = getInPlaceWndClassName();\r
+       \r
+        _inplace_wndclass_atom = RegisterClass(&wClass);\r
+    }\r
+    else\r
+    {\r
+        _inplace_wndclass_atom = 0;\r
+    }\r
+\r
+    if( ! GetClassInfo(hInstance, getVideoWndClassName(), &wClass) )\r
+    {\r
+        wClass.style          = CS_NOCLOSE|CS_HREDRAW|CS_VREDRAW;\r
+        wClass.lpfnWndProc    = VLCVideoClassWndProc;\r
+        wClass.cbClsExtra     = 0;\r
+        wClass.cbWndExtra     = 0;\r
+        wClass.hInstance      = hInstance;\r
+        wClass.hIcon          = NULL;\r
+        wClass.hCursor        = LoadCursor(NULL, IDC_ARROW);\r
+        wClass.hbrBackground  = NULL;\r
+        wClass.lpszMenuName   = NULL;\r
+        wClass.lpszClassName  = getVideoWndClassName();\r
+       \r
+        _video_wndclass_atom = RegisterClass(&wClass);\r
+    }\r
+    else\r
+    {\r
+        _video_wndclass_atom = 0;\r
+    }\r
+\r
+    _inplace_hbitmap = (HBITMAP)LoadImage(getHInstance(), TEXT("INPLACE-PICT"), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);\r
+\r
+    AddRef();\r
+};\r
+\r
+VLCPluginClass::~VLCPluginClass()\r
+{\r
+    if( 0 != _inplace_wndclass_atom )\r
+        UnregisterClass(MAKEINTATOM(_inplace_wndclass_atom), _hinstance);\r
+\r
+    if( 0 != _video_wndclass_atom )\r
+        UnregisterClass(MAKEINTATOM(_video_wndclass_atom), _hinstance);\r
+\r
+    if( NULL != _inplace_hbitmap )\r
+        DeleteObject(_inplace_hbitmap);\r
+};\r
+\r
+STDMETHODIMP VLCPluginClass::QueryInterface(REFIID riid, void **ppv)\r
+{\r
+    if( NULL == ppv )\r
+        return E_INVALIDARG;\r
+\r
+    if( (IID_IUnknown == riid) || (IID_IClassFactory == riid) )\r
+    {\r
+        AddRef();\r
+        *ppv = reinterpret_cast<LPVOID>(this);\r
+\r
+        return NOERROR;\r
+    }\r
+\r
+    *ppv = NULL;\r
+\r
+    return E_NOINTERFACE;\r
+};\r
+\r
+STDMETHODIMP_(ULONG) VLCPluginClass::AddRef(void)\r
+{\r
+    return InterlockedIncrement(_p_class_ref);\r
+};\r
+\r
+STDMETHODIMP_(ULONG) VLCPluginClass::Release(void)\r
+{\r
+    ULONG refcount = InterlockedDecrement(_p_class_ref);\r
+    if( 0 == refcount )\r
+    {\r
+        delete this;\r
+        return 0;\r
+    }\r
+    return refcount;\r
+};\r
+\r
+STDMETHODIMP VLCPluginClass::CreateInstance(IUnknown *pUnkOuter, REFIID riid, void **ppv)\r
+{\r
+    if( NULL == ppv )\r
+        return E_POINTER;\r
+\r
+    *ppv = NULL;\r
+\r
+    if( NULL != pUnkOuter )\r
+        return CLASS_E_NOAGGREGATION;\r
+\r
+    VLCPlugin *plugin = new VLCPlugin(this);\r
+    if( NULL != plugin )\r
+    {\r
+        HRESULT hr = plugin->QueryInterface(riid, ppv);\r
+        plugin->Release();\r
+        return hr;\r
+    }\r
+    return E_OUTOFMEMORY;\r
+};\r
+\r
+STDMETHODIMP VLCPluginClass::LockServer(BOOL fLock)\r
+{\r
+    if( fLock )\r
+        AddRef();\r
+    else \r
+        Release();\r
+\r
+    return S_OK;\r
+};\r
+\r
+////////////////////////////////////////////////////////////////////////\r
+\r
+VLCPlugin::VLCPlugin(VLCPluginClass *p_class) :\r
+    _inplacewnd(NULL),\r
+    _p_class(p_class),\r
+    _i_ref(1UL),\r
+    _codepage(CP_ACP),\r
+    _psz_src(NULL),\r
+    _b_autostart(TRUE),\r
+    _b_loopmode(FALSE),\r
+    _b_showdisplay(TRUE),\r
+    _b_sendevents(TRUE),\r
+    _i_vlc(0)\r
+{\r
+    p_class->AddRef();\r
+\r
+    vlcOleObject = new VLCOleObject(this);\r
+    vlcOleControl = new VLCOleControl(this);\r
+    vlcOleInPlaceObject = new VLCOleInPlaceObject(this);\r
+    vlcOleInPlaceActiveObject = new VLCOleInPlaceActiveObject(this);\r
+    vlcPersistStorage = new VLCPersistStorage(this);\r
+    vlcPersistStreamInit = new VLCPersistStreamInit(this);\r
+    vlcPersistPropertyBag = new VLCPersistPropertyBag(this);\r
+    vlcProvideClassInfo = new VLCProvideClassInfo(this);\r
+    vlcConnectionPointContainer = new VLCConnectionPointContainer(this);\r
+    vlcObjectSafety = new VLCObjectSafety(this);\r
+    vlcControl = new VLCControl(this);\r
+};\r
+\r
+VLCPlugin::~VLCPlugin()\r
+{\r
+    vlcOleInPlaceObject->UIDeactivate();\r
+    vlcOleInPlaceObject->InPlaceDeactivate();\r
+\r
+    delete vlcControl;\r
+    delete vlcObjectSafety;\r
+    delete vlcConnectionPointContainer;\r
+    delete vlcProvideClassInfo;\r
+    delete vlcPersistPropertyBag;\r
+    delete vlcPersistStreamInit;\r
+    delete vlcPersistStorage;\r
+    delete vlcOleInPlaceActiveObject;\r
+    delete vlcOleInPlaceObject;\r
+    delete vlcOleControl;\r
+    delete vlcOleObject;\r
+\r
+    if( _psz_src )\r
+        free(_psz_src);\r
+\r
+    _p_class->Release();\r
+};\r
+\r
+STDMETHODIMP VLCPlugin::QueryInterface(REFIID riid, void **ppv)\r
+{\r
+    if( NULL == ppv )\r
+        return E_INVALIDARG;\r
+\r
+    if( IID_IUnknown == riid )\r
+    {\r
+        AddRef();\r
+        *ppv = reinterpret_cast<LPVOID>(this);\r
+        return NOERROR;\r
+    }\r
+    else if( IID_IOleObject == riid )\r
+    {\r
+        AddRef();\r
+        *ppv = reinterpret_cast<LPVOID>(vlcOleObject);\r
+        return NOERROR;\r
+    }\r
+    else if( IID_IOleControl == riid )\r
+    {\r
+        AddRef();\r
+        *ppv = reinterpret_cast<LPVOID>(vlcOleControl);\r
+        return NOERROR;\r
+    }\r
+    else if( IID_IOleWindow == riid )\r
+    {\r
+        AddRef();\r
+        *ppv = reinterpret_cast<LPVOID>(vlcOleInPlaceObject);\r
+        return NOERROR;\r
+    }\r
+    else if( IID_IOleInPlaceObject == riid )\r
+    {\r
+        AddRef();\r
+        *ppv = reinterpret_cast<LPVOID>(vlcOleInPlaceObject);\r
+        return NOERROR;\r
+    }\r
+    else if( IID_IOleInPlaceActiveObject == riid )\r
+    {\r
+        AddRef();\r
+        *ppv = reinterpret_cast<LPVOID>(vlcOleInPlaceActiveObject);\r
+        return NOERROR;\r
+    }\r
+    else if( IID_IPersist == riid )\r
+    {\r
+        AddRef();\r
+        *ppv = reinterpret_cast<LPVOID>(vlcPersistPropertyBag);\r
+        return NOERROR;\r
+    }\r
+    else if( IID_IPersistStreamInit == riid )\r
+    {\r
+        AddRef();\r
+        *ppv = reinterpret_cast<LPVOID>(vlcPersistStreamInit);\r
+        return NOERROR;\r
+    }\r
+    else if( IID_IPersistStorage == riid )\r
+    {\r
+        AddRef();\r
+        *ppv = reinterpret_cast<LPVOID>(vlcPersistStorage);\r
+        return NOERROR;\r
+    }\r
+    else if( IID_IPersistPropertyBag == riid )\r
+    {\r
+        AddRef();\r
+        *ppv = reinterpret_cast<LPVOID>(vlcPersistPropertyBag);\r
+        return NOERROR;\r
+    }\r
+    else if( IID_IProvideClassInfo == riid )\r
+    {\r
+        AddRef();\r
+        *ppv = reinterpret_cast<LPVOID>(vlcProvideClassInfo);\r
+        return NOERROR;\r
+    }\r
+    else if( IID_IProvideClassInfo2 == riid )\r
+    {\r
+        AddRef();\r
+        *ppv = reinterpret_cast<LPVOID>(vlcProvideClassInfo);\r
+        return NOERROR;\r
+    }\r
+    else if( IID_IConnectionPointContainer == riid )\r
+    {\r
+        AddRef();\r
+        *ppv = reinterpret_cast<LPVOID>(vlcConnectionPointContainer);\r
+        return NOERROR;\r
+    }\r
+    else if( IID_IObjectSafety == riid )\r
+    {\r
+        AddRef();\r
+        *ppv = reinterpret_cast<LPVOID>(vlcObjectSafety);\r
+        return NOERROR;\r
+    }\r
+    else if( IID_IDispatch == riid )\r
+    {\r
+        AddRef();\r
+        *ppv = reinterpret_cast<LPVOID>(vlcControl);\r
+        return NOERROR;\r
+    }\r
+    else if( IID_IVLCControl == riid )\r
+    {\r
+        AddRef();\r
+        *ppv = reinterpret_cast<LPVOID>(vlcControl);\r
+        return NOERROR;\r
+    }\r
+\r
+    *ppv = NULL;\r
+\r
+    return E_NOINTERFACE;\r
+};\r
+\r
+STDMETHODIMP_(ULONG) VLCPlugin::AddRef(void)\r
+{\r
+    return InterlockedIncrement((LONG *)&_i_ref);\r
+};\r
+\r
+STDMETHODIMP_(ULONG) VLCPlugin::Release(void)\r
+{\r
+    if( ! InterlockedDecrement((LONG *)&_i_ref) )\r
+    {\r
+        delete this;\r
+        return 0;\r
+    }\r
+    return _i_ref;\r
+};\r
+\r
+//////////////////////////////////////\r
+\r
+/*\r
+** we use an in-place child window to represent plugin viewport,\r
+** whose size is limited by the clipping rectangle\r
+** all drawing within this window must follow \r
+** cartesian coordinate system represented by _bounds.\r
+*/\r
+\r
+void VLCPlugin::calcPositionChange(LPRECT lprPosRect, LPCRECT lprcClipRect)\r
+{\r
+    _bounds.right  = lprPosRect->right-lprPosRect->left;\r
+\r
+    if( lprcClipRect->left <= lprPosRect->left )\r
+    {\r
+        // left side is not clipped out\r
+        _bounds.left = 0;\r
+\r
+        if( lprcClipRect->right >= lprPosRect->right )\r
+        {\r
+            // right side is not clipped out, no change\r
+        }\r
+        else if( lprcClipRect->right >= lprPosRect->left )\r
+        {\r
+            // right side is clipped out\r
+            lprPosRect->right = lprcClipRect->right;\r
+        }\r
+        else\r
+        {\r
+            // outside of clipping rectange, not visible\r
+            lprPosRect->right = lprPosRect->left;\r
+        }\r
+    }\r
+    else\r
+    {\r
+        // left side is clipped out\r
+        _bounds.left = lprPosRect->left-lprcClipRect->left;\r
+        _bounds.right += _bounds.left;\r
+\r
+        lprPosRect->left = lprcClipRect->left;\r
+        if( lprcClipRect->right >= lprPosRect->right )\r
+        {\r
+            // right side is not clipped out\r
+        }\r
+        else\r
+        {\r
+            // right side is clipped out\r
+            lprPosRect->right = lprcClipRect->right;\r
+        }\r
+    }\r
+\r
+    _bounds.bottom = lprPosRect->bottom-lprPosRect->top;\r
+\r
+    if( lprcClipRect->top <= lprPosRect->top )\r
+    {\r
+        // top side is not clipped out\r
+        _bounds.top = 0;\r
+\r
+        if( lprcClipRect->bottom >= lprPosRect->bottom )\r
+        {\r
+            // bottom side is not clipped out, no change\r
+        }\r
+        else if( lprcClipRect->bottom >= lprPosRect->top )\r
+        {\r
+            // bottom side is clipped out\r
+            lprPosRect->bottom = lprcClipRect->bottom;\r
+        }\r
+        else\r
+        {\r
+            // outside of clipping rectange, not visible\r
+            lprPosRect->right = lprPosRect->left;\r
+        }\r
+    }\r
+    else\r
+    {\r
+        _bounds.top = lprPosRect->top-lprcClipRect->top;\r
+        _bounds.bottom += _bounds.top;\r
+\r
+        lprPosRect->top = lprcClipRect->top;\r
+        if( lprcClipRect->bottom >= lprPosRect->bottom )\r
+        {\r
+            // bottom side is not clipped out\r
+        }\r
+        else\r
+        {\r
+            // bottom side is clipped out\r
+            lprPosRect->bottom = lprcClipRect->bottom;\r
+        }\r
+    }\r
+};\r
+\r
+HRESULT VLCPlugin::onInitNew(void)\r
+{\r
+    if( 0 == _i_vlc )\r
+    {\r
+        char *ppsz_argv[] = { "vlc", "-vv" };\r
+        HKEY h_key;\r
+        DWORD i_type, i_data = MAX_PATH + 1;\r
+        char p_data[MAX_PATH + 1];\r
+        if( RegOpenKeyEx( HKEY_LOCAL_MACHINE, "Software\\VideoLAN\\VLC",\r
+                          0, KEY_READ, &h_key ) == ERROR_SUCCESS )\r
+        {\r
+             if( RegQueryValueEx( h_key, "InstallDir", 0, &i_type,\r
+                                  (LPBYTE)p_data, &i_data ) == ERROR_SUCCESS )\r
+             {\r
+                 if( i_type == REG_SZ )\r
+                 {\r
+                     strcat( p_data, "\\vlc" );\r
+                     ppsz_argv[0] = p_data;\r
+                 }\r
+             }\r
+             RegCloseKey( h_key );\r
+        }\r
+\r
+#if 0\r
+        ppsz_argv[0] = "C:\\cygwin\\home\\Damien_Fouilleul\\dev\\videolan\\vlc-trunk\\vlc";\r
+#endif\r
+\r
+        _i_vlc = VLC_Create();\r
+        \r
+        if( VLC_Init(_i_vlc, sizeof(ppsz_argv)/sizeof(char*), ppsz_argv) )\r
+        {\r
+            VLC_Destroy(_i_vlc);\r
+            _i_vlc = 0;\r
+            return E_FAIL;\r
+        }\r
+        return S_OK;\r
+    }\r
+    return E_UNEXPECTED;\r
+};\r
+    \r
+HRESULT VLCPlugin::onClose(DWORD dwSaveOption)\r
+{\r
+    if( _i_vlc )\r
+    {\r
+        if( isInPlaceActive() )\r
+        {\r
+            onInPlaceDeactivate();\r
+        }\r
+\r
+        VLC_CleanUp(_i_vlc);\r
+        VLC_Destroy(_i_vlc);\r
+        _i_vlc = 0;\r
+    }\r
+    return S_OK;\r
+};\r
+\r
+BOOL VLCPlugin::isInPlaceActive(void)\r
+{\r
+    return (NULL != _inplacewnd);\r
+};\r
+\r
+HRESULT VLCPlugin::onActivateInPlace(LPMSG lpMesg, HWND hwndParent, LPCRECT lprcPosRect, LPCRECT lprcClipRect)\r
+{\r
+    RECT posRect = *lprcPosRect;\r
+\r
+    calcPositionChange(&posRect, lprcClipRect);\r
+\r
+    _inplacewnd = CreateWindow(_p_class->getInPlaceWndClassName(),\r
+            "VLC Plugin In-Place Window",\r
+            WS_CHILD|WS_CLIPCHILDREN|WS_TABSTOP,\r
+            posRect.left,\r
+            posRect.top,\r
+            posRect.right-posRect.left,\r
+            posRect.bottom-posRect.top,\r
+            hwndParent,\r
+            0,\r
+            _p_class->getHInstance(),\r
+            NULL\r
+           );\r
+\r
+    if( NULL == _inplacewnd )\r
+        return E_FAIL;\r
+\r
+    SetWindowLongPtr(_inplacewnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(this));\r
+\r
+    _videownd = CreateWindow(_p_class->getVideoWndClassName(),\r
+            "VLC Plugin Video Window",\r
+            WS_CHILD|WS_CLIPCHILDREN|WS_VISIBLE,\r
+            _bounds.left,\r
+            _bounds.top,\r
+            _bounds.right-_bounds.left,\r
+            _bounds.bottom-_bounds.top,\r
+            _inplacewnd,\r
+            0,\r
+            _p_class->getHInstance(),\r
+            NULL\r
+           );\r
+\r
+    if( NULL == _videownd )\r
+    {\r
+        DestroyWindow(_inplacewnd);\r
+        return E_FAIL;\r
+    }\r
+\r
+    SetWindowLongPtr(_videownd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(this));\r
+\r
+    /* horrible cast there */\r
+    vlc_value_t val;\r
+    val.i_int = reinterpret_cast<int>(_videownd);\r
+    VLC_VariableSet(_i_vlc, "drawable", val);\r
+\r
+    setVisible(_b_showdisplay);\r
+\r
+    if( NULL != _psz_src )\r
+    {\r
+        // add target to playlist\r
+        char *cOptions[1];\r
+        int  cOptionsCount = 0;\r
+\r
+        if( _b_loopmode )\r
+        {\r
+            cOptions[cOptionsCount++] = "loop";\r
+        }\r
+        VLC_AddTarget(_i_vlc, _psz_src, (const char **)&cOptions, cOptionsCount, PLAYLIST_APPEND, PLAYLIST_END);\r
+\r
+        if( _b_autostart )\r
+        {\r
+            VLC_Play(_i_vlc);\r
+            fireOnPlayEvent();\r
+        }\r
+    }\r
+    return S_OK;\r
+};\r
+\r
+HRESULT VLCPlugin::onInPlaceDeactivate(void)\r
+{\r
+    VLC_Stop(_i_vlc);\r
+    fireOnStopEvent();\r
+\r
+    DestroyWindow(_videownd);\r
+    _videownd = NULL;\r
+    DestroyWindow(_inplacewnd);\r
+    _inplacewnd = NULL;\r
\r
+    return S_OK;\r
+};\r
+\r
+BOOL VLCPlugin::isVisible(void)\r
+{\r
+    return GetWindowLong(_inplacewnd, GWL_STYLE) & WS_VISIBLE;\r
+};\r
+\r
+void VLCPlugin::setVisible(BOOL fVisible)\r
+{\r
+    ShowWindow(_inplacewnd, fVisible ? SW_SHOW : SW_HIDE);\r
+};\r
+\r
+void VLCPlugin::setFocus(BOOL fFocus)\r
+{\r
+    if( fFocus )\r
+        SetActiveWindow(_inplacewnd);\r
+};\r
+\r
+BOOL VLCPlugin::hasFocus(void)\r
+{\r
+    return GetActiveWindow() == _inplacewnd;\r
+};\r
+\r
+void VLCPlugin::onPaint(PAINTSTRUCT &ps, RECT &pr)\r
+{\r
+    /*\r
+    ** if VLC is playing, it may not display any VIDEO content \r
+    ** hence, draw control logo\r
+    */ \r
+    int width = _bounds.right-_bounds.left;\r
+    int height = _bounds.bottom-_bounds.top;\r
+\r
+    HBITMAP pict = _p_class->getInPlacePict();\r
+    if( NULL != pict )\r
+    {\r
+        HDC hdcPict = CreateCompatibleDC(ps.hdc);\r
+        if( NULL != hdcPict )\r
+        {\r
+            BITMAP bm;\r
+            if( GetObject(pict, sizeof(BITMAPINFO), &bm) )\r
+            {\r
+                int dstWidth = bm.bmWidth;\r
+                if( dstWidth > width-4 )\r
+                    dstWidth = width-4;\r
+\r
+                int dstHeight = bm.bmHeight;\r
+                if( dstHeight > height-4 )\r
+                    dstHeight = height-4;\r
+\r
+                int dstX = (width-dstWidth)/2;\r
+                int dstY = (height-dstHeight)/2;\r
+\r
+                SelectObject(hdcPict, pict);\r
+                StretchBlt(ps.hdc, dstX, dstY, dstWidth, dstHeight,\r
+                        hdcPict, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);\r
+                DeleteDC(hdcPict);\r
+                ExcludeClipRect(ps.hdc, dstX, dstY, dstWidth+dstX, dstHeight+dstY);\r
+            }\r
+        }\r
+    }\r
+\r
+    FillRect(ps.hdc, &pr, (HBRUSH)GetStockObject(WHITE_BRUSH));\r
+    SelectObject(ps.hdc, GetStockObject(BLACK_BRUSH));\r
+\r
+    MoveToEx(ps.hdc, 0, 0, NULL);\r
+    LineTo(ps.hdc, width-1, 0);\r
+    LineTo(ps.hdc, width-1, height-1);\r
+    LineTo(ps.hdc, 0, height-1);\r
+    LineTo(ps.hdc, 0, 0);\r
+};\r
+\r
+void VLCPlugin::onPositionChange(LPCRECT lprcPosRect, LPCRECT lprcClipRect)\r
+{\r
+    RECT posRect = *lprcPosRect;\r
+\r
+    calcPositionChange(&posRect, lprcClipRect);\r
+\r
+    /*\r
+    ** change in-place window geometry to match clipping region\r
+    */\r
+    MoveWindow(_inplacewnd,\r
+            posRect.left,\r
+            posRect.top,\r
+            posRect.right-posRect.left,\r
+            posRect.bottom-posRect.top,\r
+            FALSE);\r
+\r
+    /*\r
+    ** change video window geometry to match object bounds within clipping region\r
+    */\r
+    MoveWindow(_videownd,\r
+            _bounds.left,\r
+            _bounds.top,\r
+            _bounds.right-_bounds.left,\r
+            _bounds.bottom-_bounds.top,\r
+            FALSE);\r
+\r
+    RECT updateRect;\r
+\r
+    updateRect.left = -_bounds.left;\r
+    updateRect.top = -_bounds.top;\r
+    updateRect.right = _bounds.right-_bounds.left;\r
+    updateRect.bottom = _bounds.bottom-_bounds.top;\r
+\r
+    ValidateRect(_videownd, NULL);\r
+    InvalidateRect(_videownd, &updateRect, FALSE);\r
+    UpdateWindow(_videownd);\r
+};\r
+\r
+void VLCPlugin::fireOnPlayEvent(void)\r
+{\r
+    if( _b_sendevents )\r
+    {\r
+        DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0};\r
+        vlcConnectionPointContainer->fireEvent(1, LOCALE_USER_DEFAULT, &dispparamsNoArgs); \r
+    }\r
+};\r
+\r
+void VLCPlugin::fireOnPauseEvent(void)\r
+{\r
+    if( _b_sendevents )\r
+    {\r
+        DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0};\r
+        vlcConnectionPointContainer->fireEvent(2, LOCALE_USER_DEFAULT, &dispparamsNoArgs); \r
+    }\r
+};\r
+\r
+void VLCPlugin::fireOnStopEvent(void)\r
+{\r
+    if( _b_sendevents )\r
+    {\r
+        DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0};\r
+        vlcConnectionPointContainer->fireEvent(3, LOCALE_USER_DEFAULT, &dispparamsNoArgs); \r
+    }\r
+};\r
+\r
diff --git a/activex/plugin.h b/activex/plugin.h
new file mode 100644 (file)
index 0000000..986c75c
--- /dev/null
@@ -0,0 +1,167 @@
+/*****************************************************************************\r
+ * plugin.h: ActiveX control for VLC\r
+ *****************************************************************************\r
+ * Copyright (C) 2005 VideoLAN\r
+ *\r
+ * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.\r
+ *****************************************************************************/\r
+\r
+#ifndef __PLUGIN_H__\r
+#define __PLUGIN_H__\r
+\r
+#include <ole2.h>\r
+#include <olectl.h>\r
+\r
+#include <vlc/vlc.h>\r
+\r
+extern const GUID CLSID_VLCPlugin; \r
+extern const GUID LIBID_AXVLC; \r
+extern const GUID DIID_DVLCEvents; \r
+\r
+class VLCPluginClass : public IClassFactory\r
+{\r
+\r
+public:\r
+\r
+    VLCPluginClass(LONG *p_class_ref,HINSTANCE hInstance);\r
+\r
+    /* IUnknown methods */\r
+    STDMETHODIMP QueryInterface(REFIID riid, void **ppv);\r
+    STDMETHODIMP_(ULONG) AddRef(void);\r
+    STDMETHODIMP_(ULONG) Release(void);\r
+\r
+    /* IClassFactory methods */\r
+    STDMETHODIMP CreateInstance(IUnknown *pUnkOuter, REFIID riid, void **ppv);\r
+    STDMETHODIMP LockServer(BOOL fLock);\r
+\r
+    LPCSTR getInPlaceWndClassName(void) const { return TEXT("VLC Plugin In-Place"); };\r
+    LPCSTR getVideoWndClassName(void) const { return TEXT("VLC Plugin Video"); };\r
+    HINSTANCE getHInstance(void) const { return _hinstance; };\r
+    HBITMAP getInPlacePict(void) const { return _inplace_hbitmap; };\r
+\r
+protected:\r
+\r
+    virtual ~VLCPluginClass();\r
+\r
+private:\r
+\r
+    LPLONG      _p_class_ref;\r
+    HINSTANCE   _hinstance;\r
+    ATOM        _inplace_wndclass_atom;\r
+    ATOM        _video_wndclass_atom;\r
+    HBITMAP     _inplace_hbitmap;\r
+};\r
+\r
+class VLCPlugin : public IUnknown\r
+{\r
+\r
+public:\r
+\r
+    VLCPlugin(VLCPluginClass *p_class);\r
+\r
+    /* IUnknown methods */\r
+    STDMETHODIMP QueryInterface(REFIID riid, void **ppv);\r
+    STDMETHODIMP_(ULONG) AddRef(void);\r
+    STDMETHODIMP_(ULONG) Release(void);\r
+\r
+    /* custom methods */\r
+    HRESULT getTypeLib(ITypeLib **pTL)\r
+        { return LoadRegTypeLib(LIBID_AXVLC, 1, 0, LOCALE_NEUTRAL, pTL); };\r
+    REFCLSID getClassID(void) { return (REFCLSID)CLSID_VLCPlugin; };\r
+    REFIID getDispEventID(void) { return (REFIID)DIID_DVLCEvents; };\r
+\r
+    HRESULT onInitNew(void);\r
+    HRESULT onClose(DWORD dwSaveOption);\r
+\r
+    BOOL isInPlaceActive(void);\r
+    HRESULT onActivateInPlace(LPMSG lpMesg, HWND hwndParent, LPCRECT lprcPosRect, LPCRECT lprcClipRect);\r
+    HRESULT onInPlaceDeactivate(void);\r
+    HWND getInPlaceWindow(void) const { return _inplacewnd; };\r
+\r
+    BOOL isVisible(void);\r
+    void setVisible(BOOL fVisible);\r
+\r
+    BOOL hasFocus(void);\r
+    void setFocus(BOOL fFocus);\r
+\r
+    UINT getCodePage(void) { return _codepage; };\r
+    void setCodePage(UINT cp) { _codepage = cp; };\r
+\r
+    int  getVLCObject(void) { return _i_vlc; };\r
+\r
+    // initial properties\r
+    void setSourceURL(const char *url) { _psz_src = strdup(url); };\r
+    void setAutoStart(BOOL autostart) { _b_autostart = autostart; };\r
+    void setLoopMode(BOOL loopmode) { _b_loopmode = loopmode; };\r
+    void setMute(BOOL mute) {\r
+        if( mute && _i_vlc )\r
+        {\r
+            VLC_VolumeMute(_i_vlc);\r
+        }\r
+    };\r
+    void setShowDisplay(BOOL show) { _b_showdisplay = show; };\r
+\r
+    void onPositionChange(LPCRECT lprcPosRect, LPCRECT lprcClipRect);\r
+    void onPaint(PAINTSTRUCT &ps, RECT &pr);\r
+\r
+    // plugin events\r
+    void setSendEvents(BOOL sendevents) { _b_sendevents = sendevents; };\r
+    void fireOnPlayEvent(void);\r
+    void fireOnPauseEvent(void);\r
+    void fireOnStopEvent(void);\r
+\r
+protected:\r
+\r
+    virtual ~VLCPlugin();\r
+\r
+private:\r
+\r
+    void calcPositionChange(LPRECT lprPosRect, LPCRECT lprcClipRect);\r
+\r
+    //implemented interfaces\r
+    class VLCOleObject *vlcOleObject;\r
+    class VLCOleControl *vlcOleControl;\r
+    class VLCOleInPlaceObject *vlcOleInPlaceObject;\r
+    class VLCOleInPlaceActiveObject *vlcOleInPlaceActiveObject;\r
+    class VLCPersistStreamInit *vlcPersistStreamInit;\r
+    class VLCPersistStorage *vlcPersistStorage;\r
+    class VLCPersistPropertyBag *vlcPersistPropertyBag;\r
+    class VLCProvideClassInfo *vlcProvideClassInfo;\r
+    class VLCConnectionPointContainer *vlcConnectionPointContainer;\r
+    class VLCObjectSafety *vlcObjectSafety;\r
+    class VLCControl *vlcControl;\r
+\r
+    // in place activated window (Clipping window)\r
+    HWND _inplacewnd;\r
+    // video window (Drawing window)\r
+    HWND _videownd;\r
+    RECT _bounds;\r
+\r
+    VLCPluginClass *_p_class;\r
+    ULONG _i_ref;\r
+\r
+    UINT _codepage;\r
+    char *_psz_src;\r
+    BOOL _b_autostart;\r
+    BOOL _b_loopmode;\r
+    BOOL _b_showdisplay;\r
+    BOOL _b_sendevents;\r
+    int _i_vlc;\r
+};\r
+\r
+#endif\r
+\r
diff --git a/activex/provideclassinfo.cpp b/activex/provideclassinfo.cpp
new file mode 100644 (file)
index 0000000..2df9a51
--- /dev/null
@@ -0,0 +1,60 @@
+/*****************************************************************************\r
+ * provideclassinfo.cpp: ActiveX control for VLC\r
+ *****************************************************************************\r
+ * Copyright (C) 2005 VideoLAN\r
+ *\r
+ * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.\r
+ *****************************************************************************/\r
+\r
+#include "plugin.h"\r
+#include "provideclassinfo.h"\r
+\r
+using namespace std;\r
+\r
+STDMETHODIMP VLCProvideClassInfo::GetClassInfo(ITypeInfo **ppTI)\r
+{\r
+    ITypeLib *p_typelib;\r
+\r
+    if( NULL == ppTI )\r
+        return E_POINTER;\r
+\r
+    HRESULT hr = _p_instance->getTypeLib(&p_typelib);\r
+    if( SUCCEEDED(hr) )\r
+    {\r
+        hr = p_typelib->GetTypeInfoOfGuid(_p_instance->getDispEventID(), ppTI);\r
+        if( FAILED(hr) )\r
+        {\r
+            *ppTI = NULL;\r
+        }\r
+        p_typelib->Release();\r
+    }\r
+    return hr;\r
+};\r
+\r
+STDMETHODIMP VLCProvideClassInfo::GetGUID(DWORD dwGuidKind, GUID *pGUID)\r
+{\r
+    if( GUIDKIND_DEFAULT_SOURCE_DISP_IID != dwGuidKind )\r
+        return E_INVALIDARG;\r
+\r
+    if( NULL == pGUID )\r
+        return E_POINTER;\r
+\r
+    *pGUID = _p_instance->getDispEventID();\r
+\r
+    return S_OK;\r
+};\r
+\r
diff --git a/activex/provideclassinfo.h b/activex/provideclassinfo.h
new file mode 100644 (file)
index 0000000..370c49f
--- /dev/null
@@ -0,0 +1,65 @@
+/*****************************************************************************\r
+ * provideclassinfo.h: ActiveX control for VLC\r
+ *****************************************************************************\r
+ * Copyright (C) 2005 VideoLAN\r
+ *\r
+ * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.\r
+ *****************************************************************************/\r
+\r
+#ifndef __PROVIDECLASSINFO_H__\r
+#define __PROVIDECLASSINFO_H__\r
+\r
+#include <ocidl.h>\r
+\r
+class VLCProvideClassInfo : public IProvideClassInfo2\r
+{\r
+\r
+public:\r
+\r
+    VLCProvideClassInfo(VLCPlugin *p_instance) : _p_instance(p_instance) {};\r
+    virtual ~VLCProvideClassInfo() {};\r
+\r
+    // IUnknown methods\r
+    STDMETHODIMP QueryInterface(REFIID riid, void **ppv)\r
+    {\r
+        if( (NULL != ppv)\r
+         && (IID_IUnknown == riid) \r
+         && (IID_IProvideClassInfo == riid) \r
+         && (IID_IProvideClassInfo2 == riid) ) {\r
+            AddRef();\r
+            *ppv = reinterpret_cast<LPVOID>(this);\r
+            return NOERROR;\r
+        }\r
+        return _p_instance->QueryInterface(riid, ppv);\r
+    };\r
+\r
+    STDMETHODIMP_(ULONG) AddRef(void) { return _p_instance->AddRef(); };\r
+    STDMETHODIMP_(ULONG) Release(void) { return _p_instance->Release(); };\r
+\r
+    // IProvideClassInfo methods\r
+    STDMETHODIMP GetClassInfo(ITypeInfo **);\r
+\r
+    // IProvideClassInfo2 methods\r
+    STDMETHODIMP GetGUID(DWORD, GUID *);\r
+\r
+private:\r
+\r
+    VLCPlugin *_p_instance;\r
+};\r
+\r
+#endif\r
+\r
diff --git a/activex/test.html b/activex/test.html
new file mode 100644 (file)
index 0000000..897310e
--- /dev/null
@@ -0,0 +1,57 @@
+<HTML>
+<TITLE>VLC ActiveX plugin test page</TITLE>
+<BODY>
+<SCRIPT LANGUAGE="JScript">
+<!--
+function go(targetURL)
+{
+       var options = new Array(":input-repeat");
+       document.vlc.addTarget(targetURL, options, 4+8, -666);
+};
+//-->
+</SCRIPT>
+<TABLE>
+<TR><TD>
+MRL:
+<INPUT size="80" name="targetTextField" value="">
+<INPUT type=submit value="Go" onClick="go(targetTextField.value);">
+</TD></TR>
+<TR><TD>
+<OBJECT classid="clsid:E23FE9C6-778E-49D4-B537-38FCDE4887D8"
+        width="640" height="480" id="vlc" events="True">
+<param name="Src" value="" />
+<param name="ShowDisplay" value="True" />
+<param name="Loop" value="False" />
+<param name="AutoPlay" value="False" />
+</OBJECT>
+<SCRIPT LANGUAGE="JScript">
+<!--
+function vlc::OnPlay()
+{
+       alert("Playing");
+};
+function vlc::OnPause()
+{
+       alert("Paused");
+};
+function vlc::OnStop()
+{
+       alert("Stopped");
+};
+//-->
+</SCRIPT>
+</TD></TR>
+<TR><TD>
+<INPUT type=submit value="Play" onClick='document.vlc.play();'>
+<INPUT type=submit value="Pause" onClick='document.vlc.pause();'>
+<INPUT type=submit value="Stop" onClick='document.vlc.stop();'>
+<INPUT type=submit value=" << " onClick='document.vlc.playSlower();'>
+<INPUT type=submit value=" >> " onClick='document.vlc.playFaster();'>
+<INPUT type=submit value="Mute" onClick='document.vlc.toggleMute();'>
+<INPUT type=submit value="Show" onClick='document.vlc.Visible = true;'>
+<INPUT type=submit value="Hide" onClick='document.vlc.Visible = false;'>
+<INPUT type=submit value="Version" onClick='alert(document.vlc.VersionInfo);'>
+</TD></TR>
+</TABLE>
+</BODY>
+</HTML>
diff --git a/activex/utils.cpp b/activex/utils.cpp
new file mode 100644 (file)
index 0000000..df8542a
--- /dev/null
@@ -0,0 +1,101 @@
+/*****************************************************************************\r
+ * utils.cpp: ActiveX control for VLC\r
+ *****************************************************************************\r
+ * Copyright (C) 2005 VideoLAN\r
+ *\r
+ * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.\r
+ *****************************************************************************/\r
+\r
+#include "utils.h"\r
+\r
+/*\r
+** conversion facilities\r
+*/\r
+\r
+using namespace std;\r
+\r
+char *CStrFromBSTR(int codePage, BSTR bstr)\r
+{\r
+    UINT len = SysStringLen(bstr);\r
+    if( len > 0 )\r
+    {\r
+        size_t mblen = WideCharToMultiByte(codePage,\r
+                0, bstr, len, NULL, 0, NULL, NULL);\r
+        if( mblen > 0 )\r
+        {\r
+            char *buffer = (char *)malloc(mblen+1);\r
+            ZeroMemory(buffer, mblen+1);\r
+            if( WideCharToMultiByte(CP_ACP, 0, bstr, len, buffer, mblen, NULL, NULL) )\r
+                return buffer;\r
+        }\r
+    }\r
+    return NULL;\r
+};\r
+\r
+BSTR BSTRFromCStr(int codePage, const char *s)\r
+{\r
+    int wideLen = MultiByteToWideChar(codePage, 0, s, -1, NULL, 0);\r
+    if( wideLen )\r
+    {\r
+        WCHAR* wideStr = (WCHAR*)malloc(wideLen*sizeof(WCHAR));\r
+        if( NULL != wideStr )\r
+        {\r
+            BSTR bstr;\r
+\r
+            ZeroMemory(wideStr, wideLen*sizeof(WCHAR));\r
+            MultiByteToWideChar(codePage, 0, s, -1, wideStr, wideLen);\r
+            bstr = SysAllocString(wideStr);\r
+            free(wideStr);\r
+\r
+            return bstr;\r
+        }\r
+    }\r
+    return NULL;\r
+};\r
+\r
+/*\r
+**  properties\r
+*/\r
+\r
+HRESULT GetObjectProperty(LPUNKNOWN object, DISPID dispID, VARIANT& v)\r
+{\r
+    IDispatch *pDisp;\r
+    HRESULT hr = object->QueryInterface(IID_IDispatch, (LPVOID *)&pDisp);\r
+    if( SUCCEEDED(hr) )\r
+    {\r
+        DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0};\r
+        VARIANT vres;\r
+        hr = pDisp->Invoke(dispID, IID_NULL, LOCALE_USER_DEFAULT,\r
+                DISPATCH_PROPERTYGET, &dispparamsNoArgs, &vres, NULL, NULL);\r
+        if( SUCCEEDED(hr) )\r
+        {\r
+            if( V_VT(&v) != V_VT(&vres) )\r
+            {\r
+                hr = VariantChangeType(&v, &vres, 0, V_VT(&v));\r
+                VariantClear(&vres);\r
+            }\r
+            else\r
+            {\r
+                v = vres;\r
+            }\r
+        }\r
+        pDisp->Release();\r
+    }\r
+    return hr;\r
+};\r
+\r
+\r
diff --git a/activex/utils.h b/activex/utils.h
new file mode 100644 (file)
index 0000000..f15282b
--- /dev/null
@@ -0,0 +1,181 @@
+/*****************************************************************************\r
+ * utils.h: ActiveX control for VLC\r
+ *****************************************************************************\r
+ * Copyright (C) 2005 VideoLAN\r
+ *\r
+ * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.\r
+ *****************************************************************************/\r
+\r
+#ifndef __UTILS_H__\r
+#define __UTILS_H__\r
+\r
+#include <ole2.h>\r
+\r
+#include <vector>\r
+\r
+// utilities\r
+extern char *CStrFromBSTR(int codePage, BSTR bstr);\r
+extern BSTR BSTRFromCStr(int codePage, const char *s);\r
+\r
+// properties\r
+extern HRESULT GetObjectProperty(LPUNKNOWN object, DISPID dispID, VARIANT& v);\r
+\r
+// enumeration\r
+template<class T> class VLCEnum : IUnknown\r
+{\r
+\r
+public:\r
+\r
+    VLCEnum(REFIID riid, std::vector<T> &);\r
+    VLCEnum(const VLCEnum<T> &);\r
+    virtual ~VLCEnum() {};\r
+\r
+    VLCEnum<T>& operator=(const VLCEnum<T> &t);\r
+\r
+    // IUnknown methods\r
+    STDMETHODIMP QueryInterface(REFIID riid, void **);\r
+    STDMETHODIMP_(ULONG) AddRef(void);\r
+    STDMETHODIMP_(ULONG) Release(void);\r
+\r
+    // IEnumXXXX methods\r
+    STDMETHODIMP Next(ULONG, T *, ULONG *);\r
+    STDMETHODIMP Skip(ULONG);\r
+    STDMETHODIMP Reset(void);\r
+    // cloning is implemented by subclasses and must use copy constructor\r
+    //STDMETHODIMP Clone(VLCEnum<T> **);\r
+    // cloning is implemented by subclasses and must use copy constructor\r
+\r
+    typedef void (*retainer)(T);\r
+\r
+    void setRetainOperation(retainer retain) { _retain = retain; };\r
+\r
+private:\r
+\r
+    LONG                                _refcount;\r
+    std::vector<T>                      _v;\r
+    typename std::vector<T>::iterator   _i;\r
+    REFIID                              _riid;\r
+    retainer                            _retain;\r
+};\r
+\r
+template<class T>\r
+VLCEnum<T>::VLCEnum(REFIID riid, std::vector<T> &v) :\r
+    _refcount(1),\r
+    _v(v),\r
+    _riid(riid),\r
+    _retain(NULL)\r
+{\r
+    _i= v.begin();\r
+};\r
+\r
+template<class T>\r
+VLCEnum<T>::VLCEnum(const VLCEnum<T> &e) :\r
+    _refcount(1),\r
+    _v(e._v),\r
+    _riid(e._riid)\r
+{\r
+};\r
+\r
+template<class T>\r
+VLCEnum<T>& VLCEnum<T>::operator=(const VLCEnum<T> &e)\r
+{\r
+    this->_refcount = 1;\r
+    this->_riid = e._riid;\r
+    this->_v    = e._v;\r
+    this->_i    = e._i;\r
+};\r
+\r
+template<class T>\r
+STDMETHODIMP VLCEnum<T>::QueryInterface(REFIID riid, void **ppv)\r
+{\r
+    if( NULL == ppv ) return E_POINTER;\r
+    if( (IID_IUnknown == riid) \r
+     && ( _riid == riid) ) {\r
+        AddRef();\r
+        *ppv = reinterpret_cast<LPVOID>(this);\r
+        return NOERROR;\r
+    }\r
+    return E_NOINTERFACE;\r
+};\r
+\r
+template<class T>\r
+STDMETHODIMP_(ULONG) VLCEnum<T>::AddRef(void)\r
+{\r
+    return InterlockedIncrement(&_refcount);\r
+};\r
+\r
+template<class T>\r
+STDMETHODIMP_(ULONG) VLCEnum<T>::Release(void)\r
+{\r
+    ULONG refcount = InterlockedDecrement(&_refcount);\r
+    if( 0 == refcount )\r
+    {\r
+        delete this;\r
+        return 0;\r
+    }\r
+    return refcount;\r
+};\r
+\r
+template<class T>\r
+STDMETHODIMP VLCEnum<T>::Next(ULONG celt, T *rgelt, ULONG *pceltFetched)\r
+{\r
+    if( NULL == rgelt )\r
+        return E_POINTER;\r
+\r
+    if( (celt > 1) && (NULL == pceltFetched) )\r
+        return E_INVALIDARG;\r
+\r
+    ULONG c = 0;\r
+    typename std::vector<T>::iterator end = _v.end();\r
+\r
+    while( (c < celt) && (_i != end) )\r
+    {\r
+        rgelt[c] = *_i;\r
+        if( NULL != _retain ) _retain(rgelt[c]);\r
+        ++_i;\r
+        ++c;\r
+    }\r
+\r
+    if( NULL != pceltFetched )\r
+        *pceltFetched = c;\r
+\r
+    return (c == celt) ? S_OK : S_FALSE;\r
+};\r
+\r
+template<class T>\r
+STDMETHODIMP VLCEnum<T>::Skip(ULONG celt)\r
+{\r
+    ULONG c = 0;\r
+    typename std::vector<T>::iterator end = _v.end();\r
+\r
+    while( (c < celt) && (_i != end) )\r
+    {\r
+        ++_i;\r
+        ++c;\r
+    }\r
+    return (c == celt) ? S_OK : S_FALSE;\r
+};\r
+\r
+template<class T>\r
+STDMETHODIMP VLCEnum<T>::Reset(void)\r
+{\r
+    _i= _v.begin();\r
+    return S_OK;\r
+};\r
+\r
+#endif\r
+\r
diff --git a/activex/vlccontrol.cpp b/activex/vlccontrol.cpp
new file mode 100644 (file)
index 0000000..fd5008f
--- /dev/null
@@ -0,0 +1,668 @@
+/*****************************************************************************\r
+ * vlccontrol.cpp: ActiveX control for VLC\r
+ *****************************************************************************\r
+ * Copyright (C) 2005 VideoLAN\r
+ *\r
+ * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.\r
+ *****************************************************************************/\r
+\r
+#include "plugin.h"\r
+#include "vlccontrol.h"\r
+\r
+#include "utils.h"\r
+\r
+VLCControl::~VLCControl()\r
+{\r
+    if( _p_typeinfo )\r
+        _p_typeinfo->Release();\r
+};\r
+\r
+HRESULT VLCControl::getTypeInfo(void)\r
+{\r
+    HRESULT hr = NOERROR;\r
+    if( NULL == _p_typeinfo )\r
+    {\r
+        ITypeLib *p_typelib;\r
+\r
+        HRESULT hr = _p_instance->getTypeLib(&p_typelib);\r
+        if( SUCCEEDED(hr) )\r
+        {\r
+            hr = p_typelib->GetTypeInfoOfGuid(IID_IVLCControl, &_p_typeinfo);\r
+            if( FAILED(hr) )\r
+            {\r
+                _p_typeinfo = NULL;\r
+            }\r
+            p_typelib->Release();\r
+        }\r
+    }\r
+    return hr;\r
+};\r
+\r
+STDMETHODIMP VLCControl::GetTypeInfoCount(UINT* pctInfo)\r
+{\r
+    if( SUCCEEDED(getTypeInfo()) )\r
+        *pctInfo = 1;\r
+    else\r
+        *pctInfo = 0;\r
+\r
+    return NOERROR;\r
+};\r
+\r
+STDMETHODIMP VLCControl::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo)\r
+{\r
+    if( NULL == ppTInfo )\r
+        return E_INVALIDARG;\r
+\r
+    if( SUCCEEDED(getTypeInfo()) )\r
+    {\r
+        _p_typeinfo->AddRef();\r
+        *ppTInfo = _p_typeinfo;\r
+        return NO_ERROR;\r
+    }\r
+    *ppTInfo = NULL;\r
+    return E_NOTIMPL;\r
+};\r
+\r
+STDMETHODIMP VLCControl::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, \r
+        UINT cNames, LCID lcid, DISPID* rgDispID)\r
+{\r
+    if( SUCCEEDED(getTypeInfo()) )\r
+    {\r
+        return DispGetIDsOfNames(_p_typeinfo, rgszNames, cNames, rgDispID);\r
+    }\r
+    return E_NOTIMPL;\r
+};\r
+\r
+STDMETHODIMP VLCControl::Invoke(DISPID dispIdMember, REFIID riid,\r
+        LCID lcid, WORD wFlags, DISPPARAMS* pDispParams,\r
+        VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr)\r
+{\r
+    if( SUCCEEDED(getTypeInfo()) )\r
+    {\r
+        return DispInvoke(this, _p_typeinfo, dispIdMember, wFlags, pDispParams,\r
+                pVarResult, pExcepInfo, puArgErr);\r
+    }\r
+    return E_NOTIMPL;\r
+};\r
+\r
+STDMETHODIMP VLCControl::get_Value(VARIANT *pvarValue)\r
+{\r
+    if( NULL == pvarValue )\r
+        return E_INVALIDARG;\r
+\r
+    V_VT(pvarValue) = VT_BOOL;\r
+    return get_Playing(&V_BOOL(pvarValue));\r
+};\r
+        \r
+STDMETHODIMP VLCControl::put_Value(VARIANT pvarValue)\r
+{\r
+    if( VT_BOOL != V_VT(&pvarValue) )\r
+    {\r
+        VARIANT boolValue;\r
+        HRESULT hr = VariantChangeType(&boolValue, &pvarValue, 0, VT_BOOL);\r
+        if( SUCCEEDED(hr) )\r
+        {\r
+            hr = get_Playing(&V_BOOL(&pvarValue));\r
+            //VariantClear(&boolValue);\r
+        }\r
+        return hr;\r
+    }\r
+    return get_Playing(&V_BOOL(&pvarValue));\r
+};\r
+        \r
+STDMETHODIMP VLCControl::get_Visible(VARIANT_BOOL *isVisible)\r
+{\r
+    if( NULL == isVisible )\r
+        return E_INVALIDARG;\r
+\r
+    if( _p_instance->isInPlaceActive() )\r
+        *isVisible = _p_instance->isVisible() ? VARIANT_TRUE : VARIANT_FALSE;\r
+    else\r
+        *isVisible = VARIANT_FALSE;\r
+\r
+    return NOERROR;\r
+};\r
+        \r
+STDMETHODIMP VLCControl::put_Visible(VARIANT_BOOL isVisible)\r
+{\r
+    if( _p_instance->isInPlaceActive() )\r
+        _p_instance->setVisible(isVisible != VARIANT_FALSE);\r
+    else\r
+        _p_instance->setShowDisplay(isVisible != VARIANT_FALSE);\r
+\r
+    return NOERROR;\r
+};\r
+\r
+STDMETHODIMP VLCControl::play(void)\r
+{\r
+    int i_vlc = _p_instance->getVLCObject();\r
+    if( i_vlc )\r
+    {\r
+        VLC_Play(i_vlc);\r
+        _p_instance->fireOnPlayEvent();\r
+        return NOERROR;\r
+    }\r
+    return E_UNEXPECTED;\r
+};\r
\r
+STDMETHODIMP VLCControl::pause(void)\r
+{\r
+    int i_vlc = _p_instance->getVLCObject();\r
+    if( i_vlc )\r
+    {\r
+        VLC_Pause(i_vlc);\r
+        _p_instance->fireOnPauseEvent();\r
+        return NOERROR;\r
+    }\r
+    return E_UNEXPECTED;\r
+};\r
+        \r
+STDMETHODIMP VLCControl::stop(void)\r
+{\r
+    int i_vlc = _p_instance->getVLCObject();\r
+    if( i_vlc )\r
+    {\r
+        VLC_Stop(i_vlc);\r
+        _p_instance->fireOnStopEvent();\r
+        return NOERROR;\r
+    }\r
+    return E_UNEXPECTED;\r
+}\r
+        \r
+STDMETHODIMP VLCControl::get_Playing(VARIANT_BOOL *isPlaying)\r
+{\r
+    if( NULL == isPlaying )\r
+        return E_INVALIDARG;\r
+\r
+    int i_vlc = _p_instance->getVLCObject();\r
+    if( i_vlc )\r
+    {\r
+        *isPlaying = VLC_IsPlaying(i_vlc) ? VARIANT_TRUE : VARIANT_FALSE;\r
+        return NOERROR;\r
+    }\r
+    *isPlaying = VARIANT_FALSE;\r
+    return E_UNEXPECTED;\r
+};\r
+        \r
+STDMETHODIMP VLCControl::put_Playing(VARIANT_BOOL isPlaying)\r
+{\r
+    int i_vlc = _p_instance->getVLCObject();\r
+    if( i_vlc )\r
+    {\r
+        if( VARIANT_FALSE == isPlaying )\r
+        {\r
+            if( VLC_IsPlaying(i_vlc) )\r
+                VLC_Stop(i_vlc);\r
+        }\r
+        else\r
+        {\r
+            if( ! VLC_IsPlaying(i_vlc) )\r
+                VLC_Play(i_vlc);\r
+        }\r
+        return NOERROR;\r
+    }\r
+    return E_UNEXPECTED;\r
+};\r
+        \r
+STDMETHODIMP VLCControl::get_Position(float *position)\r
+{\r
+    if( NULL == position )\r
+        return E_INVALIDARG;\r
+\r
+    int i_vlc = _p_instance->getVLCObject();\r
+    if( i_vlc )\r
+    {\r
+        *position = VLC_PositionGet(i_vlc);\r
+        return NOERROR;\r
+    }\r
+    *position = 0.0f;\r
+    return E_UNEXPECTED;\r
+};\r
+        \r
+STDMETHODIMP VLCControl::put_Position(float position)\r
+{\r
+    int i_vlc = _p_instance->getVLCObject();\r
+    if( i_vlc )\r
+    {\r
+        VLC_PositionSet(i_vlc, position);\r
+        return NOERROR;\r
+    }\r
+    return E_UNEXPECTED;\r
+};\r
+        \r
+STDMETHODIMP VLCControl::get_Time(int *seconds)\r
+{\r
+    if( NULL == seconds )\r
+        return E_INVALIDARG;\r
+\r
+    int i_vlc = _p_instance->getVLCObject();\r
+    if( i_vlc )\r
+    {\r
+        *seconds = VLC_TimeGet(i_vlc);\r
+        return NOERROR;\r
+    }\r
+    *seconds = 0;\r
+    return E_UNEXPECTED;\r
+};\r
+        \r
+STDMETHODIMP VLCControl::put_Time(int seconds)\r
+{\r
+    int i_vlc = _p_instance->getVLCObject();\r
+    if( i_vlc )\r
+    {\r
+        VLC_TimeSet(i_vlc, seconds, VLC_FALSE);\r
+        return NOERROR;\r
+    }\r
+    return E_UNEXPECTED;\r
+};\r
+        \r
+STDMETHODIMP VLCControl::shuttle(int seconds)\r
+{\r
+    int i_vlc = _p_instance->getVLCObject();\r
+    if( i_vlc )\r
+    {\r
+        VLC_TimeSet(i_vlc, seconds, VLC_TRUE);\r
+        return NOERROR;\r
+    }\r
+    return E_UNEXPECTED;\r
+};\r
+        \r
+STDMETHODIMP VLCControl::fullscreen(void)\r
+{\r
+    int i_vlc = _p_instance->getVLCObject();\r
+    if( i_vlc )\r
+    {\r
+        VLC_FullScreen(i_vlc);\r
+        return NOERROR;\r
+    }\r
+    return E_UNEXPECTED;\r
+};\r
+        \r
+STDMETHODIMP VLCControl::get_Length(int *seconds)\r
+{\r
+    if( NULL == seconds )\r
+        return E_INVALIDARG;\r
+\r
+    int i_vlc = _p_instance->getVLCObject();\r
+    if( i_vlc )\r
+    {\r
+        *seconds = VLC_LengthGet(i_vlc);\r
+        return NOERROR;\r
+    }\r
+    *seconds = 0;\r
+    return E_UNEXPECTED;\r
+};\r
+        \r
+STDMETHODIMP VLCControl::playFaster(void)\r
+{\r
+    int i_vlc = _p_instance->getVLCObject();\r
+    if( i_vlc )\r
+    {\r
+        VLC_SpeedFaster(i_vlc);\r
+        return NOERROR;\r
+    }\r
+    return E_UNEXPECTED;\r
+};\r
+        \r
+STDMETHODIMP VLCControl::playSlower(void)\r
+{\r
+    int i_vlc = _p_instance->getVLCObject();\r
+    if( i_vlc )\r
+    {\r
+        VLC_SpeedSlower(i_vlc);\r
+        return NOERROR;\r
+    }\r
+    return E_UNEXPECTED;\r
+};\r
+        \r
+STDMETHODIMP VLCControl::get_Volume(int *volume)\r
+{\r
+    if( NULL == volume )\r
+        return E_INVALIDARG;\r
+\r
+    int i_vlc = _p_instance->getVLCObject();\r
+    if( i_vlc )\r
+    {\r
+        *volume  = VLC_VolumeGet(i_vlc);\r
+        return NOERROR;\r
+    }\r
+    *volume = 0;\r
+    return E_UNEXPECTED;\r
+};\r
+        \r
+STDMETHODIMP VLCControl::put_Volume(int volume)\r
+{\r
+    int i_vlc = _p_instance->getVLCObject();\r
+    if( i_vlc )\r
+    {\r
+        VLC_VolumeSet(i_vlc, volume);\r
+        return NOERROR;\r
+    }\r
+    return E_UNEXPECTED;\r
+};\r
+        \r
+STDMETHODIMP VLCControl::toggleMute(void)\r
+{\r
+    int i_vlc = _p_instance->getVLCObject();\r
+    if( i_vlc )\r
+    {\r
+        VLC_VolumeMute(i_vlc);\r
+        return NOERROR;\r
+    }\r
+    return E_UNEXPECTED;\r
+};\r
+\r
+static void freeTargetOptions(char **cOptions, int cOptionCount)\r
+{\r
+    // clean up \r
+    for( long pos=0; pos<cOptionCount; ++pos )\r
+    {\r
+        char *cOption = cOptions[pos];\r
+        if( NULL != cOption )\r
+            free(cOption);\r
+        else\r
+            break;\r
+    }\r
+    if( NULL != cOptions )\r
+        free(cOptions);\r
+};\r
+\r
+static HRESULT createTargetOptions(int codePage, VARIANT *options, char ***cOptions, int *cOptionCount)\r
+{\r
+    HRESULT hr = E_INVALIDARG;\r
+    if( VT_ERROR == V_VT(options) )\r
+    {\r
+        if( DISP_E_PARAMNOTFOUND == V_ERROR(options) )\r
+        {\r
+            // optional parameter not set\r
+            *cOptions = NULL;\r
+            *cOptionCount = 0;\r
+            return NOERROR;\r
+        }\r
+    }\r
+    else if( (VT_EMPTY == V_VT(options)) || (VT_NULL == V_VT(options)) )\r
+    {\r
+        // null parameter\r
+        *cOptions = NULL;\r
+        *cOptionCount = 0;\r
+        return NOERROR;\r
+    }\r
+    else if( VT_DISPATCH == V_VT(options) )\r
+    {\r
+        // collection parameter\r
+        VARIANT colEnum;\r
+        V_VT(&colEnum) = VT_UNKNOWN;\r
+        hr = GetObjectProperty(V_DISPATCH(options), DISPID_NEWENUM, colEnum);\r
+        if( SUCCEEDED(hr) )\r
+        {\r
+            IEnumVARIANT *enumVar;\r
+            hr = V_UNKNOWN(&colEnum)->QueryInterface(IID_IEnumVARIANT, (LPVOID *)&enumVar);\r
+            if( SUCCEEDED(hr) )\r
+            {\r
+                long pos = 0;\r
+                long capacity = 16;\r
+                VARIANT option;\r
+\r
+                *cOptions = (char **)malloc(capacity*sizeof(char *));\r
+                if( NULL != *cOptions )\r
+                {\r
+                    ZeroMemory(*cOptions, sizeof(char *)*capacity);\r
+                    while( SUCCEEDED(hr) && (S_OK == enumVar->Next(1, &option, NULL)) )\r
+                    {\r
+                        if( VT_BSTR == V_VT(&option) )\r
+                        {\r
+                            char *cOption = CStrFromBSTR(codePage, V_BSTR(&option));\r
+                            (*cOptions)[pos] = cOption;\r
+                            if( NULL != cOption )\r
+                            {\r
+                                ++pos;\r
+                                if( pos == capacity )\r
+                                {\r
+                                    char **moreOptions = (char **)realloc(*cOptions, (capacity+16)*sizeof(char *));\r
+                                    if( NULL != moreOptions )\r
+                                    {\r
+                                        ZeroMemory(moreOptions+capacity, sizeof(char *)*16);\r
+                                        capacity += 16;\r
+                                        *cOptions = moreOptions;\r
+                                    }\r
+                                    else\r
+                                        hr = E_OUTOFMEMORY;\r
+                                }\r
+                            }\r
+                            else\r
+                                hr = E_OUTOFMEMORY;\r
+                        }\r
+                        else\r
+                            hr = E_INVALIDARG;\r
+\r
+                        VariantClear(&option);\r
+                    }\r
+                    *cOptionCount = pos;\r
+                    if( FAILED(hr) )\r
+                    {\r
+                        // free already processed elements\r
+                        freeTargetOptions(*cOptions, *cOptionCount);\r
+                    }\r
+                }\r
+                else\r
+                    hr = E_OUTOFMEMORY;\r
+                enumVar->Release();\r
+            }\r
+        }\r
+    }\r
+    else if( V_ISARRAY(options) )\r
+    {\r
+        // array parameter\r
+        SAFEARRAY *array = V_ISBYREF(options) ? *V_ARRAYREF(options) : V_ARRAY(options);\r
+\r
+        if( SafeArrayGetDim(array) != 1 )\r
+            return E_INVALIDARG;\r
+\r
+        long lBound = 0;\r
+        long uBound = 0;\r
+        SafeArrayGetLBound(array, 1, &lBound);\r
+        SafeArrayGetUBound(array, 1, &uBound);\r
+\r
+        // have we got any options\r
+        if( uBound > lBound )\r
+        {\r
+            VARTYPE vType;\r
+            HRESULT hr = SafeArrayGetVartype(array, &vType);\r
+            if( FAILED(hr) )\r
+                return hr;\r
+\r
+            long pos;\r
+\r
+            // marshall options into an array of C strings\r
+            if( VT_VARIANT == vType )\r
+            {\r
+                *cOptions = (char **)malloc(sizeof(char *)*(uBound-lBound));\r
+                if( NULL != options )\r
+                    return E_OUTOFMEMORY;\r
+\r
+                for(pos=lBound; SUCCEEDED(hr) && (pos<uBound); ++pos )\r
+                {\r
+                    VARIANT option;\r
+                    hr = SafeArrayGetElement(array, &pos, &option);\r
+                    if( SUCCEEDED(hr) )\r
+                    {\r
+                        if( VT_BSTR == V_VT(&option) ) \r
+                        {\r
+                            char *cOption = CStrFromBSTR(codePage, V_BSTR(&option));\r
+                            (*cOptions)[pos-lBound] = cOption;\r
+                            if( NULL == cOption )\r
+                                hr = E_OUTOFMEMORY;\r
+                        }\r
+                        else\r
+                            hr = E_INVALIDARG;\r
+                        VariantClear(&option);\r
+                    }\r
+                }\r
+            }\r
+            else if( VT_BSTR == vType )\r
+            {\r
+                *cOptions = (char **)malloc(sizeof(char *)*(uBound-lBound));\r
+                if( NULL != options )\r
+                    return E_OUTOFMEMORY;\r
+\r
+                ZeroMemory(cOptions, sizeof(char *)*(uBound-lBound));\r
+                for(pos=lBound; SUCCEEDED(hr) && (pos<uBound); ++pos )\r
+                {\r
+                    BSTR option;\r
+                    hr = SafeArrayGetElement(array, &pos, &option);\r
+                    if( SUCCEEDED(hr) )\r
+                    {\r
+                        char *cOption = CStrFromBSTR(codePage, option);\r
+                        (*cOptions)[pos-lBound] = cOption;\r
+                        if( NULL == cOption )\r
+                            hr = E_OUTOFMEMORY;\r
+                        SysFreeString(option);\r
+                    }\r
+                }\r
+            }\r
+            else\r
+                // unsupported type\r
+                return E_INVALIDARG;\r
+\r
+            *cOptionCount = pos-lBound;\r
+            if( FAILED(hr) )\r
+            {\r
+                // free already processed elements\r
+                freeTargetOptions(*cOptions, *cOptionCount);\r
+            }\r
+        }\r
+        else\r
+        {\r
+            // empty array\r
+            *cOptions = NULL;\r
+            *cOptionCount = 0;\r
+            return NOERROR;\r
+        }\r
+    }\r
+    return hr;\r
+};\r
+\r
+/*\r
+** use VARIANT rather than a SAFEARRAY as argument type\r
+** for compatibility with some scripting language (JScript)\r
+*/\r
+\r
+STDMETHODIMP VLCControl::addTarget( BSTR uri, VARIANT options, enum VLCPlaylistMode mode, int position)\r
+{\r
+    if( NULL == uri )\r
+        return E_INVALIDARG;\r
+\r
+    HRESULT hr = E_UNEXPECTED;\r
+\r
+    int i_vlc = _p_instance->getVLCObject();\r
+    if( i_vlc )\r
+    {\r
+        int codePage = _p_instance->getCodePage();\r
+        char *cUri = CStrFromBSTR(codePage, uri);\r
+        if( NULL == cUri )\r
+            return E_OUTOFMEMORY;\r
+\r
+        int cOptionsCount;\r
+        char **cOptions;\r
+\r
+        if( FAILED(createTargetOptions(codePage, &options, &cOptions, &cOptionsCount)) )\r
+            return E_INVALIDARG;\r
+\r
+        VLC_AddTarget(i_vlc, cUri, (const char **)cOptions, cOptionsCount, mode, position);\r
+        hr = NOERROR;\r
+\r
+        freeTargetOptions(cOptions, cOptionsCount);\r
+        free(cUri);\r
+    }\r
+    return hr;\r
+};\r
+        \r
+STDMETHODIMP VLCControl::get_PlaylistIndex(int *index)\r
+{\r
+    if( NULL == index )\r
+        return E_INVALIDARG;\r
+\r
+    int i_vlc = _p_instance->getVLCObject();\r
+    if( i_vlc )\r
+    {\r
+        *index = VLC_PlaylistIndex(i_vlc);\r
+        return NOERROR;\r
+    }\r
+    *index = 0;\r
+    return E_UNEXPECTED;\r
+};\r
+        \r
+STDMETHODIMP VLCControl::get_PlaylistCount(int *count)\r
+{\r
+    int i_vlc = _p_instance->getVLCObject();\r
+    if( i_vlc )\r
+    {\r
+        *count = VLC_PlaylistNumberOfItems(i_vlc);\r
+        return NOERROR;\r
+    }\r
+    return E_UNEXPECTED;\r
+};\r
+        \r
+STDMETHODIMP VLCControl::playlistNext(void)\r
+{\r
+    int i_vlc = _p_instance->getVLCObject();\r
+    if( i_vlc )\r
+    {\r
+        VLC_PlaylistNext(i_vlc);\r
+        return NOERROR;\r
+    }\r
+    return E_UNEXPECTED;\r
+};\r
+        \r
+STDMETHODIMP VLCControl::playlistPrev(void)\r
+{\r
+    int i_vlc = _p_instance->getVLCObject();\r
+    if( i_vlc )\r
+    {\r
+        VLC_PlaylistPrev(i_vlc);\r
+        return NOERROR;\r
+    }\r
+    return E_UNEXPECTED;\r
+};\r
+        \r
+STDMETHODIMP VLCControl::playlistClear(void)\r
+{\r
+    int i_vlc = _p_instance->getVLCObject();\r
+    if( i_vlc )\r
+    {\r
+        VLC_PlaylistClear(i_vlc);\r
+        return NOERROR;\r
+    }\r
+    return E_UNEXPECTED;\r
+};\r
+        \r
+STDMETHODIMP VLCControl::get_VersionInfo(BSTR *version)\r
+{\r
+    if( NULL == version )\r
+        return E_INVALIDARG;\r
+\r
+    const char *versionStr = VLC_Version();\r
+    if( NULL != versionStr )\r
+    {\r
+        *version = BSTRFromCStr(_p_instance->getCodePage(), versionStr);\r
+        \r
+        return NULL == *version ? E_OUTOFMEMORY : NOERROR;\r
+    }\r
+    *version = NULL;\r
+    return E_FAIL;\r
+};\r
\r
diff --git a/activex/vlccontrol.h b/activex/vlccontrol.h
new file mode 100644 (file)
index 0000000..bf60047
--- /dev/null
@@ -0,0 +1,100 @@
+/*****************************************************************************\r
+ * vlccontrol.h: ActiveX control for VLC\r
+ *****************************************************************************\r
+ * Copyright (C) 2005 VideoLAN\r
+ *\r
+ * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.\r
+ *****************************************************************************/\r
+\r
+#ifndef _VLCCONTROL_H_\r
+#define _VLCCONTROL_H_\r
+\r
+#include <oaidl.h>\r
+#include "axvlc_idl.h"\r
+\r
+class VLCControl : public IVLCControl\r
+{\r
+    \r
+public:\r
+\r
+    VLCControl(VLCPlugin *p_instance) :  _p_instance(p_instance), _p_typeinfo(NULL) {};\r
+    virtual ~VLCControl();\r
+\r
+    // IUnknown methods\r
+    STDMETHODIMP QueryInterface(REFIID riid, void **ppv)\r
+    {\r
+        if( (NULL != ppv)\r
+         && (IID_IUnknown == riid)\r
+         && (IID_IDispatch == riid)\r
+         && (IID_IVLCControl == riid) ) {\r
+            AddRef();\r
+            *ppv = dynamic_cast<LPVOID>(this);\r
+            return NOERROR;\r
+        }\r
+        return _p_instance->QueryInterface(riid, ppv);\r
+    };\r
+\r
+    STDMETHODIMP_(ULONG) AddRef(void) { return _p_instance->AddRef(); };\r
+    STDMETHODIMP_(ULONG) Release(void) { return _p_instance->Release(); };\r
+\r
+    // IDispatch methods\r
+    STDMETHODIMP GetTypeInfoCount(UINT*);\r
+    STDMETHODIMP GetTypeInfo(UINT, LCID, LPTYPEINFO*);\r
+    STDMETHODIMP GetIDsOfNames(REFIID,LPOLESTR*,UINT,LCID,DISPID*);\r
+    STDMETHODIMP Invoke(DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*);\r
+\r
+    // IVLCControl methods\r
+    STDMETHODIMP get_Value(VARIANT *pvarValue);\r
+    STDMETHODIMP put_Value(VARIANT pvarValue);\r
+    STDMETHODIMP play(void);\r
+    STDMETHODIMP get_Visible(VARIANT_BOOL *visible);\r
+    STDMETHODIMP put_Visible(VARIANT_BOOL visible);\r
+    STDMETHODIMP pause(void);\r
+    STDMETHODIMP stop(void);\r
+    STDMETHODIMP get_Playing(VARIANT_BOOL *isPlaying);\r
+    STDMETHODIMP put_Playing(VARIANT_BOOL isPlaying);\r
+    STDMETHODIMP get_Position(float *position);\r
+    STDMETHODIMP put_Position(float position);\r
+    STDMETHODIMP get_Time(int *seconds);\r
+    STDMETHODIMP put_Time(int seconds);\r
+    STDMETHODIMP shuttle(int seconds);\r
+    STDMETHODIMP fullscreen();\r
+    STDMETHODIMP get_Length(int *seconds);\r
+    STDMETHODIMP playFaster(void);\r
+    STDMETHODIMP playSlower(void);\r
+    STDMETHODIMP get_Volume(int *volume);\r
+    STDMETHODIMP put_Volume(int volume);\r
+    STDMETHODIMP toggleMute(void);\r
+    STDMETHODIMP addTarget( BSTR uri, VARIANT options, enum VLCPlaylistMode mode, int position);\r
+    STDMETHODIMP get_PlaylistIndex(int *index);\r
+    STDMETHODIMP get_PlaylistCount(int *count);\r
+    STDMETHODIMP playlistNext(void);\r
+    STDMETHODIMP playlistPrev(void);\r
+    STDMETHODIMP playlistClear(void);\r
+    STDMETHODIMP get_VersionInfo(BSTR *version);\r
\r
+private:\r
+\r
+    HRESULT      getTypeInfo();\r
+\r
+    VLCPlugin *_p_instance;\r
+    ITypeInfo *_p_typeinfo;\r
+\r
+};\r
\r
+#endif\r
+\r
index 3aadafca84e2d89ea312e4cfdf8255a1bcc3c901..916dbe5244a385618ecc40696af4ee521f6dcd33 100644 (file)
@@ -279,9 +279,9 @@ VLC_LIBRARY_SUFFIX
 
 case "${SYS}" in
   mingw32|cygwin)
-    VLC_ADD_CFLAGS([pic plugin mozilla],[${CFLAGS_mingw32_special}])
-    VLC_ADD_CXXFLAGS([pic plugin mozilla],[${CFLAGS_mingw32_special} ${CXXFLAGS_mingw32_special}])
-    VLC_ADD_OBJCFLAGS([pic plugin mozilla],[${CFLAGS_mingw32_special}])
+    VLC_ADD_CFLAGS([pic plugin mozilla activex],[${CFLAGS_mingw32_special}])
+    VLC_ADD_CXXFLAGS([pic plugin mozilla activex],[${CFLAGS_mingw32_special} ${CXXFLAGS_mingw32_special}])
+    VLC_ADD_OBJCFLAGS([pic plugin mozilla activex],[${CFLAGS_mingw32_special}])
     ;;
   *)
     VLC_ADD_CFLAGS([pic plugin mozilla],[-fpic -fPIC])
@@ -3915,6 +3915,30 @@ then
   AC_DEFINE(WORDS_BIGENDIAN, 1, big endian system)
 fi
 
+dnl
+dnl  Microsoft ActiveX support
+dnl
+AC_ARG_VAR(MIDL, [Microsoft IDL compiler (Win32 platform only)])
+AC_ARG_ENABLE(activex,
+  [  --enable-activex        build a vlc-based ActiveX control (default enabled on Win32)])
+if test "${enable_activex}" != "no"
+then
+  if test "${SYS}" = "mingw32" -o "${SYS}" = "cygwin"
+  then
+    AC_CHECK_PROG(MIDL, midl, :)
+    AM_CONDITIONAL(HAS_MIDL_COMPILER, test -n "${MIDL}")
+    AC_CHECK_HEADERS(ole2.h olectl.h,
+      [ VLC_ADD_CXXFLAGS([activex],[-fno-exceptions])
+        VLC_ADD_LDFLAGS([activex],[-lole32 -loleaut32 -luuid]) 
+        AC_CHECK_HEADERS(objsafe.h,
+          VLC_ADD_CXXFLAGS([activex],[-DHAVE_OBJSAFE_HEADER])
+        )
+      ],
+      [ AC_MSG_ERROR([required OLE headers are missing from your system]) ]
+    )
+  fi
+fi
+
 dnl
 dnl  Mozilla plugin
 dnl
@@ -4145,6 +4169,7 @@ VLC_OUTPUT_VLC_CONFIG_IN
 
 AC_CONFIG_FILES([
   Makefile
+  activex/Makefile
   debian/Makefile
   doc/Makefile
   intl/Makefile