2007-03-22 10:30:00 -07:00
|
|
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
2012-05-21 04:12:37 -07:00
|
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
2007-03-22 10:30:00 -07:00
|
|
|
|
2009-12-20 07:56:06 -08:00
|
|
|
#ifndef IEnumeFE_h__
|
|
|
|
#define IEnumeFE_h__
|
|
|
|
|
|
|
|
/*
|
|
|
|
* CEnumFormatEtc - implements IEnumFORMATETC
|
|
|
|
*/
|
2007-03-22 10:30:00 -07:00
|
|
|
|
|
|
|
#include <ole2.h>
|
|
|
|
|
2009-12-20 07:56:06 -08:00
|
|
|
#include "nsTArray.h"
|
2012-06-14 11:28:06 -07:00
|
|
|
#include "mozilla/Attributes.h"
|
2009-12-20 07:56:06 -08:00
|
|
|
|
|
|
|
// FORMATETC container
|
|
|
|
class FormatEtc
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
FormatEtc() { memset(&mFormat, 0, sizeof(FORMATETC)); }
|
|
|
|
FormatEtc(const FormatEtc& copy) { CopyIn(©.mFormat); }
|
|
|
|
~FormatEtc() { if (mFormat.ptd) CoTaskMemFree(mFormat.ptd); }
|
|
|
|
|
|
|
|
void CopyIn(const FORMATETC *aSrc) {
|
|
|
|
if (!aSrc) {
|
|
|
|
memset(&mFormat, 0, sizeof(FORMATETC));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
mFormat = *aSrc;
|
|
|
|
if (aSrc->ptd) {
|
|
|
|
mFormat.ptd = (DVTARGETDEVICE*)CoTaskMemAlloc(sizeof(DVTARGETDEVICE));
|
|
|
|
*(mFormat.ptd) = *(aSrc->ptd);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void CopyOut(LPFORMATETC aDest) {
|
|
|
|
if (!aDest)
|
|
|
|
return;
|
|
|
|
*aDest = mFormat;
|
|
|
|
if (mFormat.ptd) {
|
|
|
|
aDest->ptd = (DVTARGETDEVICE*)CoTaskMemAlloc(sizeof(DVTARGETDEVICE));
|
|
|
|
*(aDest->ptd) = *(mFormat.ptd);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
FORMATETC mFormat;
|
|
|
|
};
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
/*
|
2009-12-20 07:56:06 -08:00
|
|
|
* CEnumFormatEtc is created within IDataObject::EnumFormatEtc. This object lives
|
|
|
|
* on its own, that is, QueryInterface only knows IUnknown and IEnumFormatEtc,
|
|
|
|
* nothing more. We still use an outer unknown for reference counting, because as
|
|
|
|
* long as this enumerator lives, the data object should live, thereby keeping the
|
|
|
|
* application up.
|
2007-03-22 10:30:00 -07:00
|
|
|
*/
|
|
|
|
|
2012-06-14 11:28:06 -07:00
|
|
|
class CEnumFormatEtc MOZ_FINAL : public IEnumFORMATETC
|
2009-12-20 07:56:06 -08:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
CEnumFormatEtc(nsTArray<FormatEtc>& aArray);
|
|
|
|
CEnumFormatEtc();
|
|
|
|
~CEnumFormatEtc();
|
|
|
|
|
|
|
|
// IUnknown impl.
|
|
|
|
STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppv);
|
|
|
|
STDMETHODIMP_(ULONG) AddRef();
|
|
|
|
STDMETHODIMP_(ULONG) Release();
|
|
|
|
|
|
|
|
// IEnumFORMATETC impl.
|
|
|
|
STDMETHODIMP Next(ULONG aMaxToFetch, FORMATETC *aResult, ULONG *aNumFetched);
|
|
|
|
STDMETHODIMP Skip(ULONG aSkipNum);
|
|
|
|
STDMETHODIMP Reset();
|
|
|
|
STDMETHODIMP Clone(LPENUMFORMATETC *aResult); // Addrefs
|
|
|
|
|
|
|
|
// Utils
|
|
|
|
void AddFormatEtc(LPFORMATETC aFormat);
|
|
|
|
|
|
|
|
private:
|
|
|
|
nsTArray<FormatEtc> mFormatList; // Formats
|
|
|
|
ULONG mRefCnt; // Object reference count
|
|
|
|
ULONG mCurrentIdx; // Current element
|
|
|
|
|
2012-08-22 08:56:38 -07:00
|
|
|
void SetIndex(uint32_t aIdx);
|
2009-12-20 07:56:06 -08:00
|
|
|
};
|
2007-03-22 10:30:00 -07:00
|
|
|
|
|
|
|
|
|
|
|
#endif //_IENUMFE_H_
|