|
|
//---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1995
//
// File: cgroup.cxx
//
// Contents: Group object
//
// History: Jan-29-1996 t-ptam(PatrickT) Created.
//
//----------------------------------------------------------------------------
#include "NWCOMPAT.hxx"
#pragma hdrstop
//
// Class CNWCOMPATGroup
//
DEFINE_IDispatch_ExtMgr_Implementation(CNWCOMPATGroup) DEFINE_IADs_TempImplementation(CNWCOMPATGroup)
DEFINE_IADs_PutGetImplementation(CNWCOMPATGroup, GroupClass, gdwGroupTableSize)
DEFINE_IADsPropertyList_Implementation(CNWCOMPATGroup, GroupClass, gdwGroupTableSize)
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATGroup::CNWCOMPATGroup
//
// Synopsis:
//
//----------------------------------------------------------------------------
CNWCOMPATGroup::CNWCOMPATGroup(): _pDispMgr(NULL), _pExtMgr(NULL), _pPropertyCache(NULL), _ParentType(0), _ServerName(NULL) { ENLIST_TRACKING(CNWCOMPATGroup); }
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATGroup::CreateGroup
//
// Synopsis:
//
//----------------------------------------------------------------------------
HRESULT CNWCOMPATGroup::CreateGroup( BSTR Parent, ULONG ParentType, BSTR ServerName, BSTR GroupName, DWORD dwObjectState, REFIID riid, void **ppvObj ) { CNWCOMPATGroup FAR * pGroup = NULL; HRESULT hr = S_OK;
//
// Allocate memory for a Group object.
//
hr = AllocateGroupObject(&pGroup); BAIL_ON_FAILURE(hr);
//
// Initialize group's core object.
//
hr = pGroup->InitializeCoreObject( Parent, GroupName, GROUP_CLASS_NAME, GROUP_SCHEMA_NAME, CLSID_NWCOMPATGroup, dwObjectState ); BAIL_ON_FAILURE(hr);
//
// Save protected values.
//
hr = ADsAllocString( ServerName , &pGroup->_ServerName); BAIL_ON_FAILURE(hr);
//
// QueryInterface.
//
hr = pGroup->QueryInterface(riid, ppvObj); BAIL_ON_FAILURE(hr);
pGroup->Release();
hr = pGroup->_pExtMgr->FinalInitializeExtensions(); BAIL_ON_FAILURE(hr);
//
// Return.
//
RRETURN(hr);
error: delete pGroup;
RRETURN_EXP_IF_ERR(hr); }
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATGroup::~CNWCOMPATGroup
//
// Synopsis:
//
//----------------------------------------------------------------------------
CNWCOMPATGroup::~CNWCOMPATGroup( ) { ADsFreeString(_ServerName);
delete _pExtMgr; // created last, destroyed first
delete _pDispMgr;
delete _pPropertyCache; }
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATGroup::QueryInterface
//
// Synopsis:
//
//----------------------------------------------------------------------------
STDMETHODIMP CNWCOMPATGroup::QueryInterface( REFIID iid, LPVOID FAR* ppv ) { if (ppv == NULL) { RRETURN(E_POINTER); }
if (IsEqualIID(iid, IID_IUnknown)) { *ppv = (IADsGroup FAR *) this; } else if (IsEqualIID(iid, IID_IADsGroup)) { *ppv = (IADsGroup FAR *) this; } else if (IsEqualIID(iid, IID_IADs)) { *ppv = (IADsGroup FAR *) this; } else if (IsEqualIID(iid, IID_IDispatch)) { *ppv = (IADsGroup FAR *) this; } else if (IsEqualIID(iid, IID_ISupportErrorInfo)) { *ppv = (ISupportErrorInfo FAR *) this; } else if (IsEqualIID(iid, IID_IADsPropertyList)) { *ppv = (IADsPropertyList FAR *) this; } else if (_pExtMgr) { RRETURN( _pExtMgr->QueryInterface(iid, ppv)); } else { *ppv = NULL; return E_NOINTERFACE; } AddRef(); return NOERROR; }
/* ISupportErrorInfo method */ STDMETHODIMP CNWCOMPATGroup::InterfaceSupportsErrorInfo( THIS_ REFIID riid ) {
if (IsEqualIID(riid, IID_IADs) || IsEqualIID(riid, IID_IADsGroup) || IsEqualIID(riid, IID_IADsPropertyList)) { RRETURN(S_OK); } else { RRETURN(S_FALSE); }
}
/* IADs methods */
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATGroup::SetInfo
//
// Synopsis:
//
//----------------------------------------------------------------------------
STDMETHODIMP CNWCOMPATGroup::SetInfo(THIS) { HRESULT hr = S_OK; POBJECTINFO pObjectInfo = NULL;
//
// Bind an object to a real life resource if it is not bounded already.
//
if (GetObjectState() == ADS_OBJECT_UNBOUND) {
hr = BuildObjectInfo( _Parent, _Name, &pObjectInfo ); BAIL_ON_FAILURE(hr);
hr = NWApiCreateGroup( pObjectInfo ); BAIL_ON_FAILURE(hr);
SetObjectState(ADS_OBJECT_BOUND); }
//
// Persist changes.
//
hr = SetInfo(GROUP_WILD_CARD_ID); BAIL_ON_FAILURE(hr);
error:
if (pObjectInfo) {
FreeObjectInfo(pObjectInfo); } RRETURN_EXP_IF_ERR(hr); }
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATGroup::GetInfo
//
// Synopsis:
//
//----------------------------------------------------------------------------
STDMETHODIMP CNWCOMPATGroup::GetInfo(THIS) { HRESULT hr = S_OK;
_pPropertyCache->flushpropcache();
hr = GetInfo( TRUE, GROUP_WILD_CARD_ID );
RRETURN_EXP_IF_ERR(hr); }
/* IADsGroup methods */
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATGroup::AllocateGroupObject
//
// Synopsis:
//
//----------------------------------------------------------------------------
HRESULT CNWCOMPATGroup::AllocateGroupObject( CNWCOMPATGroup ** ppGroup ) { CNWCOMPATGroup FAR * pGroup = NULL; CNWCOMPATGroupGenInfo FAR * pGenInfo = NULL; CAggregatorDispMgr FAR * pDispMgr = NULL; CADsExtMgr FAR * pExtensionMgr = NULL; CPropertyCache FAR * pPropertyCache = NULL; HRESULT hr = S_OK;
pGroup = new CNWCOMPATGroup(); if (pGroup == NULL) { hr = E_OUTOFMEMORY; } BAIL_ON_FAILURE(hr);
//
// Create dispatch manager.
//
pDispMgr = new CAggregatorDispMgr; if (pDispMgr == NULL) { hr = E_OUTOFMEMORY; } BAIL_ON_FAILURE(hr);
//
// Load type info.
//
hr = LoadTypeInfoEntry( pDispMgr, LIBID_ADs, IID_IADsGroup, (IADsGroup *)pGroup, DISPID_REGULAR ); BAIL_ON_FAILURE(hr);
hr = LoadTypeInfoEntry( pDispMgr, LIBID_ADs, IID_IADsPropertyList, (IADsPropertyList *)pGroup, DISPID_VALUE ); BAIL_ON_FAILURE(hr);
hr = CPropertyCache::createpropertycache( GroupClass, gdwGroupTableSize, (CCoreADsObject *)pGroup, &pPropertyCache ); BAIL_ON_FAILURE(hr);
pDispMgr->RegisterPropertyCache( pPropertyCache );
hr = ADSILoadExtensionManager( GROUP_CLASS_NAME, (IADs *)pGroup, pDispMgr, &pExtensionMgr ); BAIL_ON_FAILURE(hr);
pGroup->_pPropertyCache = pPropertyCache; pGroup->_pExtMgr = pExtensionMgr; pGroup->_pDispMgr = pDispMgr; pGroup->_pGenInfo = pGenInfo; *ppGroup = pGroup;
RRETURN(hr);
error: delete pDispMgr; delete pExtensionMgr; delete pPropertyCache; delete pGroup;
RRETURN(hr); } //----------------------------------------------------------------------------
//
// Function: CNWCOMPATGroup::SetInfo
//
// Synopsis:
//
//----------------------------------------------------------------------------
STDMETHODIMP CNWCOMPATGroup::SetInfo(THIS_ DWORD dwPropertyID) { HRESULT hr = S_OK; HRESULT hrTemp = S_OK; NWCONN_HANDLE hConn = NULL;
//
// Get a handle to the bindery this object resides on.
//
hr = NWApiGetBinderyHandle( &hConn, _ServerName ); BAIL_ON_FAILURE(hr);
//
// Persist changes in cache.
//
hr = SetDescription(hConn); BAIL_ON_FAILURE(hr);
error: //
// Release handle.
//
if (hConn) { hrTemp = NWApiReleaseBinderyHandle(hConn); }
RRETURN_EXP_IF_ERR(hr); }
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATGroup::SetDescription
//
// Synopsis:
//
//----------------------------------------------------------------------------
HRESULT CNWCOMPATGroup::SetDescription( NWCONN_HANDLE hConn ) { LPWSTR pszDescription = NULL; WCHAR szwData[MAX_FULLNAME_LEN +1]; CHAR szData[(MAX_FULLNAME_LEN + 1)*2]; HRESULT hr = S_OK;
memset(szwData, 0, sizeof(WCHAR)*(MAX_FULLNAME_LEN +1)); hr = GetLPTSTRPropertyFromCache( _pPropertyCache, TEXT("Description"), &pszDescription );
if (SUCCEEDED(hr)) {
//
// Convert bstr in ANSI string.
//
wcsncpy(szwData, pszDescription, MAX_FULLNAME_LEN);
UnicodeToAnsiString( szwData, szData, 0 );
//
// Commit change.
//
hr = NWApiWriteProperty( hConn, _Name, OT_USER_GROUP, NW_PROP_IDENTIFICATION, (LPBYTE) szData ); BAIL_ON_FAILURE(hr); }
//
// Not is modified, that's ok.
// reset hr to S_OK
hr = S_OK;
error:
if (pszDescription ) {
FreeADsStr(pszDescription); }
RRETURN_EXP_IF_ERR(hr); }
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATGroup::GetInfo
//
// Synopsis:
//
//----------------------------------------------------------------------------
STDMETHODIMP CNWCOMPATGroup::GetInfo( BOOL fExplicit, DWORD dwPropertyID ) { HRESULT hr = S_OK; HRESULT hrTemp = S_OK; NWCONN_HANDLE hConn = NULL;
if (GetObjectState() == ADS_OBJECT_UNBOUND) { RRETURN_EXP_IF_ERR(E_ADS_OBJECT_UNBOUND); }
//
// Get a handle to the bindery this computer object represents.
//
hr = NWApiGetBinderyHandle( &hConn, _ServerName ); BAIL_ON_FAILURE(hr);
//
// Get property.
//
hr = GetProperty_Description(hConn, fExplicit); BAIL_ON_FAILURE(hr);
error:
if (hConn) { hrTemp = NWApiReleaseBinderyHandle(hConn); } RRETURN_EXP_IF_ERR(hr); }
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATGroup::GetProperty_Description
//
// Synopsis:
//
//----------------------------------------------------------------------------
HRESULT CNWCOMPATGroup::GetProperty_Description( NWCONN_HANDLE hConn, BOOL fExplicit ) { LPWSTR lpszFullName = NULL; CHAR szFullName[MAX_FULLNAME_LEN + 1]; DWORD dwNumSegment = 0; HRESULT hr = S_OK; LP_RPLY_SGMT_LST lpReplySegment = NULL; LP_RPLY_SGMT_LST lpTemp = NULL; // Used by DELETE_LIST macro below
//
// Get IDENTIFICATIOIN. This property contains the full name of an object.
// It is often used in place of "Description".
//
hr = NWApiGetProperty( _Name, NW_PROP_IDENTIFICATION, OT_USER_GROUP, hConn, &lpReplySegment, &dwNumSegment );
if (SUCCEEDED(hr)) { //
// Convert result into a UNICODE string.
//
strcpy(szFullName, lpReplySegment->Segment);
lpszFullName = (LPWSTR) AllocADsMem( (strlen(szFullName) + 1) * sizeof(WCHAR) ); if (!lpszFullName) BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
AnsiToUnicodeString( szFullName, lpszFullName, 0 );
//
// Unmarshall.
//
hr = SetLPTSTRPropertyInCache( _pPropertyCache, TEXT("Description"), lpszFullName, fExplicit ); BAIL_ON_FAILURE(hr); }
//
// Couldn't retrieve the property from the server. Not
// a problem, we just ignore it.
//
hr = S_OK;
error:
if (lpszFullName) { FreeADsMem(lpszFullName); }
if (lpReplySegment) { DELETE_LIST(lpReplySegment); }
RRETURN(hr); }
|