+
+protected:
+ HRESULT loadTypeInfo();
+
+private:
+ VLCPlugin* _p_instance;
+ ITypeInfo* _p_typeinfo;
+
+};
+
+class VLCMessage: public IVLCMessage
+{
+public:
+
+ VLCMessage(VLCPlugin *p_instance, struct libvlc_log_message_t &msg) :
+ _p_instance(p_instance),
+ _p_typeinfo(NULL),
+ _refcount(1),
+ _msg(msg) {};
+ virtual ~VLCMessage();
+
+ // IUnknown methods
+ STDMETHODIMP QueryInterface(REFIID riid, void **ppv)
+ {
+ if( NULL == ppv )
+ return E_POINTER;
+ if( (IID_IUnknown == riid)
+ || (IID_IDispatch == riid)
+ || (IID_IVLCMessage == riid) )
+ {
+ AddRef();
+ *ppv = reinterpret_cast<LPVOID>(this);
+ return NOERROR;
+ }
+ // behaves as a standalone object
+ return E_NOINTERFACE;
+ };
+
+ STDMETHODIMP_(ULONG) AddRef(void) { return InterlockedIncrement(&_refcount); };
+ STDMETHODIMP_(ULONG) Release(void)
+ {
+ ULONG refcount = InterlockedDecrement(&_refcount);
+ if( 0 == refcount )
+ {
+ delete this;
+ return 0;
+ }
+ return refcount;
+ };
+
+ // IDispatch methods
+ STDMETHODIMP GetTypeInfoCount(UINT*);
+ STDMETHODIMP GetTypeInfo(UINT, LCID, LPTYPEINFO*);
+ STDMETHODIMP GetIDsOfNames(REFIID,LPOLESTR*,UINT,LCID,DISPID*);
+ STDMETHODIMP Invoke(DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*);
+
+ // IVLCMessage methods
+ STDMETHODIMP get__Value(VARIANT *);
+ STDMETHODIMP get_severity(long *);
+ STDMETHODIMP get_type(BSTR *);
+ STDMETHODIMP get_name(BSTR *);
+ STDMETHODIMP get_header(BSTR *);
+ STDMETHODIMP get_message(BSTR *);
+
+protected:
+ HRESULT loadTypeInfo();
+
+private:
+ VLCPlugin* _p_instance;
+ ITypeInfo* _p_typeinfo;
+ LONG _refcount;
+
+ struct libvlc_log_message_t _msg;
+};
+
+class VLCLog;
+
+class VLCMessageIterator : public IVLCMessageIterator
+{
+public:
+
+ VLCMessageIterator(VLCPlugin *p_instance, VLCLog* p_vlclog);
+ virtual ~VLCMessageIterator();
+
+ // IUnknown methods
+ STDMETHODIMP QueryInterface(REFIID riid, void **ppv)
+ {
+ if( NULL == ppv )
+ return E_POINTER;
+ if( (IID_IUnknown == riid)
+ || (IID_IDispatch == riid)
+ || (IID_IVLCMessageIterator == riid) )
+ {
+ AddRef();
+ *ppv = reinterpret_cast<LPVOID>(this);
+ return NOERROR;
+ }
+ // behaves as a standalone object
+ return E_NOINTERFACE;
+ };
+
+ STDMETHODIMP_(ULONG) AddRef(void) { return InterlockedIncrement(&_refcount); };
+ STDMETHODIMP_(ULONG) Release(void)
+ {
+ ULONG refcount = InterlockedDecrement(&_refcount);
+ if( 0 == refcount )
+ {
+ delete this;
+ return 0;
+ }
+ return refcount;
+ };
+
+ // IDispatch methods
+ STDMETHODIMP GetTypeInfoCount(UINT*);
+ STDMETHODIMP GetTypeInfo(UINT, LCID, LPTYPEINFO*);
+ STDMETHODIMP GetIDsOfNames(REFIID,LPOLESTR*,UINT,LCID,DISPID*);
+ STDMETHODIMP Invoke(DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*);
+
+ // IVLCMessageIterator methods
+ STDMETHODIMP get_hasNext(VARIANT_BOOL*);
+ STDMETHODIMP next(IVLCMessage**);
+
+protected:
+ HRESULT loadTypeInfo();
+
+private:
+ VLCPlugin* _p_instance;
+ ITypeInfo* _p_typeinfo;
+ LONG _refcount;
+
+ VLCLog* _p_vlclog;
+ libvlc_log_iterator_t* _p_iter;
+};
+
+class VLCMessages : public IVLCMessages
+{
+public:
+
+ VLCMessages(VLCPlugin *p_instance, VLCLog *p_vlclog) :
+ _p_vlclog(p_vlclog),
+ _p_instance(p_instance),
+ _p_typeinfo(NULL) {}
+ virtual ~VLCMessages();
+
+ // IUnknown methods
+ STDMETHODIMP QueryInterface(REFIID riid, void **ppv)
+ {
+ if( NULL == ppv )
+ return E_POINTER;
+ if( (IID_IUnknown == riid)
+ || (IID_IDispatch == riid)
+ || (IID_IVLCMessages == riid) )
+ {
+ AddRef();
+ *ppv = reinterpret_cast<LPVOID>(this);
+ return NOERROR;
+ }
+ // behaves as a standalone object
+ return E_NOINTERFACE;
+ };
+
+ STDMETHODIMP_(ULONG) AddRef(void) { return _p_instance->pUnkOuter->AddRef(); };
+ STDMETHODIMP_(ULONG) Release(void) { return _p_instance->pUnkOuter->Release(); };
+
+ // IDispatch methods
+ STDMETHODIMP GetTypeInfoCount(UINT*);
+ STDMETHODIMP GetTypeInfo(UINT, LCID, LPTYPEINFO*);
+ STDMETHODIMP GetIDsOfNames(REFIID,LPOLESTR*,UINT,LCID,DISPID*);
+ STDMETHODIMP Invoke(DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*);
+
+ // IVLCMessages methods
+ STDMETHODIMP get__NewEnum(LPUNKNOWN*);
+ STDMETHODIMP clear();
+ STDMETHODIMP get_count(long*);
+ STDMETHODIMP iterator(IVLCMessageIterator**);
+
+protected:
+ HRESULT loadTypeInfo();
+
+ VLCLog* _p_vlclog;
+