// save system data HRESULT wxIDataObject::SaveSystemData(FORMATETC *pformatetc, STGMEDIUM *pmedium, BOOL fRelease) { if ( pformatetc == NULL || pmedium == NULL ) return E_INVALIDARG; // remove entry if already available for ( SystemData::iterator it = m_systemData.begin(); it != m_systemData.end(); ++it ) { if ( pformatetc->tymed & (*it)->pformatetc->tymed && pformatetc->dwAspect == (*it)->pformatetc->dwAspect && pformatetc->cfFormat == (*it)->pformatetc->cfFormat ) { delete (*it); m_systemData.erase(it); break; } } // create new format/medium FORMATETC* pnewformatEtc = new FORMATETC; STGMEDIUM* pnewmedium = new STGMEDIUM; wxZeroMemory(*pnewformatEtc); wxZeroMemory(*pnewmedium); // copy format *pnewformatEtc = *pformatetc; // copy or take ownerschip of medium if ( fRelease ) *pnewmedium = *pmedium; else wxCopyStgMedium(pmedium, pnewmedium); // save entry m_systemData.push_back(new SystemDataEntry(pnewformatEtc, pnewmedium)); return S_OK; }