3.1.2.5.1.3 IObjectExporter::ComplexPing (Opnum 2)

The ComplexPing (Opnum 2) method is invoked to create or modify a ping set, to ping a ping set, or to perform a combination of these operations in one invocation.

 [idempotent] error_status_t ComplexPing(
   [in] handle_t hRpc,
   [in, out] SETID* pSetId,
   [in] unsigned short SequenceNum,
   [in] unsigned short cAddToSet,
   [in] unsigned short cDelFromSet,
   [in, unique, size_is(cAddToSet)] 
     OID AddToSet[],
   [in, unique, size_is(cDelFromSet)] 
     OID DelFromSet[],
   [out] unsigned short* pPingBackoffFactor
 );

hRpc: This MUST specify an RPC binding handle as specified in [MS-RPCE] section 3.2.2.3.1.

pSetId: This MUST specify the SETID of the ping set to ping. If the SETID specified by the client is zero, the object resolver MUST return the SETID of a new ping set containing the OIDs specified in AddToSet. If the SETID specified by the client is not zero, the object exporter MUST not change the SETID.

SequenceNum: This MUST specify a sequence number shared between the client and the object resolver.

cAddToSet: This MUST specify the number of OIDs in the AddToSet array.

cDelFromSet: This MUST specify the number of OIDs in the DelFromSet array.

AddToSet: This MUST specify an array of OIDs to add to the set.

DelFromSet: This MUST specify an array of OIDs to remove from the set.

pPingBackoffFactor: This MUST contain a hint to reduce ping load on the server. Servers MAY set the hint to an implementation-specific value. Clients MAY choose to treat this as zero always.<55>

When processing this call:

  • The object resolver MAY compare the client's credentials against a set of implementation-specific permissions.<56> If the permissions do not allow access to the client credentials, the object resolver MUST return ERROR_ACCESS_DENIED (as specified in [MS-ERREF] section 2.2).

  • If the client specifies a nonzero SETID, the object resolver MUST look up the SETID entry for the SETID. If the entry is not found, the object resolver MUST return OR_INVALID_SET (as specified in [MS-ERREF] section 2.2).

  • If the entry is found, and if it has a sequence number greater than that specified by the client, the object resolver MUST take no further action and return success.

  • Otherwise, the object resolver MUST do the following:

    • For each OID in the AddToSet list:

      • It MUST look up the OID in the OID list in the SETID entry.

      • If not found:

        • It MUST look up the OID entry in the OID table. If found:

          • It MUST increment the reference count in the OID entry.

          • It MUST add the OID to the OID list in the SETID entry.

        • If the OID entry is not found, it MUST return OR_INVALID_OID ([MS-ERREF] section 2.2).

    • For each OID in the DelFromSet list:

      • It MUST look up the OID in the OID list in the SETID entry.

      • If found:

        • It MUST look up the OID entry in the OID table. If found:

          • It MUST decrement the reference count in the OID entry.

        • If the OID entry is not found, it MUST proceed to the following step.

        • It MUST remove the OID from the OID list in the SETID entry.

    • It MUST reset the ping timer in the SETID entry.

    • It MUST set the sequence number to the value specified by the client.

  • If the client specifies a NULL SETID, it MUST add a new SETID entry as follows:

    • It MUST allocate a SETID.

    • It MUST set the sequence number to the value specified by the client.

    • For each OID in the AddToSet list, it MUST do the following:

      • It MUST look up the OID entry. If the entry is found:

        • It MUST increment the reference count in the OID entry.

        • It MUST add the OID to the OID list in the SETID entry.

    • It MUST start the ping set timer. It MUST initialize the timer, as specified in section 3.1.2.2.

    • It MUST return the SETID to the client.