Windows NT 4.0 source code leak
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.

1089 lines
19 KiB

4 years ago
  1. /*++
  2. Copyright (c) 1992 Microsoft Corporation
  3. Module Name:
  4. protocol.hxx
  5. Abstract:
  6. This module deals with objects that make up the server and group
  7. entry items. This includes creatation/destruction and searching
  8. of the entries.
  9. Author:
  10. Steven Zeck (stevez) 07/01/90
  11. --*/
  12. #ifndef _PROTOCOL_
  13. #define _PROTOCOL_
  14. class QUERY_SERVER;
  15. class ENTRY_BASE_NODE;
  16. class ENTRY_BASE_ITEM;
  17. class ENTRY_SERVER_ITEM;
  18. class ENTRY_SERVER_NODE;
  19. class ENTRY_GROUP_ITEM;
  20. class ENTRY_GROUP_NODE;
  21. DYN_ARRAY_TYPE(UUID_ARRAY, NS_UUID, LONG)
  22. // The following enumeration is the the type of entry the object is.
  23. typedef enum {
  24. ServerEntryType = 1,
  25. GroupEntryType,
  26. ProfileEntryType,
  27. AnyEntryType,
  28. LastEntryType
  29. } TYPE_ENTRY_NODE ;
  30. // The following are the type of base member entry the object is.
  31. typedef enum {
  32. LocalItemType = 1, // local item
  33. CacheItemType, // cached item, ie - remote
  34. DeleteItemType, // delayed delete due
  35. LastItemType // end marker
  36. } TYPE_ENTRY_ITEM;
  37. // The follwing is the return values by MatchItem virtual functions.
  38. typedef enum {
  39. NoMatch, // Item didn't match
  40. ItemMatch, // This item matched
  41. SubItemMatch, // or a subitem under this object matched
  42. }MATCH_RETURN;
  43. // The following is the format for a query on the net with mailslots.
  44. typedef struct {
  45. NS_SYNTAX_ID Interface; // inteface that we are looking for
  46. NS_UUID Object; // Object that we are interested in
  47. UICHAR WkstaName[DOMAIN_MAX]; // buffer for machine name
  48. UICHAR EntryName[ENTRY_MAX]; // buffer for entry name
  49. } QueryPacket;
  50. /*++
  51. Class Definition:
  52. ENTRY_KEY
  53. Abstract:
  54. This is the EntryName object. It is the name of the entries in
  55. the in memory object data base.
  56. --*/
  57. class ENTRY_KEY {
  58. private:
  59. UNICODE_ARRAY EntryName; // and the string value of the entry
  60. public:
  61. ENTRY_KEY(
  62. IN PUZ Name,
  63. IN PUZ DomainName,
  64. OUT STATUS *Status
  65. );
  66. ENTRY_KEY(
  67. IN PUZ Name,
  68. IN int fAllowGlobal,
  69. OUT STATUS *Status
  70. );
  71. // Construct a new object by copying an existing one.
  72. ENTRY_KEY(
  73. IN ENTRY_KEY *KeyNew,
  74. OUT STATUS *Status
  75. )
  76. {
  77. EntryName = KeyNew->EntryName.Dup();
  78. *Status = (!KeyNew->EntryName.pCur() || EntryName.pCur())?
  79. NSI_S_OK: NSI_S_OUT_OF_MEMORY;
  80. }
  81. ACCESSOR(UNICODE_ARRAY, EntryName);
  82. // Free the allocated objects referenced.
  83. void
  84. Free(
  85. )
  86. {
  87. EntryName.Free();
  88. }
  89. // Set the value of the EntryName
  90. void
  91. SetEntryName(
  92. IN UNICODE_ARRAY &New,
  93. OUT UNICODE_ARRAY &Previous
  94. )
  95. {
  96. Previous = EntryName;
  97. EntryName = New;
  98. }
  99. int
  100. Equal(
  101. UNICODE_ARRAY& Entry1
  102. );
  103. // Compare two objects for identity
  104. int
  105. Equal (
  106. IN ENTRY_KEY &Entry1
  107. )
  108. {
  109. return(Equal(Entry1.EntryName));
  110. }
  111. // Determine if an entry name is empty.
  112. int
  113. IsNil(
  114. )
  115. {
  116. return(EntryName.cCur() == 0);
  117. }
  118. // Return a Copy of the entry name.
  119. UICHAR *
  120. CopyName(
  121. )
  122. {
  123. return((UICHAR *)NewCopy(EntryName.pCur(), (int) EntryName.Size()));
  124. }
  125. // Return the size to marshall this object.
  126. int
  127. MarshallSize(
  128. )
  129. {
  130. return(sizeof(ENTRY_KEY) + EntryName.Size());
  131. }
  132. char *
  133. Marshall(
  134. OUT char *Buffer
  135. );
  136. PUZ
  137. MakeLocalName(
  138. OUT PUZ Buffer,
  139. OUT PUZ DomainBuffer,
  140. IN PUZ DefDomain
  141. );
  142. friend char *
  143. KeyEntryUnMarshall(
  144. OUT ENTRY_KEY **Key,
  145. IN UICHAR * Domain,
  146. IN char *Buffer,
  147. OUT STATUS *Status
  148. );
  149. friend ostream& operator << (ostream&, ENTRY_KEY&);
  150. };
  151. /*++
  152. Class Definition:
  153. QUERY_REF_ITEM
  154. Abstract:
  155. This linked list is how replies are stored. Each found EntryItem
  156. is referenced by a pointer to the base case for EntryItems.
  157. --*/
  158. NEW_LINK_LIST(QUERY_REF,
  159. ENTRY_BASE_ITEM *EntryItem; /* Reference to matched item */
  160. QUERY_REF_ITEM (
  161. IN ENTRY_BASE_ITEM *EntryItemNew
  162. )
  163. {
  164. EntryItem = EntryItemNew;
  165. }
  166. QUERY_REF_ITEM *
  167. Free(
  168. IN OUT QUERY_REF_LIST &ML
  169. );
  170. friend ostream& operator << (ostream&, QUERY_REF_ITEM&);
  171. friend class QUERY;
  172. )
  173. /*++
  174. Class Definition:
  175. QUERY
  176. Abstract:
  177. Base class for a query into the object data base. It contains the
  178. specification for the query and the resulting replay.
  179. --*/
  180. class QUERY {
  181. protected:
  182. QUERY_REF_LIST ReplyList; // List which gets the reply from the query.
  183. ENTRY_KEY Entry; // The entry, that we are searching on.
  184. TYPE_ENTRY_NODE Type; // Type of entry we are interested in.
  185. long ExpirationTime; // Cut off point for cached entries.
  186. long Scope; // Flags which limit query.
  187. int RecursionCount; // Keeps track of the recursion in searchs.
  188. public:
  189. QUERY(
  190. IN TYPE_ENTRY_NODE TypeNew,
  191. IN ENTRY_KEY *KeyNew,
  192. IN long ScopeNew,
  193. OUT STATUS *Status
  194. ) :
  195. Entry(KeyNew, Status)
  196. {
  197. Type = TypeNew;
  198. ExpirationTime = maxCacheAge;
  199. Scope = ScopeNew;
  200. RecursionCount = 0;
  201. }
  202. ~QUERY() {
  203. Entry.Free();
  204. }
  205. ENTRY_BASE_ITEM *
  206. NextReply(
  207. );
  208. QUERY_REF_ITEM *
  209. First(
  210. )
  211. {
  212. return(ReplyList.First());
  213. }
  214. void FreeReply(
  215. IN QUERY_REF_ITEM * Item
  216. )
  217. {
  218. Item->Free(ReplyList);
  219. }
  220. ACCESSOR(long, ExpirationTime);
  221. STATUS
  222. Search(
  223. );
  224. STATUS
  225. SearchEntry(
  226. IN ENTRY_SERVER_NODE * &ENTRY_SERVER
  227. );
  228. virtual STATUS
  229. QueryNet(
  230. );
  231. STATUS BroadCast(
  232. IN QueryPacket& NetRequest,
  233. IN ENTRY_KEY &Entry
  234. );
  235. virtual STATUS
  236. GetUpdatesFromMasterLocator(
  237. );
  238. char * DetectMasterLocator(
  239. );
  240. };
  241. /*++
  242. Class Definition:
  243. QUERY_SERVER
  244. Abstract:
  245. Dervived class when searching only for a server entry object.
  246. --*/
  247. class QUERY_SERVER: public QUERY {
  248. private:
  249. // The following optional members are used to filter the search.
  250. NS_SYNTAX_ID Interface; // Interface of interest.
  251. NS_SYNTAX_ID TransferSyntax; // Stub transfer syntax of interest.
  252. NS_UUID Object; // Object of interest
  253. public:
  254. QUERY_SERVER(
  255. IN ENTRY_KEY *KeyNew,
  256. IN NS_SYNTAX_ID *InterfaceNew,
  257. IN NS_SYNTAX_ID * TransferSyntaxNew,
  258. IN NS_UUID *ObjectNew,
  259. IN long ScopeNew,
  260. OUT STATUS *Status
  261. ) : QUERY (ServerEntryType, KeyNew, ScopeNew, Status)
  262. {
  263. Interface = *InterfaceNew;
  264. TransferSyntax = *TransferSyntaxNew;
  265. Object = *ObjectNew;
  266. }
  267. ACCESSOR(NS_UUID, Object);
  268. virtual STATUS
  269. QueryNet(
  270. );
  271. virtual STATUS
  272. GetUpdatesFromMasterLocator(
  273. );
  274. friend class ENTRY_SERVER_ITEM;
  275. };
  276. /*++
  277. Class Definition:
  278. QUERY_GROUP
  279. Abstract:
  280. Dervived class when searching only for a group entry object.
  281. --*/
  282. class QUERY_GROUP: public QUERY {
  283. private:
  284. public:
  285. QUERY_GROUP(
  286. IN ENTRY_KEY *KeyNew,
  287. IN long ScopeNew,
  288. OUT STATUS *Status
  289. ) : QUERY (GroupEntryType, KeyNew, ScopeNew, Status)
  290. {
  291. }
  292. virtual STATUS
  293. QueryNet(
  294. );
  295. virtual STATUS
  296. GetUpdatesFromMasterLocator(
  297. );
  298. friend class ENTRY_GROUP_ITEM;
  299. };
  300. /*++
  301. Class Definition:
  302. ENTRY_BASE_ITEM
  303. Abstract:
  304. Each type of entry object has a linked list of these objects. These items
  305. make up the member objects that belong to the entry. This is the
  306. base class for all member objects of a EntryNode (see next class).
  307. --*/
  308. NEW_LINK_LIST(ENTRY_BASE,
  309. protected:
  310. TYPE_ENTRY_ITEM Type; /* type of list item */
  311. ENTRY_BASE_NODE *EntryNode; /* reference to which node I'm in */
  312. ULONG Time; /* time arrived for cached PS */
  313. ULONG UseCount; /* number of references to object */
  314. public:
  315. ENTRY_BASE_ITEM(
  316. IN TYPE_ENTRY_ITEM TypeNew
  317. )
  318. {
  319. Type = TypeNew;
  320. Time = CurrentTime();
  321. EntryNode = NIL;
  322. UseCount = 1;
  323. }
  324. ACCESSOR(ENTRY_BASE_NODE *, EntryNode)
  325. // See if a this object is a queried type.
  326. BOOL
  327. IsType(
  328. IN TYPE_ENTRY_ITEM qType
  329. )
  330. {
  331. return(qType == Type);
  332. }
  333. // Determine if a cached entry is stale and should be discarded.
  334. BOOL
  335. IsStaleEntry(
  336. IN long Age
  337. )
  338. {
  339. return(Type == CacheItemType && CurrentTime() > Time+Age);
  340. }
  341. // Threads must Reserve and Release an node item to use it.
  342. void
  343. MultiThreadReserve(
  344. )
  345. {
  346. UseCount++;
  347. }
  348. void
  349. MultiThreadRelease(
  350. )
  351. {
  352. UseCount--;
  353. if (Type == DeleteItemType && UseCount == 0)
  354. delete this;
  355. }
  356. virtual
  357. ~ENTRY_BASE_ITEM(
  358. );
  359. virtual MATCH_RETURN
  360. MatchItem(
  361. IN QUERY *SearchSpec
  362. );
  363. virtual int
  364. Marshall(
  365. OUT PB Buffer,
  366. IN OUT long UNALIGNED *cbBuffer
  367. );
  368. virtual ostream&
  369. Format(
  370. IN OUT ostream&
  371. );
  372. friend ostream& operator << (ostream&, ENTRY_BASE_ITEM&);
  373. )
  374. /*++
  375. Class Definition:
  376. ENTRY_BASE_NODE
  377. Abstract:
  378. This is the base class for all entry objects. It contains the name
  379. of the entry and the type. All ENTRY_BASE_ITEM are belong to one
  380. of this objects. This object is the one keep in the dictionary
  381. for fast access.
  382. --*/
  383. class ENTRY_BASE_NODE {
  384. protected:
  385. ENTRY_KEY Entry; // The entry name, must be first member.
  386. TYPE_ENTRY_NODE Type; // Type of entry object.
  387. ENTRY_BASE_LIST ItemList; // List of member objects of this node.
  388. public:
  389. unsigned long LastUpdateTime;
  390. ENTRY_BASE_NODE(
  391. IN TYPE_ENTRY_NODE TypeNew,
  392. IN ENTRY_KEY *KeyNew,
  393. OUT STATUS *Status
  394. ):
  395. Entry (KeyNew, Status)
  396. {
  397. Type = TypeNew;
  398. LastUpdateTime = 0;
  399. }
  400. ACCESSOR(ENTRY_KEY, Entry)
  401. ACCESSOR(ENTRY_BASE_LIST, ItemList)
  402. // See if a this object is a queried type.
  403. BOOL
  404. IsType(
  405. IN TYPE_ENTRY_NODE qType
  406. )
  407. {
  408. return(qType == Type);
  409. }
  410. virtual void DeleteAllObjects()
  411. {
  412. //do nothing - just keep compiler happy
  413. }
  414. friend int ENTRY_BASE_NODECompare(ENTRY_KEY &E1, ENTRY_BASE_NODE &E2);
  415. friend ENTRY_KEY& ENTRY_BASE_NODEMyKey(ENTRY_BASE_NODE &E1);
  416. friend ostream& operator << (ostream&, ENTRY_BASE_NODE&);
  417. };
  418. /*++
  419. Class Definition:
  420. ENTRY_SERVER_NODE
  421. Abstract:
  422. The is a server entry node. This class addes the object vector
  423. which all members of a server entry share.
  424. --*/
  425. class ENTRY_SERVER_NODE:public ENTRY_BASE_NODE {
  426. private:
  427. UUID_ARRAY ObjectDA; // Commaon object vector.
  428. public:
  429. ENTRY_SERVER_NODE(
  430. IN ENTRY_KEY *KeyNew,
  431. OUT STATUS *Status
  432. ): ENTRY_BASE_NODE (ServerEntryType, KeyNew, Status)
  433. {
  434. }
  435. ACCESSOR(UUID_ARRAY, ObjectDA)
  436. STATUS
  437. MergeObjects(
  438. IN UUID_ARRAY *NewObject
  439. );
  440. int
  441. DeleteObject(
  442. IN NS_UUID *Objects
  443. );
  444. virtual void DeleteAllObjects(
  445. );
  446. int
  447. SearchObject(
  448. IN NS_UUID *Object
  449. );
  450. ENTRY_SERVER_ITEM *
  451. First(
  452. )
  453. {
  454. return((ENTRY_SERVER_ITEM * ) TheItemList().First());
  455. }
  456. friend ostream& operator << (ostream&, ENTRY_SERVER_NODE&);
  457. friend class ENTRY_SERVER_ITEM;
  458. };
  459. /*++
  460. Class Definition:
  461. ENTRY_SERVER_ITEM
  462. Abstract:
  463. This instance of a sever entry member object. It adds members which
  464. describe the interface the the binding.
  465. --*/
  466. class ENTRY_SERVER_ITEM: public ENTRY_BASE_ITEM {
  467. private:
  468. NS_SYNTAX_ID Interface; // The interface of the member.
  469. NS_SYNTAX_ID TransferSyntax; // The stub transfer syntax of the member.
  470. UNICODE_ARRAY StringBinding; // DCE string binding.
  471. public:
  472. ASSERT_CLASS;
  473. ENTRY_SERVER_ITEM (
  474. IN TYPE_ENTRY_ITEM TypeNew,
  475. IN NS_SYNTAX_ID *InterfaceNew,
  476. IN NS_SYNTAX_ID * Transfer,
  477. IN PUZ StringBinding,
  478. OUT STATUS *Status);
  479. virtual
  480. ~ENTRY_SERVER_ITEM(
  481. );
  482. int
  483. Compare(
  484. IN ENTRY_SERVER_ITEM * ServerItem
  485. );
  486. // Memeber access/update functions
  487. NS_UUID &
  488. TheInterfaceGID(
  489. )
  490. {
  491. return(Interface.ThesyntaxGID());
  492. }
  493. ENTRY_KEY &
  494. TheEntry(
  495. )
  496. {
  497. return(EntryNode->TheEntry());
  498. }
  499. UUID_ARRAY &
  500. TheObjectDA(
  501. )
  502. {
  503. return(((ENTRY_SERVER_NODE *)EntryNode)->TheObjectDA());
  504. }
  505. ACCESSOR(NS_SYNTAX_ID, Interface);
  506. ACCESSOR(NS_SYNTAX_ID, TransferSyntax);
  507. ACCESSOR(UNICODE_ARRAY, StringBinding);
  508. virtual MATCH_RETURN
  509. MatchItem(
  510. IN QUERY *SearchSpec
  511. );
  512. virtual int
  513. Marshall(
  514. OUT PB Buffer,
  515. IN OUT long UNALIGNED *cbBuffer
  516. );
  517. virtual ostream&
  518. Format(
  519. ostream&
  520. );
  521. ENTRY_SERVER_ITEM *
  522. Next(
  523. )
  524. {
  525. return((ENTRY_SERVER_ITEM * ) ENTRY_BASE_ITEM::Next());
  526. }
  527. friend ostream& operator << (ostream&, QUERY_REF_ITEM&);
  528. friend ostream& operator << (ostream&, ENTRY_SERVER_ITEM&);
  529. };
  530. STATUS
  531. InsertServerEntry(
  532. IN ENTRY_KEY *Entry,
  533. IN ENTRY_SERVER_ITEM *ServerItem,
  534. IN UUID_ARRAY * ObjectDA
  535. );
  536. /*++
  537. Class Definition:
  538. ENTRY_GROUP_NODE
  539. Abstract:
  540. This is a group entry node. No additional data members are added.
  541. --*/
  542. class ENTRY_GROUP_NODE:public ENTRY_BASE_NODE {
  543. private:
  544. public:
  545. ENTRY_GROUP_NODE(
  546. IN ENTRY_KEY *KeyNew,
  547. OUT STATUS *Status
  548. ): ENTRY_BASE_NODE (GroupEntryType, KeyNew, Status)
  549. {
  550. }
  551. ENTRY_GROUP_ITEM *
  552. First(
  553. )
  554. {
  555. return((ENTRY_GROUP_ITEM * ) TheItemList().First());
  556. }
  557. friend ostream& operator << (ostream&, ENTRY_GROUP_NODE&);
  558. friend class EnteryGroupItem;
  559. };
  560. /*++
  561. Class Definition:
  562. ENTRY_GROUP_ITEM
  563. Abstract:
  564. This is a group entry member item. Group are simply a list of entry
  565. names that reference other entry objects. The links are symbolic
  566. references, not pointer values.
  567. --*/
  568. class ENTRY_GROUP_ITEM: public ENTRY_BASE_ITEM {
  569. private:
  570. UNICODE_ARRAY Member; // Entry Name of the member.
  571. public:
  572. ASSERT_CLASS;
  573. ENTRY_GROUP_ITEM (
  574. IN TYPE_ENTRY_ITEM TypeNew,
  575. IN PUZ MemberBinding,
  576. OUT STATUS *Status
  577. );
  578. virtual ~ENTRY_GROUP_ITEM(
  579. );
  580. // Compare this item with an other group member.
  581. int
  582. Compare (
  583. IN ENTRY_GROUP_ITEM * GroupItem
  584. )
  585. {
  586. return (CmpUZ(Member.pCur(), GroupItem->Member.pCur()));
  587. }
  588. // Compare this item with a unicode string for identity.
  589. int
  590. Compare (
  591. IN PUZ Name
  592. )
  593. {
  594. return (CmpUZ(Member.pCur(), Name));
  595. }
  596. ACCESSOR(UNICODE_ARRAY, Member);
  597. virtual MATCH_RETURN
  598. MatchItem(
  599. IN OUT QUERY *SearchSpec
  600. );
  601. virtual int
  602. Marshall(
  603. OUT PB Buffer,
  604. IN OUT long UNALIGNED *cbBuffer
  605. );
  606. virtual ostream&
  607. Format(
  608. IN OUT ostream&
  609. );
  610. ENTRY_GROUP_ITEM *
  611. Next(
  612. )
  613. {
  614. return((ENTRY_GROUP_ITEM * ) ENTRY_BASE_ITEM::Next());
  615. }
  616. friend ostream& operator << (ostream&, ENTRY_GROUP_ITEM&);
  617. };
  618. STATUS
  619. InsertGroupEntry(
  620. IN ENTRY_KEY *Entry,
  621. IN ENTRY_GROUP_ITEM *GroupItem
  622. );
  623. /*++
  624. Class Definition:
  625. REPLY_BASE_ITEM
  626. Abstract:
  627. All replies are kept in a LinkList. There is a base reply type
  628. which is used to derive several different kinds of replies in progress.
  629. Each derived REPLY_BASE must implement the virtual functions Free and Discard.
  630. --*/
  631. /* State of the Query in a lookup operation. */
  632. typedef enum {
  633. InitialQuery, /* First query has been made */
  634. FinialQuery, /* Finial query made, no more allowed */
  635. ReRunQuery /* Rerun the query */
  636. }REPLY_STATE;
  637. NEW_LINK_LIST(REPLY_BASE,
  638. protected:
  639. long pidOwner; /* owner of the resource */
  640. QUERY * aQuery; /* QUERY for lookup */
  641. REPLY_STATE QueryMade; /* QUERY has been made */
  642. public:
  643. REPLY_BASE_ITEM();
  644. ~REPLY_BASE_ITEM();
  645. BOOL
  646. AssertHandle(
  647. );
  648. /* Set the cache discard age for a query. */
  649. void SetExpiration(
  650. IN unsigned long Time
  651. )
  652. {
  653. aQuery->TheExpirationTime() = Time;
  654. /* If the "Next" operation hasn't been called, rerun the query. */
  655. if (QueryMade == InitialQuery) {
  656. FreeQueryResult();
  657. QueryMade = ReRunQuery;
  658. }
  659. }
  660. /* Get the next item in the query reply. */
  661. ENTRY_BASE_ITEM *
  662. NextBaseItem(
  663. )
  664. {
  665. return(aQuery->NextReply());
  666. }
  667. STATUS
  668. PerformQueryIfNeeded(
  669. BOOL fFirstTime
  670. );
  671. void
  672. FreeQueryResult(
  673. );
  674. virtual BOOL
  675. Discard(
  676. IN ENTRY_BASE_ITEM *BaseItem
  677. );
  678. virtual BOOL
  679. UpdateObject(
  680. IN ENTRY_SERVER_NODE *Entry,
  681. IN int Index
  682. );
  683. )
  684. extern REPLY_BASE_LIST RPRoot; // Global list of replies from this root.
  685. inline
  686. REPLY_BASE_ITEM::REPLY_BASE_ITEM(
  687. )
  688. /*++
  689. Routine Description:
  690. Construct a base REPLY_BASE_ITEM object. Link this object into the
  691. global list of replies.
  692. --*/
  693. {
  694. QueryMade = InitialQuery;
  695. aQuery = NIL;
  696. pidOwner = (long) this;
  697. RPRoot.Append(this);
  698. }
  699. /*++
  700. Class Definition:
  701. REPLY_SERVER_ITEM
  702. Abstract:
  703. This a reply object for a server entry based query. It contains
  704. additional state to interate through the replies formain the
  705. cross product of the reply list and object vector.
  706. --*/
  707. NEW_LINK_LIST_CLASS(REPLY_SERVER, REPLY_BASE,
  708. private:
  709. unsigned int VectorSize; /* Vector size to return */
  710. unsigned int fAllObjects; /* Include all objects in response */
  711. UUID_ARRAY_ITER ObjectCur; /* Iterator for current object */
  712. public:
  713. REPLY_SERVER_ITEM(
  714. IN QUERY_SERVER * aQueryNew,
  715. IN BOOL fAllObjectsNew = FALSE,
  716. IN int VectorSizeNew = 0
  717. )
  718. {
  719. aQuery = aQueryNew; /* BUGBUG glock c++: base should require this */
  720. VectorSize = VectorSizeNew;
  721. fAllObjects = fAllObjectsNew;
  722. }
  723. STATUS
  724. PerformQueryIfNeeded(
  725. BOOL fFirstTime
  726. );
  727. ENTRY_SERVER_ITEM *
  728. NextBindingAndObject(
  729. OUT NS_UUID ** Object
  730. );
  731. BOOL
  732. NextObject(
  733. OUT NS_UUID ** Object
  734. )
  735. {
  736. return((!ObjectCur)? FALSE:
  737. (*Object = &*ObjectCur, ++ObjectCur, TRUE));
  738. }
  739. ACCESSOR(unsigned int, VectorSize);
  740. virtual BOOL
  741. Discard(
  742. IN ENTRY_BASE_ITEM *BaseItem
  743. );
  744. virtual BOOL
  745. UpdateObject(
  746. IN ENTRY_SERVER_NODE *Entry,
  747. IN int Index
  748. );
  749. )
  750. /*++
  751. Class Definition:
  752. REPLY_GROUP_ITEM
  753. Abstract:
  754. This a reply object for a group entry based query. Only group
  755. items will be in the reply list.
  756. --*/
  757. NEW_LINK_LIST_CLASS(REPLY_GROUP, REPLY_BASE,
  758. public:
  759. REPLY_GROUP_ITEM(
  760. IN QUERY_GROUP * aQueryNew
  761. )
  762. {
  763. aQuery = aQueryNew; /* BUGBUG glock c++: base should require this */
  764. }
  765. )
  766. #endif // _PROTOCOL_