//+------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1996-1998 // // File: DataObj.cxx // // Contents: Data object // // History: 26-Nov-1996 KyleP Created // 7/1/98 mohamedn extend comp. mgmt // //-------------------------------------------------------------------------- #include #pragma hdrstop #include #include #include #include // // Global variables // extern long gulcInstances; // // Static member initialization // unsigned int CCIAdminDO::_cfNodeType = RegisterClipboardFormat(CCF_NODETYPE); unsigned int CCIAdminDO::_cfNodeTypeString = RegisterClipboardFormat(CCF_SZNODETYPE); unsigned int CCIAdminDO::_cfDisplayName = RegisterClipboardFormat(CCF_DISPLAY_NAME); unsigned int CCIAdminDO::_cfClassId = RegisterClipboardFormat(CCF_SNAPIN_CLASSID); unsigned int CCIAdminDO::_cfInternal = RegisterClipboardFormat(L"IS_SNAPIN_INTERNAL"); unsigned int CCIAdminDO::_cfMachineName = RegisterClipboardFormat(MMC_MACHINE_NAME_CF); //+------------------------------------------------------------------------- // // Method: CCIAdminDO::QueryInterface // // Synopsis: Rebind to other interface // // Arguments: [riid] -- IID of new interface // [ppvObject] -- New interface * returned here // // Returns: S_OK if bind succeeded, E_NOINTERFACE if bind failed // // History: 26-Nov-1996 KyleP Created // //-------------------------------------------------------------------------- SCODE STDMETHODCALLTYPE CCIAdminDO::QueryInterface( REFIID riid, void ** ppvObject ) { SCODE sc = S_OK; if ( 0 == ppvObject ) return E_INVALIDARG; if ( IID_IDataObject == riid ) *ppvObject = (IUnknown *)(IDataObject *) this; else if ( IID_IUnknown == riid ) *ppvObject = (IUnknown *) this; else sc = E_NOINTERFACE; if ( SUCCEEDED( sc ) ) AddRef(); return sc; } //QueryInterface //+------------------------------------------------------------------------- // // Method: CCIAdminDO::AddRef // // Synopsis: Increments refcount // // History: 26-Nov-1996 KyleP Created // //-------------------------------------------------------------------------- ULONG STDMETHODCALLTYPE CCIAdminDO::AddRef() { //ciaDebugOut(( DEB_ITRACE, "CCIAdminDO::AddRef\n" )); return InterlockedIncrement( &_uRefs ); } //+------------------------------------------------------------------------- // // Method: CCIAdminDO::Release // // Synopsis: Decrement refcount. Delete if necessary. // // History: 26-Nov-1996 KyleP Created // //-------------------------------------------------------------------------- ULONG STDMETHODCALLTYPE CCIAdminDO::Release() { //ciaDebugOut(( DEB_ITRACE, "CCIAdminDO::Release\n" )); unsigned long uTmp = InterlockedDecrement( &_uRefs ); if ( 0 == uTmp ) delete this; return uTmp; } //+------------------------------------------------------------------------- // // Method: CCIAdminDO::Create // // Synopsis: CDataObject creation // // Arguments: [pBuffer] -- buffer // [len] -- buffer length // [lpMedium] -- medium // // Returns: HRESULT upon success or failure. // // History: 7/1/98 mohamedn created // //-------------------------------------------------------------------------- HRESULT CCIAdminDO::Create(const void* pBuffer, int len, LPSTGMEDIUM lpMedium) { //ciaDebugOut(( DEB_ITRACE, "CCIAdminDO::Create\n" )); HRESULT hr = DV_E_TYMED; // Do some simple validation if (pBuffer == NULL || lpMedium == NULL) return E_POINTER; // Make sure the type medium is HGLOBAL if (lpMedium->tymed == TYMED_HGLOBAL) { // Create the stream on the hGlobal passed in LPSTREAM lpStream; hr = CreateStreamOnHGlobal(lpMedium->hGlobal, FALSE, &lpStream); if (SUCCEEDED(hr)) { // Because we told CreateStreamOnHGlobal with 'FALSE', // only the stream is released here. // Note - the caller (i.e. snap-in, object) will free the HGLOBAL // at the correct time. This is according to the IDataObject specification. // store in smart pointer to release when we're out of scope XInterface xStream(lpStream); // Write to the stream the number of bytes unsigned long written; hr = lpStream->Write(pBuffer, len, &written); } } return hr; } //+------------------------------------------------------------------------- // // Method: CCIAdminDO::CreateNodeTypeData // // Synopsis: NodeType creation // // Arguments: [lpMedium] -- medium // // Returns: HRESULT upon success or failure. // // History: 7/1/98 mohamedn created // //-------------------------------------------------------------------------- HRESULT CCIAdminDO::CreateNodeTypeData(LPSTGMEDIUM lpMedium) { // ciaDebugOut(( DEB_ITRACE, "CCIAdminDO::CreateNodeTypeData\n" )); return Create(&guidCIRootNode, sizeof(GUID), lpMedium); } //+------------------------------------------------------------------------- // // Method: CCIAdminDO::CreateNodeTypeStringData // // Synopsis: NodeType creation // // Arguments: [lpMedium] -- medium // // Returns: HRESULT upon success or failure. // // History: 7/1/98 mohamedn created // //-------------------------------------------------------------------------- HRESULT CCIAdminDO::CreateNodeTypeStringData(LPSTGMEDIUM lpMedium) { // ciaDebugOut(( DEB_ITRACE, "CCIAdminDO::CreateNodeTypeStringData\n" )); return Create(wszCIRootNode, (wcslen(wszCIRootNode)+1) * sizeof (WCHAR) , lpMedium); } //+------------------------------------------------------------------------- // // Method: CCIAdminDO::CreateDisplayName // // Synopsis: CreateDisplayName // // Arguments: [lpMedium] -- medium // // Returns: HRESULT upon success or failure. // // History: 7/1/98 mohamedn created // //-------------------------------------------------------------------------- HRESULT CCIAdminDO::CreateDisplayName(LPSTGMEDIUM lpMedium) { unsigned cc; XGrowable xwcsTitle; if ( 0 == _pwcsMachine ) { cc = wcslen( STRINGRESOURCE(srIndexServerCmpManage) ) + 1; xwcsTitle.SetSize(cc); wcscpy( xwcsTitle.Get(), STRINGRESOURCE(srIndexServerCmpManage) ); } else { cc = wcslen( STRINGRESOURCE(srIndexServer) ) + 1; xwcsTitle.SetSize(cc); wcscpy( xwcsTitle.Get(), STRINGRESOURCE(srIndexServer) ); if ( _pwcsMachine[0] == L'.' ) { cc += wcslen( STRINGRESOURCE(srLM) ); xwcsTitle.SetSize( cc ); wcscat( xwcsTitle.Get(), STRINGRESOURCE(srLM) ); } else { cc += wcslen( _pwcsMachine ); cc += 2; // the UNC slashes xwcsTitle.SetSize( cc ); wcscat( xwcsTitle.Get(), L"\\\\" ); wcscat( xwcsTitle.Get(), _pwcsMachine ); } } return Create( xwcsTitle.Get(), cc * sizeof(WCHAR), lpMedium); } //+------------------------------------------------------------------------- // // Method: CCIAdminDO::CreateCoClassID // // Synopsis: CreateCoClassID // // Arguments: [lpMedium] -- medium // // Returns: HRESULT upon success or failure. // // History: 7/1/98 mohamedn created // //-------------------------------------------------------------------------- HRESULT CCIAdminDO::CreateCoClassID(LPSTGMEDIUM lpMedium) { // ciaDebugOut(( DEB_ITRACE, "CCIAdminDO::CreateCoClassID\n" )); const CLSID & clsid = guidCISnapin; return Create(&clsid, sizeof(CLSID), lpMedium); } //+------------------------------------------------------------------------- // // Method: CCIAdminDO::CreateInternal // // Synopsis: CreateInternal // // Arguments: [lpMedium] -- medium // // Returns: HRESULT upon success or failure. // // History: 7/1/98 mohamedn created // //-------------------------------------------------------------------------- HRESULT CCIAdminDO::CreateInternal(LPSTGMEDIUM lpMedium) { // ciaDebugOut(( DEB_ITRACE, "CCIAdminDO::CreateInternal\n" )); void * pThis = this; return Create(&pThis, sizeof (DWORD), lpMedium ); } //+------------------------------------------------------------------------- // // Method: CCIAdminDO::GetData // // Synopsis: Retrieves requested data type // // Arguments: [lpFormatetcIn] -- Requested data format // [lpMedium] -- Describes storage format // // History: 26-Nov-1996 KyleP Created // //-------------------------------------------------------------------------- SCODE STDMETHODCALLTYPE CCIAdminDO::GetData( FORMATETC * lpFormatetcIn, STGMEDIUM * lpMedium ) { // ciaDebugOut(( DEB_ITRACE, "CCIAdminDO::GetData\n" )); return E_NOTIMPL; } //+------------------------------------------------------------------------- // // Method: CCIAdminDO::GetDataHere // // Synopsis: Retrieves requested data type. Caller allocated storage. // // Arguments: [lpFormatetcIn] -- Requested data format // [lpMedium] -- Describes storage format // // History: 26-Nov-1996 KyleP Created // //-------------------------------------------------------------------------- STDMETHODIMP CCIAdminDO::GetDataHere( FORMATETC * lpFormatetc, STGMEDIUM * lpMedium ) { // ciaDebugOut(( DEB_ITRACE, "CCIAdminDO::GetDataHere\n" )); // // Simple parameter checking. // if ( 0 == lpFormatetc || 0 == lpMedium ) return E_POINTER; HRESULT hr = DV_E_CLIPFORMAT; // Based on the CLIPFORMAT write data to the stream const CLIPFORMAT cf = lpFormatetc->cfFormat; if (cf == _cfNodeType) { hr = CreateNodeTypeData(lpMedium); } else if (cf == _cfClassId) { hr = CreateCoClassID(lpMedium); } else if (cf == _cfNodeTypeString) { hr = CreateNodeTypeStringData(lpMedium); } else if (cf == _cfDisplayName) { hr = CreateDisplayName(lpMedium); } else if (cf == _cfInternal) { hr = CreateInternal(lpMedium); } return hr; } //+------------------------------------------------------------------------- // // Method: CCIAdminDO::EnumFormatEtc // // Synopsis: Enumerate available format types // // Arguments: [dwDirection] -- Get vs. Set formats // [ppEnumFormatEtc] -- Format(s) returned here // // History: 26-Nov-1996 KyleP Created // //-------------------------------------------------------------------------- SCODE STDMETHODCALLTYPE CCIAdminDO::EnumFormatEtc( DWORD dwDirection, IEnumFORMATETC ** ppEnumFormatEtc ) { // ciaDebugOut(( DEB_ITRACE, "CCIAdminDO::EnumFormatEtc\n" )); return E_NOTIMPL; } //+------------------------------------------------------------------------- // // Method: CCIAdminDO::CCIAdminDO // // Synopsis: Constructor // // Arguments: [cookie] -- Cookie (assigned by MMC) // [type] -- Where data object is used (scope, result, ...) // [pwcsMachine] -- Name of computer // // History: 26-Nov-1996 KyleP Created // //-------------------------------------------------------------------------- CCIAdminDO::CCIAdminDO( MMC_COOKIE cookie, DATA_OBJECT_TYPES type, WCHAR const * pwcsMachine ) : _cookie( cookie ), _type( type ), _pwcsMachine( pwcsMachine ), _uRefs( 1 ) { // ciaDebugOut(( DEB_ITRACE, "CCIAdminDO::CCIAdminDO, New data object: cookie = 0x%x, type = 0x%x\n", // _cookie, _type )); InterlockedIncrement( &gulcInstances ); } //+------------------------------------------------------------------------- // // Method: CCIAdminDO::~CCIAdminDO // // Synopsis: Destructor // // History: 26-Nov-1996 KyleP Created // //-------------------------------------------------------------------------- CCIAdminDO::~CCIAdminDO() { // ciaDebugOut(( DEB_ITRACE, "Delete data object: cookie = 0x%x, type = 0x%x\n", // _cookie, _type )); InterlockedDecrement( &gulcInstances ); } CCatalog * CCIAdminDO::GetCatalog() { if ( IsACatalog() ) return (CCatalog *)_cookie; else if ( IsADirectoryIntermediate() || IsAPropertyIntermediate() ) return &((CIntermediate *)_cookie)->GetCatalog(); else if ( IsAProperty() ) return &((CCachedProperty *)_cookie)->GetCatalog(); else return 0; }