Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

8517 lines
211 KiB

  1. /*++
  2. Copyright (c) 2001 Microsoft Corporation
  3. Module Name:
  4. azdisp.cxx
  5. Abstract:
  6. Implementation of CAz* dispatch interfaces
  7. Author:
  8. Xiaoxi Tan (xtan) 11-May-2001
  9. --*/
  10. #include "pch.hxx"
  11. #include <Ntdsapi.h>
  12. #include <dispex.h>
  13. #define AZD_COMPONENT AZD_DISPATCH
  14. //object type IDs
  15. enum ENUM_AZ_OBJECT
  16. {
  17. ENUM_AZ_APPLICATION = 0,
  18. ENUM_AZ_GROUP = 1,
  19. ENUM_AZ_OPERATION = 2,
  20. ENUM_AZ_TASK = 3,
  21. ENUM_AZ_SCOPE = 4,
  22. ENUM_AZ_ROLE = 5,
  23. ENUM_AZ_CLIENTCONTEXT = 6,
  24. ENUM_AZ_APPLICATIONS = 7,
  25. ENUM_AZ_GROUPS = 8,
  26. ENUM_AZ_OPERATIONS = 9,
  27. ENUM_AZ_TASKS = 10,
  28. ENUM_AZ_SCOPES = 11,
  29. ENUM_AZ_ROLES = 12,
  30. };
  31. //data struct defines
  32. typedef DWORD (*PFUNCAzCreate)(
  33. IN AZ_HANDLE hObjHandle,
  34. IN LPCWSTR Name,
  35. IN DWORD Reserved,
  36. OUT PAZ_HANDLE phHandle);
  37. typedef DWORD (*PFUNCAzOpen)(
  38. IN AZ_HANDLE hObjHandle,
  39. IN LPCWSTR Name,
  40. IN DWORD Reserved,
  41. OUT PAZ_HANDLE phHandle);
  42. typedef DWORD (*PFUNCAzClose)(
  43. IN AZ_HANDLE hObjHandle,
  44. IN LPCWSTR Name,
  45. IN LONG lFlags);
  46. typedef DWORD (*PFUNCAzDelete)(
  47. IN AZ_HANDLE hParent,
  48. IN LPCWSTR Name,
  49. IN DWORD lReserved);
  50. typedef DWORD (*PFUNCAzEnum)(
  51. IN AZ_HANDLE hParent,
  52. IN DWORD Reserved,
  53. IN OUT ULONG *lContext,
  54. OUT AZ_HANDLE *phObject);
  55. typedef DWORD (*PFUNCAzSetProperty)(
  56. IN AZ_HANDLE hHandle,
  57. IN ULONG PropertyId,
  58. IN DWORD Reserved,
  59. IN PVOID PropertyValue);
  60. typedef DWORD (*PFUNCAzRemovePropertyItem)(
  61. IN AZ_HANDLE hHandle,
  62. IN ULONG PropertyId,
  63. IN DWORD Reserved,
  64. IN PVOID PropertyValue);
  65. //
  66. // Routine that checks if an object is still good to use
  67. // This is needed because when an application is forcefually
  68. // closed, all its descendent objects becomes un-usable, even
  69. // the CloseHandle call in the COM objects' destructors can't proceed.
  70. //
  71. BOOL IsObjectUsable (
  72. IN AZ_HANDLE hOwnerApp,
  73. DWORD dwOwnerAppSN
  74. )
  75. /*++
  76. Description:
  77. This helper function determines if the object is still usable.
  78. Arguments:
  79. hOwnerApp - The owner application handle of the object.
  80. dwOwnerAppSN - The sequential number of the owner application.
  81. Return:
  82. True if and only if the owner application is still valid.
  83. Note:
  84. Since applications can be forcefully closed, and when that happens,
  85. all descendent objects originated from the applications becomes invalid because
  86. their memory is freed. This violates the normal COM programming model where
  87. objects must be allowed to live by its own ref-counting rules.
  88. To solve this problem, we deviced the following solution:
  89. (1) We add a sequential number to the application object struct. This sequential
  90. number is created at the store load time and modified when an application
  91. is closed. The sequential number is not persisted. Different application
  92. cache structs can have the same sequential number.
  93. (2) when a COM object is created, if it has an application object as its
  94. ancestor, it caches that application's handle and the sequential number of
  95. the application. This application handle is called owner app handle,
  96. whereas the sequential number is called owner app sequential number.
  97. (3) An application has its sequential number incremented when it is closed.
  98. (4) When an object needs to do any function relating to the cache, we check
  99. if the object is still usable based on the cached owner app's sequential number
  100. and the current application's sequential number. If they don't match, we
  101. know that the object is a dangling object after its owning application was
  102. closed (which might have been brought back to live by OpenApplication)
  103. (5) Some objects (AzStore object, and those ApplicationGroup object owned by
  104. the store object) may not have an owner app. In those cases, the hOwnerApp
  105. should be NULL and we don't check the other condition.
  106. --*/
  107. {
  108. return (hOwnerApp == NULL) ||
  109. (dwOwnerAppSN == AzpRetrieveApplicationSequenceNumber(hOwnerApp));
  110. }
  111. HRESULT
  112. myAccountNameToSid (
  113. IN LPCWSTR pwszName,
  114. OUT PSID * ppSid
  115. )
  116. /*++
  117. Description:
  118. This helper function convert an account name to a SID.
  119. Arguments:
  120. pwszName - Name of the account to lookup
  121. ppSid - Receives the SID if found. Caller must call LocalFree
  122. if it receives a valid SID.
  123. Return:
  124. Success: S_OK
  125. Failure: E_INVALIDARG, E_OUTOFMEMORY, or other error codes from LookupAccountName
  126. --*/
  127. {
  128. if (ppSid == NULL)
  129. {
  130. return E_INVALIDARG;
  131. }
  132. *ppSid = NULL;
  133. if (pwszName == NULL || *pwszName == L'\0')
  134. {
  135. return E_INVALIDARG;
  136. }
  137. //
  138. // do account lookup
  139. //
  140. HRESULT hr = S_OK;
  141. DWORD dwSidSize = 0;
  142. DWORD dwDomainSize = 0;
  143. SID_NAME_USE snu;
  144. //
  145. // we don't care about the return result because it will fail anyway
  146. // since we are querying the buffer sizes
  147. //
  148. LookupAccountName(NULL,
  149. pwszName,
  150. NULL,
  151. &dwSidSize,
  152. NULL,
  153. &dwDomainSize,
  154. &snu
  155. );
  156. DWORD dwErr = GetLastError();
  157. //
  158. // it must fail for buffer not sufficient
  159. //
  160. if (dwErr != ERROR_INSUFFICIENT_BUFFER)
  161. {
  162. return AZ_HR_FROM_WIN32(dwErr);
  163. }
  164. //
  165. // all sids are LocalAlloc'ed. So, we just follow
  166. // the same so that callers can have a consistent usage
  167. //
  168. *ppSid = (PSID) LocalAlloc(LPTR, dwSidSize);
  169. //
  170. // although we don't care about domain, but without
  171. // retrieving domain, lookup will fail.
  172. //
  173. LPWSTR pwszDomain = NULL;
  174. SafeAllocaAllocate(pwszDomain, dwDomainSize * sizeof(WCHAR));
  175. if (*ppSid != NULL && pwszDomain != NULL)
  176. {
  177. if ( !LookupAccountName(NULL,
  178. pwszName,
  179. *ppSid,
  180. &dwSidSize,
  181. pwszDomain,
  182. &dwDomainSize,
  183. &snu
  184. ) )
  185. {
  186. dwErr = GetLastError();
  187. hr = AZ_HR_FROM_WIN32(dwErr);
  188. }
  189. }
  190. else
  191. {
  192. hr = E_OUTOFMEMORY;
  193. }
  194. //
  195. // we don't need domain name
  196. //
  197. if (pwszDomain != NULL)
  198. {
  199. SafeAllocaFree(pwszDomain);
  200. }
  201. if (hr != S_OK && *ppSid != NULL)
  202. {
  203. LocalFree(*ppSid);
  204. *ppSid = NULL;
  205. }
  206. return hr;
  207. }
  208. HRESULT
  209. mySidToAccountName (
  210. IN PSID pSid,
  211. OUT LPWSTR * ppwszName
  212. )
  213. /*++
  214. Description:
  215. This helper function convert an a SID to a string account name. Note: this function
  216. doesn't convert the name to UPN.
  217. Arguments:
  218. pSid - The SID whose name will be looked up.
  219. ppwszName - Receives the name of the SID. Caller must free it by LocalFree.
  220. Return:
  221. Success: S_OK
  222. Failure: E_INVALIDARG, E_OUTOFMEMORY, or other error codes from LookupAccountSid
  223. --*/
  224. {
  225. if (ppwszName == NULL)
  226. {
  227. return E_INVALIDARG;
  228. }
  229. *ppwszName = NULL;
  230. if (pSid == NULL)
  231. {
  232. return E_INVALIDARG;
  233. }
  234. //
  235. // do account lookup
  236. //
  237. HRESULT hr = S_OK;
  238. DWORD dwNameSize = 0;
  239. DWORD dwDomainSize = 0;
  240. SID_NAME_USE snu;
  241. //
  242. // we don't care about the return result because it will fail anyway
  243. // since we are querying the buffer sizes
  244. //
  245. LookupAccountSid(NULL,
  246. pSid,
  247. NULL,
  248. &dwNameSize,
  249. NULL,
  250. &dwDomainSize,
  251. &snu
  252. );
  253. DWORD dwErr = GetLastError();
  254. //
  255. // it must fail for buffer not sufficient to be correct.
  256. //
  257. if (dwErr != ERROR_INSUFFICIENT_BUFFER)
  258. {
  259. return AZ_HR_FROM_WIN32(dwErr);
  260. }
  261. //
  262. // we should have used AzpAllocateHeap, but that will make
  263. // our calling routine confused. So, use a more consistent
  264. // memory routine so that the caller can use the same to free it
  265. //
  266. LPWSTR pszNTName = (LPWSTR) LocalAlloc(LPTR, dwNameSize * sizeof(WCHAR));
  267. //
  268. // although we don't care about domain, but without
  269. // retrieving domain, lookup will fail. We don't pass out this memory
  270. // so, we will just use
  271. //
  272. LPWSTR pwszDomain = NULL;
  273. SafeAllocaAllocate(pwszDomain, dwDomainSize * sizeof(WCHAR));
  274. if (pszNTName != NULL && pwszDomain != NULL)
  275. {
  276. if ( !LookupAccountSid(NULL,
  277. pSid,
  278. pszNTName,
  279. &dwNameSize,
  280. pwszDomain,
  281. &dwDomainSize,
  282. &snu
  283. ) )
  284. {
  285. dwErr = GetLastError();
  286. hr = AZ_HR_FROM_WIN32(dwErr);
  287. }
  288. else
  289. {
  290. *ppwszName = pszNTName;
  291. pszNTName = NULL;
  292. }
  293. }
  294. else
  295. {
  296. hr = E_OUTOFMEMORY;
  297. }
  298. //
  299. // we don't need domain name
  300. //
  301. if (pwszDomain != NULL)
  302. {
  303. SafeAllocaFree(pwszDomain);
  304. }
  305. if (pszNTName != NULL)
  306. {
  307. LocalFree((HLOCAL)pszNTName);
  308. pszNTName = NULL;
  309. }
  310. return hr;
  311. }
  312. HRESULT
  313. mySidToName (
  314. IN HANDLE hDS,
  315. IN PSID pSid,
  316. OUT LPWSTR * ppwszName
  317. )
  318. /*++
  319. Description:
  320. This helper function convert an a SID to a string account name.
  321. If possible, we will return UPN name. But any failure to convert
  322. to UPN name will result in a regular NT4 style name.
  323. Arguments:
  324. hDS - DS handle if we need UPN name
  325. pSid - The SID whose name will be looked up.
  326. ppwszName - Receives the name of the SID. Caller must free it by LocalFree.
  327. If we can crack the name, we will return UPN. Otherwise, the NT
  328. account name will be returned.
  329. Return:
  330. Success: S_OK
  331. Failure: E_INVALIDARG, E_OUTOFMEMORY, or other error codes from LookupAccountName
  332. --*/
  333. {
  334. if (ppwszName == NULL)
  335. {
  336. return E_INVALIDARG;
  337. }
  338. *ppwszName = NULL;
  339. if (pSid == NULL)
  340. {
  341. return E_INVALIDARG;
  342. }
  343. //
  344. // Get the string SID to crack the name
  345. //
  346. HRESULT hr = S_OK;
  347. DWORD dwErr;
  348. LPWSTR pwszStringSid = NULL;
  349. if (!ConvertSidToStringSid(pSid, &pwszStringSid))
  350. {
  351. return AZ_HR_FROM_WIN32(GetLastError());
  352. }
  353. PDS_NAME_RESULTW pnamesResult = NULL;
  354. dwErr = DsCrackNamesW ( hDS,
  355. DS_NAME_NO_FLAGS,
  356. DS_SID_OR_SID_HISTORY_NAME,
  357. DS_USER_PRINCIPAL_NAME,
  358. 1,
  359. &pwszStringSid,
  360. &pnamesResult
  361. );
  362. if ( pnamesResult != NULL &&
  363. (DS_NAME_NO_ERROR == dwErr) &&
  364. (pnamesResult->rItems[0].pName != NULL) &&
  365. (pnamesResult->rItems[0].status == DS_NAME_NO_ERROR)
  366. )
  367. {
  368. dwErr = NO_ERROR;
  369. //
  370. // we can use the cracked UPN. Adding 1 to include the null terminator.
  371. //
  372. DWORD dwLen = (DWORD) wcslen(pnamesResult->rItems[0].pName) + 1;
  373. *ppwszName = (LPWSTR) LocalAlloc(LPTR, dwLen * sizeof(WCHAR));
  374. if (*ppwszName != NULL)
  375. {
  376. memcpy(*ppwszName, pnamesResult->rItems[0].pName, dwLen * sizeof(WCHAR));
  377. }
  378. else
  379. {
  380. hr = E_OUTOFMEMORY;
  381. }
  382. }
  383. else
  384. {
  385. //
  386. // we will just have to use the NT style name
  387. //
  388. hr = mySidToAccountName(pSid, ppwszName);
  389. }
  390. if (pnamesResult != NULL)
  391. {
  392. DsFreeNameResult(pnamesResult);
  393. }
  394. return hr;
  395. }
  396. BOOL
  397. myNeedSidToNameConversion (
  398. IN LONG lPropID,
  399. OUT LONG * plPersistPropID
  400. )
  401. /*++
  402. Description:
  403. Since we internally persist only sid but we allow the
  404. user to use account names, we need to convert when such properties
  405. are requested. This helper function determines which property
  406. ID needs sid to name conversion.
  407. Arguments:
  408. lPropID - The ID of the property
  409. plPersistPropID - The ID on which is property is persisted
  410. Return:
  411. TRUE if the property needs sid to name conversion
  412. FALSE otherwise
  413. --*/
  414. {
  415. BOOL bResult = TRUE;
  416. switch (lPropID)
  417. {
  418. case AZ_PROP_GROUP_MEMBERS_NAME:
  419. *plPersistPropID = AZ_PROP_GROUP_MEMBERS;
  420. break;
  421. case AZ_PROP_GROUP_NON_MEMBERS_NAME:
  422. *plPersistPropID = AZ_PROP_GROUP_NON_MEMBERS;
  423. break;
  424. case AZ_PROP_ROLE_MEMBERS_NAME:
  425. *plPersistPropID = AZ_PROP_ROLE_MEMBERS;
  426. break;
  427. case AZ_PROP_POLICY_ADMINS_NAME:
  428. *plPersistPropID = AZ_PROP_POLICY_ADMINS;
  429. break;
  430. case AZ_PROP_POLICY_READERS_NAME:
  431. *plPersistPropID = AZ_PROP_POLICY_READERS;
  432. break;
  433. case AZ_PROP_DELEGATED_POLICY_USERS_NAME:
  434. *plPersistPropID = AZ_PROP_DELEGATED_POLICY_USERS;
  435. break;
  436. default:
  437. *plPersistPropID = lPropID;
  438. bResult = FALSE;
  439. break;
  440. }
  441. return bResult;
  442. }
  443. template<class T>
  444. HRESULT
  445. myAddItemToMap (
  446. IN OUT T_AZ_MAP(T) * pMap,
  447. IN OUT T** ppObj
  448. )
  449. /*++
  450. Description:
  451. This helper function is designed to solve the problem in STL's implementation
  452. which does not protect caller from "out of memory" conditions. STL will simply
  453. crash. By catching the exception ourselves, we will be able to continue with
  454. appropriate error code.
  455. Arguments:
  456. pMap - The map where this object (*ppObj) will be added.
  457. ppObj - the object that will be added to the map.
  458. Return:
  459. Success: S_OK
  460. Failure: E_INVALIDARG or E_OUTOFMEMORY
  461. ********** Warning **************
  462. We consider the object pointed to by *ppObj is consumed after calling
  463. this function regardless of success or failure. So, the outgoing *ppObj
  464. will always be NULL.
  465. This is not a good design in general use. But for our maps, this is the
  466. cleanest way of reducing duplicate code.
  467. ********** Warning **************
  468. --*/
  469. {
  470. if (pMap == NULL || ppObj == NULL || *ppObj == NULL)
  471. {
  472. if (ppObj != NULL && *ppObj != NULL)
  473. {
  474. (*ppObj)->Release();
  475. *ppObj = NULL;
  476. }
  477. return E_INVALIDARG;
  478. }
  479. //
  480. // $consider:
  481. // all our maps uses BSTR representation of index numbers
  482. // as keys. We should eventually clean that up. We should
  483. // just use indexes.
  484. //
  485. WCHAR wszIndex[12];
  486. wnsprintf(wszIndex, 12, L"%09u", pMap->size() + 1);
  487. BSTR bstrIndex = ::SysAllocString(wszIndex);
  488. if (bstrIndex == NULL)
  489. {
  490. (*ppObj)->Release();
  491. *ppObj = NULL;
  492. return E_OUTOFMEMORY;
  493. }
  494. //
  495. // STL doesn't check for memory allocation failure.
  496. // We have to catch it ourselves. Secondly, our map
  497. // uses CComPtr<T>, so the addition to the map causes
  498. // the ref count of the object to go up by 1. So, regardless
  499. // whether we successfully added the object to the map or not,
  500. // we will release it.
  501. //
  502. HRESULT HR = S_OK;
  503. __try
  504. {
  505. (*pMap)[bstrIndex] = (*ppObj);
  506. }
  507. __except( EXCEPTION_EXECUTE_HANDLER )
  508. {
  509. HR = E_OUTOFMEMORY;
  510. }
  511. (*ppObj)->Release();
  512. *ppObj = NULL;
  513. ::SysFreeString(bstrIndex);
  514. return HR;
  515. }
  516. //some internal common procedures
  517. HRESULT
  518. HandleReserved(
  519. IN VARIANT *pvarReserved
  520. )
  521. /*+++
  522. Description:
  523. helper routine to validate VARIANT reserved passed from
  524. COM interface callers. The reserved is enforced to be
  525. VT_NULL, VT_EMPTY, 0, or DISP_E_PARAMNOTFOUND
  526. Arguments:
  527. pvarReserved - point to reserved variable for validation
  528. Return:
  529. All reserved parameters should either not be specified or should be zero
  530. ---*/
  531. {
  532. if ( pvarReserved == NULL) {
  533. return S_OK;
  534. } else if ( V_VT(pvarReserved) == VT_ERROR ) {
  535. //
  536. // From MSDN in a section talking about passing in parameters
  537. //
  538. // If the parameters are positional (unnamed), you would set cArgs
  539. // to the total number of possible parameters, cNamedArgs to 0, and
  540. // pass VT_ERROR as the type of the omitted parameters, with the
  541. // status code DISP_E_PARAMNOTFOUND as the value.
  542. if ( V_ERROR(pvarReserved) == DISP_E_PARAMNOTFOUND ) {
  543. return S_OK;
  544. }
  545. } else if ( V_VT(pvarReserved) == VT_EMPTY ) {
  546. return S_OK;
  547. } else if ( V_VT(pvarReserved) == VT_NULL ) {
  548. return S_OK;
  549. } else if ( V_VT(pvarReserved) == VT_I4 ) {
  550. if ( V_I4(pvarReserved) == 0 ) {
  551. return S_OK;
  552. }
  553. } else if ( V_VT(pvarReserved) == VT_I2 ) {
  554. if ( V_I2(pvarReserved) == 0 ) {
  555. return S_OK;
  556. }
  557. }
  558. return AZ_HRESULT( ERROR_INVALID_PARAMETER );
  559. }
  560. inline BOOL
  561. myIsGoodUnicode (
  562. IN WCHAR wch
  563. )
  564. /*++
  565. Description:
  566. Test if the given WCHAR is a valid unicode character. For v1,
  567. all unicode characters must be that they are valid for according to
  568. XML spec.
  569. Arguments:
  570. wch - given WCHAR to check.
  571. Return:
  572. TRUE and and only is the wchar is a good unicode character.
  573. --*/
  574. {
  575. static const WCHAR wchUnicodeR1First = 0x0020;
  576. static const WCHAR wchUnicodeR1Last = 0xD7FF;
  577. static const WCHAR wchUnicodeR2First = 0xE000;
  578. static const WCHAR wchUnicodeR2Last = 0xFFFD;
  579. return ( wch >= wchUnicodeR1First && wch <= wchUnicodeR1Last ||
  580. wch >= wchUnicodeR2First && wch <= wchUnicodeR2Last ||
  581. wch == 0x9 ||
  582. wch == 0xA ||
  583. wch == 0xD);
  584. }
  585. inline BOOL
  586. myIsGoodSurrogatePair (
  587. IN WCHAR wchHi,
  588. IN WCHAR wchLo
  589. )
  590. /*++
  591. Description:
  592. This function determines if a pair of WCHARs is a good surrogate pair.
  593. For valid utf-8 characters in the range, [#x10000 - #x10FFFF], MSXML uses
  594. surrogate pairs to pass them around using BSTR. For v1 before we implement
  595. provider specific validation, we require that all providers pass such
  596. characters using surrogate pairs. This is the best assumption because
  597. multiple MS products (MSXML, SQL Server 2000) already use surrogate pairs.
  598. There is probably no reason to believe that other products (such as DS) won't.
  599. Arguments:
  600. wchHi - The high part of the surrogate.
  601. wchLo - The low part of the surrogate.
  602. Return:
  603. TRUE and and only is the pair is a good surrogate pair.
  604. --*/
  605. {
  606. static const WCHAR wchSurrogateHiFirst = 0xD800;
  607. static const WCHAR wchSurrogateHiLast = 0xDBFF;
  608. static const WCHAR wchSurrogateLoFirst = 0xDC00;
  609. static const WCHAR wchSurrogateLoLast = 0xDFFF;
  610. return ( wchHi >= wchSurrogateHiFirst && wchHi <= wchSurrogateHiLast &&
  611. wchLo >= wchSurrogateLoFirst && wchLo <= wchSurrogateLoLast);
  612. }
  613. HRESULT
  614. myVerifyBSTRData (
  615. IN const BSTR bstrData
  616. )
  617. /*++
  618. Description:
  619. XML spec disallows certain characters being used. Here is the Char
  620. definition expansion:
  621. Char ::= #x9 | #xA | #xD | [#x20 - #xD7FF] | [#xE000 = #xFFFD] | [#x10000 - #x10FFFF]
  622. For v1, we will just disallow invalid characters for providers, thus
  623. bending for the convenience of XML provider.
  624. Arguments:
  625. bstrData - The BSTR data to be verified. This must be a NULL terminated BSTR.
  626. Return:
  627. Success: S_OK.
  628. Failure: various error code.
  629. Note:
  630. CLR has an API called IsSurrogate to test if a unicode
  631. character is a surrogate character. But we are not using CLR yet.
  632. So, we opt to do the test ourselves for v1.
  633. --*/
  634. {
  635. HRESULT hr = S_OK;
  636. //
  637. // We have nothing to check if given a NULL BSTR.
  638. //
  639. if (bstrData != NULL)
  640. {
  641. int i = 0;
  642. while (bstrData[i] != L'\0')
  643. {
  644. if ( !myIsGoodUnicode(bstrData[i]) &&
  645. !myIsGoodSurrogatePair(bstrData[i], bstrData[i+1])
  646. )
  647. {
  648. hr = AZ_HR_FROM_WIN32(ERROR_INVALID_DATA);
  649. break;
  650. }
  651. ++i;
  652. }
  653. }
  654. return hr;
  655. }
  656. /////////////////////////
  657. //myAzNewObject
  658. // This routine creates any type of AZ objects define in ENUM_AZ_OBJECT
  659. //
  660. // This routine is called from COM interface wrappers.
  661. //
  662. /////////////////////////
  663. HRESULT
  664. myAzNewObject(
  665. IN AZ_HANDLE hOwnerApp,
  666. IN DWORD dwOwnerAppSN,
  667. IN ENUM_AZ_OBJECT enumObject,
  668. IN AZ_HANDLE hObject,
  669. IN VARIANT *pvarReserved,
  670. OUT IUnknown **ppObject)
  671. /*+++
  672. Description:
  673. a central place to instantiate any az com interface object
  674. it is used for any object creating child interface object pointer
  675. Arguments:
  676. hOwnerApp - the handle of the owner application
  677. dwOwnerAppSN - The sequential number of the owner app.
  678. enumObject - indicate what interface object is created
  679. hObject - a az core handle used for interface object _Init call
  680. pvarReserved - reserved passed from the caller
  681. ppObject - pointer for returned interface pointer
  682. Return:
  683. *ppObject must be Release by the call if success
  684. ---*/
  685. {
  686. HRESULT hr;
  687. CComPtr<IUnknown> srpObject;
  688. CComObject<CAzApplication> *pApp;
  689. CComObject<CAzApplicationGroup> *pGroup;
  690. CComObject<CAzOperation> *pOperation;
  691. CComObject<CAzTask> *pTask;
  692. CComObject<CAzScope> *pScope;
  693. CComObject<CAzRole> *pRole;
  694. CComObject<CAzClientContext> *pClient;
  695. CComObject<CAzApplications> *pApps;
  696. CComObject<CAzApplicationGroups> *pGroups;
  697. CComObject<CAzOperations> *pOperations;
  698. CComObject<CAzTasks> *pTasks;
  699. CComObject<CAzScopes> *pScopes;
  700. CComObject<CAzRoles> *pRoles;
  701. BOOL bLockSet = FALSE;
  702. if (NULL == ppObject)
  703. {
  704. hr = E_POINTER;
  705. _JumpError(hr, error, "Null ppObject");
  706. }
  707. AZASSERT(NULL != hObject);
  708. //
  709. //initialize
  710. //
  711. *ppObject = NULL;
  712. //
  713. // Grab the close application lock so that close
  714. // application does not interfere
  715. //
  716. AzpLockResourceShared( &AzGlCloseApplication );
  717. bLockSet = TRUE;
  718. if (!IsObjectUsable(hOwnerApp, dwOwnerAppSN))
  719. {
  720. hr = AZ_HR_FROM_WIN32(ERROR_INVALID_HANDLE);
  721. _JumpError(hr, error, "Owning application was closed.");
  722. }
  723. //
  724. // validate reserved parameters
  725. //
  726. hr = HandleReserved(pvarReserved );
  727. _JumpIfError(hr, error, "HandleReserved");
  728. switch (enumObject)
  729. {
  730. case ENUM_AZ_APPLICATION:
  731. hr = CComObject<CAzApplication>::CreateInstance(&pApp);
  732. _JumpIfError(hr, error, "CreateInstance");
  733. AZASSERT(NULL != pApp);
  734. //
  735. // this QI will also secure the object
  736. //
  737. hr = pApp->QueryInterface(&srpObject);
  738. _JumpIfError(hr, error, "CAzApplication::QueryInterface(IUknown**)");
  739. hr = pApp->_Init(hObject);
  740. _JumpIfError(hr, error, "Application->_Init");
  741. break;
  742. case ENUM_AZ_GROUP:
  743. hr = CComObject<CAzApplicationGroup>::CreateInstance(&pGroup);
  744. _JumpIfError(hr, error, "CreateInstance");
  745. AZASSERT(NULL != pGroup);
  746. //
  747. // this QI will also secure the object
  748. //
  749. hr = pGroup->QueryInterface(&srpObject);
  750. _JumpIfError(hr, error, "CAzApplicationGroup::QueryInterface(IUknown**)");
  751. hr = pGroup->_Init(hOwnerApp, hObject);
  752. _JumpIfError(hr, error, "Group->_Init");
  753. break;
  754. case ENUM_AZ_OPERATION:
  755. hr = CComObject<CAzOperation>::CreateInstance(&pOperation);
  756. _JumpIfError(hr, error, "CreateInstance");
  757. AZASSERT(NULL != pOperation);
  758. //
  759. // this QI will also secure the object
  760. //
  761. hr = pOperation->QueryInterface(&srpObject);
  762. _JumpIfError(hr, error, "CAzOperation::QueryInterface(IUknown**)");
  763. hr = pOperation->_Init(hOwnerApp, hObject);
  764. _JumpIfError(hr, error, "Operation->_Init");
  765. break;
  766. case ENUM_AZ_TASK:
  767. hr = CComObject<CAzTask>::CreateInstance(&pTask);
  768. _JumpIfError(hr, error, "CreateInstance");
  769. AZASSERT(NULL != pTask);
  770. //
  771. // this QI will also secure the object
  772. //
  773. hr = pTask->QueryInterface(&srpObject);
  774. _JumpIfError(hr, error, "CAzTask::QueryInterface(IUknown**)");
  775. hr = pTask->_Init(hOwnerApp, hObject);
  776. _JumpIfError(hr, error, "Task->_Init");
  777. break;
  778. case ENUM_AZ_SCOPE:
  779. hr = CComObject<CAzScope>::CreateInstance(&pScope);
  780. _JumpIfError(hr, error, "CreateInstance");
  781. AZASSERT(NULL != pScope);
  782. //
  783. // this QI will also secure the object
  784. //
  785. hr = pScope->QueryInterface(&srpObject);
  786. _JumpIfError(hr, error, "CAzScope::QueryInterface(IUknown**)");
  787. hr = pScope->_Init(hOwnerApp, hObject);
  788. _JumpIfError(hr, error, "Scope->_Init");
  789. break;
  790. case ENUM_AZ_ROLE:
  791. hr = CComObject<CAzRole>::CreateInstance(&pRole);
  792. _JumpIfError(hr, error, "CreateInstance");
  793. AZASSERT(NULL != pRole);
  794. //
  795. // this QI will also secure the object
  796. //
  797. hr = pRole->QueryInterface(&srpObject);
  798. _JumpIfError(hr, error, "CAzRole::QueryInterface(IUknown**)");
  799. hr = pRole->_Init(hOwnerApp, hObject);
  800. _JumpIfError(hr, error, "Role->_Init");
  801. break;
  802. case ENUM_AZ_APPLICATIONS:
  803. hr = CComObject<CAzApplications>::CreateInstance(&pApps);
  804. _JumpIfError(hr, error, "CreateInstance");
  805. AZASSERT(NULL != pApps);
  806. //
  807. // this QI will also secure the object
  808. //
  809. hr = pApps->QueryInterface(&srpObject);
  810. _JumpIfError(hr, error, "CAzApplications::QueryInterface(IUknown**)");
  811. hr = pApps->_Init(pvarReserved, hObject);
  812. _JumpIfError(hr, error, "Apps->_Init");
  813. break;
  814. case ENUM_AZ_GROUPS:
  815. hr = CComObject<CAzApplicationGroups>::CreateInstance(&pGroups);
  816. _JumpIfError(hr, error, "CreateInstance");
  817. AZASSERT(NULL != pGroups);
  818. //
  819. // this QI will also secure the object
  820. //
  821. hr = pGroups->QueryInterface(&srpObject);
  822. _JumpIfError(hr, error, "CAzApplicationGroups::QueryInterface(IUknown**)");
  823. hr = pGroups->_Init(hOwnerApp, pvarReserved, hObject);
  824. _JumpIfError(hr, error, "Groups->_Init");
  825. break;
  826. case ENUM_AZ_OPERATIONS:
  827. hr = CComObject<CAzOperations>::CreateInstance(&pOperations);
  828. _JumpIfError(hr, error, "CreateInstance");
  829. AZASSERT(NULL != pOperations);
  830. //
  831. // this QI will also secure the object
  832. //
  833. hr = pOperations->QueryInterface(&srpObject);
  834. _JumpIfError(hr, error, "CAzOperations::QueryInterface(IUknown**)");
  835. hr = pOperations->_Init(hOwnerApp, pvarReserved, hObject);
  836. _JumpIfError(hr, error, "Operations->_Init");
  837. break;
  838. case ENUM_AZ_TASKS:
  839. hr = CComObject<CAzTasks>::CreateInstance(&pTasks);
  840. _JumpIfError(hr, error, "CreateInstance");
  841. AZASSERT(NULL != pTasks);
  842. //
  843. // this QI will also secure the object
  844. //
  845. hr = pTasks->QueryInterface(&srpObject);
  846. _JumpIfError(hr, error, "CAzTasks::QueryInterface(IUknown**)");
  847. hr = pTasks->_Init(hOwnerApp, pvarReserved, hObject);
  848. _JumpIfError(hr, error, "Tasks->_Init");
  849. break;
  850. case ENUM_AZ_SCOPES:
  851. hr = CComObject<CAzScopes>::CreateInstance(&pScopes);
  852. _JumpIfError(hr, error, "CreateInstance");
  853. AZASSERT(NULL != pScopes);
  854. //
  855. // this QI will also secure the object
  856. //
  857. hr = pScopes->QueryInterface(&srpObject);
  858. _JumpIfError(hr, error, "CAzScopes::QueryInterface(IUknown**)");
  859. hr = pScopes->_Init(hOwnerApp, pvarReserved, hObject);
  860. _JumpIfError(hr, error, "Scopes->_Init");
  861. break;
  862. case ENUM_AZ_ROLES:
  863. hr = CComObject<CAzRoles>::CreateInstance(&pRoles);
  864. _JumpIfError(hr, error, "CreateInstance");
  865. AZASSERT(NULL != pRoles);
  866. //
  867. // this QI will also secure the object
  868. //
  869. hr = pRoles->QueryInterface(&srpObject);
  870. _JumpIfError(hr, error, "CAzRoles::QueryInterface(IUknown**)");
  871. hr = pRoles->_Init(hOwnerApp, pvarReserved, hObject);
  872. _JumpIfError(hr, error, "Roles->_Init");
  873. break;
  874. case ENUM_AZ_CLIENTCONTEXT:
  875. hr = CComObject<CAzClientContext>::CreateInstance(&pClient);
  876. _JumpIfError(hr, error, "CreateInstance");
  877. AZASSERT(NULL != pClient);
  878. //
  879. // this QI will also secure the object
  880. //
  881. hr = pClient->QueryInterface(&srpObject);
  882. _JumpIfError(hr, error, "CAzClientContext::QueryInterface(IUknown**)");
  883. hr = pClient->_Init(hOwnerApp, hObject, 0/*pvarReserved*/);
  884. _JumpIfError(hr, error, "ClientContext->_Init");
  885. break;
  886. default:
  887. AZASSERT(FALSE);
  888. hr = E_INVALIDARG;
  889. _JumpError(hr, error, "invalid object index");
  890. break;
  891. }
  892. //
  893. // Everything is fine. Let's hand it to the out parameter
  894. // Otherwise, the smart pointer will release its ref count automatically
  895. //
  896. *ppObject = srpObject.Detach();
  897. hr = S_OK;
  898. error:
  899. if ( bLockSet ) {
  900. AzpUnlockResource( &AzGlCloseApplication );
  901. }
  902. return hr;
  903. }
  904. /////////////////////////
  905. //myAzCreateObject
  906. /////////////////////////
  907. HRESULT
  908. myAzCreateObject(
  909. IN AZ_HANDLE hOwnerApp,
  910. IN DWORD dwOwnerAppSN,
  911. IN PFUNCAzCreate pfuncAzCreate,
  912. IN ENUM_AZ_OBJECT enumObject,
  913. IN AZ_HANDLE hParentObject,
  914. IN BSTR bstrObjectName,
  915. IN VARIANT varReserved,
  916. OUT IUnknown **ppObject)
  917. /*+++
  918. Description:
  919. a subroutine for any object creating a new child object by passing
  920. a name. For example IAzApplication::CreateOperation and
  921. IAzScope::CreateTask call this routine to create a new child object
  922. Arguments:
  923. hOwnerApp - the application that owns (directly or indirectly) this new object
  924. dwOwnerAppSN - The sequential number of the owner app.
  925. pfuncAzCreate - az core object creation function pointer
  926. enumObject - object type
  927. hParentObject - from where the new child object is created
  928. bstrObjectName - new child object name
  929. varReserved - reserved variable from callers
  930. ppObject - interface pointer of the new object for return
  931. Return:
  932. *ppObject must be Release by the caller
  933. ---*/
  934. {
  935. HRESULT hr;
  936. DWORD dwErr;
  937. AZ_HANDLE hObject = NULL;
  938. BOOL bLockSet = FALSE;
  939. AZASSERT(NULL != pfuncAzCreate);
  940. hr = HandleReserved( &varReserved );
  941. _JumpIfError(hr, error, "HandleReserved");
  942. //
  943. // Grab the close application lock so that close
  944. // application does not interfere
  945. //
  946. AzpLockResourceShared( &AzGlCloseApplication );
  947. bLockSet = TRUE;
  948. if (NULL == hParentObject)
  949. {
  950. hr = E_INVALIDARG;
  951. _JumpError(hr, error, "Null parent handle");
  952. }
  953. else if (!IsObjectUsable(hOwnerApp, dwOwnerAppSN))
  954. {
  955. hr = AZ_HR_FROM_WIN32(ERROR_INVALID_HANDLE);
  956. _JumpError(hr, error, "Owning application was closed.");
  957. }
  958. //
  959. // create a new object in core cache
  960. // ref count is incremented for hObject by core
  961. //
  962. dwErr = pfuncAzCreate(hParentObject, bstrObjectName, 0, &hObject);
  963. _JumpIfWinError(dwErr, &hr, error, "Az(object)Create");
  964. AZASSERT(NULL != hObject);
  965. //
  966. // create a COM object to return
  967. //
  968. hr = myAzNewObject(
  969. hOwnerApp,
  970. dwOwnerAppSN,
  971. enumObject,
  972. hObject,
  973. &varReserved,
  974. ppObject);
  975. _JumpIfError(hr, error, "myAzNewObject");
  976. //
  977. // az object destructor will free the handle
  978. //
  979. hObject = NULL;
  980. hr = S_OK;
  981. error:
  982. if (NULL != hObject)
  983. {
  984. AzCloseHandle(hObject, 0);
  985. }
  986. if ( bLockSet ) {
  987. AzpUnlockResource( &AzGlCloseApplication );
  988. }
  989. return hr;
  990. }
  991. /////////////////////////
  992. //myAzDeleteObject
  993. /////////////////////////
  994. HRESULT
  995. myAzDeleteObject(
  996. IN AZ_HANDLE hOwnerApp,
  997. IN DWORD dwOwnerAppSN,
  998. IN PFUNCAzDelete pfuncAzDelete,
  999. IN AZ_HANDLE hParent,
  1000. IN BSTR bstrObjectName,
  1001. IN VARIANT varReserved)
  1002. /*+++
  1003. Description:
  1004. delete a child object from az core by name
  1005. Arguments:
  1006. hOwnerApp - the handle of the owner app
  1007. dwOwnerAppSN - The sequential number of the owner app.
  1008. pfuncAzDelete - az core object delete function pointer
  1009. hParent - parent object handle from where the child lives
  1010. bstrObjectName - child object name
  1011. varReserved - reserved variant passed from the caller
  1012. Return:
  1013. ---*/
  1014. {
  1015. HRESULT hr;
  1016. DWORD dwErr;
  1017. BOOL bLockSet = FALSE;
  1018. AZASSERT(NULL != pfuncAzDelete);
  1019. hr = HandleReserved( &varReserved );
  1020. _JumpIfError(hr, error, "HandleReserved");
  1021. //
  1022. // grab the close application lock so that close application
  1023. // does not interfere
  1024. //
  1025. AzpLockResourceShared( &AzGlCloseApplication );
  1026. bLockSet = TRUE;
  1027. if (NULL == hParent)
  1028. {
  1029. hr = E_INVALIDARG;
  1030. _JumpError(hr, error, "Null parent handle");
  1031. }
  1032. else if (!IsObjectUsable(hOwnerApp, dwOwnerAppSN))
  1033. {
  1034. hr = AZ_HR_FROM_WIN32(ERROR_INVALID_HANDLE);
  1035. _JumpError(hr, error, "Owning application was closed.");
  1036. }
  1037. dwErr = pfuncAzDelete(
  1038. hParent,
  1039. bstrObjectName,
  1040. 0 );
  1041. _JumpIfWinError(dwErr, &hr, error, "Az(object)Delete");
  1042. hr = S_OK;
  1043. error:
  1044. if ( bLockSet ) {
  1045. AzpUnlockResource( &AzGlCloseApplication );
  1046. }
  1047. return hr;
  1048. }
  1049. /////////////////////////
  1050. //myAzOpenObject
  1051. /////////////////////////
  1052. HRESULT
  1053. myAzOpenObject(
  1054. IN AZ_HANDLE hOwnerApp,
  1055. IN DWORD dwOwnerAppSN,
  1056. IN PFUNCAzOpen pfuncAzOpen,
  1057. IN ENUM_AZ_OBJECT enumObject,
  1058. IN AZ_HANDLE hParentObject,
  1059. IN BSTR bstrObjectName,
  1060. IN VARIANT varReserved,
  1061. OUT IUnknown **ppObject)
  1062. /*+++
  1063. Description:
  1064. a subroutine for any object opening a new child object by passing
  1065. a name. For example IAzApplication::OpenOperation and
  1066. IAzScope::OpenTask call this routine to create a new child object
  1067. Arguments:
  1068. hOwnerApp - the application that owns (directly or indirectly) this new object
  1069. dwOwnerAppSN - The sequential number of the owner app.
  1070. pfuncAzOpen - az core object open function pointer
  1071. enumObject - object type
  1072. hParentObject - from where the child object lives
  1073. bstrObjectName - child object name
  1074. varReserved - reserved variable from callers
  1075. ppObject - interface pointer of the opened object for return
  1076. Return:
  1077. *ppObject must be Release by the caller
  1078. ---*/
  1079. {
  1080. HRESULT hr;
  1081. DWORD dwErr;
  1082. AZ_HANDLE hObject = NULL;
  1083. BOOL bLockSet = FALSE;
  1084. AZASSERT(NULL != pfuncAzOpen);
  1085. hr = HandleReserved( &varReserved );
  1086. _JumpIfError(hr, error, "HandleReserved");
  1087. //
  1088. // Grab the close application lock so that close
  1089. // application does not interfere
  1090. //
  1091. AzpLockResourceShared( &AzGlCloseApplication );
  1092. bLockSet = TRUE;
  1093. if (NULL == hParentObject)
  1094. {
  1095. hr = E_INVALIDARG;
  1096. _JumpError(hr, error, "Null parent handle");
  1097. }
  1098. else if (!IsObjectUsable(hOwnerApp, dwOwnerAppSN))
  1099. {
  1100. hr = AZ_HR_FROM_WIN32(ERROR_INVALID_HANDLE);
  1101. _JumpError(hr, error, "Owning application was closed.");
  1102. }
  1103. //open existing object
  1104. dwErr = pfuncAzOpen(hParentObject, bstrObjectName, 0, &hObject);
  1105. _JumpIfWinError(dwErr, &hr, error, "Az(object)Open");
  1106. AZASSERT(NULL != hObject);
  1107. hr = myAzNewObject(hOwnerApp, dwOwnerAppSN, enumObject, hObject, NULL, ppObject);
  1108. _JumpIfError(hr, error, "myAzNewObject");
  1109. // az object destructor will free the handle
  1110. hObject = NULL;
  1111. hr = S_OK;
  1112. error:
  1113. if (NULL != hObject)
  1114. {
  1115. AzCloseHandle(hObject, 0);
  1116. }
  1117. if ( bLockSet ) {
  1118. AzpUnlockResource( &AzGlCloseApplication );
  1119. }
  1120. return hr;
  1121. }
  1122. /////////////////////////
  1123. //myAzCloseObject
  1124. /////////////////////////
  1125. HRESULT
  1126. myAzCloseObject(
  1127. IN PFUNCAzClose pfuncAzClose,
  1128. IN AZ_HANDLE hParentObject,
  1129. IN BSTR bstrObjectName,
  1130. IN LONG lFlags
  1131. )
  1132. /*++
  1133. Description:
  1134. This routine is used to close any object from cache. For example,
  1135. to unload an AzApplication object from cache.
  1136. IAzAuthorizationStore::CloseApplication will call this routine for example.
  1137. Arguments:
  1138. pfuncAzClose - Az core object close function pointer
  1139. hParentObject - parent of the Clild object being closed
  1140. bstrObjectName - Name of the object being closed
  1141. varReserved - Reserved variable for callers
  1142. Return:
  1143. S_OK if the object was unloaded from the cache
  1144. --*/
  1145. {
  1146. HRESULT hr;
  1147. DWORD dwErr;
  1148. AZASSERT( pfuncAzClose != NULL );
  1149. //
  1150. // close the object
  1151. //
  1152. //
  1153. // Grab the close application lock so that no other routine
  1154. // interferes
  1155. //
  1156. AzpLockResourceExclusive( &AzGlCloseApplication );
  1157. dwErr = pfuncAzClose(hParentObject, bstrObjectName, lFlags);
  1158. AzpUnlockResource( &AzGlCloseApplication );
  1159. _JumpIfWinError( dwErr, &hr, error, "Az(object)Close");
  1160. hr = S_OK;
  1161. error:
  1162. return hr;
  1163. }
  1164. /////////////////////////
  1165. //myAzNextObject
  1166. /////////////////////////
  1167. HRESULT
  1168. myAzNextObject(
  1169. IN AZ_HANDLE hOwnerApp,
  1170. IN DWORD dwOwnerAppSN,
  1171. IN PFUNCAzEnum pfuncAzEnum,
  1172. IN OPTIONAL VARIANT *pvarReserved,
  1173. IN ENUM_AZ_OBJECT enumObject,
  1174. IN AZ_HANDLE hParent,
  1175. IN OUT PULONG plContext,
  1176. OUT IUnknown **ppObject)
  1177. /*+++
  1178. Description:
  1179. a sub-routine to enumerate object handles for collection interface
  1180. object initialization. all collection class _Init routines call this
  1181. subroutine
  1182. Arguments:
  1183. hOwnerApp - the application that owns (directly or indirectly) this new object
  1184. dwOwnerAppSN - The sequential number of the owner app.
  1185. pfuncAzEnum - az core object enumeration function pointer
  1186. pvarReserved - reserved variant passed from the caller
  1187. enumObject - object type
  1188. hParent - parent object handle
  1189. plContext - the context for core enumeration
  1190. ppObject - interface pointer of the opened object for return
  1191. Return:
  1192. *ppObject must be Release by the caller
  1193. ---*/
  1194. {
  1195. HRESULT hr;
  1196. AZ_HANDLE hObject = NULL;
  1197. DWORD dwErr;
  1198. AZASSERT(NULL != pfuncAzEnum);
  1199. hr = HandleReserved(pvarReserved );
  1200. _JumpIfError(hr, error, "HandleReserved");
  1201. //enum to next object
  1202. //
  1203. // Grab the CloseApplication lock to maintain order
  1204. //
  1205. AzpLockResourceShared( &AzGlCloseApplication );
  1206. dwErr = pfuncAzEnum(hParent, 0, plContext, &hObject);
  1207. AzpUnlockResource( &AzGlCloseApplication );
  1208. _JumpIfWinError(dwErr, &hr, error, "Az(object)Enum");
  1209. hr = myAzNewObject(hOwnerApp, dwOwnerAppSN, enumObject, hObject, NULL, ppObject);
  1210. _JumpIfError(hr, error, "myAzNewObject");
  1211. // az object destructor will free the handle
  1212. hObject = NULL;
  1213. hr = S_OK;
  1214. error:
  1215. if (NULL != hObject)
  1216. {
  1217. AzpLockResourceShared( &AzGlCloseApplication );
  1218. AzCloseHandle(hObject, 0);
  1219. AzpUnlockResource( &AzGlCloseApplication );
  1220. }
  1221. return hr;
  1222. }
  1223. HRESULT
  1224. myAzGetPropertyDataType(
  1225. IN LONG lPropId,
  1226. OUT ENUM_AZ_DATATYPE *pDataType)
  1227. /*+++
  1228. Description:
  1229. a routine to map property ID to a data type
  1230. Arguments:
  1231. lPropId - property ID
  1232. pDataType - pointer to hold data type
  1233. Return:
  1234. ---*/
  1235. {
  1236. HRESULT hr;
  1237. ENUM_AZ_DATATYPE dataType;
  1238. // check property ID and assign data type
  1239. switch (lPropId)
  1240. {
  1241. case AZ_PROP_NAME:
  1242. case AZ_PROP_DESCRIPTION:
  1243. case AZ_PROP_APPLICATION_DATA:
  1244. case AZ_PROP_APPLICATION_AUTHZ_INTERFACE_CLSID:
  1245. case AZ_PROP_APPLICATION_VERSION:
  1246. case AZ_PROP_TASK_BIZRULE:
  1247. case AZ_PROP_TASK_BIZRULE_LANGUAGE:
  1248. case AZ_PROP_TASK_BIZRULE_IMPORTED_PATH:
  1249. case AZ_PROP_GROUP_LDAP_QUERY:
  1250. case AZ_PROP_CLIENT_CONTEXT_USER_DN:
  1251. case AZ_PROP_CLIENT_CONTEXT_USER_SAM_COMPAT:
  1252. case AZ_PROP_CLIENT_CONTEXT_USER_DISPLAY:
  1253. case AZ_PROP_CLIENT_CONTEXT_USER_GUID:
  1254. case AZ_PROP_CLIENT_CONTEXT_USER_CANONICAL:
  1255. case AZ_PROP_CLIENT_CONTEXT_USER_UPN:
  1256. case AZ_PROP_CLIENT_CONTEXT_USER_DNS_SAM_COMPAT:
  1257. case AZ_PROP_AZSTORE_TARGET_MACHINE:
  1258. case AZ_PROP_CLIENT_CONTEXT_ROLE_FOR_ACCESS_CHECK:
  1259. dataType = ENUM_AZ_BSTR;
  1260. break;
  1261. case AZ_PROP_AZSTORE_DOMAIN_TIMEOUT:
  1262. case AZ_PROP_AZSTORE_SCRIPT_ENGINE_TIMEOUT:
  1263. case AZ_PROP_AZSTORE_MAX_SCRIPT_ENGINES:
  1264. case AZ_PROP_OPERATION_ID:
  1265. case AZ_PROP_GROUP_TYPE:
  1266. //case AZ_PROP_AZSTORE_MAJOR_VERSION: make it invisible to clients
  1267. //case AZ_PROP_AZSTORE_MINOR_VERSION: make it invisible to clients
  1268. dataType = ENUM_AZ_LONG;
  1269. break;
  1270. case AZ_PROP_TASK_OPERATIONS:
  1271. case AZ_PROP_TASK_TASKS:
  1272. case AZ_PROP_GROUP_APP_MEMBERS:
  1273. case AZ_PROP_GROUP_APP_NON_MEMBERS:
  1274. case AZ_PROP_ROLE_APP_MEMBERS:
  1275. case AZ_PROP_ROLE_OPERATIONS:
  1276. case AZ_PROP_ROLE_TASKS:
  1277. dataType = ENUM_AZ_BSTR_ARRAY;
  1278. break;
  1279. case AZ_PROP_GROUP_MEMBERS:
  1280. case AZ_PROP_GROUP_NON_MEMBERS:
  1281. case AZ_PROP_ROLE_MEMBERS:
  1282. case AZ_PROP_POLICY_ADMINS:
  1283. case AZ_PROP_POLICY_READERS:
  1284. case AZ_PROP_DELEGATED_POLICY_USERS:
  1285. case AZ_PROP_GROUP_MEMBERS_NAME:
  1286. case AZ_PROP_GROUP_NON_MEMBERS_NAME:
  1287. case AZ_PROP_ROLE_MEMBERS_NAME:
  1288. case AZ_PROP_POLICY_ADMINS_NAME:
  1289. case AZ_PROP_POLICY_READERS_NAME:
  1290. case AZ_PROP_DELEGATED_POLICY_USERS_NAME:
  1291. dataType = ENUM_AZ_SID_ARRAY;
  1292. break;
  1293. case AZ_PROP_TASK_IS_ROLE_DEFINITION:
  1294. case AZ_PROP_WRITABLE:
  1295. case AZ_PROP_APPLY_STORE_SACL:
  1296. case AZ_PROP_GENERATE_AUDITS:
  1297. case AZ_PROP_SCOPE_BIZRULES_WRITABLE:
  1298. case AZ_PROP_SCOPE_CAN_BE_DELEGATED:
  1299. case AZ_PROP_CHILD_CREATE:
  1300. dataType = ENUM_AZ_BOOL;
  1301. break;
  1302. default:
  1303. hr = E_INVALIDARG;
  1304. _JumpError(hr, error, "invalid property ID");
  1305. break;
  1306. }
  1307. *pDataType = dataType;
  1308. hr = S_OK;
  1309. error:
  1310. return hr;
  1311. }
  1312. /////////////////////////
  1313. //myAzGetProperty
  1314. /////////////////////////
  1315. HRESULT
  1316. myAzGetProperty(
  1317. IN AZ_HANDLE hOwnerApp,
  1318. IN DWORD dwOwnerAppSN,
  1319. IN AZ_HANDLE hObject,
  1320. IN LONG lPropId,
  1321. IN VARIANT varReserved,
  1322. OUT VARIANT *pvarProp)
  1323. /*+++
  1324. Description:
  1325. retrieve az core object property and convert property data into
  1326. variant for interface object
  1327. all object GetProperty eventually call this routine as well as individual
  1328. property
  1329. Arguments:
  1330. hOwnerApp - the application that owns (directly or indirectly) this new object
  1331. dwOwnerAppSN - The sequential number of the owner app.
  1332. hObject - az core object handle
  1333. lPropId - property ID
  1334. varReserved - reserved varaint passed in by caller
  1335. pvarProp - point to variant to hold returned property data
  1336. Return:
  1337. pvarProp should freed by VariantClear
  1338. ---*/
  1339. {
  1340. HRESULT hr;
  1341. DWORD dwErr;
  1342. PVOID pProp = NULL;
  1343. BSTR bstrProp;
  1344. VARIANT varProp;
  1345. VARIANT TempVariant;
  1346. AZ_STRING_ARRAY *pStringArray;
  1347. AZ_SID_ARRAY *pSidArray;
  1348. WCHAR *pwszSidOrName = NULL;
  1349. SAFEARRAYBOUND rgsaBound[1]; //one dimension array
  1350. SAFEARRAY *psaString = NULL;
  1351. long lArrayIndex[1]; //one dimension
  1352. DWORD i;
  1353. ENUM_AZ_DATATYPE dataType;
  1354. BOOL bConvertSidToName;
  1355. HANDLE hDS = NULL;
  1356. LONG lPersistPropID = lPropId;
  1357. BOOL bLockSet = FALSE;
  1358. VariantInit( &TempVariant );
  1359. VariantInit(&varProp);
  1360. if (NULL == pvarProp)
  1361. {
  1362. hr = E_POINTER;
  1363. _JumpError(hr, error, "Null pvarProp");
  1364. }
  1365. //init
  1366. VariantInit(pvarProp);
  1367. //
  1368. // grab the lock so that close application cannot interfere
  1369. //
  1370. AzpLockResourceShared( &AzGlCloseApplication );
  1371. bLockSet = TRUE;
  1372. if (NULL == hObject)
  1373. {
  1374. hr = E_INVALIDARG;
  1375. _JumpError(hr, error, "Null object handle");
  1376. }
  1377. else if (!IsObjectUsable(hOwnerApp, dwOwnerAppSN))
  1378. {
  1379. hr = AZ_HR_FROM_WIN32(ERROR_INVALID_HANDLE);
  1380. _JumpError(hr, error, "Owning application was closed.");
  1381. }
  1382. hr = HandleReserved( &varReserved );
  1383. _JumpIfError(hr, error, "HandleReserved");
  1384. // determine the type of data
  1385. hr = myAzGetPropertyDataType(lPropId, &dataType);
  1386. _JumpIfError(hr, error, "myAzGetPropertyDataType");
  1387. //
  1388. // When we receive request for the names for those properties
  1389. // that are persisted using SIDs, we simply map these name properties
  1390. // to their SID counterparties. This routines does the check and
  1391. // conversion if neede. In any case, the out parameter is always the
  1392. // SID property ID so that we don't have to modify any core functions.
  1393. //
  1394. bConvertSidToName = myNeedSidToNameConversion(lPropId, &lPersistPropID);
  1395. dwErr = AzGetProperty(
  1396. hObject,
  1397. lPersistPropID,
  1398. 0,
  1399. &pProp);
  1400. _JumpIfWinError(dwErr, &hr, error, "Az(object)GetProperty");
  1401. AZASSERT(NULL != pProp);
  1402. switch (dataType)
  1403. {
  1404. case ENUM_AZ_BSTR:
  1405. bstrProp = SysAllocString((WCHAR*)pProp);
  1406. _JumpIfOutOfMemory(&hr, error, bstrProp, "SysAllocString");
  1407. //for return
  1408. varProp.vt = VT_BSTR;
  1409. varProp.bstrVal = bstrProp;
  1410. break;
  1411. case ENUM_AZ_LONG:
  1412. //for return
  1413. varProp.vt = VT_I4;
  1414. varProp.lVal = *((LONG*)pProp);
  1415. break;
  1416. case ENUM_AZ_BOOL:
  1417. //for return
  1418. varProp.vt = VT_BOOL;
  1419. if (*((LONG*)pProp))
  1420. {
  1421. varProp.boolVal = VARIANT_TRUE;
  1422. }
  1423. else
  1424. {
  1425. varProp.boolVal = VARIANT_FALSE;
  1426. }
  1427. break;
  1428. case ENUM_AZ_SID_ARRAY:
  1429. pSidArray = (AZ_SID_ARRAY*)pProp;
  1430. rgsaBound[0].lLbound = 0; //array index from 0
  1431. rgsaBound[0].cElements = pSidArray->SidCount;
  1432. //create array descriptor
  1433. psaString = SafeArrayCreate(
  1434. VT_VARIANT, //base type of array element
  1435. 1, //count of bound, ie. one dimension
  1436. rgsaBound);
  1437. _JumpIfOutOfMemory(&hr, error, psaString, "SafeArrayCreate");
  1438. //init to 1st element
  1439. lArrayIndex[0] = 0;
  1440. if (bConvertSidToName)
  1441. {
  1442. dwErr = DsBind(NULL, NULL, &hDS);
  1443. if (NO_ERROR != dwErr && ERROR_NOT_ENOUGH_MEMORY != dwErr)
  1444. {
  1445. //
  1446. // we will quietly fail and give the user the NT4 style name
  1447. //
  1448. AzPrint((AZD_ALL, "Can't DS bind. Will just return non-UPN names\n"));
  1449. dwErr = NO_ERROR;
  1450. }
  1451. else if (ERROR_NOT_ENOUGH_MEMORY == dwErr)
  1452. {
  1453. hr = E_OUTOFMEMORY;
  1454. _JumpIfError(hr, error, "DsBind");
  1455. }
  1456. }
  1457. //loop to load and put strings
  1458. for (i = 0; i < pSidArray->SidCount; ++i)
  1459. {
  1460. BOOL bUseSid = !bConvertSidToName;
  1461. if (bConvertSidToName)
  1462. {
  1463. hr = mySidToName(hDS, pSidArray->Sids[i], &pwszSidOrName);
  1464. //
  1465. // for whatever reason we failed to get the name, then we will give SID
  1466. //
  1467. if ( FAILED(hr) )
  1468. {
  1469. bUseSid = TRUE;
  1470. hr = S_OK;
  1471. }
  1472. }
  1473. if (bUseSid && !ConvertSidToStringSid(pSidArray->Sids[i], &pwszSidOrName))
  1474. {
  1475. AZ_HRESULT_LASTERROR(&hr);
  1476. _JumpError(hr, error, "ConvertSidToStringSid");
  1477. }
  1478. //then, create an element in BSTR
  1479. bstrProp = SysAllocString(pwszSidOrName);
  1480. _JumpIfOutOfMemory(&hr, error, bstrProp, "SysAllocString");
  1481. //
  1482. // Fill in a temporary variant
  1483. //
  1484. VariantClear( &TempVariant );
  1485. V_VT(&TempVariant) = VT_BSTR;
  1486. V_BSTR(&TempVariant) = bstrProp;
  1487. //put into array
  1488. hr = SafeArrayPutElement(psaString, lArrayIndex, &TempVariant );
  1489. _JumpIfError(hr, error, "SafeArrayPutElement");
  1490. //adjust index for the next element in array
  1491. ++(lArrayIndex[0]);
  1492. //make sure memory is freed
  1493. AZASSERT(NULL != pwszSidOrName);
  1494. LocalFree(pwszSidOrName);
  1495. pwszSidOrName = NULL;
  1496. }
  1497. //for return
  1498. varProp.vt = VT_ARRAY | VT_VARIANT;
  1499. varProp.parray = psaString;
  1500. psaString = NULL;
  1501. break;
  1502. case ENUM_AZ_BSTR_ARRAY:
  1503. pStringArray = (AZ_STRING_ARRAY*)pProp;
  1504. rgsaBound[0].lLbound = 0; //array index from 0
  1505. rgsaBound[0].cElements = pStringArray->StringCount;
  1506. //create array descriptor
  1507. psaString = SafeArrayCreate(
  1508. VT_VARIANT, //base type of array element
  1509. 1, //count of bound, ie. one dimension
  1510. rgsaBound);
  1511. _JumpIfOutOfMemory(&hr, error, psaString, "SafeArrayCreate");
  1512. //init to 1st element
  1513. lArrayIndex[0] = 0;
  1514. //loop to load and put strings
  1515. for (i = 0; i < pStringArray->StringCount; ++i)
  1516. {
  1517. //1st, create an element in BSTR
  1518. bstrProp = SysAllocString(pStringArray->Strings[i]);
  1519. _JumpIfOutOfMemory(&hr, error, bstrProp, "SysAllocString");
  1520. //
  1521. // Fill in a temporary variant
  1522. //
  1523. VariantClear( &TempVariant );
  1524. V_VT(&TempVariant) = VT_BSTR;
  1525. V_BSTR(&TempVariant) = bstrProp;
  1526. //put into array
  1527. hr = SafeArrayPutElement(psaString, lArrayIndex, &TempVariant);
  1528. _JumpIfError(hr, error, "SafeArrayPutElement");
  1529. //adjust index for the next element in array
  1530. ++(lArrayIndex[0]);
  1531. }
  1532. //for return
  1533. varProp.vt = VT_ARRAY | VT_VARIANT;
  1534. varProp.parray = psaString;
  1535. psaString = NULL;
  1536. break;
  1537. default:
  1538. hr = E_INVALIDARG;
  1539. _JumpError(hr, error, "invalid data type index");
  1540. break;
  1541. }
  1542. //return
  1543. *pvarProp = varProp;
  1544. hr = S_OK;
  1545. error:
  1546. if (NULL != pProp)
  1547. {
  1548. AzFreeMemory(pProp);
  1549. }
  1550. if (NULL != pwszSidOrName)
  1551. {
  1552. LocalFree(pwszSidOrName);
  1553. }
  1554. if (NULL != psaString)
  1555. {
  1556. SafeArrayDestroy(psaString);
  1557. }
  1558. VariantClear( &TempVariant );
  1559. if (hDS != NULL)
  1560. {
  1561. DsUnBind(&hDS);
  1562. }
  1563. if ( bLockSet ) {
  1564. AzpUnlockResource( &AzGlCloseApplication );
  1565. }
  1566. return hr;
  1567. }
  1568. /////////////////////////
  1569. //myAzSetProperty
  1570. /////////////////////////
  1571. HRESULT
  1572. myAzSetProperty(
  1573. IN AZ_HANDLE hOwnerApp,
  1574. IN DWORD dwOwnerAppSN,
  1575. IN AZ_HANDLE hObject,
  1576. IN LONG lPropId,
  1577. IN VARIANT varReserved,
  1578. IN VARIANT *pvarProp)
  1579. /*+++
  1580. Description:
  1581. convert interface caller property data and set it to az core object
  1582. all object SetProperty methods call this routine as well as individual
  1583. property
  1584. Arguments:
  1585. hOwnerApp - The handle to the applicatio this hObject is owned.
  1586. dwOwnerAppSN - The sequential number of the owner app.
  1587. hObject - az core object handle
  1588. lPropId - property ID
  1589. varReserved - reserved variant passed from caller
  1590. pvarProp - variant property value
  1591. Return:
  1592. ---*/
  1593. {
  1594. HRESULT hr;
  1595. DWORD dwErr;
  1596. PVOID pProp;
  1597. VARIANT varProp;
  1598. ENUM_AZ_DATATYPE dataType;
  1599. LONG lBoolVal = 0;
  1600. ::VariantInit(&varProp);
  1601. //
  1602. // grab the lock so that close application cannot interfere
  1603. //
  1604. AzpLockResourceShared( &AzGlCloseApplication );
  1605. if (NULL == hObject)
  1606. {
  1607. hr = E_INVALIDARG;
  1608. _JumpError(hr, error, "Null object handle");
  1609. }
  1610. else if (!IsObjectUsable(hOwnerApp, dwOwnerAppSN))
  1611. {
  1612. hr = AZ_HR_FROM_WIN32(ERROR_INVALID_HANDLE);
  1613. _JumpError(hr, error, "Owning application was closed.");
  1614. }
  1615. if (NULL == pvarProp)
  1616. {
  1617. hr = E_POINTER;
  1618. _JumpError(hr, error, "Null pvarProp");
  1619. }
  1620. hr = HandleReserved( &varReserved );
  1621. _JumpIfError(hr, error, "HandleReserved");
  1622. // determine the type of data
  1623. hr = myAzGetPropertyDataType(lPropId, &dataType);
  1624. _JumpIfError(hr, error, "myAzGetPropertyDataType");
  1625. //pvarProp is from applications, use try/except for any violation params
  1626. __try
  1627. {
  1628. switch (dataType)
  1629. {
  1630. case ENUM_AZ_BSTR:
  1631. hr = VariantChangeType(&varProp, pvarProp, 0, VT_BSTR);
  1632. _JumpIfError(hr, error, "VariantChangeType");
  1633. //
  1634. // Prevent invalid characters being used.
  1635. //
  1636. hr = myVerifyBSTRData(varProp.bstrVal);
  1637. _JumpIfError(hr, error, "myVerifyBSTRData");
  1638. pProp = (PVOID)varProp.bstrVal;
  1639. break;
  1640. case ENUM_AZ_LONG:
  1641. hr = VariantChangeType(&varProp, pvarProp, 0, VT_UI4);
  1642. _JumpIfError(hr, error, "VariantChangeType");
  1643. pProp = (PVOID)&(varProp.ulVal);
  1644. break;
  1645. case ENUM_AZ_BOOL:
  1646. hr = VariantChangeType(&varProp, pvarProp, 0, VT_BOOL);
  1647. _JumpIfError(hr, error, "VariantChangeType");
  1648. lBoolVal = (varProp.boolVal == VARIANT_TRUE) ? 1 : 0;
  1649. pProp = (PVOID)&(lBoolVal);
  1650. break;
  1651. default:
  1652. hr = E_INVALIDARG;
  1653. _JumpError(hr, error, "invalid data type index");
  1654. break;
  1655. }
  1656. }
  1657. __except(EXCEPTION_EXECUTE_HANDLER)
  1658. {
  1659. hr = AZ_HRESULT(ERROR_INVALID_HANDLE);
  1660. _JumpError(hr, error, "VariantChangeType-exception");
  1661. }
  1662. // now real app properties
  1663. dwErr = AzSetProperty(
  1664. hObject,
  1665. lPropId,
  1666. 0,
  1667. pProp);
  1668. _JumpIfWinError(dwErr, &hr, error, "Az(object)SetProperty");
  1669. hr = S_OK;
  1670. error:
  1671. VariantClear(&varProp);
  1672. AzpUnlockResource( &AzGlCloseApplication );
  1673. return hr;
  1674. }
  1675. /////////////////////////
  1676. //myAzAddOrDeletePropertyItem
  1677. /////////////////////////
  1678. HRESULT
  1679. myAzAddOrDeletePropertyItem(
  1680. IN AZ_HANDLE hOwnerApp,
  1681. IN DWORD dwOwnerAppSN,
  1682. IN PFUNCAzAddPropertyItem pfuncAddPropertyItem,
  1683. IN PFUNCAzRemovePropertyItem pfuncRemovePropertyItem,
  1684. IN AZ_HANDLE hObject,
  1685. IN LONG lPropId,
  1686. IN VARIANT varReserved,
  1687. IN VARIANT *pvarProp)
  1688. /*+++
  1689. Description:
  1690. routine to convert variant property item from interface caller and
  1691. add or delete the item from az core object
  1692. Arguments:
  1693. hOwnerApp - the handle of the application that owns this object.
  1694. dwOwnerAppSN - The sequential number of the owner app.
  1695. pfuncAddPropertyItem - object core property item add function pointer
  1696. if NULL, pfuncRemovePropertyItem will be checked for deletion
  1697. pfuncRemovePropertyItem - object core property item deletion function
  1698. pointer, pfuncAddPropertyItem must be NULL if it is deletion
  1699. hObject - object handle from which property items live
  1700. lPropId - property ID
  1701. varReserved - reserved variant passed from caller
  1702. pvarProp - pointer to variant property value to be added/deleted
  1703. Return:
  1704. ---*/
  1705. {
  1706. HRESULT hr;
  1707. DWORD dwErr;
  1708. PVOID pProp;
  1709. PSID pSid = NULL;
  1710. VARIANT varProp;
  1711. ENUM_AZ_DATATYPE dataType;
  1712. BOOL fAdd = (NULL != pfuncAddPropertyItem);
  1713. LONG lPersistPropID = lPropId;
  1714. VariantInit(&varProp);
  1715. //
  1716. // grab the lock so that close application cannot interfere
  1717. //
  1718. AzpLockResourceShared( &AzGlCloseApplication );
  1719. if (NULL == hObject)
  1720. {
  1721. hr = E_INVALIDARG;
  1722. _JumpError(hr, error, "Null object handle");
  1723. }
  1724. else if (!IsObjectUsable(hOwnerApp, dwOwnerAppSN))
  1725. {
  1726. hr = AZ_HR_FROM_WIN32(ERROR_INVALID_HANDLE);
  1727. _JumpError(hr, error, "Owning application was closed.");
  1728. }
  1729. if (NULL == pvarProp)
  1730. {
  1731. hr = E_POINTER;
  1732. _JumpError(hr, error, "Null pvarProp");
  1733. }
  1734. if (!fAdd && NULL == pfuncRemovePropertyItem)
  1735. {
  1736. // must be delete
  1737. hr = E_INVALIDARG;
  1738. _JumpError(hr, error, "null function pinter");
  1739. }
  1740. hr = HandleReserved( &varReserved );
  1741. _JumpIfError(hr, error, "HandleReserved");
  1742. // determine the type of data
  1743. hr = myAzGetPropertyDataType(lPropId, &dataType);
  1744. _JumpIfError(hr, error, "myAzGetPropertyDataType");
  1745. //pvarProp is from applications, use try/except for any violation params
  1746. __try
  1747. {
  1748. //convert to bstr variant any way
  1749. hr = VariantChangeType(
  1750. &varProp,
  1751. pvarProp,
  1752. 0,
  1753. VT_BSTR);
  1754. _JumpIfError(hr, error, "VariantChangeType");
  1755. }
  1756. __except(EXCEPTION_EXECUTE_HANDLER)
  1757. {
  1758. hr = AZ_HRESULT(ERROR_INVALID_HANDLE);
  1759. _JumpError(hr, error, "VariantChangeType-exception");
  1760. }
  1761. switch (dataType)
  1762. {
  1763. case ENUM_AZ_BSTR_ARRAY:
  1764. //
  1765. // If we are adding, we need to check the validity of the BSTR
  1766. // to disallow out of range characters
  1767. //
  1768. if (fAdd)
  1769. {
  1770. hr = myVerifyBSTRData(varProp.bstrVal);
  1771. _JumpIfError(hr, error, "myVerifyBSTRData");
  1772. }
  1773. pProp = (PVOID)varProp.bstrVal;
  1774. break;
  1775. case ENUM_AZ_SID_ARRAY:
  1776. //
  1777. // Some properties are persisted as SID arrays, but
  1778. // we need to convert them to names
  1779. //
  1780. if (!myNeedSidToNameConversion(lPropId, &lPersistPropID))
  1781. {
  1782. //convert string sid to sid
  1783. if (!ConvertStringSidToSid(varProp.bstrVal, &pSid))
  1784. {
  1785. hr = AZ_HR_FROM_WIN32(GetLastError());
  1786. _JumpError(hr, error, "myUserNameToSid");
  1787. }
  1788. }
  1789. else
  1790. {
  1791. //
  1792. // we will assume it to be a account name
  1793. //
  1794. hr = myAccountNameToSid(varProp.bstrVal, &pSid);
  1795. _JumpIfError(hr, error, "myAccountNameToSid");
  1796. }
  1797. pProp = (PVOID)pSid;
  1798. break;
  1799. default:
  1800. hr = E_INVALIDARG;
  1801. _JumpError(hr, error, "invalid data type index");
  1802. break;
  1803. }
  1804. if (fAdd)
  1805. {
  1806. // now real app properties
  1807. dwErr = pfuncAddPropertyItem(
  1808. hObject,
  1809. lPersistPropID,
  1810. 0,
  1811. pProp);
  1812. _JumpIfWinError(dwErr, &hr, error, "Az(object)AddPropertyItem");
  1813. }
  1814. else
  1815. {
  1816. dwErr = pfuncRemovePropertyItem(
  1817. hObject,
  1818. lPersistPropID,
  1819. 0,
  1820. pProp);
  1821. _JumpIfWinError(dwErr, &hr, error, "Az(object)RemovePropertyItem");
  1822. }
  1823. hr = S_OK;
  1824. error:
  1825. VariantClear(&varProp);
  1826. if (NULL != pSid)
  1827. {
  1828. LocalFree(pSid);
  1829. }
  1830. AzpUnlockResource( &AzGlCloseApplication );
  1831. return hr;
  1832. }
  1833. /////////////////////////
  1834. //myAzAddPropertyItem
  1835. /////////////////////////
  1836. inline HRESULT
  1837. myAzAddPropertyItem(
  1838. IN AZ_HANDLE hOwnerApp,
  1839. IN DWORD dwOwnerAppSN,
  1840. IN AZ_HANDLE hObject,
  1841. IN LONG lPropId,
  1842. IN VARIANT varReserved,
  1843. IN VARIANT *pvarProp)
  1844. /*+++
  1845. Description:
  1846. wraper api for property item add
  1847. Arguments:
  1848. hOwnerApp - the handle of the application that owns this object.
  1849. dwOwnerAppSN - The sequential number of the owner app.
  1850. hObject - object handle from which property items live
  1851. lPropId - property ID
  1852. varReserved - reserved variant passed from caller
  1853. pvarProp - pointer to variant property value to be added
  1854. Return:
  1855. ---*/
  1856. {
  1857. return myAzAddOrDeletePropertyItem(
  1858. hOwnerApp,
  1859. dwOwnerAppSN,
  1860. AzAddPropertyItem,
  1861. NULL, // not delete
  1862. hObject,
  1863. lPropId,
  1864. varReserved,
  1865. pvarProp);
  1866. }
  1867. /////////////////////////
  1868. //myAzDeletePropertyItem
  1869. /////////////////////////
  1870. inline HRESULT
  1871. myAzDeletePropertyItem(
  1872. IN AZ_HANDLE hOwnerApp,
  1873. IN DWORD dwOwnerAppSN,
  1874. IN AZ_HANDLE hObject,
  1875. IN LONG lPropId,
  1876. IN VARIANT varReserved,
  1877. IN VARIANT *pvarProp)
  1878. /*+++
  1879. Description:
  1880. wraper api for property item deletion
  1881. Arguments:
  1882. hOwnerApp - the handle of the application that owns this object.
  1883. dwOwnerAppSN - The sequential number of the owner app.
  1884. hObject - object handle from which property items live
  1885. lPropId - property ID
  1886. varReserved - reserved variant passed from caller
  1887. pvarProp - pointer to variant property value to be deleted
  1888. Return:
  1889. ---*/
  1890. {
  1891. return myAzAddOrDeletePropertyItem(
  1892. hOwnerApp,
  1893. dwOwnerAppSN,
  1894. NULL, // not add
  1895. AzRemovePropertyItem,
  1896. hObject,
  1897. lPropId,
  1898. varReserved,
  1899. pvarProp);
  1900. }
  1901. /////////////////////////
  1902. //myAzAddPropertyItemBstr
  1903. /////////////////////////
  1904. HRESULT
  1905. myAzAddPropertyItemBstr(
  1906. IN AZ_HANDLE hOwnerApp,
  1907. IN DWORD dwOwnerAppSN,
  1908. IN AZ_HANDLE hObject,
  1909. IN LONG lPropId,
  1910. IN VARIANT varReserved,
  1911. IN BSTR bstrItem)
  1912. /*+++
  1913. Description:
  1914. wraper api for BSTR property item add
  1915. Arguments:
  1916. hOwnerApp - the handle of the application that owns this object.
  1917. dwOwnerAppSN - The sequential number of the owner app.
  1918. hObject - object handle from which property items live
  1919. lPropId - property ID
  1920. varReserved - reserved variant passed from caller
  1921. bstrItem - BSTR property value to be added
  1922. Return:
  1923. ---*/
  1924. {
  1925. VARIANT varItem;
  1926. VariantInit(&varItem);
  1927. V_VT(&varItem) = VT_BSTR;
  1928. V_BSTR(&varItem) = bstrItem;
  1929. return myAzAddPropertyItem(
  1930. hOwnerApp,
  1931. dwOwnerAppSN,
  1932. hObject,
  1933. lPropId,
  1934. varReserved,
  1935. &varItem);
  1936. }
  1937. /////////////////////////
  1938. //myAzDeletePropertyItemBstr
  1939. /////////////////////////
  1940. HRESULT
  1941. myAzDeletePropertyItemBstr(
  1942. IN AZ_HANDLE hOwnerApp,
  1943. IN DWORD dwOwnerAppSN,
  1944. IN AZ_HANDLE hObject,
  1945. IN LONG lPropId,
  1946. IN VARIANT varReserved,
  1947. IN BSTR bstrItem)
  1948. /*+++
  1949. Description:
  1950. wraper api for BSTR property item deletion
  1951. Arguments:
  1952. hOwnerApp - the handle of the application that owns this object.
  1953. dwOwnerAppSN - The sequential number of the owner app.
  1954. hObject - object handle from which property items live
  1955. lPropId - property ID
  1956. varReserved - reserved variant passed from caller
  1957. bstrItem - BSTR property value to be deleted
  1958. Return:
  1959. ---*/
  1960. {
  1961. VARIANT varItem;
  1962. VariantInit(&varItem);
  1963. V_VT(&varItem) = VT_BSTR;
  1964. V_BSTR(&varItem) = bstrItem;
  1965. return myAzDeletePropertyItem(
  1966. hOwnerApp,
  1967. dwOwnerAppSN,
  1968. hObject,
  1969. lPropId,
  1970. varReserved,
  1971. &varItem);
  1972. }
  1973. HRESULT
  1974. myAzAddOrDeleteUser(
  1975. IN AZ_HANDLE hOwnerApp,
  1976. IN DWORD dwOwnerAppSN,
  1977. IN AZ_HANDLE hObject,
  1978. IN ULONG lPropId,
  1979. IN VARIANT varReserved,
  1980. IN BSTR bstrUser,
  1981. IN BOOL fAdd)
  1982. /*+++
  1983. Description:
  1984. This routine is a wrapper api to modify (add/remove) properties of policy
  1985. readers and policy admins SID list.
  1986. This routine has a special quick check on ACL support from the store. If
  1987. underlying store does not support ACL (e.g., FAT system), this API will
  1988. block the attempt to add or delete policy admins/readers.
  1989. Arguments:
  1990. hOwnerApp - the handle of the application that owns this object.
  1991. dwOwnerAppSN - The sequential number of the owner app.
  1992. hObject - object handle from which property items live
  1993. lPropId - property ID
  1994. varReserved - reserved variant passed from caller
  1995. bstrUser - user SID in BSTR
  1996. fAdd - TRUE if add & FALSE if delete
  1997. Return:
  1998. ---*/
  1999. {
  2000. HRESULT hr;
  2001. if (fAdd)
  2002. {
  2003. hr = myAzAddPropertyItemBstr(
  2004. hOwnerApp,
  2005. dwOwnerAppSN,
  2006. hObject,
  2007. lPropId,
  2008. varReserved,
  2009. bstrUser);
  2010. _JumpIfError(hr, error, "myAzAddPropertyItemBstr");
  2011. }
  2012. else
  2013. {
  2014. hr = myAzDeletePropertyItemBstr(
  2015. hOwnerApp,
  2016. dwOwnerAppSN,
  2017. hObject,
  2018. lPropId,
  2019. varReserved,
  2020. bstrUser);
  2021. _JumpIfError(hr, error, "myAzDeletePropertyItemBstr");
  2022. }
  2023. hr = S_OK;
  2024. error:
  2025. return hr;
  2026. }
  2027. HRESULT
  2028. myGetBstrProperty(
  2029. IN AZ_HANDLE hOwnerApp,
  2030. IN DWORD dwOwnerAppSN,
  2031. IN AZ_HANDLE hObject,
  2032. IN LONG lPropId,
  2033. OUT BSTR *pbstrProp)
  2034. /*+++
  2035. Description:
  2036. wraper routine to get any BSTR property
  2037. Arguments:
  2038. hOwnerApp - the handle of the application that owns this object.
  2039. dwOwnerAppSN - The sequential number of the owner app.
  2040. hObject - az core object handle
  2041. lPropId - property ID
  2042. pbstrProp - point to BSTR to hold returned property data
  2043. Return:
  2044. pbstrProp should freed by SysFreeString
  2045. ---*/
  2046. {
  2047. HRESULT hr;
  2048. DWORD dwErr;
  2049. PVOID pProp = NULL;
  2050. BOOL bLockSet = FALSE;
  2051. if (NULL == pbstrProp)
  2052. {
  2053. hr = E_INVALIDARG;
  2054. _JumpError(hr, error, "invalid null parameter");
  2055. }
  2056. //init
  2057. *pbstrProp = NULL;
  2058. //
  2059. // Grab the close application lock so that close application
  2060. // does not interfere
  2061. //
  2062. AzpLockResourceShared( &AzGlCloseApplication );
  2063. bLockSet = TRUE;
  2064. if (!IsObjectUsable(hOwnerApp, dwOwnerAppSN))
  2065. {
  2066. hr = AZ_HR_FROM_WIN32(ERROR_INVALID_HANDLE);
  2067. _JumpError(hr, error, "Owning application was closed.");
  2068. }
  2069. dwErr = AzGetProperty(
  2070. hObject,
  2071. lPropId,
  2072. 0,
  2073. (PVOID*)&pProp);
  2074. _JumpIfWinError(dwErr, &hr, error, "(object)GetProperty");
  2075. AZASSERT(NULL != pProp);
  2076. *pbstrProp = SysAllocString((WCHAR*)pProp);
  2077. _JumpIfOutOfMemory(&hr, error, *pbstrProp, "SysAllocString");
  2078. hr = S_OK;
  2079. error:
  2080. if (NULL != pProp)
  2081. {
  2082. AzFreeMemory(pProp );
  2083. }
  2084. if ( bLockSet ) {
  2085. AzpUnlockResource( &AzGlCloseApplication );
  2086. }
  2087. return hr;
  2088. }
  2089. HRESULT
  2090. mySetBstrProperty(
  2091. IN AZ_HANDLE hOwnerApp,
  2092. IN DWORD dwOwnerAppSN,
  2093. IN AZ_HANDLE hObject,
  2094. IN LONG lPropId,
  2095. IN BSTR bstrProp)
  2096. /*+++
  2097. Description:
  2098. warper routine to set BSTR property
  2099. Arguments:
  2100. hOwnerApp - the handle of the application that owns this object.
  2101. dwOwnerAppSN - The sequential number of the owner app.
  2102. hObject - az core object handle
  2103. lPropId - property ID
  2104. bstrProp - BSTR property data
  2105. Return:
  2106. ---*/
  2107. {
  2108. HRESULT hr;
  2109. DWORD dwErr;
  2110. //
  2111. // Lock the close application lock so that close
  2112. // application does not interfere
  2113. //
  2114. AzpLockResourceShared( &AzGlCloseApplication );
  2115. if (!IsObjectUsable(hOwnerApp, dwOwnerAppSN))
  2116. {
  2117. hr = AZ_HR_FROM_WIN32(ERROR_INVALID_HANDLE);
  2118. _JumpError(hr, error, "Owning application was closed.");
  2119. }
  2120. hr = myVerifyBSTRData(bstrProp);
  2121. _JumpIfError(hr, error, "myVerifyBSTRData");
  2122. dwErr = AzSetProperty(
  2123. hObject,
  2124. lPropId,
  2125. 0,
  2126. (PVOID)bstrProp); // bstr is wchar * at nominal address
  2127. _JumpIfWinError(dwErr, &hr, error, "(object)SetProperty");
  2128. hr = S_OK;
  2129. error:
  2130. AzpUnlockResource( &AzGlCloseApplication );
  2131. return hr;
  2132. }
  2133. HRESULT
  2134. myGetLongProperty(
  2135. IN AZ_HANDLE hOwnerApp,
  2136. IN DWORD dwOwnerAppSN,
  2137. IN AZ_HANDLE hObject,
  2138. IN LONG lPropId,
  2139. OUT LONG *plProp)
  2140. /*+++
  2141. Description:
  2142. wraper routine to get any LONG property
  2143. Arguments:
  2144. hOwnerApp - the handle of the application that owns this object.
  2145. dwOwnerAppSN - The sequential number of the owner app.
  2146. hObject - az core object handle
  2147. lPropId - property ID
  2148. plProp - point to LONG to hold returned property data
  2149. Return:
  2150. ---*/
  2151. {
  2152. HRESULT hr;
  2153. DWORD dwErr;
  2154. PVOID pProp = NULL;
  2155. BOOL bLockSet = FALSE;
  2156. if (NULL == plProp)
  2157. {
  2158. hr = E_INVALIDARG;
  2159. _JumpError(hr, error, "invalid null parameter");
  2160. }
  2161. // init
  2162. *plProp = 0;
  2163. //
  2164. // grab the lock so that close application does not interfere
  2165. //
  2166. AzpLockResourceShared( &AzGlCloseApplication );
  2167. bLockSet = TRUE;
  2168. if (!IsObjectUsable(hOwnerApp, dwOwnerAppSN))
  2169. {
  2170. hr = AZ_HR_FROM_WIN32(ERROR_INVALID_HANDLE);
  2171. _JumpError(hr, error, "Owning application was closed.");
  2172. }
  2173. // get data into buffer at temporary pointer
  2174. dwErr = AzGetProperty(
  2175. hObject,
  2176. lPropId,
  2177. 0,
  2178. (PVOID*)&pProp);
  2179. _JumpIfWinError(dwErr, &hr, error, "(object)GetProperty");
  2180. AZASSERT(NULL != pProp);
  2181. *plProp = *((LONG *)pProp);
  2182. hr = S_OK;
  2183. error:
  2184. if (NULL != pProp)
  2185. {
  2186. AzFreeMemory(pProp);
  2187. }
  2188. if ( bLockSet ) {
  2189. AzpUnlockResource( &AzGlCloseApplication );
  2190. }
  2191. return hr;
  2192. }
  2193. HRESULT
  2194. mySetLongProperty(
  2195. IN AZ_HANDLE hOwnerApp,
  2196. IN DWORD dwOwnerAppSN,
  2197. IN AZ_HANDLE hObject,
  2198. IN LONG lPropId,
  2199. IN LONG lProp)
  2200. /*+++
  2201. Description:
  2202. warper routine to set LONG property
  2203. Arguments:
  2204. hOwnerApp - the handle of the application that owns this object.
  2205. dwOwnerAppSN - The sequential number of the owner app.
  2206. hObject - az core object handle
  2207. lPropId - property ID
  2208. lProp - LONG property data
  2209. Return:
  2210. ---*/
  2211. {
  2212. HRESULT hr;
  2213. DWORD dwErr;
  2214. BOOL bLockSet = FALSE;
  2215. //
  2216. // Grab the lock so that close application cannot interfere
  2217. //
  2218. AzpLockResourceShared( &AzGlCloseApplication );
  2219. bLockSet = TRUE;
  2220. if (!IsObjectUsable(hOwnerApp, dwOwnerAppSN))
  2221. {
  2222. hr = AZ_HR_FROM_WIN32(ERROR_INVALID_HANDLE);
  2223. _JumpError(hr, error, "Owning application was closed.");
  2224. }
  2225. dwErr = AzSetProperty(
  2226. hObject,
  2227. lPropId,
  2228. 0,
  2229. (PVOID)&lProp);
  2230. _JumpIfWinError(dwErr, &hr, error, "(object)SetProperty");
  2231. hr = S_OK;
  2232. error:
  2233. if ( bLockSet ) {
  2234. AzpUnlockResource( &AzGlCloseApplication );
  2235. }
  2236. return hr;
  2237. }
  2238. HRESULT
  2239. myGetBoolProperty(
  2240. IN AZ_HANDLE hOwnerApp,
  2241. IN DWORD dwOwnerAppSN,
  2242. IN AZ_HANDLE hObject,
  2243. IN LONG lPropId,
  2244. OUT BOOL *plProp)
  2245. /*+++
  2246. Description:
  2247. wraper routine to get any BOOL property
  2248. Arguments:
  2249. hOwnerApp - the handle of the application that owns this object.
  2250. dwOwnerAppSN - The sequential number of the owner app.
  2251. hObject - az core object handle
  2252. lPropId - property ID
  2253. plProp - point to BOOL to hold returned property data
  2254. Return:
  2255. ---*/
  2256. {
  2257. HRESULT hr;
  2258. DWORD dwErr;
  2259. PVOID pProp = NULL;
  2260. BOOL bLockSet = FALSE;
  2261. if (NULL == plProp)
  2262. {
  2263. hr = E_INVALIDARG;
  2264. _JumpError(hr, error, "invalid null parameter");
  2265. }
  2266. // init
  2267. *plProp = FALSE;
  2268. //
  2269. // Grab the close application lock so that close
  2270. // application does not interfere
  2271. //
  2272. AzpLockResourceShared( &AzGlCloseApplication );
  2273. bLockSet = TRUE;
  2274. if (!IsObjectUsable(hOwnerApp, dwOwnerAppSN))
  2275. {
  2276. hr = AZ_HR_FROM_WIN32(ERROR_INVALID_HANDLE);
  2277. _JumpError(hr, error, "Owning application was closed.");
  2278. }
  2279. // get data into buffer at temporary pointer
  2280. dwErr = AzGetProperty(
  2281. hObject,
  2282. lPropId,
  2283. 0,
  2284. (PVOID*)&pProp);
  2285. _JumpIfWinError(dwErr, &hr, error, "(object)GetProperty");
  2286. AZASSERT(NULL != pProp);
  2287. *plProp = *((BOOL *)pProp);
  2288. hr = S_OK;
  2289. error:
  2290. if (NULL != pProp)
  2291. {
  2292. AzFreeMemory(pProp);
  2293. }
  2294. if ( bLockSet ) {
  2295. AzpUnlockResource( &AzGlCloseApplication );
  2296. }
  2297. return hr;
  2298. }
  2299. HRESULT
  2300. mySetBoolProperty(
  2301. IN AZ_HANDLE hOwnerApp,
  2302. IN DWORD dwOwnerAppSN,
  2303. IN AZ_HANDLE hObject,
  2304. IN LONG lPropId,
  2305. IN BOOL fProp)
  2306. /*+++
  2307. Description:
  2308. warper routine to set BOOL property
  2309. Arguments:
  2310. hOwnerApp - the handle of the application that owns this object.
  2311. dwOwnerAppSN - The sequential number of the owner app.
  2312. hObject - az core object handle
  2313. lPropId - property ID
  2314. fProp - BOOL property data
  2315. Return:
  2316. ---*/
  2317. {
  2318. HRESULT hr;
  2319. DWORD dwErr;
  2320. BOOL bLockSet = FALSE;
  2321. //
  2322. // Grab the close application lock so that close
  2323. // application cannot interfere
  2324. //
  2325. AzpLockResourceShared( &AzGlCloseApplication );
  2326. bLockSet = TRUE;
  2327. if (!IsObjectUsable(hOwnerApp, dwOwnerAppSN))
  2328. {
  2329. hr = AZ_HR_FROM_WIN32(ERROR_INVALID_HANDLE);
  2330. _JumpError(hr, error, "Owning application was closed.");
  2331. }
  2332. dwErr = AzSetProperty(
  2333. hObject,
  2334. lPropId,
  2335. 0,
  2336. (PVOID)&fProp);
  2337. _JumpIfWinError(dwErr, &hr, error, "(object)SetProperty");
  2338. hr = S_OK;
  2339. error:
  2340. if ( bLockSet ) {
  2341. AzpUnlockResource( &AzGlCloseApplication );
  2342. }
  2343. return hr;
  2344. }
  2345. // object implementation starts
  2346. /////////////////////////
  2347. //CAzAuthorizationStore
  2348. /////////////////////////
  2349. CAzAuthorizationStore::CAzAuthorizationStore()
  2350. {
  2351. //init
  2352. __try {
  2353. InitializeCriticalSection(&m_cs);
  2354. } __except(EXCEPTION_EXECUTE_HANDLER) {}
  2355. m_hAuthorizationStore = NULL;
  2356. }
  2357. CAzAuthorizationStore::~CAzAuthorizationStore()
  2358. {
  2359. if (NULL != m_hAuthorizationStore)
  2360. {
  2361. //
  2362. // grab the CloseApplication lock to maintain order
  2363. //
  2364. AzpLockResourceShared( &AzGlCloseApplication );
  2365. AzCloseHandle(m_hAuthorizationStore, 0);
  2366. AzpUnlockResource( &AzGlCloseApplication );
  2367. }
  2368. DeleteCriticalSection(&m_cs);
  2369. }
  2370. HRESULT
  2371. CAzAuthorizationStore::get_Description(
  2372. OUT BSTR __RPC_FAR *pbstrDescription)
  2373. {
  2374. return myGetBstrProperty(
  2375. NULL, // no app owns this object
  2376. 0, // doesn't matter if no app owns it
  2377. m_hAuthorizationStore,
  2378. AZ_PROP_DESCRIPTION,
  2379. pbstrDescription);
  2380. }
  2381. HRESULT
  2382. CAzAuthorizationStore::put_Description(
  2383. IN BSTR bstrDescription)
  2384. {
  2385. return mySetBstrProperty(
  2386. NULL, // no app owns this object
  2387. 0, // doesn't matter if no app owns it
  2388. m_hAuthorizationStore,
  2389. AZ_PROP_DESCRIPTION,
  2390. bstrDescription);
  2391. }
  2392. HRESULT
  2393. CAzAuthorizationStore::get_ApplicationData(
  2394. OUT BSTR __RPC_FAR *pbstrApplicationData)
  2395. {
  2396. return myGetBstrProperty(
  2397. NULL, // no app owns this object
  2398. 0, // doesn't matter if no app owns it
  2399. m_hAuthorizationStore,
  2400. AZ_PROP_APPLICATION_DATA,
  2401. pbstrApplicationData);
  2402. }
  2403. HRESULT
  2404. CAzAuthorizationStore::put_ApplicationData(
  2405. IN BSTR bstrApplicationData)
  2406. {
  2407. return mySetBstrProperty(
  2408. NULL, // no app owns this object
  2409. 0, // doesn't matter if no app owns it
  2410. m_hAuthorizationStore,
  2411. AZ_PROP_APPLICATION_DATA,
  2412. bstrApplicationData);
  2413. }
  2414. HRESULT
  2415. CAzAuthorizationStore::get_DomainTimeout(
  2416. OUT LONG *plProp
  2417. )
  2418. {
  2419. return myGetLongProperty(
  2420. NULL, // no app owns this object
  2421. 0, // doesn't matter if no app owns it
  2422. m_hAuthorizationStore,
  2423. AZ_PROP_AZSTORE_DOMAIN_TIMEOUT,
  2424. plProp);
  2425. }
  2426. HRESULT
  2427. CAzAuthorizationStore::put_DomainTimeout(
  2428. IN LONG lProp
  2429. )
  2430. {
  2431. return mySetLongProperty(
  2432. NULL, // no app owns this object
  2433. 0, // doesn't matter if no app owns it
  2434. m_hAuthorizationStore,
  2435. AZ_PROP_AZSTORE_DOMAIN_TIMEOUT,
  2436. lProp);
  2437. }
  2438. HRESULT
  2439. CAzAuthorizationStore::get_ScriptEngineTimeout(
  2440. OUT LONG *plProp
  2441. )
  2442. {
  2443. return myGetLongProperty(
  2444. NULL, // no app owns this object
  2445. 0, // doesn't matter if no app owns it
  2446. m_hAuthorizationStore,
  2447. AZ_PROP_AZSTORE_SCRIPT_ENGINE_TIMEOUT,
  2448. plProp);
  2449. }
  2450. HRESULT
  2451. CAzAuthorizationStore::put_ScriptEngineTimeout(
  2452. IN LONG lProp
  2453. )
  2454. {
  2455. return mySetLongProperty(
  2456. NULL, // no app owns this object
  2457. 0, // doesn't matter if no app owns it
  2458. m_hAuthorizationStore,
  2459. AZ_PROP_AZSTORE_SCRIPT_ENGINE_TIMEOUT,
  2460. lProp);
  2461. }
  2462. HRESULT
  2463. CAzAuthorizationStore::get_MaxScriptEngines(
  2464. OUT LONG *plProp
  2465. )
  2466. {
  2467. return myGetLongProperty(
  2468. NULL, // no app owns this object
  2469. 0, // doesn't matter if no app owns it
  2470. m_hAuthorizationStore,
  2471. AZ_PROP_AZSTORE_MAX_SCRIPT_ENGINES,
  2472. plProp);
  2473. }
  2474. HRESULT
  2475. CAzAuthorizationStore::put_MaxScriptEngines(
  2476. IN LONG lProp
  2477. )
  2478. {
  2479. return mySetLongProperty(
  2480. NULL, // no app owns this object
  2481. 0, // doesn't matter if no app owns it
  2482. m_hAuthorizationStore,
  2483. AZ_PROP_AZSTORE_MAX_SCRIPT_ENGINES,
  2484. lProp);
  2485. }
  2486. HRESULT
  2487. CAzAuthorizationStore::get_GenerateAudits(
  2488. OUT BOOL * pbProp
  2489. )
  2490. {
  2491. return myGetBoolProperty(
  2492. NULL, // no app owns this object
  2493. 0, // doesn't matter if no app owns it
  2494. m_hAuthorizationStore,
  2495. AZ_PROP_GENERATE_AUDITS,
  2496. pbProp);
  2497. }
  2498. HRESULT
  2499. CAzAuthorizationStore::put_GenerateAudits(
  2500. IN BOOL bProp
  2501. )
  2502. {
  2503. return mySetBoolProperty(
  2504. NULL, // no app owns this object
  2505. 0, // doesn't matter if no app owns it
  2506. m_hAuthorizationStore,
  2507. AZ_PROP_GENERATE_AUDITS,
  2508. bProp);
  2509. }
  2510. HRESULT
  2511. CAzAuthorizationStore::get_Writable(
  2512. OUT BOOL *pfProp)
  2513. {
  2514. return myGetBoolProperty(
  2515. NULL, // no app owns this object
  2516. 0, // doesn't matter if no app owns it
  2517. m_hAuthorizationStore,
  2518. AZ_PROP_WRITABLE,
  2519. pfProp);
  2520. }
  2521. HRESULT
  2522. CAzAuthorizationStore::GetProperty(
  2523. IN LONG lPropId,
  2524. IN VARIANT varReserved,
  2525. OUT VARIANT *pvarProp)
  2526. {
  2527. return myAzGetProperty(
  2528. NULL, // no app owns this object
  2529. 0, // doesn't matter if no app owns it
  2530. m_hAuthorizationStore,
  2531. lPropId,
  2532. varReserved,
  2533. pvarProp);
  2534. }
  2535. HRESULT
  2536. CAzAuthorizationStore::SetProperty(
  2537. IN LONG lPropId,
  2538. IN VARIANT varProp,
  2539. IN VARIANT varReserved )
  2540. {
  2541. return myAzSetProperty(
  2542. NULL, // no app owns this object
  2543. 0, // doesn't matter if no app owns it
  2544. m_hAuthorizationStore,
  2545. lPropId,
  2546. varReserved,
  2547. &varProp);
  2548. }
  2549. HRESULT
  2550. CAzAuthorizationStore::AddPropertyItem(
  2551. IN LONG lPropId,
  2552. IN VARIANT varProp,
  2553. IN VARIANT varReserved )
  2554. {
  2555. return myAzAddPropertyItem(
  2556. NULL, // no app owns this object
  2557. 0, // doesn't matter if no app owns it
  2558. m_hAuthorizationStore,
  2559. lPropId,
  2560. varReserved,
  2561. &varProp);
  2562. }
  2563. HRESULT
  2564. CAzAuthorizationStore::DeletePropertyItem(
  2565. IN LONG lPropId,
  2566. IN VARIANT varProp,
  2567. IN VARIANT varReserved )
  2568. {
  2569. return myAzDeletePropertyItem(
  2570. NULL, // no app owns this object
  2571. 0, // doesn't matter if no app owns it
  2572. m_hAuthorizationStore,
  2573. lPropId,
  2574. varReserved,
  2575. &varProp);
  2576. }
  2577. HRESULT
  2578. CAzAuthorizationStore::get_PolicyAdministrators(
  2579. OUT VARIANT *pvarProp)
  2580. {
  2581. CComVariant vtemp;
  2582. return myAzGetProperty(
  2583. NULL, // no app owns this object
  2584. 0, // doesn't matter if no app owns it
  2585. m_hAuthorizationStore,
  2586. AZ_PROP_POLICY_ADMINS,
  2587. vtemp,
  2588. pvarProp);
  2589. }
  2590. HRESULT
  2591. CAzAuthorizationStore::get_PolicyAdministratorsName(
  2592. OUT VARIANT *pvarProp)
  2593. {
  2594. CComVariant vtemp;
  2595. return myAzGetProperty(
  2596. NULL, // no app owns this object
  2597. 0, // doesn't matter if no app owns it
  2598. m_hAuthorizationStore,
  2599. AZ_PROP_POLICY_ADMINS_NAME,
  2600. vtemp,
  2601. pvarProp);
  2602. }
  2603. HRESULT
  2604. CAzAuthorizationStore::get_PolicyReaders(
  2605. OUT VARIANT *pvarProp)
  2606. {
  2607. CComVariant vtemp;
  2608. return myAzGetProperty(
  2609. NULL, // no app owns this object
  2610. 0, // doesn't matter if no app owns it
  2611. m_hAuthorizationStore,
  2612. AZ_PROP_POLICY_READERS,
  2613. vtemp,
  2614. pvarProp);
  2615. }
  2616. HRESULT
  2617. CAzAuthorizationStore::get_PolicyReadersName(
  2618. OUT VARIANT *pvarProp)
  2619. {
  2620. CComVariant vtemp;
  2621. return myAzGetProperty(
  2622. NULL, // no app owns this object
  2623. 0, // doesn't matter if no app owns it
  2624. m_hAuthorizationStore,
  2625. AZ_PROP_POLICY_READERS_NAME,
  2626. vtemp,
  2627. pvarProp);
  2628. }
  2629. HRESULT
  2630. CAzAuthorizationStore::AddPolicyAdministrator(
  2631. IN BSTR bstrAdmin,
  2632. IN VARIANT varReserved)
  2633. {
  2634. return myAzAddOrDeleteUser(
  2635. NULL, // no app owns this object
  2636. 0, // doesn't matter if no app owns it
  2637. m_hAuthorizationStore,
  2638. AZ_PROP_POLICY_ADMINS,
  2639. varReserved,
  2640. bstrAdmin,
  2641. TRUE);
  2642. }
  2643. HRESULT
  2644. CAzAuthorizationStore::AddPolicyAdministratorName(
  2645. IN BSTR bstrAdmin,
  2646. IN VARIANT varReserved)
  2647. {
  2648. return myAzAddOrDeleteUser(
  2649. NULL, // no app owns this object
  2650. 0, // doesn't matter if no app owns it
  2651. m_hAuthorizationStore,
  2652. AZ_PROP_POLICY_ADMINS_NAME,
  2653. varReserved,
  2654. bstrAdmin,
  2655. TRUE);
  2656. }
  2657. HRESULT
  2658. CAzAuthorizationStore::DeletePolicyAdministrator(
  2659. IN BSTR bstrAdmin,
  2660. IN VARIANT varReserved)
  2661. {
  2662. return myAzAddOrDeleteUser(
  2663. NULL, // no app owns this object
  2664. 0, // doesn't matter if no app owns it
  2665. m_hAuthorizationStore,
  2666. AZ_PROP_POLICY_ADMINS,
  2667. varReserved,
  2668. bstrAdmin,
  2669. FALSE);
  2670. }
  2671. HRESULT
  2672. CAzAuthorizationStore::DeletePolicyAdministratorName(
  2673. IN BSTR bstrAdmin,
  2674. IN VARIANT varReserved)
  2675. {
  2676. return myAzAddOrDeleteUser(
  2677. NULL, // no app owns this object
  2678. 0, // doesn't matter if no app owns it
  2679. m_hAuthorizationStore,
  2680. AZ_PROP_POLICY_ADMINS_NAME,
  2681. varReserved,
  2682. bstrAdmin,
  2683. FALSE);
  2684. }
  2685. HRESULT
  2686. CAzAuthorizationStore::AddPolicyReader(
  2687. IN BSTR bstrReader,
  2688. IN VARIANT varReserved)
  2689. {
  2690. return myAzAddOrDeleteUser(
  2691. NULL, // no app owns this object
  2692. 0, // doesn't matter if no app owns it
  2693. m_hAuthorizationStore,
  2694. AZ_PROP_POLICY_READERS,
  2695. varReserved,
  2696. bstrReader,
  2697. TRUE);
  2698. }
  2699. HRESULT
  2700. CAzAuthorizationStore::AddPolicyReaderName(
  2701. IN BSTR bstrReader,
  2702. IN VARIANT varReserved)
  2703. {
  2704. return myAzAddOrDeleteUser(
  2705. NULL, // no app owns this object
  2706. 0, // doesn't matter if no app owns it
  2707. m_hAuthorizationStore,
  2708. AZ_PROP_POLICY_READERS_NAME,
  2709. varReserved,
  2710. bstrReader,
  2711. TRUE);
  2712. }
  2713. HRESULT
  2714. CAzAuthorizationStore::DeletePolicyReader(
  2715. IN BSTR bstrReader,
  2716. IN VARIANT varReserved)
  2717. {
  2718. return myAzAddOrDeleteUser(
  2719. NULL, // no app owns this object
  2720. 0, // doesn't matter if no app owns it
  2721. m_hAuthorizationStore,
  2722. AZ_PROP_POLICY_READERS,
  2723. varReserved,
  2724. bstrReader,
  2725. FALSE);
  2726. }
  2727. HRESULT
  2728. CAzAuthorizationStore::DeletePolicyReaderName(
  2729. IN BSTR bstrReader,
  2730. IN VARIANT varReserved)
  2731. {
  2732. return myAzAddOrDeleteUser(
  2733. NULL, // no app owns this object
  2734. 0, // doesn't matter if no app owns it
  2735. m_hAuthorizationStore,
  2736. AZ_PROP_POLICY_READERS_NAME,
  2737. varReserved,
  2738. bstrReader,
  2739. FALSE);
  2740. }
  2741. HRESULT
  2742. CAzAuthorizationStore::get_TargetMachine(
  2743. OUT BSTR __RPC_FAR *pbstrTargetMachine)
  2744. {
  2745. return myGetBstrProperty(
  2746. NULL, // no app owns this object
  2747. 0, // doesn't matter if no app owns it
  2748. m_hAuthorizationStore,
  2749. AZ_PROP_AZSTORE_TARGET_MACHINE,
  2750. pbstrTargetMachine);
  2751. }
  2752. HRESULT
  2753. CAzAuthorizationStore::Initialize(
  2754. IN LONG lFlags,
  2755. IN BSTR bstrPolicyURL,
  2756. IN VARIANT varReserved )
  2757. {
  2758. HRESULT hr;
  2759. DWORD dwErr;
  2760. LPCWSTR pwszPolicyUrl = bstrPolicyURL;
  2761. if (NULL != m_hAuthorizationStore)
  2762. {
  2763. //init before, disallow
  2764. hr = E_ACCESSDENIED;
  2765. _JumpError(hr, error, "multiple Initiallize");
  2766. }
  2767. hr = HandleReserved( &varReserved );
  2768. _JumpIfError(hr, error, "HandleReserved");
  2769. //
  2770. // Grab CloseApplication lock to maintain order
  2771. //
  2772. AzpLockResourceShared( &AzGlCloseApplication );
  2773. dwErr = AzInitialize(
  2774. pwszPolicyUrl,
  2775. lFlags,
  2776. 0,
  2777. &m_hAuthorizationStore);
  2778. AzpUnlockResource( &AzGlCloseApplication );
  2779. _JumpIfWinError(dwErr, &hr, error, "AzInitialize");
  2780. AZASSERT(NULL != m_hAuthorizationStore);
  2781. hr = S_OK;
  2782. error:
  2783. return hr;
  2784. }
  2785. HRESULT
  2786. CAzAuthorizationStore::UpdateCache(
  2787. IN VARIANT varReserved )
  2788. {
  2789. HRESULT hr;
  2790. DWORD dwErr;
  2791. if (NULL == m_hAuthorizationStore)
  2792. {
  2793. //init before, disallow
  2794. hr = E_ACCESSDENIED;
  2795. _JumpError(hr, error, "multiple Initiallize");
  2796. }
  2797. hr = HandleReserved( &varReserved );
  2798. _JumpIfError(hr, error, "HandleReserved");
  2799. //
  2800. // Lock the close application so that it doesn't interfere
  2801. //
  2802. AzpLockResourceShared( &AzGlCloseApplication );
  2803. dwErr = AzUpdateCache( m_hAuthorizationStore );
  2804. //
  2805. // drop the global lock
  2806. //
  2807. AzpUnlockResource( &AzGlCloseApplication );
  2808. _JumpIfWinError(dwErr, &hr, error, "AzUpdateCache");
  2809. AZASSERT(NULL != m_hAuthorizationStore);
  2810. hr = S_OK;
  2811. error:
  2812. return hr;
  2813. }
  2814. HRESULT
  2815. CAzAuthorizationStore::Delete(
  2816. IN VARIANT varReserved)
  2817. {
  2818. HRESULT hr;
  2819. DWORD dwErr;
  2820. //
  2821. // Grab the CloseApplication lock to maintain order
  2822. //
  2823. AzpLockResourceShared( &AzGlCloseApplication );
  2824. if (NULL == m_hAuthorizationStore)
  2825. {
  2826. // not initialized, can't delete anything
  2827. hr = E_ACCESSDENIED;
  2828. _JumpError(hr, error, "not Initiallized");
  2829. }
  2830. hr = HandleReserved(&varReserved);
  2831. _JumpIfError(hr, error, "HandleReserved");
  2832. dwErr = AzAuthorizationStoreDelete(
  2833. m_hAuthorizationStore,
  2834. 0);
  2835. _JumpIfWinError(dwErr, &hr, error, "AzAuthorizaitonStoreDelete");
  2836. // release authorization store object itself
  2837. dwErr = AzCloseHandle(m_hAuthorizationStore, 0);
  2838. _JumpIfWinError(dwErr, &hr, error, "AzCloseHandle(authorization store)");
  2839. // set it to null
  2840. m_hAuthorizationStore = NULL;
  2841. hr = S_OK;
  2842. error:
  2843. AzpUnlockResource( &AzGlCloseApplication );
  2844. return hr;
  2845. }
  2846. HRESULT
  2847. CAzAuthorizationStore::get_Applications(
  2848. OUT IAzApplications __RPC_FAR **ppApplications)
  2849. {
  2850. CComVariant vtemp;
  2851. return myAzNewObject(
  2852. NULL, // not owned by application object
  2853. 0, // doesn't matter if no owner app
  2854. ENUM_AZ_APPLICATIONS,
  2855. m_hAuthorizationStore,
  2856. &vtemp,
  2857. (IUnknown**)ppApplications);
  2858. }
  2859. HRESULT
  2860. CAzAuthorizationStore::OpenApplication(
  2861. IN BSTR bstrApplicationName,
  2862. IN VARIANT varReserved,
  2863. OUT IAzApplication __RPC_FAR **ppApplication)
  2864. {
  2865. HRESULT hr;
  2866. hr = myAzOpenObject(
  2867. NULL, // not owned by application object
  2868. 0, // doesn't matter if no owner app
  2869. AzApplicationOpen,
  2870. ENUM_AZ_APPLICATION,
  2871. m_hAuthorizationStore,
  2872. bstrApplicationName,
  2873. varReserved,
  2874. (IUnknown**)ppApplication);
  2875. return hr;
  2876. }
  2877. HRESULT
  2878. CAzAuthorizationStore::CloseApplication(
  2879. IN BSTR bstrApplicationName,
  2880. IN LONG lFlags
  2881. )
  2882. {
  2883. HRESULT hr;
  2884. hr = myAzCloseObject(
  2885. AzApplicationClose,
  2886. m_hAuthorizationStore,
  2887. bstrApplicationName,
  2888. lFlags
  2889. );
  2890. return hr;
  2891. }
  2892. HRESULT
  2893. CAzAuthorizationStore::CreateApplication(
  2894. IN BSTR bstrApplicationName,
  2895. IN VARIANT varReserved,
  2896. OUT IAzApplication __RPC_FAR **ppApplication)
  2897. {
  2898. HRESULT hr;
  2899. hr = myAzCreateObject(
  2900. NULL, // not owned by application object
  2901. 0, // doesn't matter if no owner app
  2902. AzApplicationCreate,
  2903. ENUM_AZ_APPLICATION,
  2904. m_hAuthorizationStore,
  2905. bstrApplicationName,
  2906. varReserved,
  2907. (IUnknown**)ppApplication);
  2908. return hr;
  2909. }
  2910. HRESULT
  2911. CAzAuthorizationStore::DeleteApplication(
  2912. IN BSTR bstrApplicationName,
  2913. IN VARIANT varReserved )
  2914. {
  2915. HRESULT hr;
  2916. hr = myAzDeleteObject(
  2917. NULL, // not owned by application object
  2918. 0, // doesn't matter if no owner app
  2919. AzApplicationDelete,
  2920. m_hAuthorizationStore,
  2921. bstrApplicationName,
  2922. varReserved);
  2923. return hr;
  2924. }
  2925. HRESULT
  2926. CAzAuthorizationStore::get_ApplicationGroups(
  2927. OUT IAzApplicationGroups __RPC_FAR **ppApplicationGroups)
  2928. {
  2929. CComVariant vtemp;
  2930. return myAzNewObject(
  2931. NULL, // not owned by application object
  2932. 0, // doesn't matter if no owner app
  2933. ENUM_AZ_GROUPS,
  2934. m_hAuthorizationStore,
  2935. &vtemp,
  2936. (IUnknown**)ppApplicationGroups);
  2937. }
  2938. HRESULT
  2939. CAzAuthorizationStore::CreateApplicationGroup(
  2940. IN BSTR bstrGroupName,
  2941. IN VARIANT varReserved,
  2942. OUT IAzApplicationGroup __RPC_FAR **ppApplicationGroup)
  2943. {
  2944. HRESULT hr;
  2945. hr = myAzCreateObject(
  2946. NULL, // not owned by application object
  2947. 0, // doesn't matter if no owner app
  2948. AzGroupCreate,
  2949. ENUM_AZ_GROUP,
  2950. m_hAuthorizationStore,
  2951. bstrGroupName,
  2952. varReserved,
  2953. (IUnknown**)ppApplicationGroup);
  2954. return hr;
  2955. }
  2956. HRESULT
  2957. CAzAuthorizationStore::OpenApplicationGroup(
  2958. IN BSTR bstrGroupName,
  2959. IN VARIANT varReserved,
  2960. OUT IAzApplicationGroup __RPC_FAR **ppApplicationGroup)
  2961. {
  2962. HRESULT hr;
  2963. hr = myAzOpenObject(
  2964. NULL, // not owned by application object
  2965. 0, // doesn't matter if no owner app
  2966. AzGroupOpen,
  2967. ENUM_AZ_GROUP,
  2968. m_hAuthorizationStore,
  2969. bstrGroupName,
  2970. varReserved,
  2971. (IUnknown**)ppApplicationGroup);
  2972. return hr;
  2973. }
  2974. HRESULT
  2975. CAzAuthorizationStore::DeleteApplicationGroup(
  2976. IN BSTR bstrGroupName,
  2977. IN VARIANT varReserved )
  2978. {
  2979. HRESULT hr;
  2980. hr = myAzDeleteObject(
  2981. NULL, // not owned by application object
  2982. 0, // doesn't matter if no owner app
  2983. AzGroupDelete,
  2984. m_hAuthorizationStore,
  2985. bstrGroupName,
  2986. varReserved);
  2987. return hr;
  2988. }
  2989. HRESULT
  2990. CAzAuthorizationStore::Submit(
  2991. IN LONG lFlags,
  2992. IN VARIANT varReserved)
  2993. {
  2994. HRESULT hr;
  2995. DWORD dwErr;
  2996. //
  2997. // Grab CloseApplication lock to maintain order
  2998. //
  2999. AzpLockResourceShared( &AzGlCloseApplication );
  3000. if (NULL == m_hAuthorizationStore)
  3001. {
  3002. hr = E_INVALIDARG;
  3003. _JumpError(hr, error, "Null AzAuthorizationStore");
  3004. }
  3005. hr = HandleReserved( &varReserved );
  3006. _JumpIfError(hr, error, "HandleReserved");
  3007. dwErr = AzSubmit(m_hAuthorizationStore, lFlags, 0);
  3008. _JumpIfWinError(dwErr, &hr, error, "AzSubmit");
  3009. hr = S_OK;
  3010. error:
  3011. AzpUnlockResource( &AzGlCloseApplication );
  3012. return hr;
  3013. }
  3014. HRESULT
  3015. CAzAuthorizationStore::get_DelegatedPolicyUsers(
  3016. OUT VARIANT *pvarProp)
  3017. {
  3018. CComVariant vtemp;
  3019. return myAzGetProperty(
  3020. NULL, // not owned by application object
  3021. 0, // doesn't matter if no owner app
  3022. m_hAuthorizationStore,
  3023. AZ_PROP_DELEGATED_POLICY_USERS,
  3024. vtemp,
  3025. pvarProp);
  3026. }
  3027. HRESULT
  3028. CAzAuthorizationStore::get_DelegatedPolicyUsersName(
  3029. OUT VARIANT *pvarProp)
  3030. {
  3031. CComVariant vtemp;
  3032. return myAzGetProperty(
  3033. NULL, // no app owns this object
  3034. 0, // doesn't matter if no app owns it
  3035. m_hAuthorizationStore,
  3036. AZ_PROP_DELEGATED_POLICY_USERS_NAME,
  3037. vtemp,
  3038. pvarProp);
  3039. }
  3040. HRESULT
  3041. CAzAuthorizationStore::AddDelegatedPolicyUser(
  3042. IN BSTR bstrDelegatedPolicyUser,
  3043. IN VARIANT varReserved)
  3044. {
  3045. return myAzAddOrDeleteUser(
  3046. NULL, // no app owns this object
  3047. 0, // doesn't matter if no app owns it
  3048. m_hAuthorizationStore,
  3049. AZ_PROP_DELEGATED_POLICY_USERS,
  3050. varReserved,
  3051. bstrDelegatedPolicyUser,
  3052. TRUE);
  3053. }
  3054. HRESULT
  3055. CAzAuthorizationStore::AddDelegatedPolicyUserName(
  3056. IN BSTR bstrDelegatedPolicyUser,
  3057. IN VARIANT varReserved)
  3058. {
  3059. return myAzAddOrDeleteUser(
  3060. NULL, // no app owns this object
  3061. 0, // doesn't matter if no app owns it
  3062. m_hAuthorizationStore,
  3063. AZ_PROP_DELEGATED_POLICY_USERS_NAME,
  3064. varReserved,
  3065. bstrDelegatedPolicyUser,
  3066. TRUE);
  3067. }
  3068. HRESULT
  3069. CAzAuthorizationStore::DeleteDelegatedPolicyUser(
  3070. IN BSTR bstrDelegatedPolicyUser,
  3071. IN VARIANT varReserved)
  3072. {
  3073. return myAzAddOrDeleteUser(
  3074. NULL, // no app owns this object
  3075. 0, // doesn't matter if no app owns it
  3076. m_hAuthorizationStore,
  3077. AZ_PROP_DELEGATED_POLICY_USERS,
  3078. varReserved,
  3079. bstrDelegatedPolicyUser,
  3080. FALSE);
  3081. }
  3082. HRESULT
  3083. CAzAuthorizationStore::DeleteDelegatedPolicyUserName(
  3084. IN BSTR bstrDelegatedPolicyUser,
  3085. IN VARIANT varReserved)
  3086. {
  3087. return myAzAddOrDeleteUser(
  3088. NULL, // no app owns this object
  3089. 0, // doesn't matter if no app owns it
  3090. m_hAuthorizationStore,
  3091. AZ_PROP_DELEGATED_POLICY_USERS_NAME,
  3092. varReserved,
  3093. bstrDelegatedPolicyUser,
  3094. FALSE);
  3095. }
  3096. HRESULT
  3097. CAzAuthorizationStore::put_ApplyStoreSacl(
  3098. IN BOOL bApplyStoreSacl)
  3099. {
  3100. return mySetBoolProperty(
  3101. NULL, // no app owns this object
  3102. 0, // doesn't matter if no app owns it
  3103. m_hAuthorizationStore,
  3104. AZ_PROP_APPLY_STORE_SACL,
  3105. bApplyStoreSacl);
  3106. }
  3107. HRESULT
  3108. CAzAuthorizationStore::get_ApplyStoreSacl(
  3109. OUT BOOL * pbApplyStoreSacl)
  3110. {
  3111. return myGetBoolProperty(
  3112. NULL, // no app owns this object
  3113. 0, // doesn't matter if no app owns it
  3114. m_hAuthorizationStore,
  3115. AZ_PROP_APPLY_STORE_SACL,
  3116. pbApplyStoreSacl);
  3117. }
  3118. /////////////////////////
  3119. //CAzApplication
  3120. /////////////////////////
  3121. CAzApplication::CAzApplication()
  3122. {
  3123. //init
  3124. __try {
  3125. InitializeCriticalSection(&m_cs);
  3126. } __except(EXCEPTION_EXECUTE_HANDLER) {}
  3127. m_hApplication = NULL;
  3128. }
  3129. CAzApplication::~CAzApplication()
  3130. {
  3131. if (NULL != m_hApplication)
  3132. {
  3133. //
  3134. // Grab the lock to maintain order
  3135. //
  3136. AzpLockResourceShared( &AzGlCloseApplication );
  3137. AzCloseHandle(m_hApplication, 0);
  3138. AzpUnlockResource( &AzGlCloseApplication );
  3139. }
  3140. DeleteCriticalSection(&m_cs);
  3141. }
  3142. HRESULT
  3143. CAzApplication::_Init(
  3144. IN AZ_HANDLE hHandle)
  3145. {
  3146. HRESULT hr;
  3147. EnterCriticalSection(&m_cs);
  3148. //init once
  3149. AZASSERT(NULL != hHandle);
  3150. AZASSERT(NULL == m_hApplication);
  3151. m_hApplication = hHandle;
  3152. //
  3153. // Grab the CloseApplication lock to maintain order
  3154. //
  3155. AzpLockResourceShared( &AzGlCloseApplication );
  3156. m_dwSN = AzpRetrieveApplicationSequenceNumber(m_hApplication);
  3157. AzpUnlockResource( &AzGlCloseApplication );
  3158. hr = S_OK;
  3159. //error:
  3160. LeaveCriticalSection(&m_cs);
  3161. return hr;
  3162. }
  3163. HRESULT
  3164. CAzApplication::get_Description(
  3165. OUT BSTR __RPC_FAR *pbstrDescription)
  3166. {
  3167. return myGetBstrProperty(
  3168. m_hApplication,
  3169. m_dwSN,
  3170. m_hApplication,
  3171. AZ_PROP_DESCRIPTION,
  3172. pbstrDescription);
  3173. }
  3174. HRESULT
  3175. CAzApplication::put_Description(
  3176. IN BSTR bstrDescription)
  3177. {
  3178. return mySetBstrProperty(
  3179. m_hApplication,
  3180. m_dwSN,
  3181. m_hApplication,
  3182. AZ_PROP_DESCRIPTION,
  3183. bstrDescription);
  3184. }
  3185. HRESULT
  3186. CAzApplication::get_Name(
  3187. OUT BSTR __RPC_FAR *pbstrName)
  3188. {
  3189. return myGetBstrProperty(
  3190. m_hApplication,
  3191. m_dwSN,
  3192. m_hApplication,
  3193. AZ_PROP_NAME,
  3194. pbstrName);
  3195. }
  3196. HRESULT
  3197. CAzApplication::put_Name(
  3198. IN BSTR bstrName)
  3199. {
  3200. return mySetBstrProperty(
  3201. m_hApplication,
  3202. m_dwSN,
  3203. m_hApplication,
  3204. AZ_PROP_NAME,
  3205. bstrName);
  3206. }
  3207. HRESULT
  3208. CAzApplication::get_ApplicationData(
  3209. OUT BSTR __RPC_FAR *pbstrApplicationData)
  3210. {
  3211. return myGetBstrProperty(
  3212. m_hApplication,
  3213. m_dwSN,
  3214. m_hApplication,
  3215. AZ_PROP_APPLICATION_DATA,
  3216. pbstrApplicationData);
  3217. }
  3218. HRESULT
  3219. CAzApplication::put_ApplicationData(
  3220. IN BSTR bstrApplicationData)
  3221. {
  3222. return mySetBstrProperty(
  3223. m_hApplication,
  3224. m_dwSN,
  3225. m_hApplication,
  3226. AZ_PROP_APPLICATION_DATA,
  3227. bstrApplicationData);
  3228. }
  3229. HRESULT STDMETHODCALLTYPE
  3230. CAzApplication::get_AuthzInterfaceClsid(
  3231. OUT BSTR *pbstrProp)
  3232. {
  3233. return myGetBstrProperty(
  3234. m_hApplication,
  3235. m_dwSN,
  3236. m_hApplication,
  3237. AZ_PROP_APPLICATION_AUTHZ_INTERFACE_CLSID,
  3238. pbstrProp);
  3239. }
  3240. HRESULT STDMETHODCALLTYPE
  3241. CAzApplication::put_AuthzInterfaceClsid(
  3242. IN BSTR bstrProp)
  3243. {
  3244. return mySetBstrProperty(
  3245. m_hApplication,
  3246. m_dwSN,
  3247. m_hApplication,
  3248. AZ_PROP_APPLICATION_AUTHZ_INTERFACE_CLSID,
  3249. bstrProp);
  3250. }
  3251. HRESULT STDMETHODCALLTYPE
  3252. CAzApplication::get_Version(
  3253. OUT BSTR *pbstrProp)
  3254. {
  3255. return myGetBstrProperty(
  3256. m_hApplication,
  3257. m_dwSN,
  3258. m_hApplication,
  3259. AZ_PROP_APPLICATION_VERSION,
  3260. pbstrProp);
  3261. }
  3262. HRESULT STDMETHODCALLTYPE
  3263. CAzApplication::put_Version(
  3264. IN BSTR bstrProp)
  3265. {
  3266. return mySetBstrProperty(
  3267. m_hApplication,
  3268. m_dwSN,
  3269. m_hApplication,
  3270. AZ_PROP_APPLICATION_VERSION,
  3271. bstrProp);
  3272. }
  3273. HRESULT STDMETHODCALLTYPE
  3274. CAzApplication::get_GenerateAudits(
  3275. OUT BOOL *pbProp)
  3276. {
  3277. return myGetBoolProperty(
  3278. m_hApplication,
  3279. m_dwSN,
  3280. m_hApplication,
  3281. AZ_PROP_GENERATE_AUDITS,
  3282. pbProp);
  3283. }
  3284. HRESULT STDMETHODCALLTYPE
  3285. CAzApplication::put_GenerateAudits(
  3286. IN BOOL bProp)
  3287. {
  3288. return mySetBoolProperty(
  3289. m_hApplication,
  3290. m_dwSN,
  3291. m_hApplication,
  3292. AZ_PROP_GENERATE_AUDITS,
  3293. bProp);
  3294. }
  3295. HRESULT STDMETHODCALLTYPE
  3296. CAzApplication::get_ApplyStoreSacl(
  3297. OUT BOOL *pbProp)
  3298. {
  3299. return myGetBoolProperty(
  3300. m_hApplication,
  3301. m_dwSN,
  3302. m_hApplication,
  3303. AZ_PROP_APPLY_STORE_SACL,
  3304. pbProp);
  3305. }
  3306. HRESULT STDMETHODCALLTYPE
  3307. CAzApplication::put_ApplyStoreSacl(
  3308. IN BOOL bProp)
  3309. {
  3310. return mySetLongProperty(
  3311. m_hApplication,
  3312. m_dwSN,
  3313. m_hApplication,
  3314. AZ_PROP_APPLY_STORE_SACL,
  3315. bProp);
  3316. }
  3317. HRESULT
  3318. CAzApplication::get_Writable(
  3319. OUT BOOL *pfProp)
  3320. {
  3321. return myGetBoolProperty(
  3322. m_hApplication,
  3323. m_dwSN,
  3324. m_hApplication,
  3325. AZ_PROP_WRITABLE,
  3326. pfProp);
  3327. }
  3328. HRESULT
  3329. CAzApplication::GetProperty(
  3330. IN LONG lPropId,
  3331. IN VARIANT varReserved,
  3332. OUT VARIANT *pvarProp)
  3333. {
  3334. return myAzGetProperty(
  3335. m_hApplication,
  3336. m_dwSN,
  3337. m_hApplication,
  3338. lPropId,
  3339. varReserved,
  3340. pvarProp);
  3341. }
  3342. HRESULT
  3343. CAzApplication::SetProperty(
  3344. IN LONG lPropId,
  3345. IN VARIANT varProp,
  3346. IN VARIANT varReserved )
  3347. {
  3348. return myAzSetProperty(
  3349. m_hApplication,
  3350. m_dwSN,
  3351. m_hApplication,
  3352. lPropId,
  3353. varReserved,
  3354. &varProp);
  3355. }
  3356. HRESULT
  3357. CAzApplication::get_PolicyAdministrators(
  3358. OUT VARIANT *pvarProp)
  3359. {
  3360. CComVariant vtemp;
  3361. return myAzGetProperty(
  3362. m_hApplication,
  3363. m_dwSN,
  3364. m_hApplication,
  3365. AZ_PROP_POLICY_ADMINS,
  3366. vtemp,
  3367. pvarProp);
  3368. }
  3369. HRESULT
  3370. CAzApplication::get_PolicyAdministratorsName(
  3371. OUT VARIANT *pvarProp)
  3372. {
  3373. CComVariant vtemp;
  3374. return myAzGetProperty(
  3375. m_hApplication,
  3376. m_dwSN,
  3377. m_hApplication,
  3378. AZ_PROP_POLICY_ADMINS_NAME,
  3379. vtemp,
  3380. pvarProp);
  3381. }
  3382. HRESULT
  3383. CAzApplication::get_PolicyReaders(
  3384. OUT VARIANT *pvarProp)
  3385. {
  3386. CComVariant vtemp;
  3387. return myAzGetProperty(
  3388. m_hApplication,
  3389. m_dwSN,
  3390. m_hApplication,
  3391. AZ_PROP_POLICY_READERS,
  3392. vtemp,
  3393. pvarProp);
  3394. }
  3395. HRESULT
  3396. CAzApplication::get_PolicyReadersName(
  3397. OUT VARIANT *pvarProp)
  3398. {
  3399. CComVariant vtemp;
  3400. return myAzGetProperty(
  3401. m_hApplication,
  3402. m_dwSN,
  3403. m_hApplication,
  3404. AZ_PROP_POLICY_READERS_NAME,
  3405. vtemp,
  3406. pvarProp);
  3407. }
  3408. HRESULT
  3409. CAzApplication::AddPolicyAdministrator(
  3410. IN BSTR bstrAdmin,
  3411. IN VARIANT varReserved)
  3412. {
  3413. return myAzAddOrDeleteUser(
  3414. m_hApplication,
  3415. m_dwSN,
  3416. m_hApplication,
  3417. AZ_PROP_POLICY_ADMINS,
  3418. varReserved,
  3419. bstrAdmin,
  3420. TRUE);
  3421. }
  3422. HRESULT
  3423. CAzApplication::AddPolicyAdministratorName(
  3424. IN BSTR bstrAdmin,
  3425. IN VARIANT varReserved)
  3426. {
  3427. return myAzAddOrDeleteUser(
  3428. m_hApplication,
  3429. m_dwSN,
  3430. m_hApplication,
  3431. AZ_PROP_POLICY_ADMINS_NAME,
  3432. varReserved,
  3433. bstrAdmin,
  3434. TRUE);
  3435. }
  3436. HRESULT
  3437. CAzApplication::DeletePolicyAdministrator(
  3438. IN BSTR bstrAdmin,
  3439. IN VARIANT varReserved)
  3440. {
  3441. return myAzAddOrDeleteUser(
  3442. m_hApplication,
  3443. m_dwSN,
  3444. m_hApplication,
  3445. AZ_PROP_POLICY_ADMINS,
  3446. varReserved,
  3447. bstrAdmin,
  3448. FALSE);
  3449. }
  3450. HRESULT
  3451. CAzApplication::DeletePolicyAdministratorName(
  3452. IN BSTR bstrAdmin,
  3453. IN VARIANT varReserved)
  3454. {
  3455. return myAzAddOrDeleteUser(
  3456. m_hApplication,
  3457. m_dwSN,
  3458. m_hApplication,
  3459. AZ_PROP_POLICY_ADMINS_NAME,
  3460. varReserved,
  3461. bstrAdmin,
  3462. FALSE);
  3463. }
  3464. HRESULT
  3465. CAzApplication::AddPolicyReader(
  3466. IN BSTR bstrReader,
  3467. IN VARIANT varReserved)
  3468. {
  3469. return myAzAddOrDeleteUser(
  3470. m_hApplication,
  3471. m_dwSN,
  3472. m_hApplication,
  3473. AZ_PROP_POLICY_READERS,
  3474. varReserved,
  3475. bstrReader,
  3476. TRUE);
  3477. }
  3478. HRESULT
  3479. CAzApplication::AddPolicyReaderName(
  3480. IN BSTR bstrReader,
  3481. IN VARIANT varReserved)
  3482. {
  3483. return myAzAddOrDeleteUser(
  3484. m_hApplication,
  3485. m_dwSN,
  3486. m_hApplication,
  3487. AZ_PROP_POLICY_READERS_NAME,
  3488. varReserved,
  3489. bstrReader,
  3490. TRUE);
  3491. }
  3492. HRESULT
  3493. CAzApplication::DeletePolicyReader(
  3494. IN BSTR bstrReader,
  3495. IN VARIANT varReserved)
  3496. {
  3497. return myAzAddOrDeleteUser(
  3498. m_hApplication,
  3499. m_dwSN,
  3500. m_hApplication,
  3501. AZ_PROP_POLICY_READERS,
  3502. varReserved,
  3503. bstrReader,
  3504. FALSE);
  3505. }
  3506. HRESULT
  3507. CAzApplication::DeletePolicyReaderName(
  3508. IN BSTR bstrReader,
  3509. IN VARIANT varReserved)
  3510. {
  3511. return myAzAddOrDeleteUser(
  3512. m_hApplication,
  3513. m_dwSN,
  3514. m_hApplication,
  3515. AZ_PROP_POLICY_READERS_NAME,
  3516. varReserved,
  3517. bstrReader,
  3518. FALSE);
  3519. }
  3520. HRESULT
  3521. CAzApplication::get_Scopes(
  3522. OUT IAzScopes **ppScopes)
  3523. {
  3524. CComVariant vtemp;
  3525. return myAzNewObject(
  3526. m_hApplication,
  3527. m_dwSN,
  3528. ENUM_AZ_SCOPES,
  3529. m_hApplication,
  3530. &vtemp,
  3531. (IUnknown**)ppScopes);
  3532. }
  3533. HRESULT
  3534. CAzApplication::OpenScope(
  3535. IN BSTR bstrScopeName,
  3536. IN VARIANT varReserved,
  3537. OUT IAzScope **ppScope)
  3538. {
  3539. HRESULT hr;
  3540. hr = myAzOpenObject(
  3541. m_hApplication,
  3542. m_dwSN,
  3543. AzScopeOpen,
  3544. ENUM_AZ_SCOPE,
  3545. m_hApplication,
  3546. bstrScopeName,
  3547. varReserved,
  3548. (IUnknown**)ppScope);
  3549. return hr;
  3550. }
  3551. HRESULT
  3552. CAzApplication::CreateScope(
  3553. IN BSTR bstrScopeName,
  3554. IN VARIANT varReserved,
  3555. OUT IAzScope **ppScope)
  3556. {
  3557. HRESULT hr;
  3558. hr = myAzCreateObject(
  3559. m_hApplication,
  3560. m_dwSN,
  3561. AzScopeCreate,
  3562. ENUM_AZ_SCOPE,
  3563. m_hApplication,
  3564. bstrScopeName,
  3565. varReserved,
  3566. (IUnknown**)ppScope);
  3567. return hr;
  3568. }
  3569. HRESULT
  3570. CAzApplication::DeleteScope(
  3571. IN BSTR bstrScopeName,
  3572. IN VARIANT varReserved )
  3573. {
  3574. HRESULT hr;
  3575. hr = myAzDeleteObject(
  3576. m_hApplication,
  3577. m_dwSN,
  3578. AzScopeDelete,
  3579. m_hApplication,
  3580. bstrScopeName,
  3581. varReserved);
  3582. return hr;
  3583. }
  3584. HRESULT
  3585. CAzApplication::get_Operations(
  3586. OUT IAzOperations **ppOperations)
  3587. {
  3588. CComVariant vtemp;
  3589. return myAzNewObject(
  3590. m_hApplication,
  3591. m_dwSN,
  3592. ENUM_AZ_OPERATIONS,
  3593. m_hApplication,
  3594. &vtemp,
  3595. (IUnknown**)ppOperations);
  3596. }
  3597. HRESULT
  3598. CAzApplication::OpenOperation(
  3599. IN BSTR bstrOperationName,
  3600. IN VARIANT varReserved,
  3601. OUT IAzOperation **ppOperation)
  3602. {
  3603. HRESULT hr;
  3604. hr = myAzOpenObject(
  3605. m_hApplication,
  3606. m_dwSN,
  3607. AzOperationOpen,
  3608. ENUM_AZ_OPERATION,
  3609. m_hApplication,
  3610. bstrOperationName,
  3611. varReserved,
  3612. (IUnknown**)ppOperation);
  3613. return hr;
  3614. }
  3615. HRESULT
  3616. CAzApplication::CreateOperation(
  3617. IN BSTR bstrOperationName,
  3618. IN VARIANT varReserved,
  3619. OUT IAzOperation **ppOperation)
  3620. {
  3621. HRESULT hr;
  3622. hr = myAzCreateObject(
  3623. m_hApplication,
  3624. m_dwSN,
  3625. AzOperationCreate,
  3626. ENUM_AZ_OPERATION,
  3627. m_hApplication,
  3628. bstrOperationName,
  3629. varReserved,
  3630. (IUnknown**)ppOperation);
  3631. return hr;
  3632. }
  3633. HRESULT
  3634. CAzApplication::DeleteOperation(
  3635. IN BSTR bstrOperationName,
  3636. IN VARIANT varReserved )
  3637. {
  3638. HRESULT hr;
  3639. hr = myAzDeleteObject(
  3640. m_hApplication,
  3641. m_dwSN,
  3642. AzOperationDelete,
  3643. m_hApplication,
  3644. bstrOperationName,
  3645. varReserved);
  3646. return hr;
  3647. }
  3648. HRESULT
  3649. CAzApplication::get_Tasks(
  3650. OUT IAzTasks **ppTasks)
  3651. {
  3652. CComVariant vtemp;
  3653. return myAzNewObject(
  3654. m_hApplication,
  3655. m_dwSN,
  3656. ENUM_AZ_TASKS,
  3657. m_hApplication,
  3658. &vtemp,
  3659. (IUnknown**)ppTasks);
  3660. }
  3661. HRESULT
  3662. CAzApplication::OpenTask(
  3663. IN BSTR bstrTaskName,
  3664. IN VARIANT varReserved,
  3665. OUT IAzTask **ppTask)
  3666. {
  3667. HRESULT hr;
  3668. hr = myAzOpenObject(
  3669. m_hApplication,
  3670. m_dwSN,
  3671. AzTaskOpen,
  3672. ENUM_AZ_TASK,
  3673. m_hApplication,
  3674. bstrTaskName,
  3675. varReserved,
  3676. (IUnknown**)ppTask);
  3677. return hr;
  3678. }
  3679. HRESULT
  3680. CAzApplication::CreateTask(
  3681. IN BSTR bstrTaskName,
  3682. IN VARIANT varReserved,
  3683. OUT IAzTask **ppTask)
  3684. {
  3685. HRESULT hr;
  3686. hr = myAzCreateObject(
  3687. m_hApplication,
  3688. m_dwSN,
  3689. AzTaskCreate,
  3690. ENUM_AZ_TASK,
  3691. m_hApplication,
  3692. bstrTaskName,
  3693. varReserved,
  3694. (IUnknown**)ppTask);
  3695. return hr;
  3696. }
  3697. HRESULT
  3698. CAzApplication::DeleteTask(
  3699. IN BSTR bstrTaskName,
  3700. IN VARIANT varReserved )
  3701. {
  3702. HRESULT hr;
  3703. hr = myAzDeleteObject(
  3704. m_hApplication,
  3705. m_dwSN,
  3706. AzTaskDelete,
  3707. m_hApplication,
  3708. bstrTaskName,
  3709. varReserved);
  3710. return hr;
  3711. }
  3712. HRESULT
  3713. CAzApplication::get_ApplicationGroups(
  3714. OUT IAzApplicationGroups **ppGroups)
  3715. {
  3716. CComVariant vtemp;
  3717. return myAzNewObject(
  3718. m_hApplication,
  3719. m_dwSN,
  3720. ENUM_AZ_GROUPS,
  3721. m_hApplication,
  3722. &vtemp,
  3723. (IUnknown**)ppGroups);
  3724. }
  3725. HRESULT
  3726. CAzApplication::OpenApplicationGroup(
  3727. IN BSTR bstrGroupName,
  3728. IN VARIANT varReserved,
  3729. OUT IAzApplicationGroup **ppGroup)
  3730. {
  3731. HRESULT hr;
  3732. hr = myAzOpenObject(
  3733. m_hApplication,
  3734. m_dwSN,
  3735. AzGroupOpen,
  3736. ENUM_AZ_GROUP,
  3737. m_hApplication,
  3738. bstrGroupName,
  3739. varReserved,
  3740. (IUnknown**)ppGroup);
  3741. return hr;
  3742. }
  3743. HRESULT
  3744. CAzApplication::CreateApplicationGroup(
  3745. IN BSTR bstrGroupName,
  3746. IN VARIANT varReserved,
  3747. OUT IAzApplicationGroup **ppGroup)
  3748. {
  3749. HRESULT hr;
  3750. hr = myAzCreateObject(
  3751. m_hApplication,
  3752. m_dwSN,
  3753. AzGroupCreate,
  3754. ENUM_AZ_GROUP,
  3755. m_hApplication,
  3756. bstrGroupName,
  3757. varReserved,
  3758. (IUnknown**)ppGroup);
  3759. return hr;
  3760. }
  3761. HRESULT
  3762. CAzApplication::DeleteApplicationGroup(
  3763. IN BSTR bstrGroupName,
  3764. IN VARIANT varReserved )
  3765. {
  3766. HRESULT hr;
  3767. hr = myAzDeleteObject(
  3768. m_hApplication,
  3769. m_dwSN,
  3770. AzGroupDelete,
  3771. m_hApplication,
  3772. bstrGroupName,
  3773. varReserved);
  3774. return hr;
  3775. }
  3776. HRESULT
  3777. CAzApplication::get_Roles(
  3778. OUT IAzRoles **ppRoles)
  3779. {
  3780. CComVariant vtemp;
  3781. return myAzNewObject(
  3782. m_hApplication,
  3783. m_dwSN,
  3784. ENUM_AZ_ROLES,
  3785. m_hApplication,
  3786. &vtemp,
  3787. (IUnknown**)ppRoles);
  3788. }
  3789. HRESULT
  3790. CAzApplication::OpenRole(
  3791. IN BSTR bstrRoleName,
  3792. IN VARIANT varReserved,
  3793. OUT IAzRole **ppRole)
  3794. {
  3795. HRESULT hr;
  3796. hr = myAzOpenObject(
  3797. m_hApplication,
  3798. m_dwSN,
  3799. AzRoleOpen,
  3800. ENUM_AZ_ROLE,
  3801. m_hApplication,
  3802. bstrRoleName,
  3803. varReserved,
  3804. (IUnknown**)ppRole);
  3805. return hr;
  3806. }
  3807. HRESULT
  3808. CAzApplication::CreateRole(
  3809. IN BSTR bstrRoleName,
  3810. IN VARIANT varReserved,
  3811. OUT IAzRole **ppRole)
  3812. {
  3813. HRESULT hr;
  3814. hr = myAzCreateObject(
  3815. m_hApplication, // this application owns the new object
  3816. m_dwSN,
  3817. AzRoleCreate,
  3818. ENUM_AZ_ROLE,
  3819. m_hApplication,
  3820. bstrRoleName,
  3821. varReserved,
  3822. (IUnknown**)ppRole);
  3823. return hr;
  3824. }
  3825. HRESULT
  3826. CAzApplication::DeleteRole(
  3827. IN BSTR bstrRoleName,
  3828. IN VARIANT varReserved )
  3829. {
  3830. HRESULT hr;
  3831. hr = myAzDeleteObject(
  3832. m_hApplication,
  3833. m_dwSN,
  3834. AzRoleDelete,
  3835. m_hApplication,
  3836. bstrRoleName,
  3837. varReserved);
  3838. return hr;
  3839. }
  3840. HRESULT
  3841. CAzApplication::InitializeClientContextFromToken(
  3842. IN ULONGLONG ullTokenHandle,
  3843. IN VARIANT varReserved,
  3844. OUT IAzClientContext **ppClientContext)
  3845. {
  3846. HRESULT hr;
  3847. DWORD dwErr;
  3848. AZ_HANDLE hClientContext = NULL;
  3849. BOOL bLockSet = FALSE;
  3850. #pragma warning ( push )
  3851. #pragma warning ( disable : 4312 ) // cast of long to handle
  3852. HANDLE hTokenHandle = (HANDLE)(ullTokenHandle);
  3853. hr = HandleReserved( &varReserved );
  3854. _JumpIfError(hr, error, "HandleReserved");
  3855. //
  3856. // init output
  3857. //
  3858. if ( ppClientContext == NULL ) {
  3859. hr = E_INVALIDARG;
  3860. _JumpIfError(hr, error, "ppClientContext");
  3861. }
  3862. *ppClientContext = NULL;
  3863. //
  3864. // grab the lock so that close application cannot interfere
  3865. //
  3866. AzpLockResourceShared( &AzGlCloseApplication );
  3867. bLockSet = TRUE;
  3868. if (!IsObjectUsable(m_hApplication, m_dwSN))
  3869. {
  3870. hr = AZ_HR_FROM_WIN32(ERROR_INVALID_HANDLE);
  3871. _JumpError(hr, error, "Owning application was closed.");
  3872. }
  3873. dwErr = AzInitializeContextFromToken(
  3874. m_hApplication,
  3875. hTokenHandle,
  3876. 0,
  3877. &hClientContext);
  3878. _JumpIfWinError(dwErr, &hr, error, "AzInitializeContextFromToken");
  3879. #pragma warning ( pop )
  3880. AZASSERT(NULL != hClientContext);
  3881. hr = myAzNewObject(
  3882. m_hApplication,
  3883. m_dwSN,
  3884. ENUM_AZ_CLIENTCONTEXT,
  3885. hClientContext,
  3886. NULL, //varReserved is not used here
  3887. (IUnknown**)ppClientContext);
  3888. _JumpIfError(hr, error, "myAzNewObject");
  3889. // let client context object to release the handle
  3890. hClientContext = NULL;
  3891. hr = S_OK;
  3892. error:
  3893. if (NULL != hClientContext)
  3894. {
  3895. AzCloseHandle(hClientContext, 0);
  3896. }
  3897. if ( bLockSet ) {
  3898. AzpUnlockResource( &AzGlCloseApplication );
  3899. }
  3900. return hr;
  3901. }
  3902. HRESULT
  3903. CAzApplication::InitializeClientContextFromName(
  3904. IN BSTR ClientName,
  3905. IN OPTIONAL BSTR DomainName,
  3906. IN VARIANT varReserved,
  3907. OUT IAzClientContext **ppClientContext)
  3908. {
  3909. HRESULT hr;
  3910. DWORD dwErr;
  3911. AZ_HANDLE hClientContext = NULL;
  3912. BOOL bLockSet = FALSE;
  3913. hr = HandleReserved( &varReserved );
  3914. _JumpIfError(hr, error, "HandleReserved");
  3915. //
  3916. // init output
  3917. //
  3918. if ( ppClientContext == NULL ) {
  3919. hr = E_INVALIDARG;
  3920. _JumpIfError(hr, error, "ppClientContext");
  3921. }
  3922. *ppClientContext = NULL;
  3923. //
  3924. // Grab the lock so that close application cannot interfere
  3925. //
  3926. AzpLockResourceShared( &AzGlCloseApplication );
  3927. bLockSet = TRUE;
  3928. if (!IsObjectUsable(m_hApplication, m_dwSN))
  3929. {
  3930. hr = AZ_HR_FROM_WIN32(ERROR_INVALID_HANDLE);
  3931. _JumpError(hr, error, "Owning application was closed.");
  3932. }
  3933. dwErr = AzInitializeContextFromName(
  3934. m_hApplication,
  3935. DomainName,
  3936. ClientName,
  3937. 0,
  3938. &hClientContext);
  3939. _JumpIfWinError(dwErr, &hr, error, "AzInitializeContextFromName");
  3940. AZASSERT(NULL != hClientContext);
  3941. hr = myAzNewObject(
  3942. m_hApplication,
  3943. m_dwSN,
  3944. ENUM_AZ_CLIENTCONTEXT,
  3945. hClientContext,
  3946. NULL, //varReserved is not used here
  3947. (IUnknown**)ppClientContext);
  3948. _JumpIfError(hr, error, "myAzNewObject");
  3949. // let client context object to release the handle
  3950. hClientContext = NULL;
  3951. hr = S_OK;
  3952. error:
  3953. if (NULL != hClientContext)
  3954. {
  3955. AzCloseHandle(hClientContext, 0);
  3956. }
  3957. if ( bLockSet ) {
  3958. AzpUnlockResource( &AzGlCloseApplication );
  3959. }
  3960. return hr;
  3961. }
  3962. HRESULT
  3963. CAzApplication::InitializeClientContextFromStringSid(
  3964. IN BSTR SidString,
  3965. IN LONG lOptions,
  3966. IN OPTIONAL VARIANT varReserved,
  3967. OUT IAzClientContext **ppClientContext
  3968. )
  3969. /*
  3970. This routine initializes a client context from a string SID.
  3971. The string SID may or may not be a valid Windows account (specified
  3972. in lOptions).
  3973. */
  3974. {
  3975. HRESULT hr;
  3976. DWORD dwErr;
  3977. AZ_HANDLE hClientContext = NULL;
  3978. BOOL bLockSet = FALSE;
  3979. hr = HandleReserved( &varReserved );
  3980. _JumpIfError(hr, error, "HandleReserved");
  3981. //
  3982. // init output
  3983. //
  3984. if ( ppClientContext == NULL ) {
  3985. hr = E_INVALIDARG;
  3986. _JumpIfError(hr, error, "ppClientContext");
  3987. }
  3988. *ppClientContext = NULL;
  3989. //
  3990. // grab the lock so that close application cannot interfere
  3991. //
  3992. AzpLockResourceShared( &AzGlCloseApplication );
  3993. bLockSet = TRUE;
  3994. if (!IsObjectUsable(m_hApplication, m_dwSN))
  3995. {
  3996. hr = AZ_HR_FROM_WIN32(ERROR_INVALID_HANDLE);
  3997. _JumpError(hr, error, "Owning application was closed.");
  3998. }
  3999. //
  4000. // call to core engine for initialization
  4001. //
  4002. dwErr = AzInitializeContextFromStringSid(
  4003. m_hApplication,
  4004. SidString,
  4005. lOptions,
  4006. &hClientContext);
  4007. _JumpIfWinError(dwErr, &hr, error, "AzInitializeContextFromStringSid");
  4008. AZASSERT(NULL != hClientContext);
  4009. //
  4010. // create the COM object
  4011. //
  4012. hr = myAzNewObject(
  4013. m_hApplication,
  4014. m_dwSN,
  4015. ENUM_AZ_CLIENTCONTEXT,
  4016. hClientContext,
  4017. NULL, //varReserved is not used here
  4018. (IUnknown**)ppClientContext);
  4019. _JumpIfError(hr, error, "myAzNewObject");
  4020. //
  4021. // let client context object to release the handle
  4022. //
  4023. hClientContext = NULL;
  4024. hr = S_OK;
  4025. error:
  4026. if (NULL != hClientContext)
  4027. {
  4028. AzCloseHandle(hClientContext, 0);
  4029. }
  4030. if ( bLockSet ) {
  4031. AzpUnlockResource( &AzGlCloseApplication );
  4032. }
  4033. return hr;
  4034. }
  4035. HRESULT
  4036. CAzApplication::AddPropertyItem(
  4037. IN LONG lPropId,
  4038. IN VARIANT varProp,
  4039. IN VARIANT varReserved )
  4040. {
  4041. return myAzAddPropertyItem(
  4042. m_hApplication,
  4043. m_dwSN,
  4044. m_hApplication,
  4045. lPropId,
  4046. varReserved,
  4047. &varProp);
  4048. }
  4049. HRESULT
  4050. CAzApplication::DeletePropertyItem(
  4051. IN LONG lPropId,
  4052. IN VARIANT varProp,
  4053. IN VARIANT varReserved )
  4054. {
  4055. return myAzDeletePropertyItem(
  4056. m_hApplication,
  4057. m_dwSN,
  4058. m_hApplication,
  4059. lPropId,
  4060. varReserved,
  4061. &varProp);
  4062. }
  4063. HRESULT
  4064. CAzApplication::Submit(
  4065. IN LONG lFlags,
  4066. IN VARIANT varReserved)
  4067. {
  4068. HRESULT hr;
  4069. DWORD dwErr;
  4070. //
  4071. // Grab the lock so that close application cannot interfere
  4072. //
  4073. AzpLockResourceShared( &AzGlCloseApplication );
  4074. if (NULL == m_hApplication)
  4075. {
  4076. hr = E_INVALIDARG;
  4077. _JumpError(hr, error, "Null AzApplication");
  4078. }
  4079. else if (!IsObjectUsable(m_hApplication, m_dwSN))
  4080. {
  4081. hr = AZ_HR_FROM_WIN32(ERROR_INVALID_HANDLE);
  4082. _JumpError(hr, error, "Application was closed.");
  4083. }
  4084. hr = HandleReserved( &varReserved );
  4085. _JumpIfError(hr, error, "HandleReserved");
  4086. dwErr = AzSubmit(m_hApplication, lFlags, 0);
  4087. _JumpIfWinError(dwErr, &hr, error, "AzSubmit");
  4088. hr = S_OK;
  4089. error:
  4090. AzpUnlockResource( &AzGlCloseApplication );
  4091. return hr;
  4092. }
  4093. HRESULT
  4094. CAzApplication::get_DelegatedPolicyUsers(
  4095. OUT VARIANT *pvarProp)
  4096. {
  4097. CComVariant vtemp;
  4098. return myAzGetProperty(
  4099. m_hApplication,
  4100. m_dwSN,
  4101. m_hApplication,
  4102. AZ_PROP_DELEGATED_POLICY_USERS,
  4103. vtemp,
  4104. pvarProp);
  4105. }
  4106. HRESULT
  4107. CAzApplication::get_DelegatedPolicyUsersName(
  4108. OUT VARIANT *pvarProp)
  4109. {
  4110. CComVariant vtemp;
  4111. return myAzGetProperty(
  4112. m_hApplication,
  4113. m_dwSN,
  4114. m_hApplication,
  4115. AZ_PROP_DELEGATED_POLICY_USERS_NAME,
  4116. vtemp,
  4117. pvarProp);
  4118. }
  4119. HRESULT
  4120. CAzApplication::AddDelegatedPolicyUser(
  4121. IN BSTR bstrDelegatedPolicyUser,
  4122. IN VARIANT varReserved)
  4123. {
  4124. return myAzAddOrDeleteUser(
  4125. m_hApplication,
  4126. m_dwSN,
  4127. m_hApplication,
  4128. AZ_PROP_DELEGATED_POLICY_USERS,
  4129. varReserved,
  4130. bstrDelegatedPolicyUser,
  4131. TRUE);
  4132. }
  4133. HRESULT
  4134. CAzApplication::AddDelegatedPolicyUserName(
  4135. IN BSTR bstrDelegatedPolicyUser,
  4136. IN VARIANT varReserved)
  4137. {
  4138. return myAzAddOrDeleteUser(
  4139. m_hApplication,
  4140. m_dwSN,
  4141. m_hApplication,
  4142. AZ_PROP_DELEGATED_POLICY_USERS_NAME,
  4143. varReserved,
  4144. bstrDelegatedPolicyUser,
  4145. TRUE);
  4146. }
  4147. HRESULT
  4148. CAzApplication::DeleteDelegatedPolicyUser(
  4149. IN BSTR bstrDelegatedPolicyUser,
  4150. IN VARIANT varReserved)
  4151. {
  4152. return myAzAddOrDeleteUser(
  4153. m_hApplication,
  4154. m_dwSN,
  4155. m_hApplication,
  4156. AZ_PROP_DELEGATED_POLICY_USERS,
  4157. varReserved,
  4158. bstrDelegatedPolicyUser,
  4159. FALSE);
  4160. }
  4161. HRESULT
  4162. CAzApplication::DeleteDelegatedPolicyUserName(
  4163. IN BSTR bstrDelegatedPolicyUser,
  4164. IN VARIANT varReserved)
  4165. {
  4166. return myAzAddOrDeleteUser(
  4167. m_hApplication,
  4168. m_dwSN,
  4169. m_hApplication,
  4170. AZ_PROP_DELEGATED_POLICY_USERS_NAME,
  4171. varReserved,
  4172. bstrDelegatedPolicyUser,
  4173. FALSE);
  4174. }
  4175. /////////////////////////
  4176. //CAzApplications
  4177. /////////////////////////
  4178. HRESULT
  4179. CAzApplications::_Init(
  4180. IN OPTIONAL VARIANT *pvarReserved,
  4181. IN AZ_HANDLE hParent)
  4182. {
  4183. HRESULT hr;
  4184. ULONG lContext = 0;
  4185. IAzApplication * pIApp = NULL;
  4186. while (S_OK == (hr = myAzNextObject(
  4187. NULL, // this must be owned by the store, not an application
  4188. 0, // doesn't matter if not owned by an app
  4189. AzApplicationEnum,
  4190. pvarReserved,
  4191. ENUM_AZ_APPLICATION,
  4192. hParent,
  4193. &lContext,
  4194. (IUnknown**)&pIApp)))
  4195. {
  4196. AZASSERT(NULL != (PVOID)pIApp);
  4197. //
  4198. // myAddItemToMap will release the pIApp
  4199. //
  4200. hr = myAddItemToMap<IAzApplication>(&m_coll, &pIApp);
  4201. _JumpIfError(hr, error, "myAddItemToMap");
  4202. }
  4203. if (AZ_HRESULT(ERROR_NO_MORE_ITEMS) != hr)
  4204. {
  4205. _JumpError(hr, error, "myAzNextObject");
  4206. }
  4207. hr = S_OK;
  4208. error:
  4209. return hr;
  4210. }
  4211. /////////////////////////
  4212. //CAzOperation
  4213. /////////////////////////
  4214. CAzOperation::CAzOperation()
  4215. {
  4216. //init
  4217. __try {
  4218. InitializeCriticalSection(&m_cs);
  4219. } __except(EXCEPTION_EXECUTE_HANDLER) {}
  4220. m_hOperation = NULL;
  4221. }
  4222. CAzOperation::~CAzOperation()
  4223. {
  4224. if (NULL != m_hOperation)
  4225. {
  4226. AzpLockResourceShared( &AzGlCloseApplication );
  4227. if (IsObjectUsable(m_hOwnerApp, m_dwOwnerAppSN))
  4228. {
  4229. AzCloseHandle(m_hOperation, 0);
  4230. }
  4231. AzpUnlockResource( &AzGlCloseApplication );
  4232. }
  4233. DeleteCriticalSection(&m_cs);
  4234. }
  4235. HRESULT
  4236. CAzOperation::_Init(
  4237. IN AZ_HANDLE hOwnerApp,
  4238. IN AZ_HANDLE hHandle)
  4239. {
  4240. HRESULT hr;
  4241. EnterCriticalSection(&m_cs);
  4242. //init once
  4243. AZASSERT(NULL != hHandle);
  4244. AZASSERT(NULL == m_hOperation);
  4245. m_hOperation = hHandle;
  4246. m_hOwnerApp = hOwnerApp;
  4247. if (hOwnerApp != NULL)
  4248. {
  4249. //
  4250. // Grab the CloseApplication lock to maintain order
  4251. //
  4252. AzpLockResourceShared( &AzGlCloseApplication );
  4253. m_dwOwnerAppSN = AzpRetrieveApplicationSequenceNumber(hOwnerApp);
  4254. AzpUnlockResource( &AzGlCloseApplication );
  4255. }
  4256. else
  4257. {
  4258. m_dwOwnerAppSN = 0;
  4259. }
  4260. hr = S_OK;
  4261. //error:
  4262. LeaveCriticalSection(&m_cs);
  4263. return hr;
  4264. }
  4265. HRESULT
  4266. CAzOperation::get_Description(
  4267. OUT BSTR __RPC_FAR *pbstrDescription)
  4268. {
  4269. return myGetBstrProperty(
  4270. m_hOwnerApp,
  4271. m_dwOwnerAppSN,
  4272. m_hOperation,
  4273. AZ_PROP_DESCRIPTION,
  4274. pbstrDescription);
  4275. }
  4276. HRESULT
  4277. CAzOperation::put_Description(
  4278. IN BSTR bstrDescription)
  4279. {
  4280. return mySetBstrProperty(
  4281. m_hOwnerApp,
  4282. m_dwOwnerAppSN,
  4283. m_hOperation,
  4284. AZ_PROP_DESCRIPTION,
  4285. bstrDescription);
  4286. }
  4287. HRESULT
  4288. CAzOperation::get_Name(
  4289. OUT BSTR __RPC_FAR *pbstrName)
  4290. {
  4291. return myGetBstrProperty(
  4292. m_hOwnerApp,
  4293. m_dwOwnerAppSN,
  4294. m_hOperation,
  4295. AZ_PROP_NAME,
  4296. pbstrName);
  4297. }
  4298. HRESULT
  4299. CAzOperation::put_Name(
  4300. IN BSTR bstrName)
  4301. {
  4302. return mySetBstrProperty(
  4303. m_hOwnerApp,
  4304. m_dwOwnerAppSN,
  4305. m_hOperation,
  4306. AZ_PROP_NAME,
  4307. bstrName);
  4308. }
  4309. HRESULT
  4310. CAzOperation::get_ApplicationData(
  4311. OUT BSTR __RPC_FAR *pbstrApplicationData)
  4312. {
  4313. return myGetBstrProperty(
  4314. m_hOwnerApp,
  4315. m_dwOwnerAppSN,
  4316. m_hOperation,
  4317. AZ_PROP_APPLICATION_DATA,
  4318. pbstrApplicationData);
  4319. }
  4320. HRESULT
  4321. CAzOperation::put_ApplicationData(
  4322. IN BSTR bstrApplicationData)
  4323. {
  4324. return mySetBstrProperty(
  4325. m_hOwnerApp,
  4326. m_dwOwnerAppSN,
  4327. m_hOperation,
  4328. AZ_PROP_APPLICATION_DATA,
  4329. bstrApplicationData);
  4330. }
  4331. HRESULT
  4332. CAzOperation::get_Writable(
  4333. OUT BOOL *pfProp)
  4334. {
  4335. return myGetBoolProperty(
  4336. m_hOwnerApp,
  4337. m_dwOwnerAppSN,
  4338. m_hOperation,
  4339. AZ_PROP_WRITABLE,
  4340. pfProp);
  4341. }
  4342. HRESULT
  4343. CAzOperation::get_OperationID(
  4344. OUT LONG *plProp)
  4345. {
  4346. return myGetLongProperty(
  4347. m_hOwnerApp,
  4348. m_dwOwnerAppSN,
  4349. m_hOperation,
  4350. AZ_PROP_OPERATION_ID,
  4351. plProp);
  4352. }
  4353. HRESULT
  4354. CAzOperation::put_OperationID(
  4355. IN LONG lProp)
  4356. {
  4357. return mySetLongProperty(
  4358. m_hOwnerApp,
  4359. m_dwOwnerAppSN,
  4360. m_hOperation,
  4361. AZ_PROP_OPERATION_ID,
  4362. lProp);
  4363. }
  4364. HRESULT
  4365. CAzOperation::GetProperty(
  4366. IN LONG lPropId,
  4367. IN VARIANT varReserved,
  4368. OUT VARIANT *pvarProp)
  4369. {
  4370. return myAzGetProperty(
  4371. m_hOwnerApp,
  4372. m_dwOwnerAppSN,
  4373. m_hOperation,
  4374. lPropId,
  4375. varReserved,
  4376. pvarProp);
  4377. }
  4378. HRESULT
  4379. CAzOperation::SetProperty(
  4380. IN LONG lPropId,
  4381. IN VARIANT varProp,
  4382. IN VARIANT varReserved )
  4383. {
  4384. return myAzSetProperty(
  4385. m_hOwnerApp,
  4386. m_dwOwnerAppSN,
  4387. m_hOperation,
  4388. lPropId,
  4389. varReserved,
  4390. &varProp);
  4391. }
  4392. HRESULT
  4393. CAzOperation::Submit(
  4394. IN LONG lFlags,
  4395. IN VARIANT varReserved)
  4396. {
  4397. HRESULT hr;
  4398. DWORD dwErr;
  4399. //
  4400. // grab the lock so that close application does not
  4401. // interfere
  4402. //
  4403. AzpLockResourceShared( &AzGlCloseApplication );
  4404. if (NULL == m_hOperation)
  4405. {
  4406. hr = E_INVALIDARG;
  4407. _JumpError(hr, error, "Null AzOperation");
  4408. }
  4409. else if (!IsObjectUsable(m_hOwnerApp, m_dwOwnerAppSN))
  4410. {
  4411. hr = AZ_HR_FROM_WIN32(ERROR_INVALID_HANDLE);
  4412. _JumpError(hr, error, "Owning application was closed.");
  4413. }
  4414. hr = HandleReserved( &varReserved );
  4415. _JumpIfError(hr, error, "HandleReserved");
  4416. dwErr = AzSubmit(m_hOperation, lFlags, 0);
  4417. _JumpIfWinError(dwErr, &hr, error, "AzSubmit");
  4418. hr = S_OK;
  4419. error:
  4420. AzpUnlockResource( &AzGlCloseApplication );
  4421. return hr;
  4422. }
  4423. /////////////////////////
  4424. //CAzOperations
  4425. /////////////////////////
  4426. HRESULT
  4427. CAzOperations::_Init(
  4428. IN AZ_HANDLE hOwnerApp,
  4429. IN OPTIONAL VARIANT *pvarReserved,
  4430. IN AZ_HANDLE hParent)
  4431. {
  4432. HRESULT hr;
  4433. ULONG lContext = 0;
  4434. IAzOperation * pIOp = NULL;
  4435. m_hOwnerApp = hOwnerApp;
  4436. if (hOwnerApp != NULL)
  4437. {
  4438. AzpLockResourceShared( &AzGlCloseApplication );
  4439. m_dwOwnerAppSN = AzpRetrieveApplicationSequenceNumber(hOwnerApp);
  4440. AzpUnlockResource( &AzGlCloseApplication );
  4441. }
  4442. else
  4443. {
  4444. m_dwOwnerAppSN = 0;
  4445. }
  4446. while (S_OK == (hr = myAzNextObject(
  4447. m_hOwnerApp,
  4448. m_dwOwnerAppSN,
  4449. AzOperationEnum,
  4450. pvarReserved,
  4451. ENUM_AZ_OPERATION,
  4452. hParent,
  4453. &lContext,
  4454. (IUnknown**)&pIOp)))
  4455. {
  4456. AZASSERT(NULL != (PVOID)pIOp);
  4457. //
  4458. // myAddItemToMap will release the pIOp
  4459. //
  4460. hr = myAddItemToMap<IAzOperation>(&m_coll, &pIOp);
  4461. _JumpIfError(hr, error, "myAddItemToMap");
  4462. }
  4463. if (AZ_HRESULT(ERROR_NO_MORE_ITEMS) != hr)
  4464. {
  4465. _JumpError(hr, error, "myAzNextObject");
  4466. }
  4467. hr = S_OK;
  4468. error:
  4469. return hr;
  4470. }
  4471. /////////////////////////
  4472. //CAzTask
  4473. /////////////////////////
  4474. CAzTask::CAzTask()
  4475. {
  4476. //init
  4477. __try {
  4478. InitializeCriticalSection(&m_cs);
  4479. } __except(EXCEPTION_EXECUTE_HANDLER) {}
  4480. m_hTask = NULL;
  4481. }
  4482. CAzTask::~CAzTask()
  4483. {
  4484. if (NULL != m_hTask)
  4485. {
  4486. //
  4487. // Grab the lock so that Close application does not interfere
  4488. //
  4489. AzpLockResourceShared( &AzGlCloseApplication );
  4490. if (IsObjectUsable(m_hOwnerApp, m_dwOwnerAppSN))
  4491. {
  4492. AzCloseHandle(m_hTask, 0);
  4493. }
  4494. AzpUnlockResource( &AzGlCloseApplication );
  4495. }
  4496. DeleteCriticalSection(&m_cs);
  4497. }
  4498. HRESULT
  4499. CAzTask::_Init(
  4500. IN AZ_HANDLE hOwnerApp,
  4501. IN AZ_HANDLE hHandle)
  4502. {
  4503. HRESULT hr;
  4504. EnterCriticalSection(&m_cs);
  4505. //init once
  4506. AZASSERT(NULL != hHandle);
  4507. AZASSERT(NULL == m_hTask);
  4508. m_hTask = hHandle;
  4509. m_hOwnerApp = hOwnerApp;
  4510. if (hOwnerApp != NULL)
  4511. {
  4512. //
  4513. // Grab lock top maintain order
  4514. //
  4515. AzpLockResourceShared( &AzGlCloseApplication );
  4516. m_dwOwnerAppSN = AzpRetrieveApplicationSequenceNumber(hOwnerApp);
  4517. AzpUnlockResource( &AzGlCloseApplication );
  4518. }
  4519. else
  4520. {
  4521. m_dwOwnerAppSN = 0;
  4522. }
  4523. hr = S_OK;
  4524. //error:
  4525. LeaveCriticalSection(&m_cs);
  4526. return hr;
  4527. }
  4528. HRESULT
  4529. CAzTask::get_Description(
  4530. OUT BSTR __RPC_FAR *pbstrDescription)
  4531. {
  4532. return myGetBstrProperty(
  4533. m_hOwnerApp,
  4534. m_dwOwnerAppSN,
  4535. m_hTask,
  4536. AZ_PROP_DESCRIPTION,
  4537. pbstrDescription);
  4538. }
  4539. HRESULT
  4540. CAzTask::put_Description(
  4541. IN BSTR bstrDescription)
  4542. {
  4543. return mySetBstrProperty(
  4544. m_hOwnerApp,
  4545. m_dwOwnerAppSN,
  4546. m_hTask,
  4547. AZ_PROP_DESCRIPTION,
  4548. bstrDescription);
  4549. }
  4550. HRESULT
  4551. CAzTask::get_Name(
  4552. OUT BSTR __RPC_FAR *pbstrName)
  4553. {
  4554. return myGetBstrProperty(
  4555. m_hOwnerApp,
  4556. m_dwOwnerAppSN,
  4557. m_hTask,
  4558. AZ_PROP_NAME,
  4559. pbstrName);
  4560. }
  4561. HRESULT
  4562. CAzTask::put_Name(
  4563. IN BSTR bstrName)
  4564. {
  4565. return mySetBstrProperty(
  4566. m_hOwnerApp,
  4567. m_dwOwnerAppSN,
  4568. m_hTask,
  4569. AZ_PROP_NAME,
  4570. bstrName);
  4571. }
  4572. HRESULT
  4573. CAzTask::get_ApplicationData(
  4574. OUT BSTR __RPC_FAR *pbstrApplicationData)
  4575. {
  4576. return myGetBstrProperty(
  4577. m_hOwnerApp,
  4578. m_dwOwnerAppSN,
  4579. m_hTask,
  4580. AZ_PROP_APPLICATION_DATA,
  4581. pbstrApplicationData);
  4582. }
  4583. HRESULT
  4584. CAzTask::put_ApplicationData(
  4585. IN BSTR bstrApplicationData)
  4586. {
  4587. return mySetBstrProperty(
  4588. m_hOwnerApp,
  4589. m_dwOwnerAppSN,
  4590. m_hTask,
  4591. AZ_PROP_APPLICATION_DATA,
  4592. bstrApplicationData);
  4593. }
  4594. HRESULT STDMETHODCALLTYPE
  4595. CAzTask::get_BizRule(
  4596. OUT BSTR *pbstrProp)
  4597. {
  4598. return myGetBstrProperty(
  4599. m_hOwnerApp,
  4600. m_dwOwnerAppSN,
  4601. m_hTask,
  4602. AZ_PROP_TASK_BIZRULE,
  4603. pbstrProp);
  4604. }
  4605. HRESULT STDMETHODCALLTYPE
  4606. CAzTask::put_BizRule(
  4607. IN BSTR bstrProp)
  4608. {
  4609. return mySetBstrProperty(
  4610. m_hOwnerApp,
  4611. m_dwOwnerAppSN,
  4612. m_hTask,
  4613. AZ_PROP_TASK_BIZRULE,
  4614. bstrProp);
  4615. }
  4616. HRESULT STDMETHODCALLTYPE
  4617. CAzTask::get_BizRuleLanguage(
  4618. OUT BSTR *pbstrProp)
  4619. {
  4620. return myGetBstrProperty(
  4621. m_hOwnerApp,
  4622. m_dwOwnerAppSN,
  4623. m_hTask,
  4624. AZ_PROP_TASK_BIZRULE_LANGUAGE,
  4625. pbstrProp);
  4626. }
  4627. HRESULT STDMETHODCALLTYPE
  4628. CAzTask::put_BizRuleLanguage(
  4629. IN BSTR bstrProp)
  4630. {
  4631. return mySetBstrProperty(
  4632. m_hOwnerApp,
  4633. m_dwOwnerAppSN,
  4634. m_hTask,
  4635. AZ_PROP_TASK_BIZRULE_LANGUAGE,
  4636. bstrProp);
  4637. }
  4638. HRESULT STDMETHODCALLTYPE
  4639. CAzTask::get_BizRuleImportedPath(
  4640. OUT BSTR *pbstrProp)
  4641. {
  4642. return myGetBstrProperty(
  4643. m_hOwnerApp,
  4644. m_dwOwnerAppSN,
  4645. m_hTask,
  4646. AZ_PROP_TASK_BIZRULE_IMPORTED_PATH,
  4647. pbstrProp);
  4648. }
  4649. HRESULT STDMETHODCALLTYPE
  4650. CAzTask::put_BizRuleImportedPath(
  4651. IN BSTR bstrProp)
  4652. {
  4653. return mySetBstrProperty(
  4654. m_hOwnerApp,
  4655. m_dwOwnerAppSN,
  4656. m_hTask,
  4657. AZ_PROP_TASK_BIZRULE_IMPORTED_PATH,
  4658. bstrProp);
  4659. }
  4660. HRESULT STDMETHODCALLTYPE
  4661. CAzTask::get_IsRoleDefinition(
  4662. OUT BOOL *pfProp)
  4663. {
  4664. return myGetBoolProperty(
  4665. m_hOwnerApp,
  4666. m_dwOwnerAppSN,
  4667. m_hTask,
  4668. AZ_PROP_TASK_IS_ROLE_DEFINITION,
  4669. pfProp);
  4670. }
  4671. HRESULT STDMETHODCALLTYPE
  4672. CAzTask::put_IsRoleDefinition(
  4673. IN BOOL fProp)
  4674. {
  4675. return mySetBoolProperty(
  4676. m_hOwnerApp,
  4677. m_dwOwnerAppSN,
  4678. m_hTask,
  4679. AZ_PROP_TASK_IS_ROLE_DEFINITION,
  4680. fProp);
  4681. }
  4682. HRESULT STDMETHODCALLTYPE
  4683. CAzTask::get_Operations(
  4684. OUT VARIANT *pvarProp)
  4685. {
  4686. CComVariant vtemp;
  4687. return myAzGetProperty(
  4688. m_hOwnerApp,
  4689. m_dwOwnerAppSN,
  4690. m_hTask,
  4691. AZ_PROP_TASK_OPERATIONS,
  4692. vtemp,
  4693. pvarProp);
  4694. }
  4695. HRESULT STDMETHODCALLTYPE
  4696. CAzTask::get_Tasks(
  4697. OUT VARIANT *pvarProp)
  4698. {
  4699. CComVariant vtemp;
  4700. return myAzGetProperty(
  4701. m_hOwnerApp,
  4702. m_dwOwnerAppSN,
  4703. m_hTask,
  4704. AZ_PROP_TASK_TASKS,
  4705. vtemp,
  4706. pvarProp);
  4707. }
  4708. HRESULT CAzTask::AddOperation(
  4709. IN BSTR bstrOp,
  4710. IN VARIANT varReserved
  4711. )
  4712. {
  4713. HRESULT hr;
  4714. hr = myAzAddPropertyItemBstr(
  4715. m_hOwnerApp,
  4716. m_dwOwnerAppSN,
  4717. m_hTask,
  4718. AZ_PROP_TASK_OPERATIONS,
  4719. varReserved,
  4720. bstrOp);
  4721. return hr;
  4722. }
  4723. HRESULT CAzTask::DeleteOperation(
  4724. IN BSTR bstrOp,
  4725. IN VARIANT varReserved
  4726. )
  4727. {
  4728. HRESULT hr;
  4729. hr = myAzDeletePropertyItemBstr(
  4730. m_hOwnerApp,
  4731. m_dwOwnerAppSN,
  4732. m_hTask,
  4733. AZ_PROP_TASK_OPERATIONS,
  4734. varReserved,
  4735. bstrOp);
  4736. return hr;
  4737. }
  4738. HRESULT CAzTask::AddTask(
  4739. IN BSTR bstrTask,
  4740. IN VARIANT varReserved
  4741. )
  4742. {
  4743. HRESULT hr;
  4744. hr = myAzAddPropertyItemBstr(
  4745. m_hOwnerApp,
  4746. m_dwOwnerAppSN,
  4747. m_hTask,
  4748. AZ_PROP_TASK_TASKS,
  4749. varReserved,
  4750. bstrTask);
  4751. return hr;
  4752. }
  4753. HRESULT CAzTask::DeleteTask(
  4754. IN BSTR bstrTask,
  4755. IN VARIANT varReserved
  4756. )
  4757. {
  4758. HRESULT hr;
  4759. hr = myAzDeletePropertyItemBstr(
  4760. m_hOwnerApp,
  4761. m_dwOwnerAppSN,
  4762. m_hTask,
  4763. AZ_PROP_TASK_TASKS,
  4764. varReserved,
  4765. bstrTask);
  4766. return hr;
  4767. }
  4768. HRESULT
  4769. CAzTask::get_Writable(
  4770. OUT BOOL *pfProp)
  4771. {
  4772. return myGetBoolProperty(
  4773. m_hOwnerApp,
  4774. m_dwOwnerAppSN,
  4775. m_hTask,
  4776. AZ_PROP_WRITABLE,
  4777. pfProp);
  4778. }
  4779. HRESULT
  4780. CAzTask::GetProperty(
  4781. IN LONG lPropId,
  4782. IN VARIANT varReserved,
  4783. OUT VARIANT *pvarProp)
  4784. {
  4785. return myAzGetProperty(
  4786. m_hOwnerApp,
  4787. m_dwOwnerAppSN,
  4788. m_hTask,
  4789. lPropId,
  4790. varReserved,
  4791. pvarProp);
  4792. }
  4793. HRESULT
  4794. CAzTask::SetProperty(
  4795. IN LONG lPropId,
  4796. IN VARIANT varProp,
  4797. IN VARIANT varReserved )
  4798. {
  4799. return myAzSetProperty(
  4800. m_hOwnerApp,
  4801. m_dwOwnerAppSN,
  4802. m_hTask,
  4803. lPropId,
  4804. varReserved,
  4805. &varProp);
  4806. }
  4807. HRESULT
  4808. CAzTask::AddPropertyItem(
  4809. IN LONG lPropId,
  4810. IN VARIANT varProp,
  4811. IN VARIANT varReserved )
  4812. {
  4813. return myAzAddPropertyItem(
  4814. m_hOwnerApp,
  4815. m_dwOwnerAppSN,
  4816. m_hTask,
  4817. lPropId,
  4818. varReserved,
  4819. &varProp);
  4820. }
  4821. HRESULT
  4822. CAzTask::DeletePropertyItem(
  4823. IN LONG lPropId,
  4824. IN VARIANT varProp,
  4825. IN VARIANT varReserved )
  4826. {
  4827. return myAzDeletePropertyItem(
  4828. m_hOwnerApp,
  4829. m_dwOwnerAppSN,
  4830. m_hTask,
  4831. lPropId,
  4832. varReserved,
  4833. &varProp);
  4834. }
  4835. HRESULT
  4836. CAzTask::Submit(
  4837. IN LONG lFlags,
  4838. IN VARIANT varReserved)
  4839. {
  4840. HRESULT hr;
  4841. DWORD dwErr;
  4842. //
  4843. // Grab the lock so that close application does not
  4844. // interfere
  4845. //
  4846. AzpLockResourceShared( &AzGlCloseApplication );
  4847. if (NULL == m_hTask)
  4848. {
  4849. hr = E_INVALIDARG;
  4850. _JumpError(hr, error, "Null AzTask");
  4851. }
  4852. else if (!IsObjectUsable(m_hOwnerApp, m_dwOwnerAppSN))
  4853. {
  4854. hr = AZ_HR_FROM_WIN32(ERROR_INVALID_HANDLE);
  4855. _JumpError(hr, error, "Owning application was closed.");
  4856. }
  4857. hr = HandleReserved( &varReserved );
  4858. _JumpIfError(hr, error, "HandleReserved");
  4859. dwErr = AzSubmit(m_hTask, lFlags, 0);
  4860. _JumpIfWinError(dwErr, &hr, error, "AzSubmit");
  4861. hr = S_OK;
  4862. error:
  4863. AzpUnlockResource( &AzGlCloseApplication );
  4864. return hr;
  4865. }
  4866. /////////////////////////
  4867. //CAzTasks
  4868. /////////////////////////
  4869. HRESULT
  4870. CAzTasks::_Init(
  4871. IN AZ_HANDLE hOwnerApp,
  4872. IN OPTIONAL VARIANT *pvarReserved,
  4873. IN AZ_HANDLE hParent)
  4874. {
  4875. HRESULT hr;
  4876. ULONG lContext = 0;
  4877. IAzTask * pITask = NULL;
  4878. m_hOwnerApp = hOwnerApp;
  4879. if (hOwnerApp != NULL)
  4880. {
  4881. AzpLockResourceShared( &AzGlCloseApplication );
  4882. m_dwOwnerAppSN = AzpRetrieveApplicationSequenceNumber(hOwnerApp);
  4883. AzpUnlockResource( &AzGlCloseApplication );
  4884. }
  4885. else
  4886. {
  4887. m_dwOwnerAppSN = 0;
  4888. }
  4889. while (S_OK == (hr = myAzNextObject(
  4890. m_hOwnerApp,
  4891. m_dwOwnerAppSN,
  4892. AzTaskEnum,
  4893. pvarReserved,
  4894. ENUM_AZ_TASK,
  4895. hParent,
  4896. &lContext,
  4897. (IUnknown**)&pITask)))
  4898. {
  4899. AZASSERT(NULL != (PVOID)pITask);
  4900. //
  4901. // myAddItemToMap will release the pITask
  4902. //
  4903. hr = myAddItemToMap<IAzTask>(&m_coll, &pITask);
  4904. _JumpIfError(hr, error, "myAddItemToMap");
  4905. }
  4906. if (AZ_HRESULT(ERROR_NO_MORE_ITEMS) != hr)
  4907. {
  4908. _JumpError(hr, error, "myAzNextObject");
  4909. }
  4910. hr = S_OK;
  4911. error:
  4912. return hr;
  4913. }
  4914. /////////////////////////
  4915. //CAzScope
  4916. /////////////////////////
  4917. CAzScope::CAzScope()
  4918. {
  4919. //init
  4920. __try {
  4921. InitializeCriticalSection(&m_cs);
  4922. } __except(EXCEPTION_EXECUTE_HANDLER) {}
  4923. m_hScope = NULL;
  4924. }
  4925. CAzScope::~CAzScope()
  4926. {
  4927. if (NULL != m_hScope)
  4928. {
  4929. //
  4930. // Grab the lock so that close application does not
  4931. // interfere
  4932. //
  4933. AzpLockResourceShared( &AzGlCloseApplication );
  4934. if (IsObjectUsable(m_hOwnerApp, m_dwOwnerAppSN))
  4935. {
  4936. AzCloseHandle(m_hScope, 0);
  4937. }
  4938. AzpUnlockResource( &AzGlCloseApplication );
  4939. }
  4940. DeleteCriticalSection(&m_cs);
  4941. }
  4942. HRESULT
  4943. CAzScope::_Init(
  4944. IN AZ_HANDLE hOwnerApp,
  4945. IN AZ_HANDLE hHandle)
  4946. {
  4947. HRESULT hr;
  4948. EnterCriticalSection(&m_cs);
  4949. //init once
  4950. AZASSERT(NULL != hHandle);
  4951. AZASSERT(NULL == m_hScope);
  4952. m_hScope = hHandle;
  4953. m_hOwnerApp = hOwnerApp;
  4954. if (hOwnerApp != NULL)
  4955. {
  4956. //
  4957. // Grab lock to maintain order
  4958. //
  4959. AzpLockResourceShared( &AzGlCloseApplication );
  4960. m_dwOwnerAppSN = AzpRetrieveApplicationSequenceNumber(hOwnerApp);
  4961. AzpUnlockResource( &AzGlCloseApplication );
  4962. }
  4963. else
  4964. {
  4965. m_dwOwnerAppSN = 0;
  4966. }
  4967. hr = S_OK;
  4968. //error:
  4969. LeaveCriticalSection(&m_cs);
  4970. return hr;
  4971. }
  4972. HRESULT
  4973. CAzScope::get_Description(
  4974. OUT BSTR __RPC_FAR *pbstrDescription)
  4975. {
  4976. return myGetBstrProperty(
  4977. m_hOwnerApp,
  4978. m_dwOwnerAppSN,
  4979. m_hScope,
  4980. AZ_PROP_DESCRIPTION,
  4981. pbstrDescription);
  4982. }
  4983. HRESULT
  4984. CAzScope::put_Description(
  4985. IN BSTR bstrDescription)
  4986. {
  4987. return mySetBstrProperty(
  4988. m_hOwnerApp,
  4989. m_dwOwnerAppSN,
  4990. m_hScope,
  4991. AZ_PROP_DESCRIPTION,
  4992. bstrDescription);
  4993. }
  4994. HRESULT
  4995. CAzScope::get_Name(
  4996. OUT BSTR __RPC_FAR *pbstrName)
  4997. {
  4998. return myGetBstrProperty(
  4999. m_hOwnerApp,
  5000. m_dwOwnerAppSN,
  5001. m_hScope,
  5002. AZ_PROP_NAME,
  5003. pbstrName);
  5004. }
  5005. HRESULT
  5006. CAzScope::put_Name(
  5007. IN BSTR bstrName)
  5008. {
  5009. return mySetBstrProperty(
  5010. m_hOwnerApp,
  5011. m_dwOwnerAppSN,
  5012. m_hScope,
  5013. AZ_PROP_NAME,
  5014. bstrName);
  5015. }
  5016. HRESULT
  5017. CAzScope::get_ApplicationData(
  5018. OUT BSTR __RPC_FAR *pbstrApplicationData)
  5019. {
  5020. return myGetBstrProperty(
  5021. m_hOwnerApp,
  5022. m_dwOwnerAppSN,
  5023. m_hScope,
  5024. AZ_PROP_APPLICATION_DATA,
  5025. pbstrApplicationData);
  5026. }
  5027. HRESULT
  5028. CAzScope::put_ApplicationData(
  5029. IN BSTR bstrApplicationData)
  5030. {
  5031. return mySetBstrProperty(
  5032. m_hOwnerApp,
  5033. m_dwOwnerAppSN,
  5034. m_hScope,
  5035. AZ_PROP_APPLICATION_DATA,
  5036. bstrApplicationData);
  5037. }
  5038. HRESULT
  5039. CAzScope::get_Writable(
  5040. OUT BOOL *pfProp)
  5041. {
  5042. return myGetBoolProperty(
  5043. m_hOwnerApp,
  5044. m_dwOwnerAppSN,
  5045. m_hScope,
  5046. AZ_PROP_WRITABLE,
  5047. pfProp);
  5048. }
  5049. HRESULT
  5050. CAzScope::GetProperty(
  5051. IN LONG lPropId,
  5052. IN VARIANT varReserved,
  5053. OUT VARIANT *pvarProp)
  5054. {
  5055. return myAzGetProperty(
  5056. m_hOwnerApp,
  5057. m_dwOwnerAppSN,
  5058. m_hScope,
  5059. lPropId,
  5060. varReserved,
  5061. pvarProp);
  5062. }
  5063. HRESULT
  5064. CAzScope::AddPropertyItem(
  5065. IN LONG lPropId,
  5066. IN VARIANT varProp,
  5067. IN VARIANT varReserved )
  5068. {
  5069. return myAzAddPropertyItem(
  5070. m_hOwnerApp,
  5071. m_dwOwnerAppSN,
  5072. m_hScope,
  5073. lPropId,
  5074. varReserved,
  5075. &varProp);
  5076. }
  5077. HRESULT
  5078. CAzScope::DeletePropertyItem(
  5079. IN LONG lPropId,
  5080. IN VARIANT varProp,
  5081. IN VARIANT varReserved )
  5082. {
  5083. return myAzDeletePropertyItem(
  5084. m_hOwnerApp,
  5085. m_dwOwnerAppSN,
  5086. m_hScope,
  5087. lPropId,
  5088. varReserved,
  5089. &varProp);
  5090. }
  5091. HRESULT
  5092. CAzScope::get_PolicyAdministrators(
  5093. OUT VARIANT *pvarProp)
  5094. {
  5095. CComVariant vtemp;
  5096. return myAzGetProperty(
  5097. m_hOwnerApp,
  5098. m_dwOwnerAppSN,
  5099. m_hScope,
  5100. AZ_PROP_POLICY_ADMINS,
  5101. vtemp,
  5102. pvarProp);
  5103. }
  5104. HRESULT
  5105. CAzScope::get_PolicyAdministratorsName(
  5106. OUT VARIANT* pvarAdminsName
  5107. )
  5108. {
  5109. CComVariant vtemp;
  5110. return myAzGetProperty(
  5111. m_hOwnerApp,
  5112. m_dwOwnerAppSN,
  5113. m_hScope,
  5114. AZ_PROP_POLICY_ADMINS_NAME,
  5115. vtemp,
  5116. pvarAdminsName);
  5117. }
  5118. HRESULT
  5119. CAzScope::get_PolicyReaders(
  5120. OUT VARIANT *pvarProp)
  5121. {
  5122. CComVariant vtemp;
  5123. return myAzGetProperty(
  5124. m_hOwnerApp,
  5125. m_dwOwnerAppSN,
  5126. m_hScope,
  5127. AZ_PROP_POLICY_READERS,
  5128. vtemp,
  5129. pvarProp);
  5130. }
  5131. HRESULT
  5132. CAzScope::get_PolicyReadersName(
  5133. OUT VARIANT* pvarReadersName
  5134. )
  5135. {
  5136. CComVariant vtemp;
  5137. return myAzGetProperty(
  5138. m_hOwnerApp,
  5139. m_dwOwnerAppSN,
  5140. m_hScope,
  5141. AZ_PROP_POLICY_READERS_NAME,
  5142. vtemp,
  5143. pvarReadersName);
  5144. }
  5145. HRESULT
  5146. CAzScope::AddPolicyAdministrator(
  5147. IN BSTR bstrAdmin,
  5148. IN VARIANT varReserved)
  5149. {
  5150. return myAzAddOrDeleteUser(
  5151. m_hOwnerApp,
  5152. m_dwOwnerAppSN,
  5153. m_hScope,
  5154. AZ_PROP_POLICY_ADMINS,
  5155. varReserved,
  5156. bstrAdmin,
  5157. TRUE);
  5158. }
  5159. HRESULT
  5160. CAzScope::AddPolicyAdministratorName(
  5161. IN BSTR bstrAdminName,
  5162. IN VARIANT varReserved
  5163. )
  5164. {
  5165. return myAzAddOrDeleteUser(
  5166. m_hOwnerApp,
  5167. m_dwOwnerAppSN,
  5168. m_hScope,
  5169. AZ_PROP_POLICY_ADMINS_NAME,
  5170. varReserved,
  5171. bstrAdminName,
  5172. TRUE);
  5173. }
  5174. HRESULT
  5175. CAzScope::DeletePolicyAdministrator(
  5176. IN BSTR bstrAdmin,
  5177. IN VARIANT varReserved)
  5178. {
  5179. return myAzAddOrDeleteUser(
  5180. m_hOwnerApp,
  5181. m_dwOwnerAppSN,
  5182. m_hScope,
  5183. AZ_PROP_POLICY_ADMINS,
  5184. varReserved,
  5185. bstrAdmin,
  5186. FALSE);
  5187. }
  5188. HRESULT
  5189. CAzScope::DeletePolicyAdministratorName(
  5190. IN BSTR bstrAdminName,
  5191. IN VARIANT varReserved
  5192. )
  5193. {
  5194. return myAzAddOrDeleteUser(
  5195. m_hOwnerApp,
  5196. m_dwOwnerAppSN,
  5197. m_hScope,
  5198. AZ_PROP_POLICY_ADMINS_NAME,
  5199. varReserved,
  5200. bstrAdminName,
  5201. FALSE);
  5202. }
  5203. HRESULT
  5204. CAzScope::AddPolicyReader(
  5205. IN BSTR bstrReader,
  5206. IN VARIANT varReserved)
  5207. {
  5208. return myAzAddOrDeleteUser(
  5209. m_hOwnerApp,
  5210. m_dwOwnerAppSN,
  5211. m_hScope,
  5212. AZ_PROP_POLICY_READERS,
  5213. varReserved,
  5214. bstrReader,
  5215. TRUE);
  5216. }
  5217. HRESULT
  5218. CAzScope::AddPolicyReaderName(
  5219. IN BSTR bstrReaderName,
  5220. IN VARIANT varReserved
  5221. )
  5222. {
  5223. return myAzAddOrDeleteUser(
  5224. m_hOwnerApp,
  5225. m_dwOwnerAppSN,
  5226. m_hScope,
  5227. AZ_PROP_POLICY_READERS_NAME,
  5228. varReserved,
  5229. bstrReaderName,
  5230. TRUE);
  5231. }
  5232. HRESULT
  5233. CAzScope::DeletePolicyReader(
  5234. IN BSTR bstrReader,
  5235. IN VARIANT varReserved)
  5236. {
  5237. return myAzAddOrDeleteUser(
  5238. m_hOwnerApp,
  5239. m_dwOwnerAppSN,
  5240. m_hScope,
  5241. AZ_PROP_POLICY_READERS,
  5242. varReserved,
  5243. bstrReader,
  5244. FALSE);
  5245. }
  5246. HRESULT
  5247. CAzScope::DeletePolicyReaderName(
  5248. IN BSTR bstrReaderName,
  5249. IN VARIANT varReserved
  5250. )
  5251. {
  5252. return myAzAddOrDeleteUser(
  5253. m_hOwnerApp,
  5254. m_dwOwnerAppSN,
  5255. m_hScope,
  5256. AZ_PROP_POLICY_READERS_NAME,
  5257. varReserved,
  5258. bstrReaderName,
  5259. FALSE);
  5260. }
  5261. HRESULT
  5262. CAzScope::SetProperty(
  5263. IN LONG lPropId,
  5264. IN VARIANT varProp,
  5265. IN VARIANT varReserved )
  5266. {
  5267. return myAzSetProperty(
  5268. m_hOwnerApp,
  5269. m_dwOwnerAppSN,
  5270. m_hScope,
  5271. lPropId,
  5272. varReserved,
  5273. &varProp);
  5274. }
  5275. HRESULT
  5276. CAzScope::get_ApplicationGroups(
  5277. OUT IAzApplicationGroups **ppGroups)
  5278. {
  5279. CComVariant vtemp;
  5280. return myAzNewObject(
  5281. m_hOwnerApp, // owned by the same application
  5282. m_dwOwnerAppSN,
  5283. ENUM_AZ_GROUPS,
  5284. m_hScope,
  5285. &vtemp,
  5286. (IUnknown**)ppGroups);
  5287. }
  5288. HRESULT
  5289. CAzScope::OpenApplicationGroup(
  5290. IN BSTR bstrGroupName,
  5291. IN VARIANT varReserved,
  5292. OUT IAzApplicationGroup **ppGroup)
  5293. {
  5294. HRESULT hr;
  5295. hr = myAzOpenObject(
  5296. m_hOwnerApp, // owned by the same application
  5297. m_dwOwnerAppSN,
  5298. AzGroupOpen,
  5299. ENUM_AZ_GROUP,
  5300. m_hScope,
  5301. bstrGroupName,
  5302. varReserved,
  5303. (IUnknown**)ppGroup);
  5304. return hr;
  5305. }
  5306. HRESULT
  5307. CAzScope::CreateApplicationGroup(
  5308. IN BSTR bstrGroupName,
  5309. IN VARIANT varReserved,
  5310. OUT IAzApplicationGroup **ppGroup)
  5311. {
  5312. HRESULT hr;
  5313. hr = myAzCreateObject(
  5314. m_hOwnerApp, // owned by the same application
  5315. m_dwOwnerAppSN,
  5316. AzGroupCreate,
  5317. ENUM_AZ_GROUP,
  5318. m_hScope,
  5319. bstrGroupName,
  5320. varReserved,
  5321. (IUnknown**)ppGroup);
  5322. return hr;
  5323. }
  5324. HRESULT
  5325. CAzScope::DeleteApplicationGroup(
  5326. IN BSTR bstrGroupName,
  5327. IN VARIANT varReserved )
  5328. {
  5329. HRESULT hr;
  5330. hr = myAzDeleteObject(
  5331. m_hOwnerApp,
  5332. m_dwOwnerAppSN,
  5333. AzGroupDelete,
  5334. m_hScope,
  5335. bstrGroupName,
  5336. varReserved);
  5337. return hr;
  5338. }
  5339. HRESULT
  5340. CAzScope::get_Roles(
  5341. OUT IAzRoles **ppRoles)
  5342. {
  5343. HRESULT hr;
  5344. CComVariant vtemp;
  5345. //
  5346. // Grab lock to maintain order
  5347. //
  5348. AzpLockResourceShared( &AzGlCloseApplication );
  5349. if (ppRoles == NULL)
  5350. {
  5351. hr = E_POINTER;
  5352. _JumpIfError( hr, error, "Null AzRole");
  5353. }
  5354. *ppRoles = NULL;
  5355. if (!IsObjectUsable(m_hOwnerApp, m_dwOwnerAppSN))
  5356. {
  5357. hr = AZ_HR_FROM_WIN32(ERROR_INVALID_HANDLE);
  5358. _JumpIfError( hr, error, "Owning application was closed" );
  5359. }
  5360. hr = myAzNewObject(
  5361. m_hOwnerApp,
  5362. m_dwOwnerAppSN,
  5363. ENUM_AZ_ROLES,
  5364. m_hScope,
  5365. &vtemp,
  5366. (IUnknown**)ppRoles);
  5367. error:
  5368. AzpUnlockResource( &AzGlCloseApplication );
  5369. return hr;
  5370. }
  5371. HRESULT
  5372. CAzScope::OpenRole(
  5373. IN BSTR bstrRoleName,
  5374. IN VARIANT varReserved,
  5375. OUT IAzRole **ppRole)
  5376. {
  5377. HRESULT hr;
  5378. //
  5379. // Grab lock to maintain order
  5380. //
  5381. AzpLockResourceShared( &AzGlCloseApplication );
  5382. if (ppRole == NULL)
  5383. {
  5384. hr = E_POINTER;
  5385. _JumpIfError( hr, error, "Null AzRole" );
  5386. }
  5387. *ppRole = NULL;
  5388. if (!IsObjectUsable(m_hOwnerApp, m_dwOwnerAppSN))
  5389. {
  5390. hr = AZ_HR_FROM_WIN32(ERROR_INVALID_HANDLE);
  5391. _JumpIfError( hr, error, "Owning application was closed" );
  5392. }
  5393. hr = myAzOpenObject(
  5394. m_hOwnerApp,
  5395. m_dwOwnerAppSN,
  5396. AzRoleOpen,
  5397. ENUM_AZ_ROLE,
  5398. m_hScope,
  5399. bstrRoleName,
  5400. varReserved,
  5401. (IUnknown**)ppRole);
  5402. error:
  5403. AzpUnlockResource( &AzGlCloseApplication );
  5404. return hr;
  5405. }
  5406. HRESULT
  5407. CAzScope::CreateRole(
  5408. IN BSTR bstrRoleName,
  5409. IN VARIANT varReserved,
  5410. OUT IAzRole **ppRole)
  5411. {
  5412. HRESULT hr;
  5413. //
  5414. // Grab lock to maintain locking order
  5415. //
  5416. AzpLockResourceShared( &AzGlCloseApplication );
  5417. if (ppRole == NULL)
  5418. {
  5419. hr = E_POINTER;
  5420. _JumpIfError( hr, error, "Null AzRole" );
  5421. }
  5422. *ppRole = NULL;
  5423. if (!IsObjectUsable(m_hOwnerApp, m_dwOwnerAppSN))
  5424. {
  5425. hr = AZ_HR_FROM_WIN32(ERROR_INVALID_HANDLE);
  5426. _JumpIfError( hr, error, "Owning application was closed" );
  5427. }
  5428. hr = myAzCreateObject(
  5429. m_hOwnerApp,
  5430. m_dwOwnerAppSN,
  5431. AzRoleCreate,
  5432. ENUM_AZ_ROLE,
  5433. m_hScope,
  5434. bstrRoleName,
  5435. varReserved,
  5436. (IUnknown**)ppRole);
  5437. error:
  5438. AzpUnlockResource( &AzGlCloseApplication );
  5439. return hr;
  5440. }
  5441. HRESULT
  5442. CAzScope::DeleteRole(
  5443. IN BSTR bstrRoleName,
  5444. IN VARIANT varReserved )
  5445. {
  5446. HRESULT hr;
  5447. hr = myAzDeleteObject(
  5448. m_hOwnerApp,
  5449. m_dwOwnerAppSN,
  5450. AzRoleDelete,
  5451. m_hScope,
  5452. bstrRoleName,
  5453. varReserved);
  5454. return hr;
  5455. }
  5456. HRESULT
  5457. CAzScope::get_Tasks(
  5458. OUT IAzTasks **ppTasks)
  5459. {
  5460. CComVariant vtemp;
  5461. return myAzNewObject(
  5462. m_hOwnerApp,
  5463. m_dwOwnerAppSN,
  5464. ENUM_AZ_TASKS,
  5465. m_hScope,
  5466. &vtemp,
  5467. (IUnknown**)ppTasks);
  5468. }
  5469. HRESULT
  5470. CAzScope::OpenTask(
  5471. IN BSTR bstrTaskName,
  5472. IN VARIANT varReserved,
  5473. OUT IAzTask **ppTask)
  5474. {
  5475. HRESULT hr;
  5476. hr = myAzOpenObject(
  5477. m_hOwnerApp,
  5478. m_dwOwnerAppSN,
  5479. AzTaskOpen,
  5480. ENUM_AZ_TASK,
  5481. m_hScope,
  5482. bstrTaskName,
  5483. varReserved,
  5484. (IUnknown**)ppTask);
  5485. return hr;
  5486. }
  5487. HRESULT
  5488. CAzScope::CreateTask(
  5489. IN BSTR bstrTaskName,
  5490. IN VARIANT varReserved,
  5491. OUT IAzTask **ppTask)
  5492. {
  5493. HRESULT hr;
  5494. hr = myAzCreateObject(
  5495. m_hOwnerApp,
  5496. m_dwOwnerAppSN,
  5497. AzTaskCreate,
  5498. ENUM_AZ_TASK,
  5499. m_hScope,
  5500. bstrTaskName,
  5501. varReserved,
  5502. (IUnknown**)ppTask);
  5503. return hr;
  5504. }
  5505. HRESULT
  5506. CAzScope::DeleteTask(
  5507. IN BSTR bstrTaskName,
  5508. IN VARIANT varReserved )
  5509. {
  5510. HRESULT hr;
  5511. hr = myAzDeleteObject(
  5512. m_hOwnerApp,
  5513. m_dwOwnerAppSN,
  5514. AzTaskDelete,
  5515. m_hScope,
  5516. bstrTaskName,
  5517. varReserved);
  5518. return hr;
  5519. }
  5520. HRESULT
  5521. CAzScope::Submit(
  5522. IN LONG lFlags,
  5523. IN VARIANT varReserved)
  5524. {
  5525. HRESULT hr;
  5526. DWORD dwErr;
  5527. //
  5528. // grab the lock so that close application does not interfere
  5529. //
  5530. AzpLockResourceShared( &AzGlCloseApplication );
  5531. if (NULL == m_hScope)
  5532. {
  5533. hr = E_INVALIDARG;
  5534. _JumpError(hr, error, "Null AzScope");
  5535. }
  5536. else if (!IsObjectUsable(m_hOwnerApp, m_dwOwnerAppSN))
  5537. {
  5538. hr = AZ_HR_FROM_WIN32(ERROR_INVALID_HANDLE);
  5539. _JumpError(hr, error, "Owning application was closed.");
  5540. }
  5541. hr = HandleReserved( &varReserved );
  5542. _JumpIfError(hr, error, "HandleReserved");
  5543. dwErr = AzSubmit(m_hScope, lFlags, 0);
  5544. _JumpIfWinError(dwErr, &hr, error, "AzSubmit");
  5545. hr = S_OK;
  5546. error:
  5547. AzpUnlockResource( &AzGlCloseApplication );
  5548. return hr;
  5549. }
  5550. HRESULT
  5551. CAzScope::get_CanBeDelegated(
  5552. OUT BOOL *pfProp)
  5553. {
  5554. return myGetBoolProperty(
  5555. m_hOwnerApp,
  5556. m_dwOwnerAppSN,
  5557. m_hScope,
  5558. AZ_PROP_SCOPE_CAN_BE_DELEGATED,
  5559. pfProp);
  5560. }
  5561. HRESULT
  5562. CAzScope::get_BizrulesWritable(
  5563. OUT BOOL *pfProp)
  5564. {
  5565. return myGetBoolProperty(
  5566. m_hOwnerApp,
  5567. m_dwOwnerAppSN,
  5568. m_hScope,
  5569. AZ_PROP_SCOPE_BIZRULES_WRITABLE,
  5570. pfProp);
  5571. }
  5572. /////////////////////////
  5573. //CAzScopes
  5574. /////////////////////////
  5575. HRESULT
  5576. CAzScopes::_Init(
  5577. IN AZ_HANDLE hOwnerApp,
  5578. IN OPTIONAL VARIANT *pvarReserved,
  5579. IN AZ_HANDLE hParent)
  5580. {
  5581. HRESULT hr;
  5582. ULONG lContext = 0;
  5583. IAzScope * pIScope = NULL;
  5584. m_hOwnerApp = hOwnerApp;
  5585. if (hOwnerApp != NULL)
  5586. {
  5587. //
  5588. // Grab the lock to maintain order
  5589. //
  5590. AzpLockResourceShared( &AzGlCloseApplication );
  5591. m_dwOwnerAppSN = AzpRetrieveApplicationSequenceNumber(hOwnerApp);
  5592. AzpUnlockResource( &AzGlCloseApplication );
  5593. }
  5594. else
  5595. {
  5596. m_dwOwnerAppSN = 0;
  5597. }
  5598. while (S_OK == (hr = myAzNextObject(
  5599. m_hOwnerApp,
  5600. m_dwOwnerAppSN,
  5601. AzScopeEnum,
  5602. pvarReserved,
  5603. ENUM_AZ_SCOPE,
  5604. hParent,
  5605. &lContext,
  5606. (IUnknown**)&pIScope)))
  5607. {
  5608. AZASSERT(NULL != (PVOID)pIScope);
  5609. //
  5610. // myAddItemToMap will release the pIScope
  5611. //
  5612. hr = myAddItemToMap<IAzScope>(&m_coll, &pIScope);
  5613. _JumpIfError(hr, error, "myAddItemToMap");
  5614. }
  5615. if (AZ_HRESULT(ERROR_NO_MORE_ITEMS) != hr)
  5616. {
  5617. _JumpError(hr, error, "myAzNextObject");
  5618. }
  5619. hr = S_OK;
  5620. error:
  5621. return hr;
  5622. }
  5623. /////////////////////////
  5624. //CAzApplicationGroup
  5625. /////////////////////////
  5626. CAzApplicationGroup::CAzApplicationGroup()
  5627. {
  5628. //init
  5629. __try {
  5630. InitializeCriticalSection(&m_cs);
  5631. } __except(EXCEPTION_EXECUTE_HANDLER) {}
  5632. m_hGroup = NULL;
  5633. }
  5634. CAzApplicationGroup::~CAzApplicationGroup()
  5635. {
  5636. if (NULL != m_hGroup)
  5637. {
  5638. //
  5639. // Grab the lock so that close application does not interfere
  5640. //
  5641. AzpLockResourceShared( &AzGlCloseApplication );
  5642. if (IsObjectUsable(m_hOwnerApp, m_dwOwnerAppSN))
  5643. {
  5644. AzCloseHandle(m_hGroup, 0);
  5645. }
  5646. AzpUnlockResource( &AzGlCloseApplication );
  5647. }
  5648. DeleteCriticalSection(&m_cs);
  5649. }
  5650. HRESULT
  5651. CAzApplicationGroup::_Init(
  5652. IN AZ_HANDLE hOwnerApp,
  5653. IN AZ_HANDLE hHandle)
  5654. {
  5655. HRESULT hr;
  5656. EnterCriticalSection(&m_cs);
  5657. //init once
  5658. AZASSERT(NULL != hHandle);
  5659. AZASSERT(NULL == m_hGroup);
  5660. m_hGroup = hHandle;
  5661. m_hOwnerApp = hOwnerApp;
  5662. if (hOwnerApp != NULL)
  5663. {
  5664. //
  5665. // Grab the lock to maintain order
  5666. //
  5667. AzpLockResourceShared( &AzGlCloseApplication );
  5668. m_dwOwnerAppSN = AzpRetrieveApplicationSequenceNumber(hOwnerApp);
  5669. AzpUnlockResource( &AzGlCloseApplication );
  5670. }
  5671. else
  5672. {
  5673. m_dwOwnerAppSN = 0;
  5674. }
  5675. hr = S_OK;
  5676. //error:
  5677. LeaveCriticalSection(&m_cs);
  5678. return hr;
  5679. }
  5680. HRESULT CAzApplicationGroup::get_Type(
  5681. OUT LONG *plProp
  5682. )
  5683. {
  5684. return myGetLongProperty(
  5685. m_hOwnerApp,
  5686. m_dwOwnerAppSN,
  5687. m_hGroup,
  5688. AZ_PROP_GROUP_TYPE,
  5689. plProp);
  5690. }
  5691. HRESULT CAzApplicationGroup::put_Type(
  5692. IN LONG lProp
  5693. )
  5694. {
  5695. return mySetLongProperty(
  5696. m_hOwnerApp,
  5697. m_dwOwnerAppSN,
  5698. m_hGroup,
  5699. AZ_PROP_GROUP_TYPE,
  5700. lProp);
  5701. }
  5702. HRESULT CAzApplicationGroup::get_LdapQuery(
  5703. OUT BSTR *pbstrProp
  5704. )
  5705. {
  5706. return myGetBstrProperty(
  5707. m_hOwnerApp,
  5708. m_dwOwnerAppSN,
  5709. m_hGroup,
  5710. AZ_PROP_GROUP_LDAP_QUERY,
  5711. pbstrProp);
  5712. }
  5713. HRESULT CAzApplicationGroup::put_LdapQuery(
  5714. IN BSTR bstrProp
  5715. )
  5716. {
  5717. return mySetBstrProperty(
  5718. m_hOwnerApp,
  5719. m_dwOwnerAppSN,
  5720. m_hGroup,
  5721. AZ_PROP_GROUP_LDAP_QUERY,
  5722. bstrProp);
  5723. }
  5724. HRESULT CAzApplicationGroup::get_AppMembers(
  5725. OUT VARIANT *pvarProp
  5726. )
  5727. {
  5728. CComVariant vtemp;
  5729. return myAzGetProperty(
  5730. m_hOwnerApp,
  5731. m_dwOwnerAppSN,
  5732. m_hGroup,
  5733. AZ_PROP_GROUP_APP_MEMBERS,
  5734. vtemp,
  5735. pvarProp);
  5736. }
  5737. HRESULT CAzApplicationGroup::get_AppNonMembers(
  5738. OUT VARIANT *pvarProp
  5739. )
  5740. {
  5741. CComVariant vtemp;
  5742. return myAzGetProperty(
  5743. m_hOwnerApp,
  5744. m_dwOwnerAppSN,
  5745. m_hGroup,
  5746. AZ_PROP_GROUP_APP_NON_MEMBERS,
  5747. vtemp,
  5748. pvarProp);
  5749. }
  5750. HRESULT CAzApplicationGroup::get_Members(
  5751. OUT VARIANT *pvarProp
  5752. )
  5753. {
  5754. CComVariant vtemp;
  5755. return myAzGetProperty(
  5756. m_hOwnerApp,
  5757. m_dwOwnerAppSN,
  5758. m_hGroup,
  5759. AZ_PROP_GROUP_MEMBERS,
  5760. vtemp,
  5761. pvarProp);
  5762. }
  5763. HRESULT CAzApplicationGroup::get_MembersName(
  5764. OUT VARIANT *pvarProp
  5765. )
  5766. {
  5767. CComVariant vtemp;
  5768. return myAzGetProperty(
  5769. m_hOwnerApp,
  5770. m_dwOwnerAppSN,
  5771. m_hGroup,
  5772. AZ_PROP_GROUP_MEMBERS_NAME,
  5773. vtemp,
  5774. pvarProp);
  5775. }
  5776. HRESULT CAzApplicationGroup::get_NonMembers(
  5777. OUT VARIANT *pvarProp
  5778. )
  5779. {
  5780. CComVariant vtemp;
  5781. return myAzGetProperty(
  5782. m_hOwnerApp,
  5783. m_dwOwnerAppSN,
  5784. m_hGroup,
  5785. AZ_PROP_GROUP_NON_MEMBERS,
  5786. vtemp,
  5787. pvarProp);
  5788. }
  5789. HRESULT CAzApplicationGroup::get_NonMembersName(
  5790. OUT VARIANT *pvarProp
  5791. )
  5792. {
  5793. CComVariant vtemp;
  5794. return myAzGetProperty(
  5795. m_hOwnerApp,
  5796. m_dwOwnerAppSN,
  5797. m_hGroup,
  5798. AZ_PROP_GROUP_NON_MEMBERS_NAME,
  5799. vtemp,
  5800. pvarProp);
  5801. }
  5802. HRESULT
  5803. CAzApplicationGroup::get_Description(
  5804. OUT BSTR __RPC_FAR *pbstrDescription)
  5805. {
  5806. return myGetBstrProperty(
  5807. m_hOwnerApp,
  5808. m_dwOwnerAppSN,
  5809. m_hGroup,
  5810. AZ_PROP_DESCRIPTION,
  5811. pbstrDescription);
  5812. }
  5813. HRESULT
  5814. CAzApplicationGroup::put_Description(
  5815. IN BSTR bstrDescription)
  5816. {
  5817. return mySetBstrProperty(
  5818. m_hOwnerApp,
  5819. m_dwOwnerAppSN,
  5820. m_hGroup,
  5821. AZ_PROP_DESCRIPTION,
  5822. bstrDescription);
  5823. }
  5824. HRESULT
  5825. CAzApplicationGroup::get_Name(
  5826. OUT BSTR __RPC_FAR *pbstrName)
  5827. {
  5828. return myGetBstrProperty(
  5829. m_hOwnerApp,
  5830. m_dwOwnerAppSN,
  5831. m_hGroup,
  5832. AZ_PROP_NAME,
  5833. pbstrName);
  5834. }
  5835. HRESULT
  5836. CAzApplicationGroup::put_Name(
  5837. IN BSTR bstrName)
  5838. {
  5839. return mySetBstrProperty(
  5840. m_hOwnerApp,
  5841. m_dwOwnerAppSN,
  5842. m_hGroup,
  5843. AZ_PROP_NAME,
  5844. bstrName);
  5845. }
  5846. HRESULT CAzApplicationGroup::AddAppMember(
  5847. IN BSTR bstrMember,
  5848. IN VARIANT varReserved
  5849. )
  5850. {
  5851. HRESULT hr;
  5852. hr = myAzAddPropertyItemBstr(
  5853. m_hOwnerApp,
  5854. m_dwOwnerAppSN,
  5855. m_hGroup,
  5856. AZ_PROP_GROUP_APP_MEMBERS,
  5857. varReserved,
  5858. bstrMember);
  5859. return hr;
  5860. }
  5861. HRESULT CAzApplicationGroup::DeleteAppMember(
  5862. IN BSTR bstrMember,
  5863. IN VARIANT varReserved
  5864. )
  5865. {
  5866. HRESULT hr;
  5867. hr = myAzDeletePropertyItemBstr(
  5868. m_hOwnerApp,
  5869. m_dwOwnerAppSN,
  5870. m_hGroup,
  5871. AZ_PROP_GROUP_APP_MEMBERS,
  5872. varReserved,
  5873. bstrMember);
  5874. return hr;
  5875. }
  5876. HRESULT CAzApplicationGroup::AddAppNonMember(
  5877. IN BSTR bstrNonMember,
  5878. IN VARIANT varReserved
  5879. )
  5880. {
  5881. HRESULT hr;
  5882. hr = myAzAddPropertyItemBstr(
  5883. m_hOwnerApp,
  5884. m_dwOwnerAppSN,
  5885. m_hGroup,
  5886. AZ_PROP_GROUP_APP_NON_MEMBERS,
  5887. varReserved,
  5888. bstrNonMember);
  5889. return hr;
  5890. }
  5891. HRESULT CAzApplicationGroup::DeleteAppNonMember(
  5892. IN BSTR bstrNonMember,
  5893. IN VARIANT varReserved
  5894. )
  5895. {
  5896. HRESULT hr;
  5897. CComVariant vtemp;
  5898. hr = myAzDeletePropertyItemBstr(
  5899. m_hOwnerApp,
  5900. m_dwOwnerAppSN,
  5901. m_hGroup,
  5902. AZ_PROP_GROUP_APP_NON_MEMBERS,
  5903. varReserved,
  5904. bstrNonMember);
  5905. return hr;
  5906. }
  5907. HRESULT
  5908. CAzApplicationGroup::AddMember(
  5909. IN BSTR bstrProp,
  5910. IN VARIANT varReserved)
  5911. {
  5912. return myAzAddPropertyItemBstr(
  5913. m_hOwnerApp,
  5914. m_dwOwnerAppSN,
  5915. m_hGroup,
  5916. AZ_PROP_GROUP_MEMBERS,
  5917. varReserved,
  5918. bstrProp);
  5919. }
  5920. HRESULT
  5921. CAzApplicationGroup::DeleteMember(
  5922. IN BSTR bstrProp,
  5923. IN VARIANT varReserved)
  5924. {
  5925. return myAzDeletePropertyItemBstr(
  5926. m_hOwnerApp,
  5927. m_dwOwnerAppSN,
  5928. m_hGroup,
  5929. AZ_PROP_GROUP_MEMBERS,
  5930. varReserved,
  5931. bstrProp);
  5932. }
  5933. HRESULT
  5934. CAzApplicationGroup::AddMemberName(
  5935. IN BSTR bstrProp,
  5936. IN VARIANT varReserved)
  5937. {
  5938. return myAzAddPropertyItemBstr(
  5939. m_hOwnerApp,
  5940. m_dwOwnerAppSN,
  5941. m_hGroup,
  5942. AZ_PROP_GROUP_MEMBERS_NAME,
  5943. varReserved,
  5944. bstrProp);
  5945. }
  5946. HRESULT
  5947. CAzApplicationGroup::DeleteMemberName(
  5948. IN BSTR bstrProp,
  5949. IN VARIANT varReserved)
  5950. {
  5951. return myAzDeletePropertyItemBstr(
  5952. m_hOwnerApp,
  5953. m_dwOwnerAppSN,
  5954. m_hGroup,
  5955. AZ_PROP_GROUP_MEMBERS_NAME,
  5956. varReserved,
  5957. bstrProp);
  5958. }
  5959. HRESULT
  5960. CAzApplicationGroup::AddNonMember(
  5961. IN BSTR bstrProp,
  5962. IN VARIANT varReserved)
  5963. {
  5964. return myAzAddPropertyItemBstr(
  5965. m_hOwnerApp,
  5966. m_dwOwnerAppSN,
  5967. m_hGroup,
  5968. AZ_PROP_GROUP_NON_MEMBERS,
  5969. varReserved,
  5970. bstrProp);
  5971. }
  5972. HRESULT
  5973. CAzApplicationGroup::DeleteNonMember(
  5974. IN BSTR bstrProp,
  5975. IN VARIANT varReserved)
  5976. {
  5977. return myAzDeletePropertyItemBstr(
  5978. m_hOwnerApp,
  5979. m_dwOwnerAppSN,
  5980. m_hGroup,
  5981. AZ_PROP_GROUP_NON_MEMBERS,
  5982. varReserved,
  5983. bstrProp);
  5984. }
  5985. HRESULT
  5986. CAzApplicationGroup::AddNonMemberName(
  5987. IN BSTR bstrProp,
  5988. IN VARIANT varReserved)
  5989. {
  5990. return myAzAddPropertyItemBstr(
  5991. m_hOwnerApp,
  5992. m_dwOwnerAppSN,
  5993. m_hGroup,
  5994. AZ_PROP_GROUP_NON_MEMBERS_NAME,
  5995. varReserved,
  5996. bstrProp);
  5997. }
  5998. HRESULT
  5999. CAzApplicationGroup::DeleteNonMemberName(
  6000. IN BSTR bstrProp,
  6001. IN VARIANT varReserved)
  6002. {
  6003. return myAzDeletePropertyItemBstr(
  6004. m_hOwnerApp,
  6005. m_dwOwnerAppSN,
  6006. m_hGroup,
  6007. AZ_PROP_GROUP_NON_MEMBERS_NAME,
  6008. varReserved,
  6009. bstrProp);
  6010. }
  6011. HRESULT
  6012. CAzApplicationGroup::get_Writable(
  6013. OUT BOOL *pfProp)
  6014. {
  6015. return myGetBoolProperty(
  6016. m_hOwnerApp,
  6017. m_dwOwnerAppSN,
  6018. m_hGroup,
  6019. AZ_PROP_WRITABLE,
  6020. pfProp);
  6021. }
  6022. HRESULT
  6023. CAzApplicationGroup::GetProperty(
  6024. IN LONG lPropId,
  6025. IN VARIANT varReserved,
  6026. OUT VARIANT *pvarProp)
  6027. {
  6028. return myAzGetProperty(
  6029. m_hOwnerApp,
  6030. m_dwOwnerAppSN,
  6031. m_hGroup,
  6032. lPropId,
  6033. varReserved,
  6034. pvarProp);
  6035. }
  6036. HRESULT
  6037. CAzApplicationGroup::SetProperty(
  6038. IN LONG lPropId,
  6039. IN VARIANT varProp,
  6040. IN VARIANT varReserved )
  6041. {
  6042. return myAzSetProperty(
  6043. m_hOwnerApp,
  6044. m_dwOwnerAppSN,
  6045. m_hGroup,
  6046. lPropId,
  6047. varReserved,
  6048. &varProp);
  6049. }
  6050. HRESULT
  6051. CAzApplicationGroup::AddPropertyItem(
  6052. IN LONG lPropId,
  6053. IN VARIANT varProp,
  6054. IN VARIANT varReserved )
  6055. {
  6056. return myAzAddPropertyItem(
  6057. m_hOwnerApp,
  6058. m_dwOwnerAppSN,
  6059. m_hGroup,
  6060. lPropId,
  6061. varReserved,
  6062. &varProp);
  6063. }
  6064. HRESULT
  6065. CAzApplicationGroup::DeletePropertyItem(
  6066. IN LONG lPropId,
  6067. IN VARIANT varProp,
  6068. IN VARIANT varReserved )
  6069. {
  6070. return myAzDeletePropertyItem(
  6071. m_hOwnerApp,
  6072. m_dwOwnerAppSN,
  6073. m_hGroup,
  6074. lPropId,
  6075. varReserved,
  6076. &varProp);
  6077. }
  6078. HRESULT
  6079. CAzApplicationGroup::Submit(
  6080. IN LONG lFlags,
  6081. IN VARIANT varReserved)
  6082. {
  6083. HRESULT hr;
  6084. DWORD dwErr;
  6085. //
  6086. // Grab the lock so that close application does not interfere
  6087. //
  6088. AzpLockResourceShared( &AzGlCloseApplication );
  6089. if (NULL == m_hGroup)
  6090. {
  6091. hr = E_INVALIDARG;
  6092. _JumpError(hr, error, "Null AzApplicationGroup");
  6093. }
  6094. else if (!IsObjectUsable(m_hOwnerApp, m_dwOwnerAppSN))
  6095. {
  6096. hr = AZ_HR_FROM_WIN32(ERROR_INVALID_HANDLE);
  6097. _JumpError(hr, error, "Owning application was closed.");
  6098. }
  6099. hr = HandleReserved( &varReserved );
  6100. _JumpIfError(hr, error, "HandleReserved");
  6101. dwErr = AzSubmit(m_hGroup, lFlags, 0);
  6102. _JumpIfWinError(dwErr, &hr, error, "AzSubmit");
  6103. hr = S_OK;
  6104. error:
  6105. AzpUnlockResource( &AzGlCloseApplication );
  6106. return hr;
  6107. }
  6108. /////////////////////////
  6109. //CAzApplicationGroups
  6110. /////////////////////////
  6111. HRESULT
  6112. CAzApplicationGroups::_Init(
  6113. IN AZ_HANDLE hOwnerApp,
  6114. IN OPTIONAL VARIANT *pvarReserved,
  6115. IN AZ_HANDLE hParent)
  6116. {
  6117. HRESULT hr;
  6118. ULONG lContext = 0;
  6119. IAzApplicationGroup * pIGroup = NULL;
  6120. m_hOwnerApp = hOwnerApp;
  6121. if (hOwnerApp != NULL)
  6122. {
  6123. //
  6124. // grab the lock to maintain order
  6125. //
  6126. AzpLockResourceShared( &AzGlCloseApplication );
  6127. m_dwOwnerAppSN = AzpRetrieveApplicationSequenceNumber(hOwnerApp);
  6128. AzpUnlockResource( &AzGlCloseApplication );
  6129. }
  6130. else
  6131. {
  6132. m_dwOwnerAppSN = 0;
  6133. }
  6134. while (S_OK == (hr = myAzNextObject(
  6135. m_hOwnerApp,
  6136. m_dwOwnerAppSN,
  6137. AzGroupEnum,
  6138. pvarReserved,
  6139. ENUM_AZ_GROUP,
  6140. hParent,
  6141. &lContext,
  6142. (IUnknown**)&pIGroup)))
  6143. {
  6144. AZASSERT(NULL != (PVOID)pIGroup);
  6145. //
  6146. // myAddItemToMap will release the pIGroup
  6147. //
  6148. hr = myAddItemToMap<IAzApplicationGroup>(&m_coll, &pIGroup);
  6149. _JumpIfError(hr, error, "myAddItemToMap");
  6150. }
  6151. if (AZ_HRESULT(ERROR_NO_MORE_ITEMS) != hr)
  6152. {
  6153. _JumpError(hr, error, "myAzNextObject");
  6154. }
  6155. hr = S_OK;
  6156. error:
  6157. return hr;
  6158. }
  6159. /////////////////////////
  6160. //CAzRole
  6161. /////////////////////////
  6162. CAzRole::CAzRole()
  6163. {
  6164. //init
  6165. __try {
  6166. InitializeCriticalSection(&m_cs);
  6167. } __except(EXCEPTION_EXECUTE_HANDLER) {}
  6168. m_hRole = NULL;
  6169. }
  6170. CAzRole::~CAzRole()
  6171. {
  6172. if (NULL != m_hRole)
  6173. {
  6174. //
  6175. // grab the lock so that close application does not interfere
  6176. //
  6177. AzpLockResourceShared( &AzGlCloseApplication );
  6178. if (IsObjectUsable(m_hOwnerApp, m_dwOwnerAppSN))
  6179. {
  6180. AzCloseHandle(m_hRole, 0);
  6181. }
  6182. AzpUnlockResource( &AzGlCloseApplication );
  6183. }
  6184. DeleteCriticalSection(&m_cs);
  6185. }
  6186. HRESULT
  6187. CAzRole::_Init(
  6188. IN AZ_HANDLE hOwnerApp,
  6189. IN AZ_HANDLE hHandle)
  6190. {
  6191. HRESULT hr;
  6192. EnterCriticalSection(&m_cs);
  6193. //init once
  6194. AZASSERT(NULL != hHandle);
  6195. AZASSERT(NULL == m_hRole);
  6196. m_hRole = hHandle;
  6197. m_hOwnerApp = hOwnerApp;
  6198. if (hOwnerApp != NULL)
  6199. {
  6200. //
  6201. // Grab the lock to maintain order
  6202. //
  6203. AzpLockResourceShared( &AzGlCloseApplication );
  6204. m_dwOwnerAppSN = AzpRetrieveApplicationSequenceNumber(hOwnerApp);
  6205. AzpUnlockResource( &AzGlCloseApplication );
  6206. }
  6207. else
  6208. {
  6209. m_dwOwnerAppSN = 0;
  6210. }
  6211. hr = S_OK;
  6212. //error:
  6213. LeaveCriticalSection(&m_cs);
  6214. return hr;
  6215. }
  6216. HRESULT
  6217. CAzRole::get_Description(
  6218. OUT BSTR __RPC_FAR *pbstrDescription)
  6219. {
  6220. return myGetBstrProperty(
  6221. m_hOwnerApp,
  6222. m_dwOwnerAppSN,
  6223. m_hRole,
  6224. AZ_PROP_DESCRIPTION,
  6225. pbstrDescription);
  6226. }
  6227. HRESULT
  6228. CAzRole::put_Description(
  6229. IN BSTR bstrDescription)
  6230. {
  6231. return mySetBstrProperty(
  6232. m_hOwnerApp,
  6233. m_dwOwnerAppSN,
  6234. m_hRole,
  6235. AZ_PROP_DESCRIPTION,
  6236. bstrDescription);
  6237. }
  6238. HRESULT
  6239. CAzRole::get_Name(
  6240. OUT BSTR __RPC_FAR *pbstrName)
  6241. {
  6242. return myGetBstrProperty(
  6243. m_hOwnerApp,
  6244. m_dwOwnerAppSN,
  6245. m_hRole,
  6246. AZ_PROP_NAME,
  6247. pbstrName);
  6248. }
  6249. HRESULT
  6250. CAzRole::put_Name(
  6251. IN BSTR bstrName)
  6252. {
  6253. return mySetBstrProperty(
  6254. m_hOwnerApp,
  6255. m_dwOwnerAppSN,
  6256. m_hRole,
  6257. AZ_PROP_NAME,
  6258. bstrName);
  6259. }
  6260. HRESULT
  6261. CAzRole::get_ApplicationData(
  6262. OUT BSTR __RPC_FAR *pbstrApplicationData)
  6263. {
  6264. return myGetBstrProperty(
  6265. m_hOwnerApp,
  6266. m_dwOwnerAppSN,
  6267. m_hRole,
  6268. AZ_PROP_APPLICATION_DATA,
  6269. pbstrApplicationData);
  6270. }
  6271. HRESULT
  6272. CAzRole::put_ApplicationData(
  6273. IN BSTR bstrApplicationData)
  6274. {
  6275. return mySetBstrProperty(
  6276. m_hOwnerApp,
  6277. m_dwOwnerAppSN,
  6278. m_hRole,
  6279. AZ_PROP_APPLICATION_DATA,
  6280. bstrApplicationData);
  6281. }
  6282. HRESULT CAzRole::get_AppMembers(
  6283. OUT VARIANT *pvarProp
  6284. )
  6285. {
  6286. CComVariant vtemp;
  6287. return myAzGetProperty(
  6288. m_hOwnerApp,
  6289. m_dwOwnerAppSN,
  6290. m_hRole,
  6291. AZ_PROP_ROLE_APP_MEMBERS,
  6292. vtemp,
  6293. pvarProp);
  6294. }
  6295. HRESULT CAzRole::get_Members(
  6296. OUT VARIANT *pvarProp
  6297. )
  6298. {
  6299. CComVariant vtemp;
  6300. return myAzGetProperty(
  6301. m_hOwnerApp,
  6302. m_dwOwnerAppSN,
  6303. m_hRole,
  6304. AZ_PROP_ROLE_MEMBERS,
  6305. vtemp,
  6306. pvarProp);
  6307. }
  6308. HRESULT CAzRole::get_MembersName(
  6309. OUT VARIANT *pvarProp
  6310. )
  6311. {
  6312. CComVariant vtemp;
  6313. return myAzGetProperty(
  6314. m_hOwnerApp,
  6315. m_dwOwnerAppSN,
  6316. m_hRole,
  6317. AZ_PROP_ROLE_MEMBERS_NAME,
  6318. vtemp,
  6319. pvarProp);
  6320. }
  6321. HRESULT CAzRole::get_Operations(
  6322. OUT VARIANT *pvarProp
  6323. )
  6324. {
  6325. CComVariant vtemp;
  6326. return myAzGetProperty(
  6327. m_hOwnerApp,
  6328. m_dwOwnerAppSN,
  6329. m_hRole,
  6330. AZ_PROP_ROLE_OPERATIONS,
  6331. vtemp,
  6332. pvarProp);
  6333. }
  6334. HRESULT CAzRole::get_Tasks(
  6335. OUT VARIANT *pvarProp
  6336. )
  6337. {
  6338. CComVariant vtemp;
  6339. return myAzGetProperty(
  6340. m_hOwnerApp,
  6341. m_dwOwnerAppSN,
  6342. m_hRole,
  6343. AZ_PROP_ROLE_TASKS,
  6344. vtemp,
  6345. pvarProp);
  6346. }
  6347. HRESULT CAzRole::AddAppMember(
  6348. IN BSTR bstrProp,
  6349. IN VARIANT varReserved
  6350. )
  6351. {
  6352. HRESULT hr;
  6353. hr = myAzAddPropertyItemBstr(
  6354. m_hOwnerApp,
  6355. m_dwOwnerAppSN,
  6356. m_hRole,
  6357. AZ_PROP_ROLE_APP_MEMBERS,
  6358. varReserved,
  6359. bstrProp);
  6360. return hr;
  6361. }
  6362. HRESULT CAzRole::DeleteAppMember(
  6363. IN BSTR bstrProp,
  6364. IN VARIANT varReserved
  6365. )
  6366. {
  6367. HRESULT hr;
  6368. hr = myAzDeletePropertyItemBstr(
  6369. m_hOwnerApp,
  6370. m_dwOwnerAppSN,
  6371. m_hRole,
  6372. AZ_PROP_ROLE_APP_MEMBERS,
  6373. varReserved,
  6374. bstrProp);
  6375. return hr;
  6376. }
  6377. HRESULT CAzRole::AddTask(
  6378. IN BSTR bstrProp,
  6379. IN VARIANT varReserved
  6380. )
  6381. {
  6382. HRESULT hr;
  6383. hr = myAzAddPropertyItemBstr(
  6384. m_hOwnerApp,
  6385. m_dwOwnerAppSN,
  6386. m_hRole,
  6387. AZ_PROP_ROLE_TASKS,
  6388. varReserved,
  6389. bstrProp);
  6390. return hr;
  6391. }
  6392. HRESULT CAzRole::DeleteTask(
  6393. IN BSTR bstrProp,
  6394. IN VARIANT varReserved
  6395. )
  6396. {
  6397. HRESULT hr;
  6398. CComVariant vtemp;
  6399. hr = myAzDeletePropertyItemBstr(
  6400. m_hOwnerApp,
  6401. m_dwOwnerAppSN,
  6402. m_hRole,
  6403. AZ_PROP_ROLE_TASKS,
  6404. varReserved,
  6405. bstrProp);
  6406. return hr;
  6407. }
  6408. HRESULT CAzRole::AddOperation(
  6409. IN BSTR bstrProp,
  6410. IN VARIANT varReserved
  6411. )
  6412. {
  6413. HRESULT hr;
  6414. CComVariant vtemp;
  6415. hr = myAzAddPropertyItemBstr(
  6416. m_hOwnerApp,
  6417. m_dwOwnerAppSN,
  6418. m_hRole,
  6419. AZ_PROP_ROLE_OPERATIONS,
  6420. varReserved,
  6421. bstrProp);
  6422. return hr;
  6423. }
  6424. HRESULT CAzRole::DeleteOperation(
  6425. IN BSTR bstrProp,
  6426. IN VARIANT varReserved
  6427. )
  6428. {
  6429. HRESULT hr;
  6430. CComVariant vtemp;
  6431. hr = myAzDeletePropertyItemBstr(
  6432. m_hOwnerApp,
  6433. m_dwOwnerAppSN,
  6434. m_hRole,
  6435. AZ_PROP_ROLE_OPERATIONS,
  6436. varReserved,
  6437. bstrProp);
  6438. return hr;
  6439. }
  6440. HRESULT
  6441. CAzRole::AddMember(
  6442. IN BSTR bstrProp,
  6443. IN VARIANT varReserved)
  6444. {
  6445. return myAzAddPropertyItemBstr(
  6446. m_hOwnerApp,
  6447. m_dwOwnerAppSN,
  6448. m_hRole,
  6449. AZ_PROP_ROLE_MEMBERS,
  6450. varReserved,
  6451. bstrProp);
  6452. }
  6453. HRESULT
  6454. CAzRole::DeleteMember(
  6455. IN BSTR bstrProp,
  6456. IN VARIANT varReserved)
  6457. {
  6458. return myAzDeletePropertyItemBstr(
  6459. m_hOwnerApp,
  6460. m_dwOwnerAppSN,
  6461. m_hRole,
  6462. AZ_PROP_ROLE_MEMBERS,
  6463. varReserved,
  6464. bstrProp);
  6465. }
  6466. HRESULT
  6467. CAzRole::AddMemberName(
  6468. IN BSTR bstrProp,
  6469. IN VARIANT varReserved)
  6470. {
  6471. return myAzAddPropertyItemBstr(
  6472. m_hOwnerApp,
  6473. m_dwOwnerAppSN,
  6474. m_hRole,
  6475. AZ_PROP_ROLE_MEMBERS_NAME,
  6476. varReserved,
  6477. bstrProp);
  6478. }
  6479. HRESULT
  6480. CAzRole::DeleteMemberName(
  6481. IN BSTR bstrProp,
  6482. IN VARIANT varReserved)
  6483. {
  6484. return myAzDeletePropertyItemBstr(
  6485. m_hOwnerApp,
  6486. m_dwOwnerAppSN,
  6487. m_hRole,
  6488. AZ_PROP_ROLE_MEMBERS_NAME,
  6489. varReserved,
  6490. bstrProp);
  6491. }
  6492. HRESULT
  6493. CAzRole::get_Writable(
  6494. OUT BOOL *pfProp)
  6495. {
  6496. return myGetBoolProperty(
  6497. m_hOwnerApp,
  6498. m_dwOwnerAppSN,
  6499. m_hRole,
  6500. AZ_PROP_WRITABLE,
  6501. pfProp);
  6502. }
  6503. HRESULT
  6504. CAzRole::GetProperty(
  6505. IN LONG lPropId,
  6506. IN VARIANT varReserved,
  6507. OUT VARIANT *pvarProp)
  6508. {
  6509. return myAzGetProperty(
  6510. m_hOwnerApp,
  6511. m_dwOwnerAppSN,
  6512. m_hRole,
  6513. lPropId,
  6514. varReserved,
  6515. pvarProp);
  6516. }
  6517. HRESULT
  6518. CAzRole::SetProperty(
  6519. IN LONG lPropId,
  6520. IN VARIANT varProp,
  6521. IN VARIANT varReserved )
  6522. {
  6523. return myAzSetProperty(
  6524. m_hOwnerApp,
  6525. m_dwOwnerAppSN,
  6526. m_hRole,
  6527. lPropId,
  6528. varReserved,
  6529. &varProp);
  6530. }
  6531. HRESULT
  6532. CAzRole::AddPropertyItem(
  6533. IN LONG lPropId,
  6534. IN VARIANT varProp,
  6535. IN VARIANT varReserved )
  6536. {
  6537. return myAzAddPropertyItem(
  6538. m_hOwnerApp,
  6539. m_dwOwnerAppSN,
  6540. m_hRole,
  6541. lPropId,
  6542. varReserved,
  6543. &varProp);
  6544. }
  6545. HRESULT
  6546. CAzRole::DeletePropertyItem(
  6547. IN LONG lPropId,
  6548. IN VARIANT varProp,
  6549. IN VARIANT varReserved )
  6550. {
  6551. return myAzDeletePropertyItem(
  6552. m_hOwnerApp,
  6553. m_dwOwnerAppSN,
  6554. m_hRole,
  6555. lPropId,
  6556. varReserved,
  6557. &varProp);
  6558. }
  6559. HRESULT
  6560. CAzRole::Submit(
  6561. IN LONG lFlags,
  6562. IN VARIANT varReserved)
  6563. {
  6564. HRESULT hr;
  6565. DWORD dwErr;
  6566. //
  6567. // grab the lock so that close application does not interfere
  6568. //
  6569. AzpLockResourceShared( &AzGlCloseApplication );
  6570. if (NULL == m_hRole)
  6571. {
  6572. hr = E_INVALIDARG;
  6573. _JumpError(hr, error, "Null AzRole");
  6574. }
  6575. else if (!IsObjectUsable(m_hOwnerApp, m_dwOwnerAppSN))
  6576. {
  6577. hr = AZ_HR_FROM_WIN32(ERROR_INVALID_HANDLE);
  6578. _JumpError(hr, error, "Owning application was closed.");
  6579. }
  6580. hr = HandleReserved( &varReserved );
  6581. _JumpIfError(hr, error, "HandleReserved");
  6582. dwErr = AzSubmit(m_hRole, lFlags, 0);
  6583. _JumpIfWinError(dwErr, &hr, error, "AzSubmit");
  6584. hr = S_OK;
  6585. error:
  6586. AzpUnlockResource( &AzGlCloseApplication );
  6587. return hr;
  6588. }
  6589. /////////////////////////
  6590. //CAzRoles
  6591. /////////////////////////
  6592. HRESULT
  6593. CAzRoles::_Init(
  6594. IN AZ_HANDLE hOwnerApp,
  6595. IN OPTIONAL VARIANT *pvarReserved,
  6596. IN AZ_HANDLE hParent)
  6597. {
  6598. HRESULT hr;
  6599. ULONG lContext = 0;
  6600. IAzRole * pIRole = NULL;
  6601. m_hOwnerApp = hOwnerApp;
  6602. if (hOwnerApp != NULL)
  6603. {
  6604. //
  6605. // Grab the lock to maintain order
  6606. //
  6607. AzpLockResourceShared( &AzGlCloseApplication );
  6608. m_dwOwnerAppSN = AzpRetrieveApplicationSequenceNumber(hOwnerApp);
  6609. AzpLockResourceShared( &AzGlCloseApplication );
  6610. }
  6611. else
  6612. {
  6613. m_dwOwnerAppSN = 0;
  6614. }
  6615. while (S_OK == (hr = myAzNextObject(
  6616. m_hOwnerApp,
  6617. m_dwOwnerAppSN,
  6618. AzRoleEnum,
  6619. pvarReserved,
  6620. ENUM_AZ_ROLE,
  6621. hParent,
  6622. &lContext,
  6623. (IUnknown**)&pIRole)))
  6624. {
  6625. AZASSERT(NULL != (PVOID)pIRole);
  6626. //
  6627. // myAddItemToMap will release the pIRole
  6628. //
  6629. hr = myAddItemToMap<IAzRole>(&m_coll, &pIRole);
  6630. _JumpIfError(hr, error, "myAddItemToMap");
  6631. }
  6632. if (AZ_HRESULT(ERROR_NO_MORE_ITEMS) != hr)
  6633. {
  6634. _JumpError(hr, error, "myAzNextObject");
  6635. }
  6636. hr = S_OK;
  6637. error:
  6638. return hr;
  6639. }
  6640. /////////////////////////
  6641. //CAzClientContext
  6642. /////////////////////////
  6643. CAzClientContext::CAzClientContext()
  6644. {
  6645. //init
  6646. __try {
  6647. InitializeCriticalSection(&m_cs);
  6648. } __except(EXCEPTION_EXECUTE_HANDLER) {}
  6649. m_hClientContext = NULL;
  6650. m_pwszBusinessRuleString = NULL;
  6651. }
  6652. CAzClientContext::~CAzClientContext()
  6653. {
  6654. if (NULL != m_hClientContext)
  6655. {
  6656. //
  6657. // grab the lock so that close application does not interfere
  6658. //
  6659. AzpLockResourceShared( &AzGlCloseApplication );
  6660. if (IsObjectUsable(m_hOwnerApp, m_dwOwnerAppSN))
  6661. {
  6662. AzCloseHandle(m_hClientContext, 0);
  6663. }
  6664. m_hClientContext = NULL;
  6665. AzpUnlockResource( &AzGlCloseApplication );
  6666. }
  6667. if (NULL != m_pwszBusinessRuleString)
  6668. {
  6669. AzpFreeHeap(m_pwszBusinessRuleString );
  6670. m_pwszBusinessRuleString = NULL;
  6671. }
  6672. DeleteCriticalSection(&m_cs);
  6673. }
  6674. HRESULT
  6675. CAzClientContext::AccessCheck(
  6676. IN BSTR bstrObjectName,
  6677. IN VARIANT varScopeNames,
  6678. IN VARIANT varOperations,
  6679. IN VARIANT varParameterNames,
  6680. IN VARIANT varParameterValues,
  6681. IN VARIANT varInterfaceNames,
  6682. IN VARIANT varInterfaceFlags,
  6683. IN VARIANT varInterfaces,
  6684. OUT VARIANT *pvarResults)
  6685. {
  6686. HRESULT hr;
  6687. DWORD dwErr;
  6688. ULONG lScopeCount;
  6689. LPCWSTR *ppwszScopeNames = NULL;
  6690. //
  6691. // This is the alias of the scope names that we will pass to the core
  6692. // It may be NULL if all passed in scope elements are empty, thus allow
  6693. // the use of default scope.
  6694. //
  6695. LPCWSTR *ppNonEmptyScopeNames = ppwszScopeNames;
  6696. ULONG lOperationCount;
  6697. LONG *plOperations = NULL;
  6698. ULONG *plResults = NULL;
  6699. WCHAR *pwszBusinessRuleString = NULL;
  6700. SAFEARRAY *psaScopes = NULL;
  6701. VARIANT HUGEP *pvarScopes;
  6702. SAFEARRAY *psaOperations = NULL;
  6703. VARIANT HUGEP *pvarOperations;
  6704. VARIANT varResults;
  6705. ULONG i;
  6706. SAFEARRAYBOUND rgsaBound[1]; //one dimension array
  6707. SAFEARRAY *psaResults = NULL;
  6708. long lArrayIndex[1]; //one dimension
  6709. //
  6710. // The following variants are guaranteed to be safearrays
  6711. //
  6712. VARIANT varSAParameterNames;
  6713. VARIANT varSAParameterValues;
  6714. VARIANT varSAInterfaceNames;
  6715. VARIANT varSAInterfaceFlags;
  6716. VARIANT varSAInterfaces;
  6717. VariantInit(&varSAParameterNames);
  6718. VariantInit(&varSAParameterValues);
  6719. VariantInit(&varSAInterfaceNames);
  6720. VariantInit(&varSAInterfaceFlags);
  6721. VariantInit(&varSAInterfaces);
  6722. AZASSERT(NULL != pvarResults);
  6723. AZASSERT(NULL != m_hClientContext);
  6724. // init
  6725. VariantInit(pvarResults);
  6726. //
  6727. // Grab the lock so that Close application does not interfere
  6728. //
  6729. AzpLockResourceShared( &AzGlCloseApplication );
  6730. //
  6731. // we need to protect our instance data
  6732. //
  6733. EnterCriticalSection(&m_cs);
  6734. if (NULL != m_pwszBusinessRuleString)
  6735. {
  6736. AzpFreeHeap(m_pwszBusinessRuleString );
  6737. m_pwszBusinessRuleString = NULL;
  6738. }
  6739. if (!IsObjectUsable(m_hOwnerApp, m_dwOwnerAppSN))
  6740. {
  6741. hr = AZ_HR_FROM_WIN32(ERROR_INVALID_HANDLE);
  6742. _JumpError(hr, error, "Owning application was closed.");
  6743. }
  6744. // prepare input data
  6745. //
  6746. // Validate the scope names array
  6747. //
  6748. if (varScopeNames.vt == VT_DISPATCH)
  6749. {
  6750. hr = AzpGetSafearrayFromArrayObject(varScopeNames, &psaScopes );
  6751. _JumpIfError(hr, error, "AzpGetPtrFromArrayObject");
  6752. }
  6753. else
  6754. {
  6755. dwErr = AzpSafeArrayPointerFromVariant(
  6756. &varScopeNames,
  6757. TRUE, // VT_EMPTY is to be allowed
  6758. &psaScopes );
  6759. _JumpIfWinError(dwErr, &hr, error, "AzpSafeArrayPointerFromVariant");
  6760. }
  6761. //
  6762. // If VT_EMPTY was passed, then we use the default scope
  6763. // Otherwise, get the list of scopes passed in
  6764. //
  6765. if ( psaScopes != NULL ) {
  6766. hr = SafeArrayAccessData(
  6767. psaScopes,
  6768. (void HUGEP **)&pvarScopes);
  6769. _JumpIfError(hr, error, "SafeArrayAccessData");
  6770. // get the count of scopes
  6771. lScopeCount = psaScopes->rgsabound[0].cElements;
  6772. if ( lScopeCount == 0 ) {
  6773. hr = E_INVALIDARG;
  6774. _JumpError(hr, error, "invalid Scope count");
  6775. }
  6776. // Allocate a array of LPWSTRs
  6777. SafeAllocaAllocate( ppwszScopeNames, lScopeCount*sizeof(LPWSTR) );
  6778. _JumpIfOutOfMemory(&hr, error, ppwszScopeNames, "AzpAllocateHeap");
  6779. //
  6780. // We may see empty scopes being passed in. We will reply
  6781. // on this pass to find out how many non-empty scopes we have
  6782. //
  6783. lScopeCount = 0;
  6784. // Fill in the array of LPSWTRs
  6785. for ( i=0; i<psaScopes->rgsabound[0].cElements; i++) {
  6786. ppwszScopeNames[i] = NULL;
  6787. if ( V_VT(&pvarScopes[i]) == VT_BSTR ) {
  6788. //
  6789. // we will regard NULL bstr (which is possible from C++ code or empty
  6790. // string ("") as an empty scope. This provides the best programming
  6791. // experience for scripting clients.
  6792. //
  6793. if (pvarScopes[i].bstrVal != NULL && wcslen(pvarScopes[i].bstrVal) != 0)
  6794. {
  6795. ++lScopeCount;
  6796. ppwszScopeNames[i] = V_BSTR(&pvarScopes[i]);
  6797. }
  6798. }
  6799. else if (V_VT(&pvarScopes[i]) != VT_EMPTY ) {
  6800. hr = E_INVALIDARG;
  6801. _JumpError(hr, error, "invalid scope data type");
  6802. }
  6803. }
  6804. //
  6805. // If we end up having no non-empty scopes, then we should
  6806. // pass a NULL to the core. The core enforces that if the scope
  6807. // count is 0, the scope name parameter must be NULL.
  6808. //
  6809. if (lScopeCount == 0)
  6810. {
  6811. ppNonEmptyScopeNames = NULL;
  6812. }
  6813. else
  6814. {
  6815. ppNonEmptyScopeNames = ppwszScopeNames;
  6816. }
  6817. } else { // if ( psaScopes != NULL )
  6818. lScopeCount = 0;
  6819. }
  6820. //
  6821. // Validate the operations array
  6822. //
  6823. if (varOperations.vt == VT_DISPATCH)
  6824. {
  6825. hr = AzpGetSafearrayFromArrayObject(varOperations, &psaOperations );
  6826. _JumpIfError(hr, error, "AzpGetPtrFromArrayObject");
  6827. }
  6828. else
  6829. {
  6830. dwErr = AzpSafeArrayPointerFromVariant(
  6831. &varOperations,
  6832. FALSE,
  6833. &psaOperations );
  6834. _JumpIfWinError(dwErr, &hr, error, "AzpSafeArrayPointerFromVariant");
  6835. }
  6836. AZASSERT(NULL != psaOperations);
  6837. hr = SafeArrayAccessData(
  6838. psaOperations,
  6839. (void HUGEP **)&pvarOperations);
  6840. _JumpIfError(hr, error, "SafeArrayAccessData");
  6841. // get the count of operations
  6842. lOperationCount = psaOperations->rgsabound[0].cElements;
  6843. if ( lOperationCount == 0 ) {
  6844. hr = E_INVALIDARG;
  6845. _JumpError(hr, error, "invalid operation count");
  6846. }
  6847. // Allocate a array of ULONGs
  6848. SafeAllocaAllocate( plOperations, lOperationCount*sizeof(ULONG) );
  6849. _JumpIfOutOfMemory(&hr, error, plOperations, "AzpAllocateHeap");
  6850. // Fill in the array of ULONGs
  6851. for ( i=0; i<lOperationCount; i++) {
  6852. if ( V_VT(&pvarOperations[i]) == VT_EMPTY ) {
  6853. lOperationCount = i;
  6854. if ( lOperationCount == 0 ) {
  6855. hr = E_INVALIDARG;
  6856. _JumpError(hr, error, "invalid operation count");
  6857. }
  6858. break;
  6859. }
  6860. if ( V_VT(&pvarOperations[i]) == VT_I4 ) {
  6861. plOperations[i] = V_I4(&pvarOperations[i]);
  6862. } else if ( V_VT(&pvarOperations[i]) == VT_I2 ) {
  6863. plOperations[i] = V_I2(&pvarOperations[i]);
  6864. } else {
  6865. hr = E_INVALIDARG;
  6866. _JumpError(hr, error, "invalid Operation data type");
  6867. }
  6868. }
  6869. //
  6870. // prepare the other parameters if they are JScript style
  6871. // array objects.
  6872. // If these local VARIANT variables are set to VT_EMPTY,
  6873. // it indicates that AzContextAccessCheck should not
  6874. // use this parameter. It should use the passed in parameter
  6875. // directly
  6876. //
  6877. //
  6878. // The parameter names
  6879. //
  6880. if (varParameterNames.vt == VT_DISPATCH)
  6881. {
  6882. SAFEARRAY * psaParam = NULL;
  6883. hr = AzpGetSafearrayFromArrayObject(varParameterNames, &psaParam);
  6884. if (SUCCEEDED(hr))
  6885. {
  6886. varSAParameterNames.vt = VT_ARRAY | VT_VARIANT;
  6887. varSAParameterNames.parray = psaParam;
  6888. }
  6889. _JumpIfError(hr, error, "AzpGetPtrFromArrayObject");
  6890. }
  6891. //
  6892. // The parameter values
  6893. //
  6894. if (varParameterValues.vt == VT_DISPATCH)
  6895. {
  6896. SAFEARRAY * psaParam = NULL;
  6897. hr = AzpGetSafearrayFromArrayObject(varParameterValues, &psaParam);
  6898. if (SUCCEEDED(hr))
  6899. {
  6900. varSAParameterValues.vt = VT_ARRAY | VT_VARIANT;
  6901. varSAParameterValues.parray = psaParam;
  6902. }
  6903. _JumpIfError(hr, error, "AzpGetPtrFromArrayObject");
  6904. }
  6905. //
  6906. // The interface names
  6907. //
  6908. if (varInterfaceNames.vt == VT_DISPATCH)
  6909. {
  6910. SAFEARRAY * psaParam = NULL;
  6911. hr = AzpGetSafearrayFromArrayObject(varInterfaceNames, &psaParam);
  6912. if (SUCCEEDED(hr))
  6913. {
  6914. varSAInterfaceNames.vt = VT_ARRAY | VT_VARIANT;
  6915. varSAInterfaceNames.parray = psaParam;
  6916. }
  6917. _JumpIfError(hr, error, "AzpGetPtrFromArrayObject");
  6918. }
  6919. //
  6920. // The interface flags
  6921. //
  6922. if (varInterfaceFlags.vt == VT_DISPATCH)
  6923. {
  6924. SAFEARRAY * psaParam = NULL;
  6925. hr = AzpGetSafearrayFromArrayObject(varInterfaceFlags, &psaParam);
  6926. if (SUCCEEDED(hr))
  6927. {
  6928. varSAInterfaceFlags.vt = VT_ARRAY | VT_VARIANT;
  6929. varSAInterfaceFlags.parray = psaParam;
  6930. }
  6931. _JumpIfError(hr, error, "AzpGetPtrFromArrayObject");
  6932. }
  6933. //
  6934. // The interfaces
  6935. //
  6936. if (varInterfaces.vt == VT_DISPATCH)
  6937. {
  6938. SAFEARRAY * psaParam = NULL;
  6939. hr = AzpGetSafearrayFromArrayObject(varInterfaces, &psaParam);
  6940. if (SUCCEEDED(hr))
  6941. {
  6942. varSAInterfaces.vt = VT_ARRAY | VT_VARIANT;
  6943. varSAInterfaces.parray = psaParam;
  6944. }
  6945. _JumpIfError(hr, error, "AzpGetPtrFromArrayObject");
  6946. }
  6947. //
  6948. // allocate operation results for output
  6949. //
  6950. SafeAllocaAllocate( plResults, lOperationCount*sizeof(ULONG) );
  6951. _JumpIfOutOfMemory(&hr, error, plResults, "AzpAllocateHeap");
  6952. //now we are ready to access check
  6953. dwErr = AzContextAccessCheck(
  6954. m_hOwnerApp,
  6955. m_dwOwnerAppSN,
  6956. m_hClientContext,
  6957. bstrObjectName,
  6958. lScopeCount,
  6959. ppNonEmptyScopeNames,
  6960. lOperationCount,
  6961. plOperations,
  6962. plResults,
  6963. &pwszBusinessRuleString,
  6964. (varSAParameterNames.vt == VT_EMPTY) ? &varParameterNames : &varSAParameterNames,
  6965. (varSAParameterValues.vt == VT_EMPTY) ? &varParameterValues : &varSAParameterValues,
  6966. (varSAInterfaceNames.vt == VT_EMPTY) ? &varInterfaceNames : &varSAInterfaceNames,
  6967. (varSAInterfaceFlags.vt == VT_EMPTY) ? &varInterfaceFlags : &varSAInterfaceFlags,
  6968. (varSAInterfaces.vt == VT_EMPTY) ? &varInterfaces : &varSAInterfaces
  6969. );
  6970. _JumpIfWinError(dwErr, &hr, error, "AzContextAccessCheck");
  6971. // save business rule string
  6972. m_pwszBusinessRuleString = pwszBusinessRuleString;
  6973. pwszBusinessRuleString = NULL;
  6974. // convert results to variant for output
  6975. rgsaBound[0].lLbound = 0; //array index from 0
  6976. rgsaBound[0].cElements = lOperationCount;
  6977. //create array descriptor
  6978. psaResults = SafeArrayCreate(
  6979. VT_VARIANT, //base type of array element
  6980. 1, //count of bound, ie. one dimension
  6981. rgsaBound);
  6982. _JumpIfOutOfMemory(&hr, error, psaResults, "SafeArrayCreate");
  6983. //init to 1st element
  6984. lArrayIndex[0] = 0;
  6985. //loop to load and put strings
  6986. for (i = 0; i < lOperationCount; ++i)
  6987. {
  6988. VARIANT var;
  6989. VariantInit( &var );
  6990. V_VT(&var) = VT_I4;
  6991. V_I4(&var) = plResults[i];
  6992. //put into array
  6993. hr = SafeArrayPutElement(
  6994. psaResults,
  6995. lArrayIndex,
  6996. &var );
  6997. _JumpIfError(hr, error, "SafeArrayPutElement");
  6998. //adjust index for the next element in array
  6999. ++(lArrayIndex[0]);
  7000. }
  7001. //for return
  7002. VariantInit(&varResults);
  7003. V_VT(&varResults) = VT_ARRAY | VT_VARIANT;
  7004. V_ARRAY(&varResults) = psaResults;
  7005. psaResults = NULL;
  7006. *pvarResults = varResults;
  7007. hr = S_OK;
  7008. error:
  7009. LeaveCriticalSection(&m_cs);
  7010. if (NULL != psaScopes)
  7011. {
  7012. SafeArrayUnaccessData(psaScopes);
  7013. }
  7014. if (NULL != psaOperations)
  7015. {
  7016. SafeArrayUnaccessData(psaOperations);
  7017. }
  7018. if (NULL != pwszBusinessRuleString)
  7019. {
  7020. AzpFreeHeap(pwszBusinessRuleString );
  7021. }
  7022. if (NULL != psaResults)
  7023. {
  7024. SafeArrayDestroy(psaResults);
  7025. }
  7026. SafeAllocaFree( ppwszScopeNames );
  7027. SafeAllocaFree( plOperations );
  7028. SafeAllocaFree( plResults );
  7029. VariantClear(&varSAParameterNames);
  7030. VariantClear(&varSAParameterValues);
  7031. VariantClear(&varSAInterfaceNames);
  7032. VariantClear(&varSAInterfaceFlags);
  7033. VariantClear(&varSAInterfaces);
  7034. AzpUnlockResource( &AzGlCloseApplication );
  7035. return hr;
  7036. }
  7037. HRESULT
  7038. CAzClientContext::GetRoles(
  7039. IN OPTIONAL BSTR bstrScopeName,
  7040. OUT VARIANT *pvarRoleNames)
  7041. {
  7042. HRESULT hr = S_OK;
  7043. DWORD Count = 0;
  7044. LPWSTR *Strings = NULL;
  7045. DWORD dwErr = NO_ERROR;
  7046. BSTR bstrProp;
  7047. VARIANT varRoleNames;
  7048. VARIANT TempVariant;
  7049. SAFEARRAYBOUND rgsaBound[1]; //one dimension array
  7050. SAFEARRAY *psaString = NULL;
  7051. long lArrayIndex[1]; //one dimension
  7052. DWORD i;
  7053. BSTR bstrLocal = NULL;
  7054. AZASSERT(NULL != pvarRoleNames);
  7055. AZASSERT(NULL != m_hClientContext);
  7056. //init
  7057. VariantInit(pvarRoleNames);
  7058. VariantInit( &TempVariant );
  7059. //
  7060. // Grab the lock so that close application does not interfere
  7061. //
  7062. AzpLockResourceShared( &AzGlCloseApplication );
  7063. if (!IsObjectUsable(m_hOwnerApp, m_dwOwnerAppSN))
  7064. {
  7065. hr = AZ_HR_FROM_WIN32(ERROR_INVALID_HANDLE);
  7066. _JumpError(hr, error, "Owning application was closed.");
  7067. }
  7068. //
  7069. // We get an empty string from the caller if no argument is supplied. Supply
  7070. // ScopeName to NULL if we get an empty string.
  7071. //
  7072. if (ARGUMENT_PRESENT(bstrScopeName)) {
  7073. if (bstrScopeName[0]) {
  7074. bstrLocal = bstrScopeName;
  7075. }
  7076. }
  7077. dwErr = AzContextGetRoles(
  7078. m_hClientContext,
  7079. bstrLocal,
  7080. &Strings,
  7081. &Count );
  7082. _JumpIfWinError(dwErr, &hr, error, "AzContextAccessCheck");
  7083. VariantInit(&varRoleNames);
  7084. rgsaBound[0].lLbound = 0; //array index from 0
  7085. rgsaBound[0].cElements = Count;
  7086. //create array descriptor
  7087. psaString = SafeArrayCreate(
  7088. VT_VARIANT, //base type of array element
  7089. 1, //count of bound, ie. one dimension
  7090. rgsaBound);
  7091. _JumpIfOutOfMemory(&hr, error, psaString, "SafeArrayCreate");
  7092. //init to 1st element
  7093. lArrayIndex[0] = 0;
  7094. //loop to load and put strings
  7095. for (i = 0; i < Count; ++i)
  7096. {
  7097. //1st, create an element in BSTR
  7098. bstrProp = SysAllocString(Strings[i]);
  7099. _JumpIfOutOfMemory(&hr, error, bstrProp, "SysAllocString");
  7100. //
  7101. // Fill in a temporary variant
  7102. //
  7103. VariantClear( &TempVariant );
  7104. V_VT(&TempVariant) = VT_BSTR;
  7105. V_BSTR(&TempVariant) = bstrProp;
  7106. //put into array
  7107. hr = SafeArrayPutElement(psaString, lArrayIndex, &TempVariant);
  7108. _JumpIfError(hr, error, "SafeArrayPutElement");
  7109. //adjust index for the next element in array
  7110. ++(lArrayIndex[0]);
  7111. }
  7112. //for return
  7113. varRoleNames.vt = VT_ARRAY | VT_VARIANT;
  7114. varRoleNames.parray = psaString;
  7115. psaString = NULL;
  7116. //return
  7117. *pvarRoleNames = varRoleNames;
  7118. hr = S_OK;
  7119. error:
  7120. if (NULL != Strings)
  7121. {
  7122. AzFreeMemory(Strings);
  7123. }
  7124. if (NULL != psaString)
  7125. {
  7126. SafeArrayDestroy(psaString);
  7127. }
  7128. VariantClear( &TempVariant );
  7129. AzpUnlockResource( &AzGlCloseApplication );
  7130. return hr;
  7131. }
  7132. HRESULT
  7133. CAzClientContext::GetBusinessRuleString(
  7134. OUT BSTR *pbstrBusinessRuleString)
  7135. {
  7136. HRESULT hr;
  7137. AZASSERT(NULL != pbstrBusinessRuleString);
  7138. //
  7139. // Grab the lock so that close application does not interfere
  7140. //
  7141. AzpLockResourceShared( &AzGlCloseApplication );
  7142. if (!IsObjectUsable(m_hOwnerApp, m_dwOwnerAppSN))
  7143. {
  7144. hr = AZ_HR_FROM_WIN32(ERROR_INVALID_HANDLE);
  7145. _JumpError(hr, error, "Owning application was closed.");
  7146. }
  7147. if ( m_pwszBusinessRuleString == NULL ) {
  7148. *pbstrBusinessRuleString = NULL;
  7149. } else {
  7150. *pbstrBusinessRuleString = SysAllocString(m_pwszBusinessRuleString);
  7151. _JumpIfOutOfMemory(&hr, error, *pbstrBusinessRuleString, "SysAllocString");
  7152. }
  7153. hr = S_OK;
  7154. error:
  7155. AzpUnlockResource( &AzGlCloseApplication );
  7156. return hr;
  7157. }
  7158. HRESULT CAzClientContext::get_UserDn(
  7159. OUT BSTR *pbstrProp
  7160. )
  7161. {
  7162. return myGetBstrProperty(
  7163. m_hOwnerApp,
  7164. m_dwOwnerAppSN,
  7165. m_hClientContext,
  7166. AZ_PROP_CLIENT_CONTEXT_USER_DN,
  7167. pbstrProp);
  7168. }
  7169. HRESULT CAzClientContext::get_UserSamCompat(
  7170. OUT BSTR *pbstrProp
  7171. )
  7172. {
  7173. return myGetBstrProperty(
  7174. m_hOwnerApp,
  7175. m_dwOwnerAppSN,
  7176. m_hClientContext,
  7177. AZ_PROP_CLIENT_CONTEXT_USER_SAM_COMPAT,
  7178. pbstrProp);
  7179. }
  7180. HRESULT CAzClientContext::get_UserDisplay(
  7181. OUT BSTR *pbstrProp
  7182. )
  7183. {
  7184. return myGetBstrProperty(
  7185. m_hOwnerApp,
  7186. m_dwOwnerAppSN,
  7187. m_hClientContext,
  7188. AZ_PROP_CLIENT_CONTEXT_USER_DISPLAY,
  7189. pbstrProp);
  7190. }
  7191. HRESULT CAzClientContext::get_UserGuid(
  7192. OUT BSTR *pbstrProp
  7193. )
  7194. {
  7195. CComVariant vtemp;
  7196. return myGetBstrProperty(
  7197. m_hOwnerApp,
  7198. m_dwOwnerAppSN,
  7199. m_hClientContext,
  7200. AZ_PROP_CLIENT_CONTEXT_USER_GUID,
  7201. pbstrProp);
  7202. }
  7203. HRESULT CAzClientContext::get_UserCanonical(
  7204. OUT BSTR *pbstrProp
  7205. )
  7206. {
  7207. return myGetBstrProperty(
  7208. m_hOwnerApp,
  7209. m_dwOwnerAppSN,
  7210. m_hClientContext,
  7211. AZ_PROP_CLIENT_CONTEXT_USER_CANONICAL,
  7212. pbstrProp);
  7213. }
  7214. HRESULT CAzClientContext::get_UserUpn(
  7215. OUT BSTR *pbstrProp
  7216. )
  7217. {
  7218. return myGetBstrProperty(
  7219. m_hOwnerApp,
  7220. m_dwOwnerAppSN,
  7221. m_hClientContext,
  7222. AZ_PROP_CLIENT_CONTEXT_USER_UPN,
  7223. pbstrProp);
  7224. }
  7225. HRESULT CAzClientContext::get_UserDnsSamCompat(
  7226. OUT BSTR *pbstrProp
  7227. )
  7228. {
  7229. return myGetBstrProperty(
  7230. m_hOwnerApp,
  7231. m_dwOwnerAppSN,
  7232. m_hClientContext,
  7233. AZ_PROP_CLIENT_CONTEXT_USER_DNS_SAM_COMPAT,
  7234. pbstrProp);
  7235. }
  7236. HRESULT
  7237. CAzClientContext::GetProperty(
  7238. IN LONG lPropId,
  7239. IN VARIANT varReserved,
  7240. OUT VARIANT *pvarProp)
  7241. {
  7242. return myAzGetProperty(
  7243. m_hOwnerApp,
  7244. m_dwOwnerAppSN,
  7245. m_hClientContext,
  7246. lPropId,
  7247. varReserved,
  7248. pvarProp);
  7249. }
  7250. HRESULT CAzClientContext::get_RoleForAccessCheck(
  7251. OUT BSTR *pbstrProp
  7252. )
  7253. {
  7254. return myGetBstrProperty(
  7255. m_hOwnerApp,
  7256. m_dwOwnerAppSN,
  7257. m_hClientContext,
  7258. AZ_PROP_CLIENT_CONTEXT_ROLE_FOR_ACCESS_CHECK,
  7259. pbstrProp);
  7260. }
  7261. HRESULT CAzClientContext::put_RoleForAccessCheck(
  7262. IN BSTR bstrProp
  7263. )
  7264. {
  7265. return mySetBstrProperty(
  7266. m_hOwnerApp,
  7267. m_dwOwnerAppSN,
  7268. m_hClientContext,
  7269. AZ_PROP_CLIENT_CONTEXT_ROLE_FOR_ACCESS_CHECK,
  7270. bstrProp);
  7271. }
  7272. HRESULT
  7273. CAzClientContext::_Init(
  7274. IN AZ_HANDLE hOwnerApp,
  7275. IN AZ_HANDLE hHandle,
  7276. IN LONG lReserved)
  7277. {
  7278. HRESULT hr;
  7279. EnterCriticalSection(&m_cs);
  7280. //init once
  7281. AZASSERT(NULL == m_hClientContext);
  7282. AZASSERT(NULL != hHandle);
  7283. m_hClientContext = hHandle;
  7284. m_lReserved = lReserved;
  7285. m_hOwnerApp = hOwnerApp;
  7286. if (hOwnerApp != NULL)
  7287. {
  7288. //
  7289. //Grab the lock to maintain order
  7290. //
  7291. AzpLockResourceShared( &AzGlCloseApplication );
  7292. m_dwOwnerAppSN = AzpRetrieveApplicationSequenceNumber(hOwnerApp);
  7293. AzpUnlockResource( &AzGlCloseApplication );
  7294. }
  7295. else
  7296. {
  7297. m_dwOwnerAppSN = 0;
  7298. }
  7299. hr = S_OK;
  7300. //error:
  7301. LeaveCriticalSection(&m_cs);
  7302. return hr;
  7303. }