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

  1. /*++
  2.  
  3. Copyright (c) 1996 Microsoft Corporation
  4.  
  5. Module Name:
  6.  
  7.     CClsObj.cpp
  8.  
  9. Abstract:
  10.  
  11. Author:
  12.  
  13. Environment:
  14.  
  15.     User mode
  16.  
  17. Revision History :
  18.  
  19. --*/
  20. #include "adssmp.h"
  21. #pragma hdrstop
  22.  
  23. //  Class CSampleDSClass
  24.  
  25. DEFINE_IDispatch_Implementation(CSampleDSClass)
  26. DEFINE_IADs_Implementation(CSampleDSClass)
  27.  
  28.  
  29. CSampleDSClass::CSampleDSClass():
  30.       _pDispMgr( NULL ),
  31.       _lpClassName(0),
  32.       _dwNumberOfMandatoryAttributes(0),
  33.       _lpMandatoryAttributes(0)
  34.  
  35. {
  36.     ENLIST_TRACKING(CSampleDSClass);
  37. }
  38.  
  39. HRESULT
  40. CSampleDSClass::CreateClass(
  41.     BSTR Parent,
  42.     BSTR CommonName,
  43.     LPSampleDS_CLASS_DEF lpClassDefs,
  44.     DWORD dwObjectState,
  45.     REFIID riid,
  46.     void **ppvObj
  47.     )
  48. {
  49.     CSampleDSClass FAR * pClass = NULL;
  50.     HRESULT hr = S_OK;
  51.  
  52.     hr = AllocateClassObject(&pClass);
  53.     BAIL_ON_FAILURE(hr);
  54.  
  55.     hr = pClass->InitializeCoreObject(
  56.                 Parent,
  57.                 CommonName,
  58.                 CLASS_CLASS_NAME,
  59.                 L"",
  60.                 CLSID_SampleDSClass,
  61.                 dwObjectState
  62.                 );
  63.     BAIL_ON_FAILURE(hr);
  64.  
  65.     hr = pClass->QueryInterface(riid, ppvObj);
  66.     BAIL_ON_FAILURE(hr);
  67.  
  68.     pClass->_dwNumberOfMandatoryAttributes =
  69.                     lpClassDefs->dwNumberOfMandatoryAttributes;
  70.     pClass->_lpMandatoryAttributes = CreatePropertyList(
  71.                                           lpClassDefs->lpMandatoryAttributes
  72.                                           );
  73.     
  74.     pClass->Release();
  75.  
  76.     RRETURN(hr);
  77.  
  78. error:
  79.  
  80.     delete pClass;
  81.     RRETURN(hr);
  82. }
  83.  
  84. HRESULT
  85. CSampleDSClass::CreateClass(
  86.     BSTR Parent,
  87.     BSTR CommonName,
  88.     HANDLE hTree,
  89.     DWORD dwObjectState,
  90.     REFIID riid,
  91.     void **ppvObj
  92.     )
  93. {
  94.     HRESULT hr = S_OK;
  95.     LPSampleDS_CLASS_DEF lpClassDefs = NULL;
  96.  
  97.     hr = SampleDSGetClassDefinition(&lpClassDefs,
  98.                                     CommonName);
  99.     BAIL_ON_FAILURE(hr);
  100.     
  101.     if (!lpClassDefs) {
  102.         hr = E_FAIL;
  103.         BAIL_ON_FAILURE(hr);
  104.     }
  105.  
  106.     hr = CSampleDSClass::CreateClass(
  107.                     Parent,
  108.                     CommonName,
  109.                     lpClassDefs,
  110.                     dwObjectState,
  111.                     riid,
  112.                     ppvObj
  113.                     );
  114.  
  115. error:
  116.     if (lpClassDefs) {
  117.         SampleDSFreeClassDefinition(lpClassDefs,
  118.                                     1);
  119.     };
  120.     RRETURN(hr);
  121. }
  122.  
  123.  
  124. CSampleDSClass::~CSampleDSClass( )
  125. {
  126.     delete _pDispMgr;
  127. }
  128.  
  129. STDMETHODIMP
  130. CSampleDSClass::QueryInterface(
  131.     REFIID iid,
  132.     LPVOID FAR* ppv
  133.     )
  134. {
  135.     if (IsEqualIID(iid, IID_IUnknown))
  136.     {
  137.         *ppv = (IADsClass FAR *) this;
  138.     }
  139.     else if (IsEqualIID(iid, IID_IADsClass))
  140.     {
  141.         *ppv = (IADsClass FAR *) this;
  142.     }
  143.     else if (IsEqualIID(iid, IID_IADs))
  144.     {
  145.         *ppv = (IADsClass FAR *) this;
  146.     }
  147.     else if (IsEqualIID(iid, IID_IDispatch))
  148.     {
  149.         *ppv = (IADsClass FAR *) this;
  150.     }
  151.     else
  152.     {
  153.         *ppv = NULL;
  154.         return E_NOINTERFACE;
  155.     }
  156.     AddRef();
  157.     return NOERROR;
  158. }
  159.  
  160. STDMETHODIMP
  161. CSampleDSClass::SetInfo(THIS)
  162. {
  163.     RRETURN(E_NOTIMPL);
  164. }
  165.  
  166. STDMETHODIMP
  167. CSampleDSClass::GetInfo(THIS)
  168. {
  169.     RRETURN(E_NOTIMPL);
  170. }
  171.  
  172. HRESULT
  173. CSampleDSClass::AllocateClassObject(
  174.     CSampleDSClass ** ppClass
  175.     )
  176. {
  177.     CSampleDSClass FAR * pClass = NULL;
  178.     CDispatchMgr FAR * pDispMgr = NULL;
  179.     HRESULT hr = S_OK;
  180.  
  181.     pClass = new CSampleDSClass();
  182.     if (pClass == NULL) {
  183.         hr = E_OUTOFMEMORY;
  184.     }
  185.     BAIL_ON_FAILURE(hr);
  186.  
  187.     pDispMgr = new CDispatchMgr;
  188.     if (pDispMgr == NULL) {
  189.         hr = E_OUTOFMEMORY;
  190.     }
  191.     BAIL_ON_FAILURE(hr);
  192.  
  193.     hr = LoadTypeInfoEntry(
  194.                 pDispMgr,
  195.                 LIBID_ADs,
  196.                 IID_IADsClass,
  197.                 (IADsClass *)pClass,
  198.                 DISPID_REGULAR
  199.                 );
  200.     BAIL_ON_FAILURE(hr);
  201.  
  202.     hr = LoadTypeInfoEntry(
  203.                 pDispMgr,
  204.                 LIBID_ADs,
  205.                 IID_IADsContainer,
  206.                 (IADsContainer *)pClass,
  207.                 DISPID_NEWENUM
  208.                 );
  209.     BAIL_ON_FAILURE(hr);
  210.  
  211.     pClass->_pDispMgr = pDispMgr;
  212.     *ppClass = pClass;
  213.  
  214.     RRETURN(hr);
  215.  
  216. error:
  217.     delete  pDispMgr;
  218.  
  219.     RRETURN(hr);
  220.  
  221. }
  222.  
  223.  
  224. STDMETHODIMP
  225. CSampleDSClass::GetInfo(
  226.     THIS_ DWORD dwApiLevel,
  227.     BOOL fExplicit
  228.     )
  229. {
  230.     RRETURN(E_NOTIMPL);
  231. }
  232.  
  233.  
  234. STDMETHODIMP
  235. CSampleDSClass::Get(
  236.     THIS_ BSTR bstrName,
  237.     VARIANT FAR* pvProp
  238.     )
  239. {
  240.     RRETURN(E_NOTIMPL);
  241. }
  242.  
  243.  
  244.  
  245. STDMETHODIMP
  246. CSampleDSClass::Put(
  247.     THIS_ BSTR bstrName,
  248.     VARIANT vProp
  249.     )
  250. {
  251.     RRETURN(E_NOTIMPL);
  252. }
  253.  
  254. PPROPENTRY
  255. CreatePropertyList(
  256.     LPWSTR_LIST  lpStringList
  257.     )
  258. {
  259.     PPROPENTRY pStart = NULL;
  260.     PPROPENTRY pPropEntry = NULL;
  261.  
  262.     while (lpStringList) {
  263.  
  264.         pPropEntry = CreatePropertyEntry(
  265.                             lpStringList->lpString,
  266.                             0
  267.                             );
  268.  
  269.         pPropEntry->pNext = pStart;
  270.         pStart = pPropEntry;
  271.  
  272.         lpStringList = lpStringList->Next;
  273.     }
  274.  
  275.     return(pStart);
  276. }
  277.  
  278.  
  279. PPROPENTRY
  280. CreatePropertyEntry(
  281.     LPWSTR pszPropertyName,
  282.     DWORD dwSyntaxId
  283.     )
  284. {
  285.     LPWSTR pszTemp = NULL;
  286.     PPROPENTRY pPropName = NULL;
  287.  
  288.     pszTemp = (LPWSTR)AllocProvStr(
  289.                     pszPropertyName
  290.                     );
  291.     if (!pszTemp) {
  292.         return(NULL);
  293.     }
  294.  
  295.     pPropName = (PPROPENTRY)AllocProvMem(
  296.                         sizeof(PROPENTRY)
  297.                         );
  298.     if (!pPropName) {
  299.         FreeProvStr(pszTemp);
  300.         return(NULL);
  301.     }
  302.  
  303.     pPropName->pszPropName = pszTemp;
  304.     pPropName->dwSyntaxId = dwSyntaxId;
  305.  
  306.     return(pPropName);
  307. }
  308.  
  309. void
  310. FreePropertyEntry(
  311.     PPROPENTRY pPropName
  312.     )
  313. {
  314.     if (pPropName->pszPropName) {
  315.         FreeProvStr(pPropName->pszPropName);
  316.     }
  317.  
  318.     FreeProvMem(pPropName);
  319.  
  320.     return;
  321. }
  322.  
  323. HRESULT
  324. MakeVariantFromPropList(
  325.     PPROPENTRY pPropList,
  326.     DWORD dwNumEntries,
  327.     VARIANT * pVarList
  328.     )
  329. {
  330.     SAFEARRAYBOUND sabNewArray;
  331.     SAFEARRAY * pFilter = NULL;
  332.     HRESULT hr = S_OK;
  333.     DWORD dwSLBound = 0;
  334.     DWORD dwSUBound = 0;
  335.     DWORD i = 0;
  336.     VARIANT v;
  337.  
  338.     VariantInit(pVarList);
  339.  
  340.     sabNewArray.cElements = dwNumEntries;
  341.     sabNewArray.lLbound = 0;
  342.  
  343.     pFilter = SafeArrayCreate(
  344.                     VT_VARIANT,
  345.                     1,
  346.                     &sabNewArray
  347.                     );
  348.  
  349.     if (!pFilter) {
  350.         hr = E_OUTOFMEMORY;
  351.         BAIL_ON_FAILURE(hr);
  352.     }
  353.  
  354.     for (i = dwSLBound; i < (dwSLBound + dwNumEntries); i++) {
  355.         VariantInit(&v);
  356.         V_VT(&v) = VT_BSTR;
  357.  
  358.         V_BSTR(&v) = SysAllocString(pPropList->pszPropName);
  359.  
  360.         hr = SafeArrayPutElement(
  361.                 pFilter,
  362.                 (long*)&i,
  363.                 (void *)&v
  364.                 );
  365.         BAIL_ON_FAILURE(hr);
  366.  
  367.         pPropList = pPropList->pNext;
  368.  
  369.     }
  370.  
  371.     V_VT(pVarList) = VT_ARRAY | VT_VARIANT;
  372.     V_ARRAY(pVarList) = pFilter;
  373.  
  374.     RRETURN(S_OK);
  375.  
  376. error:
  377.  
  378.     if (pFilter) {
  379.         SafeArrayDestroy(pFilter);
  380.     }
  381.  
  382.     RRETURN(hr);
  383. }
  384.  
  385. /* IADsClass methods */
  386.  
  387. STDMETHODIMP
  388. CSampleDSClass::get_PrimaryInterface( THIS_ BSTR FAR *pbstrGUID )
  389. {
  390.     RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED);
  391. }
  392.  
  393. STDMETHODIMP
  394. CSampleDSClass::get_CLSID( THIS_ BSTR FAR *pbstrCLSID )
  395. {
  396.     RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED);
  397. }
  398.  
  399. STDMETHODIMP
  400. CSampleDSClass::put_CLSID( THIS_ BSTR bstrCLSID )
  401. {
  402.     RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED);
  403. }
  404.  
  405. STDMETHODIMP
  406. CSampleDSClass::get_OID( THIS_ BSTR FAR *pbstrOID )
  407. {
  408.     RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED);
  409. }
  410.  
  411. STDMETHODIMP
  412. CSampleDSClass::put_OID( THIS_ BSTR bstrOID )
  413. {
  414.     RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED);
  415. }
  416.  
  417. STDMETHODIMP
  418. CSampleDSClass::get_Abstract( THIS_ VARIANT_BOOL FAR *pfAbstract )
  419. {
  420.     RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED);
  421. }
  422.  
  423. STDMETHODIMP
  424. CSampleDSClass::put_Abstract( THIS_ VARIANT_BOOL fAbstract )
  425. {
  426.     RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED);
  427. }
  428.  
  429. STDMETHODIMP
  430. CSampleDSClass::get_MandatoryProperties( THIS_ VARIANT FAR *pvMandatoryProperties )
  431. {
  432.     HRESULT hr = S_OK;
  433.  
  434.     hr = MakeVariantFromPropList(
  435.             _lpMandatoryAttributes,
  436.             _dwNumberOfMandatoryAttributes,
  437.             pvMandatoryProperties
  438.             );
  439.     RRETURN(hr);
  440. }
  441.  
  442. STDMETHODIMP
  443. CSampleDSClass::put_MandatoryProperties( THIS_ VARIANT vMandatoryProperties )
  444. {
  445.     RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED);
  446. }
  447.  
  448. STDMETHODIMP
  449. CSampleDSClass::get_DerivedFrom( THIS_ VARIANT FAR *pvDerivedFrom )
  450. {
  451.     RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED);
  452. }
  453.  
  454. STDMETHODIMP
  455. CSampleDSClass::put_DerivedFrom( THIS_ VARIANT vDerivedFrom )
  456. {
  457.     RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED);
  458. }
  459.  
  460. STDMETHODIMP
  461. CSampleDSClass::get_Containment( THIS_ VARIANT FAR *pvContainment )
  462. {
  463.     RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED);
  464. }
  465.  
  466. STDMETHODIMP
  467. CSampleDSClass::put_Containment( THIS_ VARIANT vContainment )
  468. {
  469.     RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED);
  470. }
  471.  
  472. STDMETHODIMP
  473. CSampleDSClass::get_Container( THIS_ VARIANT_BOOL FAR *pfContainer )
  474. {
  475.     RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED);
  476. }
  477.  
  478. STDMETHODIMP
  479. CSampleDSClass::put_Container( THIS_ VARIANT_BOOL fContainer )
  480. {
  481.     RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED);
  482. }
  483.  
  484. STDMETHODIMP
  485. CSampleDSClass::get_HelpFileName( THIS_ BSTR FAR *pbstrHelpFileName )
  486. {
  487.     RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED);
  488. }
  489.  
  490. STDMETHODIMP
  491. CSampleDSClass::put_HelpFileName( THIS_ BSTR bstrHelpFile )
  492. {
  493.     RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED);
  494. }
  495.  
  496. STDMETHODIMP
  497. CSampleDSClass::get_HelpFileContext( THIS_ long FAR *plHelpContext )
  498. {
  499.     RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED);
  500. }
  501.  
  502. STDMETHODIMP
  503. CSampleDSClass::put_HelpFileContext( THIS_ long lHelpContext )
  504. {
  505.     RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED);
  506. }
  507.  
  508. STDMETHODIMP
  509. CSampleDSClass::Qualifiers(THIS_ IADsCollection FAR* FAR* ppQualifiers)
  510. {
  511.     RRETURN(E_NOTIMPL);
  512. }
  513.  
  514. STDMETHODIMP
  515. CSampleDSClass::get_Auxiliary( THIS_ VARIANT_BOOL FAR *pfAuxiliary )
  516. {
  517.     RRETURN(E_NOTIMPL);
  518. }
  519.  
  520. STDMETHODIMP
  521. CSampleDSClass::put_Auxiliary( THIS_ VARIANT_BOOL fAuxiliary )
  522. {
  523.     RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED);
  524. }
  525.  
  526. STDMETHODIMP
  527. CSampleDSClass::get_OptionalProperties( THIS_ VARIANT FAR *retval )
  528. {
  529.     RRETURN(E_NOTIMPL);
  530. }
  531.  
  532. STDMETHODIMP
  533. CSampleDSClass::put_OptionalProperties( THIS_ VARIANT vOptionalProperties )
  534. {
  535.     RRETURN(E_NOTIMPL);
  536. }
  537.  
  538. STDMETHODIMP
  539. CSampleDSClass::get_NamingProperties( THIS_ VARIANT FAR *retval )
  540. {
  541.     RRETURN(E_NOTIMPL);
  542. }
  543.  
  544. STDMETHODIMP
  545. CSampleDSClass::put_NamingProperties( THIS_ VARIANT vNamingProperties )
  546. {
  547.     RRETURN(E_NOTIMPL);
  548. }
  549. STDMETHODIMP
  550. CSampleDSClass::get_AuxDerivedFrom( THIS_ VARIANT FAR *pvAuxDerivedFrom )
  551. {
  552.     RRETURN(E_NOTIMPL);
  553. }
  554.  
  555. STDMETHODIMP
  556. CSampleDSClass::put_AuxDerivedFrom( THIS_ VARIANT vAuxDerivedFrom )
  557. {
  558.     RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED);
  559. }
  560.  
  561. STDMETHODIMP
  562. CSampleDSClass::get_PossibleSuperiors( THIS_ VARIANT FAR *pvPossSuperiors)
  563. {
  564.     RRETURN(E_NOTIMPL);
  565. }
  566.  
  567. STDMETHODIMP
  568. CSampleDSClass::put_PossibleSuperiors( THIS_ VARIANT vPossSuperiors )
  569. {
  570.     RRETURN(E_ADS_PROPERTY_NOT_SUPPORTED);
  571. }
  572.  
  573.