///////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2003 // // Module Name: // ExtObjData.cpp // // Description: // Implementation of the context menu functions and functions for // returning the property sheet and wizard pages. // // Author: // () Mmmm DD, 2003 // // Revision History: // // Notes: // ///////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "ClipBook ServerEx.h" #include "ExtObjData.h" #include "resprop.h" #include "resource.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // Constant Definitions ///////////////////////////////////////////////////////////////////////////// #define CLUSTER_MENU_BASE_ID 0 #define CLUSTER_MENU_ID_1 (CLUSTER_MENU_BASE_ID + 1) #define NODE_MENU_BASE_ID 10 #define NODE_MENU_ID_1 (NODE_MENU_BASE_ID + 1) #define GROUP_MENU_BASE_ID 20 #define GROUP_MENU_ID_1 (GROUP_MENU_BASE_ID + 1) #define RESOURCE_MENU_BASE_ID 30 #define RESOURCE_MENU_ID_1 (RESOURCE_MENU_BASE_ID + 1) #define ALL_RESOURCES_MENU_BASE_ID 40 #define ALL_RESOURCES_MENU_ID_1 (ALL_RESOURCES_MENU_BASE_ID + 1) #define RESTYPE_MENU_BASE_ID 50 #define RESTYPE_MENU_ID_1 (RESTYPE_MENU_BASE_ID + 1) #define ALL_RESTYPES_MENU_BASE_ID 60 #define ALL_RESTYPES_MENU_ID_1 (ALL_RESTYPES_MENU_BASE_ID + 1) #define NETWORK_MENU_BASE_ID 70 #define NETWORK_MENU_ID_1 (NETWORK_MENU_BASE_ID + 1) #define NETINTERFACE_MENU_BASE_ID 80 #define NETINTERFACE_MENU_ID_1 (NETINTERFACE_MENU_BASE_ID + 1) ///////////////////////////////////////////////////////////////////////////// // CObjData implementation ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// //++ // // CObjData::S_HrCreateObject // // Description: // Create a CObjData-derived object based on the requesting object type. // // Arguments: // // Return Value: // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CObjData::S_HrCreateObject( IUnknown * piDataIn , CObjData ** ppodOut ) { HRESULT hr = S_OK; CObjData * podData = NULL; CLUADMEX_OBJECT_TYPE cot; IGetClusterObjectInfo * piObjInfo = NULL; ASSERT( piDataIn != NULL ); ASSERT( ppodOut != NULL ); hr = piDataIn->QueryInterface( IID_IGetClusterObjectInfo, reinterpret_cast< LPVOID * >( &piObjInfo ) ); if ( FAILED( hr ) ) { goto Cleanup; } // if: error querying for interface cot = piObjInfo->GetObjectType( 0 ); piObjInfo->Release(); piObjInfo = NULL; switch ( cot ) { case CLUADMEX_OT_RESOURCE: podData = new CResData(); break; case CLUADMEX_OT_RESOURCETYPE: podData = new CResTypeData(); break; default: hr = E_NOTIMPL; goto Cleanup; break; } // switch: object type if ( podData == NULL ) { hr = E_OUTOFMEMORY; goto Cleanup; } // if: error allocating the object hr = podData->HrInitialize( piDataIn ); if ( FAILED( hr ) ) { goto Cleanup; } // if: error initializing the object *ppodOut = podData; podData = NULL; // We gave away ownership. Cleanup: if ( piObjInfo != NULL ) { piObjInfo->Release(); } // if: delete podData; return hr; } //*** CObjData::S_HrCreateObject ///////////////////////////////////////////////////////////////////////////// //++ // // CObjData::AddContextMenuItem // // Description: // Add a context menu item. // // Arguments: // piCallbackIn // Pointer to an IWCContextMenuCallback interface for adding menu // items to the context menu. // // Return Value: // S_OK // Menu items added successfully. // // hr // Any errors returned by IWCContextMenuCallback // ::AddExtensionMenuItem(). // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CObjData::AddContextMenuItem( IWCContextMenuCallback * piCallbackIn , UINT nMenuItem , UINT nMenuItemDesc , UINT nBaseID , ULONG uFlags ) { HRESULT hr = S_OK; CString strMenuItem; CString strStatusBarText; LPWSTR pwszMenuItem = NULL; LPWSTR pwszStatusBarText = NULL; ASSERT( piCallbackIn != NULL ); // // Get strings. // strMenuItem.LoadString( nMenuItem ); strStatusBarText.LoadString( nMenuItemDesc ); pwszMenuItem = strMenuItem.GetBuffer( 1 ); pwszStatusBarText = strStatusBarText.GetBuffer( 1 ); // // Add item to the context menu. // hr = piCallbackIn->AddExtensionMenuItem( pwszMenuItem // lpszName , pwszStatusBarText // lpszStatusBarText , nBaseID // lCommandID , 0 // lSubCommandID - reserved, must be 0 , uFlags // uFlags ); // // Release strings. // strMenuItem.ReleaseBuffer(); strStatusBarText.ReleaseBuffer(); return hr; } //*** CObjData::AddContextMenuItem ///////////////////////////////////////////////////////////////////////////// //++ // // CObjData::HrInitialize // // Description: // Initializes the object. // // Description: // // Arguments: // // Return Value: // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CObjData::HrInitialize( IUnknown * piDataIn ) { HRESULT hr = S_OK; BSTR bstrName = NULL; LONG cchName = 0; IGetClusterObjectInfo * piObjInfo = NULL; ASSERT( piDataIn != NULL ); // // Get an interface pointer to IGetClusterObjectInfo. // hr = piDataIn->QueryInterface( IID_IGetClusterObjectInfo, reinterpret_cast< LPVOID * >( &piObjInfo ) ); if ( FAILED( hr ) ) { goto Cleanup; } // if: error querying for interface // // Allocate a buffer for the object name. // hr = piObjInfo->GetObjectName( 0, NULL, &cchName ); if ( FAILED( hr ) ) { goto Cleanup; } // if: error getting the name length bstrName = SysAllocStringLen( NULL, cchName ); if ( bstrName == NULL ) { hr = E_OUTOFMEMORY; goto Cleanup; } // if: error allocating a string // // Retrieve the object name. // hr = piObjInfo->GetObjectName( 0, bstrName, &cchName ); if ( FAILED( hr ) ) { goto Cleanup; } // if: error getting the name // // The CString assignment operator makes a copy. // m_strName = bstrName; Cleanup: SysFreeString( bstrName ); if ( piObjInfo != NULL ) { piObjInfo->Release(); } // if: return hr; } //*** CObjData::HrInitialize ///////////////////////////////////////////////////////////////////////////// // CClusterData implementation ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// //++ // // CClusterData::HrInitialize // // Description: // Initializes the object. // // Arguments: // // Return Value: // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CClusterData::HrInitialize( IUnknown * piDataIn ) { HRESULT hr = S_OK; IGetClusterDataInfo * piClusInfo = NULL; LONG cchClusterName = 0; BSTR bstrClusterName = NULL; ASSERT( piDataIn != NULL ); // // Initialize the base class. // hr = CObjData::HrInitialize( piDataIn ); if ( FAILED( hr ) ) { goto Cleanup; } // if: error initializing the base class // // Initialize member variables to default values. // m_hCluster = NULL; // // Set the object type. // m_cot = CLUADMEX_OT_CLUSTER; // // Get an interface pointer to IGetClusterDataInfo. // hr = piDataIn->QueryInterface( IID_IGetClusterDataInfo, reinterpret_cast< LPVOID * >( &piClusInfo ) ); if ( FAILED( hr ) ) { goto Cleanup; } // if: error querying for interface // // Get a copy of the handle. Don't free this handle - it's just a copy. // m_hCluster = piClusInfo->GetClusterHandle(); ASSERT( m_hCluster != NULL ); if ( m_hCluster == NULL ) { hr = E_HANDLE; goto Cleanup; } // if: error querying for interface // // Allocate a buffer for and retrieve the name. // hr = piClusInfo->GetClusterName( NULL, &cchClusterName ); if ( FAILED( hr ) ) { goto Cleanup; } // if: error getting the name length bstrClusterName = SysAllocStringLen( NULL, cchClusterName ); if ( bstrClusterName == NULL ) { hr = E_OUTOFMEMORY; goto Cleanup; } // if: error allocating a string hr = piClusInfo->GetClusterName( bstrClusterName, &cchClusterName ); if ( FAILED( hr ) ) { goto Cleanup; } // if: error getting the name // // The CString assignment operator makes a copy. // m_strClusterName = bstrClusterName; Cleanup: if ( piClusInfo != NULL ) { piClusInfo->Release(); } // if: SysFreeString( bstrClusterName ); return hr; } //*** CClusterData::HrInitialize ///////////////////////////////////////////////////////////////////////////// //++ // // CClusterData::AddContextMenuItems // // Description: // Add menu items to the cluster object context menu. // // Arguments: // piCallbackIn // Pointer to an IWCContextMenuCallback interface for adding menu // items to the context menu. // // Return Value: // S_OK // Menu items added successfully. // // hr // Any errors returned by IWCContextMenuCallback // ::AddExtensionMenuItem(). // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CClusterData::AddContextMenuItems( IWCContextMenuCallback * piCallbackIn ) { HRESULT hr = S_OK; ASSERT( piCallbackIn != NULL ); hr = AddContextMenuItem( piCallbackIn , IDS_CLUSTER_MENU_ITEM_1 , IDS_CLUSTER_MENU_ITEM_1_DESC , CLUSTER_MENU_ID_1 , MF_ENABLED ); return hr; } //*** CClusterData::AddContextMenuItems ///////////////////////////////////////////////////////////////////////////// //++ // // CClusterData::InvokeCommand // // Description: // Invoke a command we added to a context menu. // // Arguments: // nCommandIDIn // ID of the menu item to execute. This is the same ID passed to the // IWCContextMenuCallback::AddExtensionMenuItem() method. // // Return Value: // HRESULT // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CClusterData::InvokeCommand( ULONG nCommandIDIn ) { HRESULT hr = S_OK; switch ( nCommandIDIn ) { case CLUSTER_MENU_ID_1: // // TODO: Implement your menu item here. // hr = S_OK; break; default: hr = E_NOTIMPL; break; } // switch: nCommandIDIn return hr; } //*** CClusterData::InvokeCommand ///////////////////////////////////////////////////////////////////////////// // CNodeData implementation ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// //++ // // CNodeData::HrInitialize // // Description: // Initializes the object. // // Arguments: // // Return Value: // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CNodeData::HrInitialize( IUnknown * piDataIn ) { HRESULT hr = S_OK; IGetClusterNodeInfo * piNodeInfo = NULL; ASSERT( piDataIn != NULL ); // // Initialize the base class. // hr = CObjData::HrInitialize( piDataIn ); if ( FAILED( hr ) ) { goto Cleanup; } // if: error initializing the base class // // Initialize member variables to default values. // m_hNode = NULL; // // Set the object type. // m_cot = CLUADMEX_OT_NODE; // // Get an interface pointer to IGetClusterNodeInfo. // hr = piDataIn->QueryInterface( IID_IGetClusterNodeInfo, reinterpret_cast< LPVOID * >( &piNodeInfo ) ); if ( FAILED( hr ) ) { goto Cleanup; } // if: error querying for interface // // Get a copy of the handle. Don't free this handle - it's just a copy. // m_hNode = piNodeInfo->GetNodeHandle( 0 ); ASSERT( m_hNode != NULL ); if ( m_hNode == NULL ) { hr = E_HANDLE; goto Cleanup; } // if: error getting the node handle Cleanup: if ( piNodeInfo != NULL ) { piNodeInfo->Release(); } // if: return hr; } //*** CNodeData::HrInitialize ///////////////////////////////////////////////////////////////////////////// //++ // // CNodeData::AddContextMenuItems // // Description: // Add menu items to the node object context menu. // // Arguments: // piCallbackIn // Pointer to an IWCContextMenuCallback interface for adding menu // items to the context menu. // // Return Value: // S_OK // Menu items added successfully. // // hr // Any errors returned by IWCContextMenuCallback // ::AddExtensionMenuItem(). // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CNodeData::AddContextMenuItems( IWCContextMenuCallback * piCallbackIn ) { HRESULT hr = S_OK; ASSERT( piCallbackIn != NULL ); hr = AddContextMenuItem( piCallbackIn , IDS_NODE_MENU_ITEM_1 , IDS_NODE_MENU_ITEM_1_DESC , NODE_MENU_ID_1 , MF_ENABLED ); return hr; } //*** CNodeData::AddContextMenuItems ///////////////////////////////////////////////////////////////////////////// //++ // // CNodeData::InvokeCommand // // Description: // Invoke a command we added to a context menu. // // Arguments: // nCommandIDIn // ID of the menu item to execute. This is the same ID passed to the // IWCContextMenuCallback::AddExtensionMenuItem() method. // // Return Value: // S_OK Command invoked successfully. // E_NOTIMPL Command ID not recognized. // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CNodeData::InvokeCommand( ULONG nCommandIDIn ) { HRESULT hr = S_OK; switch ( nCommandIDIn ) { case NODE_MENU_ID_1: // // TODO: Implement your menu item here // hr = S_OK; break; default: hr = E_NOTIMPL; break; } // switch: nCommandIDIn return hr; } //*** CNodeData::InvokeCommand ///////////////////////////////////////////////////////////////////////////// // CGroupData implementation ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// //++ // // CGroupData::HrInitialize // // Description: // Initializes the object. // // Arguments: // // Return Value: // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CGroupData::HrInitialize( IUnknown * piDataIn ) { HRESULT hr = S_OK; IGetClusterGroupInfo * piGroupInfo = NULL; ASSERT( piDataIn != NULL ); // // Initialize the base class. // hr = CObjData::HrInitialize( piDataIn ); if ( FAILED( hr ) ) { goto Cleanup; } // if: error initializing the base class // // Initialize member variables to default values. // m_hGroup = NULL; // // Set the object type. // m_cot = CLUADMEX_OT_GROUP; // // Get an interface pointer to IGetClusterGroupInfo. // hr = piDataIn->QueryInterface( IID_IGetClusterGroupInfo, reinterpret_cast< LPVOID * >( &piGroupInfo ) ); if ( FAILED( hr ) ) { goto Cleanup; } // if: error querying for interface // // Get a copy of the handle. Don't free this handle - it's just a copy. // m_hGroup = piGroupInfo->GetGroupHandle( 0 ); ASSERT( m_hGroup != NULL ); if ( m_hGroup == NULL ) { hr = E_HANDLE; goto Cleanup; } // if: error getting the group handle Cleanup: if ( piGroupInfo != NULL ) { piGroupInfo->Release(); } // if: return hr; } //*** CGroupData::HrInitialize ///////////////////////////////////////////////////////////////////////////// //++ // // CGroupData::AddContextMenuItems // // Description: // Add menu items to the group object context menu. // // Arguments: // piCallbackIn // Pointer to an IWCContextMenuCallback interface for adding menu // items to the context menu. // // Return Value: // S_OK // Menu items added successfully. // // hr // Any errors returned by IWCContextMenuCallback // ::AddExtensionMenuItem(). // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CGroupData::AddContextMenuItems( IWCContextMenuCallback * piCallbackIn ) { HRESULT hr = S_OK; ASSERT( piCallbackIn != NULL ); hr = AddContextMenuItem( piCallbackIn , IDS_GROUP_MENU_ITEM_1 , IDS_GROUP_MENU_ITEM_1_DESC , GROUP_MENU_ID_1 , MF_ENABLED ); return hr; } //*** CGroupData::AddContextMenuItems ///////////////////////////////////////////////////////////////////////////// //++ // // CGroupData::InvokeCommand // // Description: // Invoke a command we added to a context menu. // // Arguments: // nCommandIDIn // ID of the menu item to execute. This is the same ID passed to the // IWCContextMenuCallback::AddExtensionMenuItem() method. // // Return Value: // S_OK Command invoked successfully. // E_NOTIMPL Command ID not recognized. // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CGroupData::InvokeCommand( ULONG nCommandIDIn ) { HRESULT hr = S_OK; switch ( nCommandIDIn ) { case GROUP_MENU_ID_1: // // TODO: Implement your menu item here // hr = S_OK; break; default: hr = E_NOTIMPL; break; } // switch: nCommandIDIn return hr; } //*** CGroupData::InvokeCommand ///////////////////////////////////////////////////////////////////////////// // CResData implementation ///////////////////////////////////////////////////////////////////////////// // // Note: Since we don't have any properties to display we won't display // the Wizard or Property Sheet pages. To have them shown uncomment // the line below. // static CRuntimeClass * g_rgprtcResPSPages[] = { // RUNTIME_CLASS( CClipBookServerParamsPage ), NULL }; ///////////////////////////////////////////////////////////////////////////// //++ // // CResData::HrInitialize // // Description: // Initializes the object. // // Arguments: // // Return Value: // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CResData::HrInitialize( IUnknown * piDataIn ) { HRESULT hr = S_OK; IGetClusterResourceInfo * piResInfo = NULL; LONG cchTypeName = 0; BSTR bstrTypeName = NULL; LPCWSTR pwszResTypes = g_wszResourceTypeNames; ASSERT( piDataIn != NULL ); // // Initialize the base class. // hr = CObjData::HrInitialize( piDataIn ); if ( FAILED( hr ) ) { goto Cleanup; } // if: error initializing the base class // // Initialize member variables to default values. // m_hResource = NULL; m_fSupportedType = FALSE; // // Set the object type. // m_cot = CLUADMEX_OT_RESOURCE; // // Set the pointers to our resource property sheet and wizard pages. // m_rgprtcPSPages = g_rgprtcResPSPages; m_rgprtcWizPages = g_rgprtcResPSPages; // // Get an interface pointer to IGetClusterResourceInfo. // hr = piDataIn->QueryInterface( IID_IGetClusterResourceInfo, reinterpret_cast< LPVOID * >( &piResInfo ) ); if ( FAILED( hr ) ) { goto Cleanup; } // if: error querying for interface // // Get a copy of the handle. Don't free this handle, it's just a copy. // m_hResource = piResInfo->GetResourceHandle( 0 ); ASSERT( m_hResource != NULL ); if ( m_hResource == NULL ) { hr = E_HANDLE; goto Cleanup; } // if: error querying for interface // // Allocate a buffer for and retrieve the resource type name. // hr = piResInfo->GetResourceTypeName( 0, NULL, &cchTypeName ); if ( FAILED( hr ) ) { goto Cleanup; } // if: bstrTypeName = SysAllocStringLen( NULL, cchTypeName ); if ( bstrTypeName == NULL ) { hr = E_OUTOFMEMORY; goto Cleanup; } // if: hr = piResInfo->GetResourceTypeName( 0, bstrTypeName, &cchTypeName ); if ( FAILED( hr ) ) { goto Cleanup; } // if: // // The CString assignment operator makes a copy. // m_strResTypeName = bstrTypeName; // // Determine whether this is a supported type. // m_fSupportedType = FALSE; while ( *pwszResTypes != L'\0' ) { if ( m_strResTypeName.CompareNoCase( pwszResTypes ) == 0 ) { m_fSupportedType = TRUE; break; } // if: pwszResTypes += lstrlenW( pwszResTypes ) + 1; } // while: more resource types Cleanup: if ( piResInfo != NULL ) { piResInfo->Release(); } // if: SysFreeString( bstrTypeName ); return hr; } //*** CResData::HrInitialize ///////////////////////////////////////////////////////////////////////////// //++ // // CResData::AddContextMenuItems // // Description: // Add menu items to the resource object context menu. // // Arguments: // piCallbackIn // Pointer to an IWCContextMenuCallback interface for adding menu // items to the context menu. // // Return Value: // S_OK // Menu items added successfully. // // hr // Any errors returned by IWCContextMenuCallback // ::AddExtensionMenuItem(). // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CResData::AddContextMenuItems( IWCContextMenuCallback * piCallbackIn ) { HRESULT hr = S_OK; UNREFERENCED_PARAMETER( piCallbackIn ); // // TODO: Uncomment the following code to add context menus // to ClipBookServer resources. // /* ASSERT( piCallbackIn != NULL ); hr = AddContextMenuItem( piCallbackIn , IDS_RESOURCE_MENU_ITEM_1 , IDS_RESOURCE_MENU_ITEM_1_DESC , RESOURCE_MENU_ID_1 , MF_ENABLED ); */ return hr; } //*** CResData::AddContextMenuItems ///////////////////////////////////////////////////////////////////////////// //++ // // CResData::InvokeCommand // // Description: // Invoke a command we added to a context menu. // // Arguments: // nCommandIDIn // ID of the menu item to execute. This is the same ID passed to the // IWCContextMenuCallback::AddExtensionMenuItem() method. // // Return Value: // S_OK Command invoked successfully. // E_NOTIMPL Command ID not recognized. // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CResData::InvokeCommand( ULONG nCommandIDIn ) { HRESULT hr = S_OK; switch ( nCommandIDIn ) { case RESOURCE_MENU_ID_1: // // TODO: Implement your menu item here // hr = S_OK; break; case ALL_RESOURCES_MENU_ID_1: hr = S_OK; break; default: hr = E_NOTIMPL; break; } // switch: nCommandIDIn return hr; } //*** CResData::InvokeCommand ///////////////////////////////////////////////////////////////////////////// //++ // // CResData::GetPropertySheetPages // // Description: // // Arguments: // // Return Value: // S_OK Success. // E_NOTIMPL No property sheet pages for this resource. // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CResData::GetPropertySheetPages( CRuntimeClass *** ppaPropSheetsOut ) { HRESULT hr = E_NOTIMPL; ASSERT( ppaPropSheetsOut != NULL ); // // This class only extends ClipBook Server resources. // if ( m_fSupportedType == FALSE ) { goto Cleanup; } // if: if ( m_rgprtcPSPages != NULL ) { hr = S_OK; *ppaPropSheetsOut = m_rgprtcPSPages; } // if: Cleanup: return hr; } //*** CResData::GetPropertySheetPages ///////////////////////////////////////////////////////////////////////////// //++ // // CResData::GetWizardPages // // Description: // // Arguments: // // Return Value: // S_OK Success. // E_NOTIMPL No property sheet pages for this resource. // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CResData::GetWizardPages( CRuntimeClass *** ppaWizardPagesOut ) { HRESULT hr = E_NOTIMPL; ASSERT( ppaWizardPagesOut != NULL ); // // This class only extends ClipBook Server resources. // if ( m_fSupportedType == FALSE ) { goto Cleanup; } // if: if ( m_rgprtcWizPages != NULL ) { hr = S_OK; *ppaWizardPagesOut = m_rgprtcWizPages; } // if: Cleanup: return hr; } //*** CResData::GetWizardPages ///////////////////////////////////////////////////////////////////////////// // CResTypeData implementation ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// //++ // // CResTypeData::HrInitialize // // Description: // Initializes the object. // // Arguments: // // Return Value: // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CResTypeData::HrInitialize( IUnknown * piDataIn ) { HRESULT hr = S_OK; LPCWSTR pwszResTypes = g_wszResourceTypeNames; ASSERT( piDataIn != NULL ); // // Initialize the base class. // hr = CObjData::HrInitialize( piDataIn ); if ( FAILED( hr ) ) { goto Cleanup; } // if: error initializing the base class // // Set the object type. // m_cot = CLUADMEX_OT_RESOURCETYPE; m_fSupportedType = FALSE; while ( *pwszResTypes != L'\0' ) { if ( StrName().CompareNoCase( pwszResTypes ) == 0 ) { m_fSupportedType = TRUE; break; } // if: pwszResTypes += lstrlenW( pwszResTypes ) + 1; } // while: more resource types Cleanup: return hr; } //*** CResTypeData::HrInitialize ///////////////////////////////////////////////////////////////////////////// //++ // // CResTypeData::AddContextMenuItems // // Description: // Add menu items to the resource type object context menu. // // Arguments: // piCallbackIn // Pointer to an IWCContextMenuCallback interface for adding menu // items to the context menu. // // Return Value: // S_OK // Menu items added successfully. // // hr // Any errors returned by IWCContextMenuCallback // ::AddExtensionMenuItem(). // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CResTypeData::AddContextMenuItems( IWCContextMenuCallback * piCallbackIn ) { HRESULT hr = S_OK; UNREFERENCED_PARAMETER( piCallbackIn ); return hr; } //*** CResTypeData::AddContextMenuItems ///////////////////////////////////////////////////////////////////////////// //++ // // CResTypeData::InvokeCommand // // Description: // Invoke a command we added to a context menu. // // Arguments: // nCommandIDIn // ID of the menu item to execute. This is the same ID passed to the // IWCContextMenuCallback::AddExtensionMenuItem() method. // // Return Value: // S_OK Command invoked successfully. // E_NOTIMPL Command ID not recognized. // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CResTypeData::InvokeCommand( ULONG nCommandIDIn ) { HRESULT hr = S_OK; switch ( nCommandIDIn ) { case RESTYPE_MENU_ID_1: // // TODO: Implement your menu item here // hr = S_OK; break; case ALL_RESTYPES_MENU_ID_1: hr = S_OK; break; default: hr = E_NOTIMPL; break; } // switch: nCommandIDIn return hr; } //*** CResTypeData::InvokeCommand ///////////////////////////////////////////////////////////////////////////// // CNetworkData implementation ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// //++ // // CNetworkData::HrInitialize // // Description: // Initializes the object. // // Arguments: // // Return Value: // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CNetworkData::HrInitialize( IUnknown * piDataIn ) { HRESULT hr = S_OK; IGetClusterNetworkInfo * piNetInfo = NULL; ASSERT( piDataIn != NULL ); // // Initialize the base class. // hr = CObjData::HrInitialize( piDataIn ); if ( FAILED( hr ) ) { goto Cleanup; } // if: error initializing the base class // // Initialize member variables to default values. // m_hNetwork = NULL; // // Set the object type. // m_cot = CLUADMEX_OT_NETWORK; // // Get an interface pointer to IGetClusterNetworkInfo. // hr = piDataIn->QueryInterface( IID_IGetClusterNetworkInfo, reinterpret_cast< LPVOID * >( &piNetInfo ) ); if ( FAILED( hr ) ) { goto Cleanup; } // if: error querying for interface // // Get a copy of the handle. Don't free this handle - it's just a copy. // m_hNetwork = piNetInfo->GetNetworkHandle( 0 ); ASSERT( m_hNetwork != NULL ); if ( m_hNetwork == NULL ) { hr = E_HANDLE; goto Cleanup; } // if: error getting the network handle Cleanup: if ( piNetInfo != NULL ) { piNetInfo->Release(); } // if: return hr; } //*** CNetworkData::HrInitialize ///////////////////////////////////////////////////////////////////////////// //++ // // CNetworkData::AddContextMenuItems // // Description: // Add menu items to the network object context menu. // // Arguments: // piCallbackIn // Pointer to an IWCContextMenuCallback interface for adding menu // items to the context menu. // // Return Value: // S_OK // Menu items added successfully. // // hr // Any errors returned by IWCContextMenuCallback // ::AddExtensionMenuItem(). // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CNetworkData::AddContextMenuItems( IWCContextMenuCallback * piCallbackIn ) { HRESULT hr = S_OK; ASSERT( piCallbackIn != NULL ); hr = AddContextMenuItem( piCallbackIn , IDS_NETWORK_MENU_ITEM_1 , IDS_NETWORK_MENU_ITEM_1_DESC , NETWORK_MENU_ID_1 , MF_ENABLED ); return hr; } //*** CNetworkData::AddContextMenuItems ///////////////////////////////////////////////////////////////////////////// //++ // // CNetworkData::InvokeCommand // // Description: // Invoke a command we added to a context menu. // // Arguments: // nCommandIDIn // ID of the menu item to execute. This is the same ID passed to the // IWCContextMenuCallback::AddExtensionMenuItem() method. // // Return Value: // S_OK Command invoked successfully. // E_NOTIMPL Command ID not recognized. // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CNetworkData::InvokeCommand( ULONG nCommandIDIn ) { HRESULT hr = S_OK; switch ( nCommandIDIn ) { case NETWORK_MENU_ID_1: // // TODO: Implement your menu item here // hr = S_OK; break; default: hr = E_NOTIMPL; break; } // switch: nCommandIDIn return hr; } //*** CNetworkData::InvokeCommand ///////////////////////////////////////////////////////////////////////////// // CNetInterfaceData implementation ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// //++ // // CNetInterfaceData::HrInitialize // // Description: // Initializes the object. // // Arguments: // // Return Value: // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CNetInterfaceData::HrInitialize( IUnknown * piDataIn ) { HRESULT hr = S_OK; IGetClusterNetInterfaceInfo * piNetInterfaceInfo = NULL; ASSERT( piDataIn != NULL ); // // Initialize the base class. // hr = CObjData::HrInitialize( piDataIn ); if ( FAILED( hr ) ) { goto Cleanup; } // if: error initializing the base class // // Initialize member variables to default values. // m_hNetInterface = NULL; // // Set the object type. // m_cot = CLUADMEX_OT_NETINTERFACE; // // Get an interface pointer to IGetClusterNetInterfaceInfo. // hr = piDataIn->QueryInterface( IID_IGetClusterNetInterfaceInfo, reinterpret_cast< LPVOID * >( &piNetInterfaceInfo ) ); if ( FAILED( hr ) ) { goto Cleanup; } // if: error querying for interface // // Get a copy of the handle. Don't free this handle - it's just a copy. // m_hNetInterface = piNetInterfaceInfo->GetNetInterfaceHandle( 0 ); ASSERT( m_hNetInterface != NULL ); if ( m_hNetInterface == NULL ) { hr = E_HANDLE; goto Cleanup; } // if: error getting the netinterface handle Cleanup: if ( piNetInterfaceInfo != NULL ) { piNetInterfaceInfo->Release(); } // if: return hr; } //*** CNetInterfaceData::HrInitialize ///////////////////////////////////////////////////////////////////////////// //++ // // CNetInterfaceData::AddContextMenuItems // // Description: // Add menu items to the network interface object context menu. // // Arguments: // piCallbackIn // Pointer to an IWCContextMenuCallback interface for adding menu // items to the context menu. // // Return Value: // S_OK // Menu items added successfully. // // hr // Any errors returned by IWCContextMenuCallback // ::AddExtensionMenuItem(). // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CNetInterfaceData::AddContextMenuItems( IWCContextMenuCallback * piCallbackIn ) { HRESULT hr = S_OK; ASSERT( piCallbackIn != NULL ); hr = AddContextMenuItem( piCallbackIn , IDS_NETINTERFACE_MENU_ITEM_1 , IDS_NETINTERFACE_MENU_ITEM_1_DESC , NETINTERFACE_MENU_ID_1 , MF_ENABLED ); return hr; } //*** CNetInterfaceData::AddContextMenuItems ///////////////////////////////////////////////////////////////////////////// //++ // // CNetInterfaceData::InvokeCommand // // Description: // Invoke a command we added to a context menu. // // Arguments: // nCommandIDIn // ID of the menu item to execute. This is the same ID passed to the // IWCContextMenuCallback::AddExtensionMenuItem() method. // // Return Value: // S_OK Command invoked successfully. // E_NOTIMPL Command ID not recognized. // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CNetInterfaceData::InvokeCommand( ULONG nCommandIDIn ) { HRESULT hr = S_OK; switch ( nCommandIDIn ) { case NETINTERFACE_MENU_ID_1: // // TODO: Implement your menu item here // hr = S_OK; break; default: hr = E_NOTIMPL; break; } // switch: nCommandIDIn return hr; } //*** CNetInterfaceData::InvokeCommand