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

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * utils.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 __UTILS_H__
  23. #define __UTILS_H__
  24. #include <ole2.h>
  25. #include <vector>
  26. // utilities
  27. extern char *CStrFromWSTR(UINT codePage, LPCWSTR wstr, UINT len);
  28. extern char *CStrFromBSTR(UINT codePage, BSTR bstr);
  29. extern BSTR BSTRFromCStr(UINT codePage, LPCSTR s);
  30. // properties
  31. extern HRESULT GetObjectProperty(LPUNKNOWN object, DISPID dispID, VARIANT& v);
  32. // properties
  33. extern HDC CreateDevDC(DVTARGETDEVICE *ptd);
  34. extern void DPFromHimetric(HDC hdc, LPPOINT pt, int count);
  35. extern void HimetricFromDP(HDC hdc, LPPOINT pt, int count);
  36. // URL
  37. extern LPWSTR CombineURL(LPCWSTR baseUrl, LPCWSTR url);
  38. /**************************************************************************************************/
  39. /* this function object is used to dereference the iterator into a value */
  40. template <typename T, class Iterator>
  41. struct VLCDereference
  42. {
  43.     T operator()(const Iterator& i) const
  44.     {
  45.         return *i;
  46.     };
  47. };
  48. template<REFIID EnumeratorIID, class Enumerator, typename T, class Iterator, typename Dereference = VLCDereference<T, Iterator> >
  49. class VLCEnumIterator : public Enumerator
  50. {
  51. public:
  52.     VLCEnumIterator(const Iterator& from, const Iterator& to) :
  53.         _refcount(1),
  54.         _begin(from),
  55.         _curr(from),
  56.         _end(to)
  57.     {};
  58.     VLCEnumIterator(const VLCEnumIterator& e) :
  59.         Enumerator(),
  60.         _refcount(e._refcount),
  61.         _begin(e._begin),
  62.         _curr(e._curr),
  63.         _end(e._end)
  64.     {};
  65.     virtual ~VLCEnumIterator()
  66.     {};
  67.     // IUnknown methods
  68.     STDMETHODIMP QueryInterface(REFIID riid, void **ppv)
  69.     {
  70.         if( NULL == ppv )
  71.             return E_POINTER;
  72.         if( (IID_IUnknown == riid)
  73.          || (EnumeratorIID == riid) )
  74.         {
  75.             AddRef();
  76.             *ppv = reinterpret_cast<LPVOID>(this);
  77.             return NOERROR;
  78.         }
  79.         // standalone object
  80.         return E_NOINTERFACE;
  81.     };
  82.     STDMETHODIMP_(ULONG) AddRef(void)
  83.     {
  84.         return InterlockedIncrement(&_refcount);
  85.     };
  86.     STDMETHODIMP_(ULONG) Release(void)
  87.     {
  88.         ULONG refcount = InterlockedDecrement(&_refcount);
  89.         if( 0 == refcount )
  90.         {
  91.             delete this;
  92.             return 0;
  93.         }
  94.         return refcount;
  95.     };
  96.     // IEnumXXXX methods
  97.     STDMETHODIMP Next(ULONG celt, T *rgelt, ULONG *pceltFetched)
  98.     {
  99.         if( NULL == rgelt )
  100.             return E_POINTER;
  101.         if( (celt > 1) && (NULL == pceltFetched) )
  102.             return E_INVALIDARG;
  103.         ULONG c = 0;
  104.         while( (c < celt) && (_curr != _end) )
  105.         {
  106.             rgelt[c] = dereference(_curr);
  107.             ++_curr;
  108.             ++c;
  109.         }
  110.         if( NULL != pceltFetched )
  111.             *pceltFetched = c;
  112.         return (c == celt) ? S_OK : S_FALSE;
  113.     };
  114.     STDMETHODIMP Skip(ULONG celt)
  115.     {
  116.         ULONG c = 0;
  117.         while( (c < celt) && (_curr != _end) )
  118.         {
  119.             ++_curr;
  120.             ++c;
  121.         }
  122.         return (c == celt) ? S_OK : S_FALSE;
  123.     };
  124.     STDMETHODIMP Reset(void)
  125.     {
  126.         _curr = _begin;
  127.         return S_OK;
  128.     };
  129.     STDMETHODIMP Clone(Enumerator **ppEnum)
  130.     {
  131.         if( NULL == ppEnum )
  132.             return E_POINTER;
  133.         *ppEnum = dynamic_cast<Enumerator *>(new VLCEnumIterator(*this));
  134.         return (NULL != *ppEnum ) ? S_OK : E_OUTOFMEMORY;
  135.     };
  136. private:
  137.     LONG     _refcount;
  138.     Iterator _begin, _curr, _end;
  139.     Dereference dereference;
  140. };
  141. #endif