connectioncontainer.h
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:4k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * connectioncontainer.h: ActiveX control for VLC
  3.  *****************************************************************************
  4.  * Copyright (C) 2005 the VideoLAN team
  5.  *
  6.  * Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>
  7.  *
  8.  * This program is free software; you can redistribute it and/or modify
  9.  * it under the terms of the GNU General Public License as published by
  10.  * the Free Software Foundation; either version 2 of the License, or
  11.  * (at your option) any later version.
  12.  *
  13.  * This program is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  * GNU General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU General Public License
  19.  * along with this program; if not, write to the Free Software
  20.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  21.  *****************************************************************************/
  22. #ifndef __CONNECTIONCONTAINER_H__
  23. #define __CONNECTIONCONTAINER_H__
  24. #include <ocidl.h>
  25. #include <vector>
  26. #include <queue>
  27. #include <map>
  28. class VLCConnectionPoint : public IConnectionPoint
  29. {
  30. public:
  31.     VLCConnectionPoint(IConnectionPointContainer *p_cpc, REFIID iid) :
  32.         _iid(iid), _p_cpc(p_cpc) {};
  33.     virtual ~VLCConnectionPoint() {};
  34.     // IUnknown methods
  35.     STDMETHODIMP QueryInterface(REFIID riid, void **ppv)
  36.     {
  37.         if( NULL == ppv )
  38.             return E_POINTER;
  39.         if( (IID_IUnknown == riid)
  40.          || (IID_IConnectionPoint == riid) )
  41.         {
  42.             AddRef();
  43.             *ppv = reinterpret_cast<LPVOID>(this);
  44.             return NOERROR;
  45.         }
  46.         // must be a standalone object
  47.         return E_NOINTERFACE;
  48.     };
  49.     STDMETHODIMP_(ULONG) AddRef(void) { return _p_cpc->AddRef(); };
  50.     STDMETHODIMP_(ULONG) Release(void) { return _p_cpc->Release(); };
  51.     // IConnectionPoint methods
  52.     STDMETHODIMP GetConnectionInterface(IID *);
  53.     STDMETHODIMP GetConnectionPointContainer(LPCONNECTIONPOINTCONTAINER *);
  54.     STDMETHODIMP Advise(IUnknown *, DWORD *);
  55.     STDMETHODIMP Unadvise(DWORD);
  56.     STDMETHODIMP EnumConnections(LPENUMCONNECTIONS *);
  57.     void fireEvent(DISPID dispIdMember, DISPPARAMS* pDispParams);
  58.     void firePropChangedEvent(DISPID dispId);
  59. private:
  60.     REFIID _iid;
  61.     IConnectionPointContainer *_p_cpc;
  62.     std::map<DWORD, LPUNKNOWN> _connections;
  63. };
  64. //////////////////////////////////////////////////////////////////////////
  65. class VLCDispatchEvent {
  66. public:
  67.     VLCDispatchEvent(DISPID dispId, DISPPARAMS dispParams) :
  68.         _dispId(dispId), _dispParams(dispParams) {};
  69.     VLCDispatchEvent(const VLCDispatchEvent&);
  70.     ~VLCDispatchEvent();
  71.     DISPID      _dispId;
  72.     DISPPARAMS  _dispParams;
  73. };
  74. class VLCConnectionPointContainer : public IConnectionPointContainer
  75. {
  76. public:
  77.     VLCConnectionPointContainer(VLCPlugin *p_instance);
  78.     virtual ~VLCConnectionPointContainer();
  79.     // IUnknown methods
  80.     STDMETHODIMP QueryInterface(REFIID riid, void **ppv)
  81.     {
  82.         if( NULL == ppv)
  83.             return E_POINTER;
  84.         if( (IID_IUnknown == riid)
  85.          || (IID_IConnectionPointContainer == riid) )
  86.         {
  87.             AddRef();
  88.             *ppv = reinterpret_cast<LPVOID>(this);
  89.             return NOERROR;
  90.         }
  91.         return _p_instance->pUnkOuter->QueryInterface(riid, ppv);
  92.     };
  93.     STDMETHODIMP_(ULONG) AddRef(void) { return _p_instance->pUnkOuter->AddRef(); };
  94.     STDMETHODIMP_(ULONG) Release(void) { return _p_instance->pUnkOuter->Release(); };
  95.     // IConnectionPointContainer methods
  96.     STDMETHODIMP EnumConnectionPoints(LPENUMCONNECTIONPOINTS *);
  97.     STDMETHODIMP FindConnectionPoint(REFIID, LPCONNECTIONPOINT *);
  98.     void freezeEvents(BOOL);
  99.     void fireEvent(DISPID, DISPPARAMS*);
  100.     void firePropChangedEvent(DISPID dispId);
  101. private:
  102.     VLCPlugin *_p_instance;
  103.     BOOL _b_freeze;
  104.     VLCConnectionPoint *_p_events;
  105.     VLCConnectionPoint *_p_props;
  106.     std::vector<LPCONNECTIONPOINT> _v_cps;
  107.     std::queue<class VLCDispatchEvent *> _q_events;
  108. };
  109. #endif