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 / object.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1997-07-29  |  6.7 KB  |  357 lines

  1. /*++
  2.  
  3. Copyright (c) 1996 Microsoft Corporation
  4.  
  5. Module Name:
  6.  
  7.     Object.cpp
  8.  
  9. Abstract:
  10.  
  11.     ObjectTypeList class
  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. ObjectTypeList::ObjectTypeList()
  26. {
  27.     _pObjList = NULL;
  28.     _dwCurrentIndex = 0;
  29.     _dwMaxElements = 0;
  30.     _dwUBound  = 0;
  31.     _dwLBound = 0;
  32.  
  33. }
  34.  
  35. HRESULT
  36. ObjectTypeList::CreateObjectTypeList(
  37.     VARIANT vFilter,
  38.     ObjectTypeList ** ppObjectTypeList
  39. ){
  40.     ObjectTypeList * pObjectTypeList = NULL;
  41.     HRESULT hr = S_OK;
  42.  
  43.     pObjectTypeList = new ObjectTypeList;
  44.  
  45.     if (!pObjectTypeList) {
  46.         hr = E_OUTOFMEMORY;
  47.         BAIL_ON_FAILURE(hr);
  48.     }
  49.  
  50.     hr = BuildObjectArray(
  51.             vFilter,
  52.             &pObjectTypeList->_pObjList,
  53.             &pObjectTypeList->_dwMaxElements
  54.             );
  55.  
  56.     if (FAILED(hr)) {
  57.  
  58.         hr = BuildDefaultObjectArray(
  59.                 gpFilters,
  60.                 gdwMaxFilters,
  61.                 &pObjectTypeList->_pObjList,
  62.                 &pObjectTypeList->_dwMaxElements
  63.                 );
  64.  
  65.         BAIL_ON_FAILURE(hr);
  66.     }
  67.  
  68.     hr = SafeArrayGetUBound(
  69.                 pObjectTypeList->_pObjList,
  70.                 1,
  71.                 (long FAR *)&pObjectTypeList->_dwUBound
  72.                 );
  73.     BAIL_ON_FAILURE(hr);
  74.  
  75.     hr = SafeArrayGetLBound(
  76.                 pObjectTypeList->_pObjList,
  77.                 1,
  78.                 (long FAR *)&pObjectTypeList->_dwLBound
  79.                 );
  80.     BAIL_ON_FAILURE(hr);
  81.  
  82.     pObjectTypeList->_dwCurrentIndex = pObjectTypeList->_dwLBound;
  83.  
  84.     *ppObjectTypeList = pObjectTypeList;
  85.  
  86.     RRETURN(S_OK);
  87.  
  88.  
  89. error:
  90.     if (pObjectTypeList) {
  91.         delete pObjectTypeList;
  92.     }
  93.     RRETURN(hr);
  94.  
  95. }
  96.  
  97.  
  98. ObjectTypeList::~ObjectTypeList()
  99. {
  100.     HRESULT hr = S_OK;
  101.     if (_pObjList) {
  102.         hr = SafeArrayDestroy(_pObjList);
  103.     }
  104. }
  105.  
  106.  
  107. HRESULT
  108. ObjectTypeList::GetCurrentObject(PDWORD pdwObject)
  109. {
  110.     HRESULT hr = S_OK;
  111.  
  112.     if (_dwCurrentIndex > _dwUBound) {
  113.         return(E_FAIL);
  114.     }
  115.  
  116.     hr = SafeArrayGetElement(
  117.                     _pObjList,
  118.                     (long FAR *)&_dwCurrentIndex,
  119.                     (void *)pdwObject
  120.                     );
  121.     RRETURN(hr);
  122. }
  123.  
  124. HRESULT
  125. ObjectTypeList::Next()
  126. {
  127.     HRESULT hr = S_OK;
  128.  
  129.     _dwCurrentIndex++;
  130.  
  131.     if (_dwCurrentIndex > _dwUBound) {
  132.         return(E_FAIL);
  133.     }
  134.  
  135.     return(hr);
  136. }
  137.  
  138.  
  139.  
  140. HRESULT
  141. ObjectTypeList::Reset()
  142. {
  143.     HRESULT hr = S_OK;
  144.  
  145.     return(hr);
  146.  
  147. }
  148.  
  149.  
  150. HRESULT
  151. IsValidFilter(
  152.     LPWSTR ObjectName,
  153.     DWORD *pdwFilterId,
  154.     PFILTERS pFilters,
  155.     DWORD dwMaxFilters
  156. ){
  157.  
  158.     DWORD i = 0;
  159.  
  160.     for (i = 0; i < dwMaxFilters; i++) {
  161.  
  162.         if (!_wcsicmp(ObjectName, (pFilters + i)->szObjectName)) {
  163.             *pdwFilterId = (pFilters + i)->dwFilterId;
  164.             RRETURN(S_OK);
  165.         }
  166.  
  167.     }
  168.     *pdwFilterId = 0;
  169.     RRETURN(E_FAIL);
  170. }
  171.  
  172.  
  173.  
  174. HRESULT
  175. BuildDefaultObjectArray(
  176.     PFILTERS  pFilters,
  177.     DWORD dwMaxFilters,
  178.     SAFEARRAY ** ppFilter,
  179.     DWORD * pdwNumElements
  180. ){
  181.     DWORD i;
  182.     HRESULT hr = S_OK;
  183.     SAFEARRAYBOUND sabNewArray;
  184.     SAFEARRAY * pFilter = NULL;
  185.  
  186.     sabNewArray.cElements = dwMaxFilters;
  187.     sabNewArray.lLbound =  0;
  188.  
  189.     pFilter =   SafeArrayCreate(
  190.                         VT_I4,
  191.                         1,
  192.                         &sabNewArray
  193.                         );
  194.     if (!pFilter){
  195.         hr = E_OUTOFMEMORY;
  196.         BAIL_ON_FAILURE(hr);
  197.     }
  198.  
  199.     for (i = 0; i < dwMaxFilters; i++) {
  200.  
  201.         hr = SafeArrayPutElement(
  202.                 pFilter,
  203.                 (long *)&i,
  204.                 (void *)&((pFilters + i)->dwFilterId)
  205.             );
  206.         BAIL_ON_FAILURE(hr);
  207.     }
  208.  
  209.     *ppFilter = pFilter;
  210.     *pdwNumElements = dwMaxFilters;
  211.  
  212.     RRETURN(S_OK);
  213.  
  214. error:
  215.     if (pFilter) {
  216.         SafeArrayDestroy(pFilter);
  217.     }
  218.  
  219.     *ppFilter = NULL;
  220.     *pdwNumElements = 0;
  221.     RRETURN(hr);
  222. }
  223.  
  224.  
  225.  
  226. HRESULT
  227. BuildObjectArray(
  228.     VARIANT var,
  229.     SAFEARRAY ** ppFilter,
  230.     DWORD * pdwNumElements
  231. ){
  232.     LONG uDestCount = 0;
  233.     LONG dwSLBound = 0;
  234.     LONG dwSUBound = 0;
  235.     VARIANT v;
  236.     LONG i;
  237.     HRESULT hr = S_OK;
  238.     SAFEARRAYBOUND sabNewArray;
  239.     DWORD dwFilterId;
  240.     SAFEARRAY * pFilter = NULL;
  241.  
  242.     if(!((V_VT(&var) &  VT_VARIANT) &&  V_ISARRAY(&var))) {
  243.         RRETURN(E_FAIL);
  244.     }
  245.  
  246.     //
  247.     // Check that there is only one dimension in this array
  248.     //
  249.  
  250.     if ((V_ARRAY(&var))->cDims != 1) {
  251.         hr = E_FAIL;
  252.         BAIL_ON_FAILURE(hr);
  253.     }
  254.     //
  255.     // Check that there is atleast one element in this array
  256.     //
  257.  
  258.     if ((V_ARRAY(&var))->rgsabound[0].cElements == 0){
  259.         hr = E_FAIL;
  260.         BAIL_ON_FAILURE(hr);
  261.     }
  262.  
  263.     //
  264.     // We know that this is a valid single dimension array
  265.     //
  266.  
  267.     hr = SafeArrayGetLBound(V_ARRAY(&var),
  268.                             1,
  269.                             (long FAR *)&dwSLBound
  270.                             );
  271.     BAIL_ON_FAILURE(hr);
  272.  
  273.     hr = SafeArrayGetUBound(V_ARRAY(&var),
  274.                             1,
  275.                             (long FAR *)&dwSUBound
  276.                             );
  277.     BAIL_ON_FAILURE(hr);
  278.  
  279.     sabNewArray.cElements = dwSUBound - dwSLBound + 1;
  280.     sabNewArray.lLbound = dwSLBound;
  281.  
  282.     pFilter = SafeArrayCreate(
  283.                     VT_I4,
  284.                     1,
  285.                     &sabNewArray
  286.                     );
  287.  
  288.  
  289.     if (!pFilter) {
  290.         hr = E_OUTOFMEMORY;
  291.         BAIL_ON_FAILURE(hr);
  292.     }
  293.  
  294.     for (i = dwSLBound; i <= dwSUBound; i++) {
  295.         VariantInit(&v);
  296.         hr = SafeArrayGetElement(V_ARRAY(&var),
  297.                                 (long FAR *)&i,
  298.                                 &v
  299.                                 );
  300.         if (FAILED(hr)) {
  301.             continue;
  302.         }
  303.  
  304.  
  305.         hr = IsValidFilter(
  306.                 V_BSTR(&v),
  307.                 &dwFilterId,
  308.                 gpFilters,
  309.                 gdwMaxFilters
  310.                 );
  311.  
  312.         if (FAILED(hr)) {
  313.             continue;
  314.         }
  315.  
  316.         hr = SafeArrayPutElement(
  317.                 pFilter,
  318.                 (long*)&uDestCount,
  319.                 (void *)&dwFilterId
  320.                 );
  321.  
  322.         if(FAILED(hr)){
  323.             continue;
  324.         }
  325.  
  326.         uDestCount++;
  327.  
  328.     }
  329.  
  330.     //
  331.     // There was nothing of value that could be retrieved from the
  332.     // filter.
  333.     //
  334.  
  335.     if (!uDestCount ) {
  336.         hr = E_FAIL;
  337.         BAIL_ON_FAILURE(hr);
  338.     }
  339.  
  340.  
  341.     *pdwNumElements  = uDestCount;
  342.     *ppFilter = pFilter;
  343.  
  344.     RRETURN(S_OK);
  345.  
  346. error:
  347.  
  348.     if (pFilter) {
  349.  
  350.         SafeArrayDestroy(pFilter);
  351.     }
  352.     *ppFilter = NULL;
  353.     *pdwNumElements = 0;
  354.     RRETURN(hr);
  355. }
  356.  
  357.