DSMPropertyBag.h
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:5k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. #pragma once
  2. #include <atlsimpcoll.h>
  3. // IDSMPropertyBag
  4. [uuid("232FD5D2-4954-41E7-BF9B-09E1257B1A95")]
  5. interface IDSMPropertyBag : public IPropertyBag2
  6. {
  7. STDMETHOD(SetProperty) (LPCWSTR key, LPCWSTR value) = 0;
  8. STDMETHOD(SetProperty) (LPCWSTR key, VARIANT* var) = 0;
  9. STDMETHOD(GetProperty) (LPCWSTR key, BSTR* value) = 0;
  10. STDMETHOD(DelAllProperties) () = 0;
  11. STDMETHOD(DelProperty) (LPCWSTR key) = 0;
  12. };
  13. class IDSMPropertyBagImpl : public ATL::CSimpleMap<CStringW, CStringW>, public IDSMPropertyBag, public IPropertyBag
  14. {
  15. BOOL Add(const CStringW& key, const CStringW& val) {return __super::Add(key, val);}
  16. BOOL SetAt(const CStringW& key, const CStringW& val) {return __super::SetAt(key, val);}
  17. public:
  18. IDSMPropertyBagImpl();
  19. virtual ~IDSMPropertyBagImpl();
  20. // IPropertyBag
  21.     STDMETHODIMP Read(LPCOLESTR pszPropName, VARIANT* pVar, IErrorLog* pErrorLog);
  22.     STDMETHODIMP Write(LPCOLESTR pszPropName, VARIANT* pVar);
  23. // IPropertyBag2
  24. STDMETHODIMP Read(ULONG cProperties, PROPBAG2* pPropBag, IErrorLog* pErrLog, VARIANT* pvarValue, HRESULT* phrError);
  25. STDMETHODIMP Write(ULONG cProperties, PROPBAG2* pPropBag, VARIANT* pvarValue);
  26. STDMETHODIMP CountProperties(ULONG* pcProperties);
  27. STDMETHODIMP GetPropertyInfo(ULONG iProperty, ULONG cProperties, PROPBAG2* pPropBag, ULONG* pcProperties);
  28. STDMETHODIMP LoadObject(LPCOLESTR pstrName, DWORD dwHint, IUnknown* pUnkObject, IErrorLog* pErrLog);
  29. // IDSMPropertyBag
  30. STDMETHODIMP SetProperty(LPCWSTR key, LPCWSTR value);
  31. STDMETHODIMP SetProperty(LPCWSTR key, VARIANT* var);
  32. STDMETHODIMP GetProperty(LPCWSTR key, BSTR* value);
  33. STDMETHODIMP DelAllProperties();
  34. STDMETHODIMP DelProperty(LPCWSTR key);
  35. };
  36. // IDSMResourceBag
  37. [uuid("EBAFBCBE-BDE0-489A-9789-05D5692E3A93")]
  38. interface IDSMResourceBag : public IUnknown
  39. {
  40. STDMETHOD_(DWORD, ResGetCount) () = 0;
  41. STDMETHOD(ResGet) (DWORD iIndex, BSTR* ppName, BSTR* ppDesc, BSTR* ppMime, BYTE** ppData, DWORD* pDataLen, DWORD_PTR* pTag) = 0;
  42. STDMETHOD(ResSet) (DWORD iIndex, LPCWSTR pName, LPCWSTR pDesc, LPCWSTR pMime, BYTE* pData, DWORD len, DWORD_PTR tag) = 0;
  43. STDMETHOD(ResAppend) (LPCWSTR pName, LPCWSTR pDesc, LPCWSTR pMime, BYTE* pData, DWORD len, DWORD_PTR tag) = 0;
  44. STDMETHOD(ResRemoveAt) (DWORD iIndex) = 0;
  45. STDMETHOD(ResRemoveAll) (DWORD_PTR tag) = 0;
  46. };
  47. class CDSMResource
  48. {
  49. public:
  50. DWORD_PTR tag;
  51. CStringW name, desc, mime;
  52. CArray<BYTE> data;
  53. CDSMResource();
  54. CDSMResource(LPCWSTR name, LPCWSTR desc, LPCWSTR mime, BYTE* pData, int len, DWORD_PTR tag = 0);
  55. virtual ~CDSMResource();
  56. void operator = (const CDSMResource& r);
  57. // global access to all resources
  58. static CCritSec m_csResources;
  59. static CAtlMap<DWORD, CDSMResource*> m_resources;
  60. };
  61. class IDSMResourceBagImpl : public IDSMResourceBag
  62. {
  63. protected:
  64. CArray<CDSMResource> m_resources;
  65. public:
  66. IDSMResourceBagImpl();
  67. void operator += (const CDSMResource& r) {m_resources.Add(r);}
  68. // IDSMResourceBag
  69. STDMETHODIMP_(DWORD) ResGetCount();
  70. STDMETHODIMP ResGet(DWORD iIndex, BSTR* ppName, BSTR* ppDesc, BSTR* ppMime, BYTE** ppData, DWORD* pDataLen, DWORD_PTR* pTag = NULL);
  71. STDMETHODIMP ResSet(DWORD iIndex, LPCWSTR pName, LPCWSTR pDesc, LPCWSTR pMime, BYTE* pData, DWORD len, DWORD_PTR tag = 0);
  72. STDMETHODIMP ResAppend(LPCWSTR pName, LPCWSTR pDesc, LPCWSTR pMime, BYTE* pData, DWORD len, DWORD_PTR tag = 0);
  73. STDMETHODIMP ResRemoveAt(DWORD iIndex);
  74. STDMETHODIMP ResRemoveAll(DWORD_PTR tag = 0);
  75. };
  76. // IDSMChapterBag
  77. [uuid("2D0EBE73-BA82-4E90-859B-C7C48ED3650F")]
  78. interface IDSMChapterBag : public IUnknown
  79. {
  80. STDMETHOD_(DWORD, ChapGetCount) () = 0;
  81. STDMETHOD(ChapGet) (DWORD iIndex, REFERENCE_TIME* prt, BSTR* ppName) = 0;
  82. STDMETHOD(ChapSet) (DWORD iIndex, REFERENCE_TIME rt, LPCWSTR pName) = 0;
  83. STDMETHOD(ChapAppend) (REFERENCE_TIME rt, LPCWSTR pName) = 0;
  84. STDMETHOD(ChapRemoveAt) (DWORD iIndex) = 0;
  85. STDMETHOD(ChapRemoveAll) () = 0;
  86. STDMETHOD_(long, ChapLookup) (REFERENCE_TIME* prt, BSTR* ppName) = 0;
  87. STDMETHOD(ChapSort) () = 0;
  88. };
  89. class CDSMChapter
  90. {
  91. public:
  92. REFERENCE_TIME rt;
  93. CStringW name;
  94. CDSMChapter() {rt = 0;}
  95. CDSMChapter(REFERENCE_TIME rt, LPCWSTR name);
  96. void operator = (const CDSMChapter& c);
  97. };
  98. class IDSMChapterBagImpl : public IDSMChapterBag
  99. {
  100. protected:
  101. CArray<CDSMChapter> m_chapters;
  102. bool m_fSorted;
  103. public:
  104. IDSMChapterBagImpl();
  105. void operator += (const CDSMChapter& c) {m_chapters.Add(c); m_fSorted = false;}
  106. // IDSMChapterBag
  107. STDMETHODIMP_(DWORD) ChapGetCount();
  108. STDMETHODIMP ChapGet(DWORD iIndex, REFERENCE_TIME* prt, BSTR* ppName = NULL);
  109. STDMETHODIMP ChapSet(DWORD iIndex, REFERENCE_TIME rt, LPCWSTR pName);
  110. STDMETHODIMP ChapAppend(REFERENCE_TIME rt, LPCWSTR pName);
  111. STDMETHODIMP ChapRemoveAt(DWORD iIndex);
  112. STDMETHODIMP ChapRemoveAll();
  113. STDMETHODIMP_(long) ChapLookup(REFERENCE_TIME* prt, BSTR* ppName = NULL);
  114. STDMETHODIMP ChapSort();
  115. };
  116. class CDSMChapterBag : public CUnknown, public IDSMChapterBagImpl
  117. {
  118. public:
  119. CDSMChapterBag(LPUNKNOWN pUnk, HRESULT* phr);
  120. DECLARE_IUNKNOWN;
  121. STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
  122. };
  123. template<class T>
  124. int range_bsearch(const CArray<T>& array, REFERENCE_TIME rt)
  125. {
  126. int i = 0, j = array.GetCount() - 1, ret = -1;
  127. if(j >= 0 && rt >= array[j].rt) return j;
  128. while(i < j)
  129. {
  130. int mid = (i + j) >> 1;
  131. REFERENCE_TIME midrt = array[mid].rt;
  132. if(rt == midrt) {ret = mid; break;}
  133. else if(rt < midrt) {ret = -1; if(j == mid) mid--; j = mid;}
  134. else if(rt > midrt) {ret = mid; if(i == mid) mid++; i = mid;}
  135. }
  136. return ret;
  137. }