home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / netds / adsi / sampprov / cenumns.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1997-07-29  |  6.2 KB  |  270 lines

  1. /*++
  2.  
  3. Copyright (c) 1996 Microsoft Corporation
  4.  
  5. Module Name:
  6.  
  7.     CEnumNS.c
  8.  
  9. Abstract:
  10.  
  11.     Sample Provider Namespace Enumerator Code
  12.  
  13. Author:
  14.  
  15. Environment:
  16.  
  17.     User mode
  18.  
  19. Revision History :
  20.  
  21. --*/
  22. #include "adssmp.h"
  23. #pragma hdrstop
  24.  
  25. #define ENUM_BUFFER_SIZE (1024 * 16)
  26.  
  27. //+---------------------------------------------------------------------------
  28. //
  29. //  Function:   CSampleDSNamespaceEnum::Create
  30. //
  31. //  Synopsis:
  32. //
  33. //  Arguments:  [pCollection]
  34. //              [ppEnumVariant]
  35. //
  36. //  Returns:    HRESULT
  37. //
  38. //  Modifies:
  39. //
  40. //----------------------------------------------------------------------------
  41. HRESULT
  42. CSampleDSNamespaceEnum::Create(
  43.     CSampleDSNamespaceEnum FAR* FAR* ppenumvariant,
  44.     VARIANT var
  45.     )
  46. {
  47.     HRESULT hr = S_OK;
  48.     CSampleDSNamespaceEnum FAR* penumvariant = NULL;
  49.  
  50.     penumvariant = new CSampleDSNamespaceEnum();
  51.  
  52.     if (penumvariant == NULL){
  53.         hr = E_OUTOFMEMORY;
  54.         BAIL_ON_FAILURE(hr);
  55.     }
  56.  
  57.     hr = SampleDSRDNEnum( 
  58.                      &penumvariant->_hEnum, 
  59.                      NULL
  60.                      );
  61.     BAIL_ON_FAILURE(hr);
  62.  
  63.     hr = ObjectTypeList::CreateObjectTypeList(
  64.                                         var,
  65.                                         &penumvariant->_pObjList
  66.                                         );
  67.     BAIL_ON_FAILURE(hr);
  68.  
  69.     *ppenumvariant = penumvariant;
  70.     RRETURN(hr);
  71.  
  72. error:
  73.     if (penumvariant) {
  74.         delete penumvariant;
  75.     }
  76.     RRETURN(hr);
  77. }
  78.  
  79. //+---------------------------------------------------------------------------
  80. //
  81. //  Function:   CSampleDSNamespaceEnum::CSampleDSNamespaceEnum
  82. //
  83. //  Synopsis:
  84. //
  85. //
  86. //  Arguments:
  87. //
  88. //
  89. //  Returns:
  90. //
  91. //----------------------------------------------------------------------------
  92. CSampleDSNamespaceEnum::CSampleDSNamespaceEnum()
  93. {
  94.     _pObjList = NULL;
  95.     _dwEntriesRead = 0;
  96.     _dwCurrentEntry = 0;
  97.     _hEnum = NULL;
  98.     _pBuffer = NULL;
  99. }
  100.  
  101. //+---------------------------------------------------------------------------
  102. //
  103. //  Function:   CSampleDSNamespaceEnum::~CSampleDSNamespaceEnum
  104. //
  105. //  Synopsis:
  106. //
  107. //
  108. //  Arguments:
  109. //
  110. //  Returns:
  111. //
  112. //----------------------------------------------------------------------------
  113. CSampleDSNamespaceEnum::~CSampleDSNamespaceEnum()
  114. {
  115.     if (_pBuffer)
  116.         FreeProvMem(_pBuffer);
  117. }
  118.  
  119. //+---------------------------------------------------------------------------
  120. //
  121. //  Function:   CSampleDSNamespaceEnum::Next
  122. //
  123. //  Synopsis:   Returns cElements number of requested ADs objects in the
  124. //              array supplied in pvar.
  125. //
  126. //  Arguments:  [cElements] -- The number of elements requested by client
  127. //              [pvar] -- ptr to array of VARIANTs to for return objects
  128. //              [pcElementFetched] -- if non-NULL, then number of elements
  129. //                                 -- actually returned is placed here
  130. //
  131. //  Returns:    HRESULT -- S_OK if number of elements requested are returned
  132. //                      -- S_FALSE if number of elements is < requested
  133. //
  134. //----------------------------------------------------------------------------
  135. STDMETHODIMP
  136. CSampleDSNamespaceEnum::Next(
  137.     ULONG cElements,
  138.     VARIANT FAR* pvar,
  139.     ULONG FAR* pcElementFetched
  140.     )
  141. {
  142.     ULONG cElementFetched = 0;
  143.     HRESULT hr = S_OK;
  144.  
  145.     hr = EnumObjects(
  146.             cElements,
  147.             pvar,
  148.             &cElementFetched
  149.             );
  150.  
  151.     if (pcElementFetched) {
  152.         *pcElementFetched = cElementFetched;
  153.     }
  154.     RRETURN(hr);
  155. }
  156.  
  157.  
  158. HRESULT
  159. CSampleDSNamespaceEnum::EnumObjects(
  160.     ULONG cElements,
  161.     VARIANT FAR* pvar,
  162.     ULONG FAR* pcElementFetched
  163.     )
  164. {
  165.     DWORD           i;
  166.     ULONG           cRequested = 0;
  167.     ULONG           cTotalFetched = 0;
  168.     HRESULT         hr;
  169.  
  170.     for (i = 0; i < cElements; i++)  {
  171.         VariantInit(&pvar[i]);
  172.     }
  173.     cRequested = cElements;
  174.  
  175.         hr = FetchObjects(cElements, pvar, &cTotalFetched);
  176.    
  177.     if (pcElementFetched) {
  178.         *pcElementFetched = cTotalFetched;
  179.     }
  180.  
  181.     RRETURN(hr);
  182. }
  183.  
  184. //
  185. // Load IDispatch pointers of Next cElements Root Objects into pvar array
  186. //
  187. HRESULT
  188. CSampleDSNamespaceEnum::FetchObjects(
  189.  
  190.     ULONG cElements,
  191.     VARIANT FAR* pvar,
  192.     ULONG FAR* pcElementFetched
  193.     )
  194. {
  195.     HRESULT hr;
  196.     IDispatch *pDispatch = NULL;
  197.     DWORD i = 0;
  198.  
  199.     while (i < cElements) {
  200.  
  201.         hr = FetchNextObject(&pDispatch);
  202.         if (hr == S_FALSE) {
  203.             break;
  204.         }
  205.  
  206.         VariantInit(&pvar[i]);
  207.         pvar[i].vt = VT_DISPATCH;
  208.         pvar[i].pdispVal = pDispatch;
  209.         (*pcElementFetched)++;
  210.         i++;
  211.     }
  212.     return(hr);
  213. }
  214.  
  215.  
  216. //+---------------------------------------------------------------------------
  217. //
  218. //  Function:   CSampleDSNamespaceEnum::FetchNextObject
  219. //
  220. //  Synopsis:   Gets IDispatch pointer of next object in namespace.
  221. //
  222. //  Arguments:  [ppDispatch] -- Pointer to where to return IDispatch pointer.
  223. //
  224. //  Returns:    HRESULT -- S_OK if got the next object
  225. //                      -- S_FALSE if not
  226. //
  227. //  Modifies:   [*ppDispatch]
  228. //
  229. //----------------------------------------------------------------------------
  230. HRESULT
  231. CSampleDSNamespaceEnum::FetchNextObject(
  232.     IDispatch ** ppDispatch
  233.     )
  234. {
  235.     HRESULT hr;
  236.     LPTSTR lpRootRDN=NULL ;
  237.     LPTSTR lpClassName=NULL ;
  238.     *ppDispatch = NULL;
  239.  
  240.     hr = SampleDSNextRDN(_hEnum,
  241.                          &lpRootRDN,
  242.                          &lpClassName 
  243.                          );    
  244.  
  245.     if (hr != S_OK) {
  246.         if (_hEnum) {
  247.             SampleDSFreeEnum(_hEnum);
  248.             _hEnum = NULL;
  249.         }
  250.         goto error;
  251.     }
  252.  
  253.     hr = CSampleDSGenObject::CreateGenericObject(
  254.                                          L"Sample:",
  255.                                         lpRootRDN,
  256.                                         lpClassName,
  257.                                         ADS_OBJECT_BOUND,
  258.                                         IID_IDispatch,
  259.                                         (void **)ppDispatch
  260.                                         );
  261. error:
  262.     if (lpClassName)
  263.         FreeProvMem(lpClassName);  
  264.     if (lpRootRDN)
  265.         FreeProvMem(lpRootRDN);  
  266.     RRETURN_ENUM_STATUS(hr); 
  267. }
  268.  
  269.  
  270.