/*
* (C) 2003-2006 Gabest
* (C) 2006-2012 see Authors.txt
*
* This file is part of MPC-HC.
*
* MPC-HC is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* MPC-HC is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
*/
#pragma once
#include
#include
// IDSMPropertyBag
interface __declspec(uuid("232FD5D2-4954-41E7-BF9B-09E1257B1A95"))
IDSMPropertyBag :
public IPropertyBag2 {
STDMETHOD(SetProperty)(LPCWSTR key, LPCWSTR value) = 0;
STDMETHOD(SetProperty)(LPCWSTR key, VARIANT * var) = 0;
STDMETHOD(GetProperty)(LPCWSTR key, BSTR * value) = 0;
STDMETHOD(DelAllProperties)() = 0;
STDMETHOD(DelProperty)(LPCWSTR key) = 0;
};
class IDSMPropertyBagImpl : public ATL::CSimpleMap, public IDSMPropertyBag, public IPropertyBag
{
BOOL Add(const CStringW& key, const CStringW& val) {
return __super::Add(key, val);
}
BOOL SetAt(const CStringW& key, const CStringW& val) {
return __super::SetAt(key, val);
}
public:
IDSMPropertyBagImpl();
virtual ~IDSMPropertyBagImpl();
// IPropertyBag
STDMETHODIMP Read(LPCOLESTR pszPropName, VARIANT* pVar, IErrorLog* pErrorLog);
STDMETHODIMP Write(LPCOLESTR pszPropName, VARIANT* pVar);
// IPropertyBag2
STDMETHODIMP Read(ULONG cProperties, PROPBAG2* pPropBag, IErrorLog* pErrLog, VARIANT* pvarValue, HRESULT* phrError);
STDMETHODIMP Write(ULONG cProperties, PROPBAG2* pPropBag, VARIANT* pvarValue);
STDMETHODIMP CountProperties(ULONG* pcProperties);
STDMETHODIMP GetPropertyInfo(ULONG iProperty, ULONG cProperties, PROPBAG2* pPropBag, ULONG* pcProperties);
STDMETHODIMP LoadObject(LPCOLESTR pstrName, DWORD dwHint, IUnknown* pUnkObject, IErrorLog* pErrLog);
// IDSMPropertyBag
STDMETHODIMP SetProperty(LPCWSTR key, LPCWSTR value);
STDMETHODIMP SetProperty(LPCWSTR key, VARIANT* var);
STDMETHODIMP GetProperty(LPCWSTR key, BSTR* value);
STDMETHODIMP DelAllProperties();
STDMETHODIMP DelProperty(LPCWSTR key);
};
// IDSMResourceBag
interface __declspec(uuid("EBAFBCBE-BDE0-489A-9789-05D5692E3A93"))
IDSMResourceBag :
public IUnknown {
STDMETHOD_(DWORD, ResGetCount)() = 0;
STDMETHOD(ResGet)(DWORD iIndex, BSTR * ppName, BSTR * ppDesc, BSTR * ppMime, BYTE** ppData, DWORD * pDataLen, DWORD_PTR * pTag) = 0;
STDMETHOD(ResSet)(DWORD iIndex, LPCWSTR pName, LPCWSTR pDesc, LPCWSTR pMime, BYTE * pData, DWORD len, DWORD_PTR tag) = 0;
STDMETHOD(ResAppend)(LPCWSTR pName, LPCWSTR pDesc, LPCWSTR pMime, BYTE * pData, DWORD len, DWORD_PTR tag) = 0;
STDMETHOD(ResRemoveAt)(DWORD iIndex) = 0;
STDMETHOD(ResRemoveAll)(DWORD_PTR tag) = 0;
};
class CDSMResource
{
public:
DWORD_PTR tag;
CStringW name, desc, mime;
CAtlArray data;
CDSMResource();
CDSMResource(const CDSMResource& r);
CDSMResource(LPCWSTR name, LPCWSTR desc, LPCWSTR mime, BYTE* pData, int len, DWORD_PTR tag = 0);
virtual ~CDSMResource();
CDSMResource& operator = (const CDSMResource& r);
// global access to all resources
static CCritSec m_csResources;
static CAtlMap m_resources;
};
class IDSMResourceBagImpl : public IDSMResourceBag
{
protected:
CAtlArray m_resources;
public:
IDSMResourceBagImpl();
void operator += (const CDSMResource& r) { m_resources.Add(r); }
// IDSMResourceBag
STDMETHODIMP_(DWORD) ResGetCount();
STDMETHODIMP ResGet(DWORD iIndex, BSTR* ppName, BSTR* ppDesc, BSTR* ppMime,
BYTE** ppData, DWORD* pDataLen, DWORD_PTR* pTag = NULL);
STDMETHODIMP ResSet(DWORD iIndex, LPCWSTR pName, LPCWSTR pDesc, LPCWSTR pMime,
BYTE* pData, DWORD len, DWORD_PTR tag = 0);
STDMETHODIMP ResAppend(LPCWSTR pName, LPCWSTR pDesc, LPCWSTR pMime,
BYTE* pData, DWORD len, DWORD_PTR tag = 0);
STDMETHODIMP ResRemoveAt(DWORD iIndex);
STDMETHODIMP ResRemoveAll(DWORD_PTR tag = 0);
};
// IDSMChapterBag
interface __declspec(uuid("2D0EBE73-BA82-4E90-859B-C7C48ED3650F"))
IDSMChapterBag :
public IUnknown {
STDMETHOD_(DWORD, ChapGetCount)() = 0;
STDMETHOD(ChapGet)(DWORD iIndex, REFERENCE_TIME * prt, BSTR * ppName) = 0;
STDMETHOD(ChapSet)(DWORD iIndex, REFERENCE_TIME rt, LPCWSTR pName) = 0;
STDMETHOD(ChapAppend)(REFERENCE_TIME rt, LPCWSTR pName) = 0;
STDMETHOD(ChapRemoveAt)(DWORD iIndex) = 0;
STDMETHOD(ChapRemoveAll)() = 0;
STDMETHOD_(long, ChapLookup)(REFERENCE_TIME * prt, BSTR * ppName) = 0;
STDMETHOD(ChapSort)() = 0;
};
class CDSMChapter
{
static int counter;
int order;
public:
REFERENCE_TIME rt;
CStringW name;
CDSMChapter();
CDSMChapter(REFERENCE_TIME rt, LPCWSTR name);
CDSMChapter& operator = (const CDSMChapter& c);
static int Compare(const void* a, const void* b);
};
class IDSMChapterBagImpl : public IDSMChapterBag
{
protected:
CAtlArray m_chapters;
bool m_fSorted;
public:
IDSMChapterBagImpl();
void operator += (const CDSMChapter& c) { m_chapters.Add(c); m_fSorted = false; }
// IDSMChapterBag
STDMETHODIMP_(DWORD) ChapGetCount();
STDMETHODIMP ChapGet(DWORD iIndex, REFERENCE_TIME* prt, BSTR* ppName = NULL);
STDMETHODIMP ChapSet(DWORD iIndex, REFERENCE_TIME rt, LPCWSTR pName);
STDMETHODIMP ChapAppend(REFERENCE_TIME rt, LPCWSTR pName);
STDMETHODIMP ChapRemoveAt(DWORD iIndex);
STDMETHODIMP ChapRemoveAll();
STDMETHODIMP_(long) ChapLookup(REFERENCE_TIME* prt, BSTR* ppName = NULL);
STDMETHODIMP ChapSort();
};
class CDSMChapterBag : public CUnknown, public IDSMChapterBagImpl
{
public:
CDSMChapterBag(LPUNKNOWN pUnk, HRESULT* phr);
DECLARE_IUNKNOWN;
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
};
template
__declspec(nothrow noalias) __forceinline size_t range_bsearch(CAtlArray const& tArray, REFERENCE_TIME rt)
{
// MAXSIZE_T is returned by this function for status invalid
ptrdiff_t k = tArray.GetCount() - 1;
if ((k < 0) || (rt >= tArray[k].rt)) {
return k;
}
size_t ret = MAXSIZE_T;
if (!k) {
return ret;
}
size_t i = 0, j = k;
do {
size_t mid = (i + j) >> 1;
REFERENCE_TIME midrt = tArray[mid].rt;
if (rt == midrt) {
ret = mid;
break;
} else if (rt < midrt) {
ret = MAXSIZE_T;
if (j == mid) {
--mid;
}
j = mid;
} else if (rt > midrt) {
ret = mid;
if (i == mid) {
++mid;
}
i = mid;
}
} while (i < j);
return ret;
}