/*++ Copyright (c) 1996 Microsoft Corporation Module Name: cenmfpre.cxx Abstract: Contains methods for implementing the Enumeration of resources(open files) on a server. Has methods for the CFPNWResourcesCollection object as well as the CFPNWResourcesEnumVar object. Author: Ram Viswanathan (ramv) 03/12/96 Revision History: --*/ #include "winnt.hxx" #pragma hdrstop CFPNWResourcesCollection::CFPNWResourcesCollection() { _pszServerADsPath = NULL; _pszServerName = NULL; _pszBasePath = NULL; _pszUserName = NULL; _pDispMgr = NULL; _pCResourcesEnumVar = NULL; ENLIST_TRACKING(CFPNWResourcesCollection); } CFPNWResourcesCollection::~CFPNWResourcesCollection() { if(_pszServerADsPath){ FreeADsStr(_pszServerADsPath); } if(_pszServerName){ FreeADsStr(_pszServerName); } if(_pszBasePath){ FreeADsStr(_pszBasePath); } if(_pszUserName){ FreeADsStr(_pszUserName); } delete _pDispMgr; if(_pCResourcesEnumVar){ _pCResourcesEnumVar->Release(); } } HRESULT CFPNWResourcesCollection::Create(LPTSTR pszServerADsPath, LPTSTR pszBasePath, CWinNTCredentials& Credentials, CFPNWResourcesCollection ** ppCFPNWResourcesCollection ) { BOOL fStatus = FALSE, LastError; HRESULT hr; CFPNWResourcesCollection *pCFPNWResourcesCollection = NULL; POBJECTINFO pServerObjectInfo = NULL; // // create the Resources collection object // pCFPNWResourcesCollection = new CFPNWResourcesCollection(); if(pCFPNWResourcesCollection == NULL){ hr = E_OUTOFMEMORY; goto cleanup; } pCFPNWResourcesCollection->_pszServerADsPath = AllocADsStr(pszServerADsPath); if(!pCFPNWResourcesCollection->_pszServerADsPath){ hr = E_OUTOFMEMORY; goto cleanup; } hr = BuildObjectInfo(pszServerADsPath, &pServerObjectInfo ); BAIL_IF_ERROR(hr); pCFPNWResourcesCollection->_pszServerName = AllocADsStr(pServerObjectInfo->ComponentArray[1]); if(!pCFPNWResourcesCollection->_pszServerName){ hr = E_OUTOFMEMORY; goto cleanup; } pCFPNWResourcesCollection->_Credentials = Credentials; hr = pCFPNWResourcesCollection->_Credentials.RefServer( pCFPNWResourcesCollection->_pszServerName); BAIL_IF_ERROR(hr); if(pszBasePath){ pCFPNWResourcesCollection->_pszBasePath = AllocADsStr(pszBasePath); if(!pCFPNWResourcesCollection->_pszBasePath){ hr = E_OUTOFMEMORY; goto cleanup; } } pCFPNWResourcesCollection->_pDispMgr = new CAggregatorDispMgr; if (pCFPNWResourcesCollection->_pDispMgr == NULL){ hr = E_OUTOFMEMORY; goto cleanup; } hr = LoadTypeInfoEntry(pCFPNWResourcesCollection->_pDispMgr, LIBID_ADs, IID_IADsCollection, (IADsCollection *)pCFPNWResourcesCollection, DISPID_NEWENUM); BAIL_IF_ERROR(hr); hr = CFPNWResourcesEnumVar::Create(pszServerADsPath, pszBasePath, pCFPNWResourcesCollection->_Credentials, &pCFPNWResourcesCollection->_pCResourcesEnumVar); BAIL_IF_ERROR(hr); *ppCFPNWResourcesCollection =pCFPNWResourcesCollection; cleanup: if(pServerObjectInfo){ FreeObjectInfo(pServerObjectInfo); } if(SUCCEEDED(hr)){ RRETURN(hr); } delete pCFPNWResourcesCollection; RRETURN_EXP_IF_ERR(hr); } /* IUnknown methods for Resources collection object */ STDMETHODIMP CFPNWResourcesCollection::QueryInterface(REFIID riid, LPVOID FAR* ppvObj) { if(!ppvObj){ RRETURN(E_POINTER); } if (IsEqualIID(riid, IID_IUnknown)) { *ppvObj = this; } else if (IsEqualIID(riid, IID_IDispatch)) { *ppvObj = (IDispatch *)this; } else if (IsEqualIID(riid, IID_ISupportErrorInfo)) { *ppvObj = (ISupportErrorInfo FAR *) this; } else if (IsEqualIID(riid, IID_IADsCollection)) { *ppvObj = (IADsCollection FAR *)this; } else { *ppvObj = NULL; return E_NOINTERFACE; } ((LPUNKNOWN)*ppvObj)->AddRef(); RRETURN(S_OK); } /* ISupportErrorInfo method */ STDMETHODIMP CFPNWResourcesCollection::InterfaceSupportsErrorInfo( THIS_ REFIID riid ) { if (IsEqualIID(riid, IID_IADsCollection)) { RRETURN(S_OK); } else { RRETURN(S_FALSE); } } DEFINE_IDispatch_Implementation(CFPNWResourcesCollection); /* IADsCollection methods */ STDMETHODIMP CFPNWResourcesCollection::get__NewEnum(THIS_ IUnknown * FAR* retval) { HRESULT hr; CFPNWResourcesEnumVar *pCResourcesEnumVar = NULL; if(!retval){ RRETURN_EXP_IF_ERR(E_POINTER); } *retval = NULL; ADsAssert(_pCResourcesEnumVar); hr = _pCResourcesEnumVar->QueryInterface(IID_IUnknown, (void **)retval); RRETURN_EXP_IF_ERR(hr); } STDMETHODIMP CFPNWResourcesCollection::GetObject(THIS_ BSTR bstrResourceName, VARIANT *pvar ) { // // scan the buffer _pbSessions to find one where the ConnectionId // matches the one in bstrSessionName and get this object // HRESULT hr; hr = _pCResourcesEnumVar->GetObject(bstrResourceName, pvar); RRETURN_EXP_IF_ERR(hr); /* HRESULT hr = S_OK; DWORD dwFileId; IDispatch *pDispatch = NULL; if(!bstrResourceName || !pvar){ RRETURN_EXP_IF_ERR(E_ADS_BAD_PARAMETER); } // // convert the job name into a fileid // dwFileId = (DWORD)_wtol(bstrResourceName); hr = CFPNWResource::Create((LPTSTR)_bstrServerADsPath, ADS_OBJECT_BOUND, dwFileId, IID_IDispatch, _Credentials, (void **)&pDispatch); BAIL_IF_ERROR(hr); // // stick this IDispatch pointer into caller provided variant // VariantInit(pvar); V_VT(pvar) = VT_DISPATCH; V_DISPATCH(pvar) = pDispatch; cleanup: RRETURN_EXP_IF_ERR(hr); */ } STDMETHODIMP CFPNWResourcesCollection::Add(THIS_ BSTR bstrName, VARIANT varNewItem) { RRETURN_EXP_IF_ERR(E_NOTIMPL); } STDMETHODIMP CFPNWResourcesCollection::Remove(THIS_ BSTR bstrResourceName) { RRETURN_EXP_IF_ERR(E_NOTIMPL); } // // CFPNWResourcesEnumVar methods follow // //+--------------------------------------------------------------------------- // // Function: CFPNWResourcesEnumVar::CFPNWResourcesEnumVar // // Synopsis: // // // Arguments: // // // Returns: // // Modifies: // // History: 11-22-95 RamV Created. // //---------------------------------------------------------------------------- CFPNWResourcesEnumVar::CFPNWResourcesEnumVar() { _pszServerADsPath = NULL; _pszServerName = NULL; _pszBasePath = NULL; _pszUserName = NULL; _pbResources = NULL; _cElements = 0; _lLBound = 0; _lCurrentPosition = _lLBound; _dwTotalEntries = 0; _dwResumeHandle = 0; } //+--------------------------------------------------------------------------- // // Function: CFPNWResourcesEnumVar::~CFPNWResourcesEnumVar // // Synopsis: // // // Arguments: // // Returns: // // Modifies: // // History: 11-22-95 RamV Created. // //---------------------------------------------------------------------------- CFPNWResourcesEnumVar::~CFPNWResourcesEnumVar() { if(_pszServerADsPath){ FreeADsStr(_pszServerADsPath); } if(_pszServerName){ FreeADsStr(_pszServerName); } if(_pszBasePath){ FreeADsStr(_pszBasePath); } if(_pszUserName){ FreeADsStr(_pszUserName); } if(_pbResources){ NetApiBufferFree(_pbResources); } } HRESULT CFPNWResourcesEnumVar::Create(LPTSTR pszServerADsPath, LPTSTR pszBasePath, CWinNTCredentials& Credentials, CFPNWResourcesEnumVar **ppCResourcesEnumVar) { HRESULT hr; BOOL fStatus = FALSE; POBJECTINFO pServerObjectInfo = NULL; CFPNWResourcesEnumVar FAR* pCResourcesEnumVar = NULL; *ppCResourcesEnumVar = NULL; pCResourcesEnumVar = new CFPNWResourcesEnumVar(); if (pCResourcesEnumVar == NULL){ hr = E_OUTOFMEMORY; goto cleanup; } pCResourcesEnumVar->_pszServerADsPath = AllocADsStr(pszServerADsPath); if(!pCResourcesEnumVar->_pszServerADsPath){ hr = E_OUTOFMEMORY; goto cleanup; } hr = BuildObjectInfo(pszServerADsPath, &pServerObjectInfo); BAIL_IF_ERROR(hr); pCResourcesEnumVar->_pszServerName = AllocADsStr(pServerObjectInfo->ComponentArray[1]); if(!pCResourcesEnumVar->_pszServerName){ hr = E_OUTOFMEMORY; goto cleanup; } pCResourcesEnumVar->_Credentials = Credentials; hr = pCResourcesEnumVar->_Credentials.RefServer( pCResourcesEnumVar->_pszServerName); BAIL_IF_ERROR(hr); if(pszBasePath){ pCResourcesEnumVar->_pszBasePath = AllocADsStr(pszBasePath); if(!pCResourcesEnumVar->_pszBasePath){ hr = E_OUTOFMEMORY; goto cleanup; } } *ppCResourcesEnumVar = pCResourcesEnumVar; cleanup: if(pServerObjectInfo){ FreeObjectInfo(pServerObjectInfo); } if(SUCCEEDED(hr)){ RRETURN(hr); } delete pCResourcesEnumVar; RRETURN_EXP_IF_ERR(hr); } //+--------------------------------------------------------------------------- // // Function: CFPNWResourcesEnumVar::Next // // Synopsis: Returns cElements number of requested Resource objects in the // array supplied in pvar. // // Arguments: [cElements] -- The number of elements requested by client // [pvar] -- ptr to array of VARIANTs to for return objects // [pcElementFetched] -- if non-NULL, then number of elements // -- actually returned is placed here // // Returns: HRESULT -- S_OK if number of elements requested are returned // -- S_FALSE if number of elements is < requested // // Modifies: // // History: 11-27-95 RamV Created. // //---------------------------------------------------------------------------- STDMETHODIMP CFPNWResourcesEnumVar::Next(ULONG ulNumElementsRequested, VARIANT FAR* pvar, ULONG FAR* pulNumFetched) { HRESULT hresult; ULONG l; LONG lNewCurrent; ULONG lNumFetched; PNWFILEINFO pFileInfo; VARIANT v; IDispatch * pDispatch = NULL; if (pulNumFetched != NULL){ *pulNumFetched = 0; } // // Initialize the elements to be returned // for (l=0; ldwFileId = dwFileId){ // // return this struct in the static create for the object // hr = CFPNWResource::Create(_pszServerADsPath, pFileInfo, ADS_OBJECT_BOUND, IID_IDispatch, _Credentials, (void **) &pDispatch ); BAIL_IF_ERROR(hr); break; } } if(i == _cElements){ // // no such element // hr = E_ADS_UNKNOWN_OBJECT; goto cleanup; } // // stick this IDispatch pointer into caller provided variant // VariantInit(pvar); V_VT(pvar) = VT_DISPATCH; V_DISPATCH(pvar) = pDispatch; cleanup: RRETURN_EXP_IF_ERR(hr); }