X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=activex%2Futils.h;h=5e8bea5f3e27a3bf08cf09a8e852b3a817e430a3;hb=94cc428df657035f243f4122b3c4ad1d910b2229;hp=070c477c4670342169a33b2f4b75e4591dcaa561;hpb=d2310f2a226acf7061a812193c8cd8aa15eff46b;p=vlc diff --git a/activex/utils.h b/activex/utils.h index 070c477c46..5e8bea5f3e 100644 --- a/activex/utils.h +++ b/activex/utils.h @@ -17,7 +17,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #ifndef __UTILS_H__ @@ -28,8 +28,9 @@ #include // utilities -extern char *CStrFromBSTR(int codePage, BSTR bstr); -extern BSTR BSTRFromCStr(int codePage, const char *s); +extern char *CStrFromWSTR(UINT codePage, LPCWSTR wstr, UINT len); +extern char *CStrFromBSTR(UINT codePage, BSTR bstr); +extern BSTR BSTRFromCStr(UINT codePage, LPCSTR s); // properties extern HRESULT GetObjectProperty(LPUNKNOWN object, DISPID dispID, VARIANT& v); @@ -39,148 +40,135 @@ extern HDC CreateDevDC(DVTARGETDEVICE *ptd); extern void DPFromHimetric(HDC hdc, LPPOINT pt, int count); extern void HimetricFromDP(HDC hdc, LPPOINT pt, int count); +// URL +extern LPWSTR CombineURL(LPCWSTR baseUrl, LPCWSTR url); -// enumeration -template class VLCEnum : IUnknown +/**************************************************************************************************/ + +/* this function object is used to dereference the iterator into a value */ +template +struct VLCDereference { + T operator()(const Iterator& i) const + { + return *i; + }; +}; -public: +template > +class VLCEnumIterator : public Enumerator +{ - VLCEnum(REFIID riid, std::vector &); - VLCEnum(const VLCEnum &); - virtual ~VLCEnum() {}; +public: - VLCEnum& operator=(const VLCEnum &t); + VLCEnumIterator(const Iterator& from, const Iterator& to) : + _refcount(1), + _begin(from), + _curr(from), + _end(to) + {}; - // IUnknown methods - STDMETHODIMP QueryInterface(REFIID riid, void **); - STDMETHODIMP_(ULONG) AddRef(void); - STDMETHODIMP_(ULONG) Release(void); + VLCEnumIterator(const VLCEnumIterator& e) : + Enumerator(), + _refcount(e._refcount), + _begin(e._begin), + _curr(e._curr), + _end(e._end) + {}; - // IEnumXXXX methods - STDMETHODIMP Next(ULONG, T *, ULONG *); - STDMETHODIMP Skip(ULONG); - STDMETHODIMP Reset(void); - // cloning is implemented by subclasses and must use copy constructor - //STDMETHODIMP Clone(VLCEnum **); + virtual ~VLCEnumIterator() + {}; - typedef void (*retainer)(T); + // IUnknown methods + STDMETHODIMP QueryInterface(REFIID riid, void **ppv) + { + if( NULL == ppv ) + return E_POINTER; + if( (IID_IUnknown == riid) + || (EnumeratorIID == riid) ) + { + AddRef(); + *ppv = reinterpret_cast(this); + return NOERROR; + } + // standalone object + return E_NOINTERFACE; + }; + + STDMETHODIMP_(ULONG) AddRef(void) + { + return InterlockedIncrement(&_refcount); + }; - void setRetainOperation(retainer retain) { _retain = retain; }; + STDMETHODIMP_(ULONG) Release(void) + { + ULONG refcount = InterlockedDecrement(&_refcount); + if( 0 == refcount ) + { + delete this; + return 0; + } + return refcount; + }; -private: - LONG _refcount; - std::vector _v; - typename std::vector::iterator _i; - REFIID _riid; - retainer _retain; -}; + // IEnumXXXX methods + STDMETHODIMP Next(ULONG celt, T *rgelt, ULONG *pceltFetched) + { + if( NULL == rgelt ) + return E_POINTER; -template -VLCEnum::VLCEnum(REFIID riid, std::vector &v) : - _refcount(1), - _v(v), - _riid(riid), - _retain(NULL) -{ - _i= v.begin(); -}; + if( (celt > 1) && (NULL == pceltFetched) ) + return E_INVALIDARG; -template -VLCEnum::VLCEnum(const VLCEnum &e) : - _refcount(1), - _v(e._v), - _riid(e._riid) -{ -}; + ULONG c = 0; -template -VLCEnum& VLCEnum::operator=(const VLCEnum &e) -{ - this->_refcount = 1; - this->_riid = e._riid; - this->_v = e._v; - this->_i = e._i; - return this; -}; + while( (c < celt) && (_curr != _end) ) + { + rgelt[c] = dereference(_curr); + ++_curr; + ++c; + } -template -STDMETHODIMP VLCEnum::QueryInterface(REFIID riid, void **ppv) -{ - if( NULL == ppv ) return E_POINTER; - if( (IID_IUnknown == riid) - && ( _riid == riid) ) { - AddRef(); - *ppv = reinterpret_cast(this); - return NOERROR; - } - return E_NOINTERFACE; -}; + if( NULL != pceltFetched ) + *pceltFetched = c; -template -STDMETHODIMP_(ULONG) VLCEnum::AddRef(void) -{ - return InterlockedIncrement(&_refcount); -}; + return (c == celt) ? S_OK : S_FALSE; + }; -template -STDMETHODIMP_(ULONG) VLCEnum::Release(void) -{ - ULONG refcount = InterlockedDecrement(&_refcount); - if( 0 == refcount ) + STDMETHODIMP Skip(ULONG celt) { - delete this; - return 0; - } - return refcount; -}; + ULONG c = 0; -template -STDMETHODIMP VLCEnum::Next(ULONG celt, T *rgelt, ULONG *pceltFetched) -{ - if( NULL == rgelt ) - return E_POINTER; + while( (c < celt) && (_curr != _end) ) + { + ++_curr; + ++c; + } + return (c == celt) ? S_OK : S_FALSE; + }; - if( (celt > 1) && (NULL == pceltFetched) ) - return E_INVALIDARG; - - ULONG c = 0; - typename std::vector::iterator end = _v.end(); + STDMETHODIMP Reset(void) + { + _curr = _begin; + return S_OK; + }; - while( (c < celt) && (_i != end) ) + STDMETHODIMP Clone(Enumerator **ppEnum) { - rgelt[c] = *_i; - if( NULL != _retain ) _retain(rgelt[c]); - ++_i; - ++c; - } + if( NULL == ppEnum ) + return E_POINTER; + *ppEnum = dynamic_cast(new VLCEnumIterator(*this)); + return (NULL != *ppEnum ) ? S_OK : E_OUTOFMEMORY; + }; - if( NULL != pceltFetched ) - *pceltFetched = c; +private: - return (c == celt) ? S_OK : S_FALSE; -}; + LONG _refcount; + Iterator _begin, _curr, _end; -template -STDMETHODIMP VLCEnum::Skip(ULONG celt) -{ - ULONG c = 0; - typename std::vector::iterator end = _v.end(); + Dereference dereference; - while( (c < celt) && (_i != end) ) - { - ++_i; - ++c; - } - return (c == celt) ? S_OK : S_FALSE; -}; - -template -STDMETHODIMP VLCEnum::Reset(void) -{ - _i= _v.begin(); - return S_OK; }; #endif