# 5 Infrastructure

This section presents the XML structure for Infrastructure common elements, messages and objects in a tabular format for readers less versed in parsing formal XML schema definitions.

The Char(acteristics) column for all of the tables in this section use the following codes:

Code | Characteristic
M | Mandatory element or attribute
O | Optional element or attribute
C | Conditional element or attribute
MR | Mandatory and repeatable element
OR | Optional and repeatable element
CR | Conditional and repeatable element

Mandatory elements and attributes MUST be provided in the Infrastructure messages in which they appear. Infrastructure data objects (`SIF_ZoneStatus`, `SIF_AgentACL`) can be subject to SIF's request/response and event models; when impacted by these models (in a `SIF_Event` or in a `SIF_Response`), these objects follow the same conventions as listed in Data Model.

## 5.1 Common Elements

### 5.1.1 SIF_Message

The `SIF_Message` element is the root element of all SIF messages.

Figure 5.1.1-1: SIF_Message

| Element/@Attribute | Char | Description | Type
--- | --- | --- | --- | ---
| SIF_Message |  | Contains one of the SIF message types. | choice of: SIF_Ack SIF_Event SIF_Provide SIF_Provision SIF_Register SIF_Request SIF_Response SIF_Subscribe SIF_SystemControl SIF_Unprovide SIF_Unregister SIF_Unsubscribe
@ | xmlns | C | The xmlns attribute specifies the XML namespace for SIF messages. For this version of the specification, the value of this attribute MUST be `http://www.sifinfo.org/uk/infrastructure/2.x`. This XML namespace value will remain the same until the next major release of SIF (3.0). Note that one `SIF_Message` may be contained within another when a ZIS delivers a Pull-Mode Agent's next message in a `SIF_Ack` response to a `SIF_GetMessage` from the Pull-Mode Agent. If the default namespace specified for the child `SIF_Message` is the same as the default namespace of the parent `SIF_Message`, the `xmlns` attribute for the child message MAY be omitted. | xs:anyURI
@ | Version | M | The version of the SIF Implementation Specification that defines this message's XML structure. For this version of the specification, the value of this attribute is `2.0r1`. This attribute can be used by ZIS and agent implementations to choose schema files to validate the message's XML. | VersionType

Table 5.1.1-1: SIF_Message
<SIF_Message Version="2.0r1" xmlns="http://www.sifinfo.org/uk/infrastructure/2.x"> ... </SIF_Message>
Example 5.1.1-2: SIF_Message

### 5.1.2 SIF_Header

`SIF_Header` is a common message header for all SIF messages.

Figure 5.1.2-1: SIF_Header

| Element/@Attribute | Char | Description | Type
--- | --- | --- | --- | ---
| SIF_Header | M | Header information associated with a message. |
| SIF_MsgId | M | `SIF_MsgId` is a globally unique message identifier from the Agent or ZIS that sends out the message. | MsgIdType
| SIF_Timestamp | M | Timestamp of when the message was sent. | xs:dateTime
| SIF_Security | O | This element allows an originating agent to specify security requirements that the ZIS must ensure upon delivery of the message to recipient agents. `SIF_Security` is only examined and processed by a ZIS on `SIF_Request`, `SIF_Response` and `SIF_Event` messages. In this version of the specification, `SIF_Security` is ignored on all other messages; its use on other messages is reserved for future versions of this specification. |
| SIF_Security/SIF_SecureChannel | M | The originating agent uses this element to specify security requirements for the channel between the ZIS and any recipient agents at delivery time. The ZIS must ensure these requirements are met for this message when delivered to other agents. |
| SIF_Security/SIF_SecureChannel/ SIF_AuthenticationLevel | M | The minimum level of authentication required by the message originator to be considered a secure channel upon message delivery to other agents. | SIF_AuthenticationLevel
| SIF_Security/SIF_SecureChannel/ SIF_EncryptionLevel | M | The minimum level of encryption required by the message originator to be considered a secure channel upon message delivery to other agents. | SIF_EncryptionLevel
| SIF_SourceId | M | The `SIF_SourceId` is the ID of the originator of the message. Each source needs to have a zone unique case-sensitive identifier. | xs:token
| SIF_DestinationId | C | This element represents the ID of the recipient of the message and may be present as follows: `SIF_Response` messages MUST have this element set to the `SIF_SourceId` of the originator of the `SIF_Request` message. The ZIS will use this information to route the `SIF_Response` to the requesting agent. `SIF_Request` messages MAY have this element set to the ID of a specific agent if the requesting agent wishes to direct the `SIF_Request` to a specific responder. If present, the ZIS will route the `SIF_Request` to the agent referenced in the element subject to the access control policies in effect for the zone. This element SHOULD NOT be used in any other SIF Infrastructure messages. If the element is present, it will be ignored by the ZIS. | xs:token
| SIF_Contexts | O | Contains each SIF Context that applies to the message. If omitted, the applicable context is `SIF_Default`. `SIF_Context` is repeatable for `SIF_Event`s, not repeatable for `SIF_Request` or `SIF_Response`. | SIF_Contexts

Table 5.1.2-1: SIF_Header
<SIF_Header> <SIF_MsgId>A3E90785EFDA330DACB00785EFDA330D</SIF_MsgId> <SIF_Timestamp>2006-02-18T14:30:00-05:00</SIF_Timestamp> <SIF_SourceId>RamseySIS</SIF_SourceId> </SIF_Header>
Example 5.1.2-1: SIF_Header
<SIF_Header> <SIF_MsgId>A3E90785EFDA330DACB00785EFDA330E</SIF_MsgId> <SIF_Timestamp>2006-03-11T08:39:49-08:00</SIF_Timestamp> <SIF_Security> <SIF_SecureChannel> <SIF_AuthenticationLevel>3</SIF_AuthenticationLevel> <SIF_EncryptionLevel>4</SIF_EncryptionLevel> </SIF_SecureChannel> </SIF_Security> <SIF_SourceId>RamseyLIB</SIF_SourceId> <SIF_DestinationId>RamseySIS</SIF_DestinationId> </SIF_Header>
Example 5.1.2-2: SIF_Header

### 5.1.3 SIF_EncryptionLevel

The minimum level of encryption required by the message originator to be considered a secure channel upon message delivery to other agents.

Figure 5.1.3-1: SIF_EncryptionLevel

| Element/@Attribute | Char | Description | Type
--- | --- | --- | --- | ---
| SIF_EncryptionLevel |  | The minimum level of encryption required by the message originator to be considered a secure channel upon message delivery to other agents. | values: 0 No encryption required 1 Symmetric key length of at least 40 bits is to be used 2 Symmetric key length of at least 56 bits is to be used 3 Symmetric key length of at least 80 bits is to be used 4 Symmetric key length of at least 128 bits is to be used

Table 5.1.3-1: SIF_EncryptionLevel

### 5.1.4 SIF_AuthenticationLevel

The minimum level of authentication required by the message originator to be considered a secure channel upon message delivery to other agents.

Figure 5.1.4-1: SIF_AuthenticationLevel

| Element/@Attribute | Char | Description | Type
--- | --- | --- | --- | ---
| SIF_AuthenticationLevel |  | The minimum level of authentication required by the message originator to be considered a secure channel upon message delivery to other agents. | values: 0 No authentication required and a valid certificate does not need to be presented. 1 A valid certificate must be presented. 2 A valid certificate from a trusted certificate authority must be presented. 3 A valid certificate from a trusted certificate authority must be presented and the CN field of the certificate's Subject entry must match the host sending the certificate.

Table 5.1.4-1: SIF_AuthenticationLevel

### 5.1.5 SIF_Contexts

A list of SIF contexts that applies to a message or operation. Typically where used as an optional element, the omission of this element implies the `SIF_Default` context applies.

Figure 5.1.5-1: SIF_Contexts

| Element/@Attribute | Char | Description | Type
--- | --- | --- | --- | ---
| SIF_Contexts |  | A list of SIF contexts that applies to a message or operation. Typically where used as an optional element, the omission of this element implies the `SIF_Default` context applies. | List
| SIF_Context | MR |  | SIF_Context

Table 5.1.5-1: SIF_Contexts

### 5.1.6 SIF_Context

The name of a SIF Context that applies to a message or operation.

Figure 5.1.6-1: SIF_Context

| Element/@Attribute | Char | Description | Type
--- | --- | --- | --- | ---
| SIF_Context |  | The name of a SIF Context that applies to a message or operation. | xs:token

Table 5.1.6-1: SIF_Context

### 5.1.7 SIF_Protocol

Contains protocol information for contacting a ZIS or Agent.

Figure 5.1.7-1: SIF_Protocol

| Element/@Attribute | Char | Description | Type
--- | --- | --- | --- | ---
| SIF_Protocol | C | Contains protocol information for contacting a ZIS or Agent. |
@ | Type | M | The type of protocol to use (`HTTPS`, `HTTP` or an implementation-defined protocol). | union of: DefinedProtocolsType xs:token
@ | Secure | M | Whether the protocol provides a secure channel. | values: Yes No
| SIF_URL | C | This element is required if the protocol is `HTTPS` or `HTTP`. It contains the `https` or `http` URL for contacting the agent. | xs:anyURI
| SIF_Property | CR | If the protocol isn't `HTTPS` or `HTTP` then the `SIF_Protocol` element may contain zero or more `SIF_Property` elements. Each property element contains a `SIF_Name`/`SIF_Value` pair that describes a protocol setting for proper communication. |
| SIF_Property/SIF_Name | M | Property name. | xs:token
| SIF_Property/SIF_Value | M | Property value. | xs:string

Table 5.1.7-1: SIF_Protocol

### 5.1.8 SIF_Status

This element is used to signal a successful response.

Figure 5.1.8-1: SIF_Status

| Element/@Attribute | Char | Description | Type
--- | --- | --- | --- | ---
| SIF_Status |  | This element is used to signal a successful response. |
| SIF_Code | M |  | InfrastructureStatusCodeType
| SIF_Desc | O | An optional textual description/equivalent of `SIF_Code`. | xs:string
| SIF_Data | O | Optional element to hold data related to a successful operation. This data is currently limited to a `SIF_Message` returned by the ZIS in response to a Pull-Mode Agent's `SIF_GetMessage`, `SIF_AgentACL` returned by the ZIS in response to `SIF_Register` and `SIF_GetAgentACL`, and `SIF_ZoneStatus` returned by the ZIS in response to `SIF_GetZoneStatus`. | choice of: SIF_Message SIF_AgentACL SIF_ZoneStatus

Table 5.1.8-1: SIF_Status

### 5.1.9 SIF_Error

This element is used to signal an unsuccessful response.

Figure 5.1.9-1: SIF_Error

| Element/@Attribute | Char | Description | Type
--- | --- | --- | --- | ---
| SIF_Error |  | This element is used to signal an unsuccessful response. |
| SIF_Category | M |  | InfrastructureErrorCategoryType
| SIF_Code | M | See Error Codes. | union of: InfrastructureXMLValidationErrorType InfrastructureEncryptionErrorType InfrastructureAuthenticationErrorType InfrastructureAccessAndPermissionErrorType InfrastructureRegistrationErrorType InfrastructureProvisionErrorType InfrastructureSubscriptionErrorType InfrastructureRequestAndResponseErrorType InfrastructureEventReportingAndProcessingErrorType InfrastructureTransportErrorType InfrastructureSystemErrorType InfrastructureGenericMessageHandlingErrorType xs:token
| SIF_Desc | M | A simple, easy to understand, description of the error. The primary consumer of this message is the application user. Example: "Unable to open database." | xs:string
| SIF_ExtendedDesc | O | An optional error description that is more complete and technical in nature. It is to be used as a diagnostic message in trouble-shooting procedures. Example: "The 'Students' table is opened in exclusive mode by user 'ADM1' (dbm.cpp, line 300)." | xs:string

Table 5.1.9-1: SIF_Error

### 5.1.10 SIF_Query

SIF's default query mechanism.
Figure 5.1.10-1: SIF_Query

| Element/@Attribute | Char | Description | Type
--- | --- | --- | --- | ---
| SIF_Query |  | SIF's default query mechanism. |
| SIF_QueryObject | M | This is the object that is being queried for. |
@ | ObjectName | M | The actual name of the object that is being queried for. | SIF_RequestObjectNamesType
| SIF_QueryObject/SIF_Element | OR | Individual elements/attributes being requested of matching object. See `SIF_Element` Syntax below. If specified, only the elements/attributes requested are returned in the `SIF_Response` (with any parent elements/attributes); otherwise, all elements supported by the provider's object are returned. Note that this is a means to filter or select a subset of elements/attributes from a matching object; specifying elements/attributes here that do not occur in or are not supported in a matching object does not exclude that matching object from being returned. Include any existing parent elements/attributes of the elements/attributes that are requested but not present. | xs:normalizedString
| SIF_ConditionGroup | C | Either `SIF_ConditionGroup` or `SIF_Example` may optionally be specified to present conditions matching objects should satisfy. `SIF_ConditionGroup` represents the conditions that the queried object(s) must meet. If conditions are specified, only those objects that meet the conditions are returned; otherwise, all objects of the specified name are returned. |
@ | Type | M | The Boolean operator for joining conditions (`SIF_Conditions` elements) within this element. Note that `None` should be used if there is only one `SIF_Conditions` element. | values: And Or None
| SIF_ConditionGroup/SIF_Conditions | MR | This construct allows for nested conditions. |
@ | Type | M | The boolean operator for joining conditions (`SIF_Condition` elements) within this element. Note that `None` should be used if there is only one `SIF_Condition` element. | values: And Or None
| SIF_ConditionGroup/SIF_Conditions/ SIF_Condition | MR | This element represents an individual condition. |
| SIF_ConditionGroup/SIF_Conditions/ SIF_Condition/SIF_Element | M | This is the element/attribute being queried. See below for syntax. | xs:normalizedString
| SIF_ConditionGroup/SIF_Conditions/ SIF_Condition/SIF_Operator | M | The comparison operator for the condition. | values: EQ Equals LT Less Than GT Greater Than LE Less Than Or Equals GE Greater Than Or Equals NE Not Equals
| SIF_ConditionGroup/SIF_Conditions/ SIF_Condition/SIF_Value | M | `SIF_Value` is the data that is used to compare with the value of the element or attribute. | xs:string
| SIF_Example | C | An example SIF object that serves as a template for matching objects. There is an implied `EQ` operator for every element/attribute value present and an implied `And` group of all resulting conditions. Currently this is an experimental feature and limited to use with select objects; wider use may be considered in future versions of this specification. | SIF_ExampleObjectType

Table 5.1.10-1: SIF_Query

#### 5.1.10.1 SIF_ConditionGroup

The `SIF_Query` element may have a `SIF_ConditionGroup` element that may have one or more `SIF_Conditions` elements. A `SIF_Conditions` element may contain one or more `SIF_Condition` elements. Each `SIF_Condition` element defines a search criterion, which contains the following sub-elements.

<SIF_ConditionGroup Type="None"> <SIF_Conditions Type="None"> <SIF_Condition> <SIF_Element>@LearnerPersonalRefId</SIF_Element> <SIF_Operator>EQ</SIF_Operator> <SIF_Value>9B004AC4F51E4867A2B3B4ED92F46DAE</SIF_Value> </SIF_Condition> </SIF_Conditions> </SIF_ConditionGroup>
Example 5.1.10.1-1
<SIF_Message Version="2.0r1" xmlns="http://www.sifinfo.org/uk/infrastructure/2.x"> <SIF_Request> <SIF_Header> <SIF_MsgId>A3E90785EFDA330DACB00785EFDA330D</SIF_MsgId> <SIF_Timestamp>2006-02-18T20:39:12-08:00</SIF_Timestamp> <SIF_SourceId>RamseyLIB</SIF_SourceId> </SIF_Header> <SIF_Version>2.*</SIF_Version> <SIF_MaxBufferSize>1048576</SIF_MaxBufferSize> <SIF_Query> <SIF_QueryObject ObjectName="LearnerPersonal" /> <SIF_ConditionGroup Type="None"> <SIF_Conditions Type="None"> <SIF_Condition> <SIF_Element>PersonalInformation/Name/FamilyName</SIF_Element> <SIF_Operator>EQ</SIF_Operator> <SIF_Value>Smith</SIF_Value> </SIF_Condition> </SIF_Conditions> </SIF_ConditionGroup> </SIF_Query> </SIF_Request> </SIF_Message>
Example 5.1.10.1-2: SIF_ConditionGroup querying into an object

#### 5.1.10.2 SIF_Element Syntax

To reference individual elements/attributes in query criteria for objects, and in lists of individual elements/attributes to be returned from matching objects, SIF defines a path syntax which is based on a small subset of [XPath], for use in `SIF_Element`. Elements are specified by name (e.g. `Name`) and attributes are specified by name, prefixed with `@` (e.g. `@Type`). Namespace prefixes may precede element/attribute names as necessary (e.g. `@xml:lang`) and reference the current prefix-to-namespace mappings within the XML of the request. To reference child elements or attributes of child elements, a path notation is used where each element/attribute in the path is separated by `/` (e.g. `PersonalInformation/Name/GivenName`, `PersonalInformation/Name/@Type`). The object's element is the root element and is not included when referencing child elements (e.g. `PersonalInformation/Name/FirstName`, not `LearnerPersonal/PersonalInformation/Name/GivenName`); no `/` is required when referencing attributes of the object itself (e.g. `@RefId`, not `LearnerPersonal/@RefId)`.

`SIF_Condition/SIF_Element` may also contain XPath predicates (e.g. `[@Type='R]`) to allow for more precise matching, especially with regard to repeatable elements with "key" attributes. The following `SIF_Condition` would match object withs any `GivenName` of `Cameron`:

<SIF_Condition> <SIF_Element>PersonalInformation/Name/GivenName</SIF_Element> <SIF_Operator>EQ</SIF_Operator> <SIF_Value>Cameron</SIF_Value> </SIF_Condition>
Example 5.1.10.2-1

Using a predicate allows the requester to specifically query the person's name of record (`R`) vs. his/her previous, professional, current legal name, etc.

<SIF_Condition> <SIF_Element>PersonalInformation/Name[@Type='R']/GivenName</SIF_Element> <SIF_Operator>EQ</SIF_Operator> <SIF_Value>Cameron</SIF_Value> </SIF_Condition>
Example 5.1.10.2-2

Predicate expressions supported in SIF are limited to `or`, `and`, `=`, element/attribute names with optional prefixes and accessing nested elements/attributes using `/`.

### 5.1.11 SIF_ExtendedQuery

SIF's default query mechanism for `SIF_Request`, `SIF_Query`, has several limitations that limit its usefulness when creating reporting applications that process data from a SIF zone. `SIF_Query` is limited to matching only one object type per query, requiring applications to manually join together results as needed for reporting and general data processing. `SIF_ExtendedQuery` is designed to allow for joins on object identifiers/RefIds and to allow retrieval of data in a row/column fashion similar to SQL. Each returned column may contain hierarchical XML elements/objects. Providers and Responders in a Zone may support `SIF_ExtendedQuery` in addition to `SIF_Query`. Support for `SIF_ExtendedQuery` can be declared in and retrieved from the Zone is various Infrastructure messages and objects.

Note that matching rows are generated solely based on the `SIF_From` clause, with optional join criteria, optionally limited/filtered by the `SIF_Where` clause. If a repeatable element is requested as a column in `SIF_Select`, this does not generate multiple rows for each occurrence of matching elements; all elements are returned in the corresponding column within a single row.

Figure 5.1.11-1: SIF_ExtendedQuery

| Element/@Attribute | Char | Description | Type
--- | --- | --- | --- | ---
| SIF_ExtendedQuery |  | SIF's default query mechanism for `SIF_Request`, `SIF_Query`, has several limitations that limit its usefulness when creating reporting applications that process data from a SIF zone. `SIF_Query` is limited to matching only one object type per query, requiring applications to manually join together results as needed for reporting and general data processing. `SIF_ExtendedQuery` is designed to allow for joins on object identifiers/RefIds and to allow retrieval of data in a row/column fashion similar to SQL. Each returned column may contain hierarchical XML elements/objects. Providers and Responders in a Zone may support `SIF_ExtendedQuery` in addition to `SIF_Query`. Support for `SIF_ExtendedQuery` can be declared in and retrieved from the Zone is various Infrastructure messages and objects. Note that matching rows are generated solely based on the `SIF_From` clause, with optional join criteria, optionally limited/filtered by the `SIF_Where` clause. If a repeatable element is requested as a column in `SIF_Select`, this does not generate multiple rows for each occurrence of matching elements; all elements are returned in the corresponding column within a single row. |
| SIF_DestinationProvider | O | If no `SIF_DestinationId` applies to the request and this element is supplied, the Requester specifies that the extended query be routed to the Provider on record for the given object name. If this element is omitted and no `SIF_DestinationId` applies to the request, the ZIS routes the request to the Provider on record for the object name in `SIF_From`. | SIF_RequestObjectNamesType
| SIF_Select | M | Identifies which data elements/attribute are to be returned as columns in each matching row. |
@ | Distinct | M | Specifies whether query results should return all rows (`false`) or just distinct ones (`true`). Rows are distinct if at least one column differs between them. | xs:boolean
@ | RowCount | M | The maximum number of rows to return. If `All`, return all rows, otherwise return the top rows up to the maximum row count indicated. | union of: xs:positiveInteger additional values: All
| SIF_Select/SIF_Element | MR | Indicates the element/attribute to return as a column. Contents can be left empty to return the whole object specified in `ObjectName`, or `*` can be designated to return all attributes and immediate child elements of the object specified in `ObjectName`, or `SIF_Element` Syntax can be specified, relative to the object specified in `ObjectName`. Requested attributes are to be returned as the text value of the corresponding attribute, elements as a copy of the XML element itself including attributes if they exist. | xs:normalizedString
@ | Alias | O | Optional caption for the column. | xs:normalizedString
@ | ObjectName | M | The name of the object from which to retrieve element/attributes. | SIF_RequestObjectNamesType
| SIF_From | M | Join specification for the query if more than one object is being queried. If only one object is being queried, specify it without the `SIF_Join` clause. This clause generates the matching rows returned, optionally limited/filtered by the `SIF_Where` clause. Each object referenced in the `SIF_Select`, `SIF_Where` and `SIF_OrderBy` clauses must be included here. |
@ | ObjectName | M | The name of the object to query. | SIF_RequestObjectNamesType
| SIF_From/SIF_Join | OR | Additional objects to query, with join conditions specifying the relationships between objects. |
@ | Type | M | Type of relational join. | values: Inner LeftOuter RightOuter FullOuter
| SIF_From/SIF_Join/SIF_JoinOn | MR | Specifies the conditions for the join. |
| SIF_From/SIF_Join/SIF_JoinOn/ SIF_LeftElement | M | Specifies the left-side element/attribute on which to constrain the join. Currently only support for keys/RefIds/RefId references is required. | xs:normalizedString
@ | ObjectName | M | Name of the object that contains the element/attribute. | SIF_RequestObjectNamesType
| SIF_From/SIF_Join/SIF_JoinOn/ SIF_RightElement | M | Specifies right left-side element/attribute on which to constrain the join. Currently only support for keys/RefIds/RefId references is required. | xs:normalizedString
@ | ObjectName | M | Name of the object that contains the element/attribute. | SIF_RequestObjectNamesType
| SIF_Where | O | Optionally specifies conditions to limit/filter rows resulting from the `SIF_From` clause. |
| SIF_Where/SIF_ConditionGroup | M | Conditions that matching rows must meet. |
@ | Type | M | The Boolean operator for joining conditions (`SIF_Conditions` elements) within this element. Note that `None` should be used if there is only one `SIF_Conditions` element. | values: And Or None
| SIF_Where/SIF_ConditionGroup/ SIF_Conditions | MR | This construct allows for nested conditions. |
@ | Type | M | The boolean operator for joining conditions (`SIF_Condition` elements) within this element. Note that `None` should be used if there is only one `SIF_Condition` element. | values: And Or None
| SIF_Where/SIF_ConditionGroup/ SIF_Conditions/SIF_Condition | MR | This element represents an individual condition. |
| SIF_Where/SIF_ConditionGroup/ SIF_Conditions/SIF_Condition/ SIF_Element | M | This is the element/attribute being queried. | xs:normalizedString
@ | ObjectName | M | The name of the object containing the element/attribute. | SIF_RequestObjectNamesType
| SIF_Where/SIF_ConditionGroup/ SIF_Conditions/SIF_Condition/ SIF_Operator | M | The comparison operator for the condition. | values: EQ Equals LT Less Than GT Greater Than LE Less Than Or Equals GE Greater Than Or Equals NE Not Equals
| SIF_Where/SIF_ConditionGroup/ SIF_Conditions/SIF_Condition/ SIF_Value | M | `SIF_Value` is the data that is used to compare with the value of the element or attribute. | xs:string
| SIF_OrderBy | O | An optional list of elements/attributes by which to sort the resulting rows. |
| SIF_OrderBy/SIF_Element | MR | Indicates the element/attribute by which to sort. | xs:normalizedString
@ | ObjectName | M | The name of the object containing the element/attribute. | SIF_RequestObjectNamesType
@ | Ordering | M | Whether to order the element/attribute in ascending or descending order. | values: Ascending Descending

Table 5.1.11-1: SIF_ExtendedQuery
<SIF_ExtendedQuery> <SIF_Select Distinct="false" RowCount="All"> <SIF_Element ObjectName="LearnerPersonal" /> </SIF_Select> <SIF_From ObjectName="LearnerPersonal" /> </SIF_ExtendedQuery>
Example 5.1.11-2: Selecting all LearnerPersonal objects
<SIF_ExtendedQuery> <SIF_Select Distinct="false" RowCount="All"> <SIF_Element ObjectName="LearnerPersonal">*</SIF_Element> </SIF_Select> <SIF_From ObjectName="LearnerPersonal" /> </SIF_ExtendedQuery>
Example 5.1.11-4: Selecting all attributes and immediate child elements of LearnerPersonal as columns from all LearnerPersonal objects
<SIF_ExtendedQuery> <SIF_Select Distinct="false" RowCount="All"> <SIF_Element ObjectName="LearnerPersonal">@RefId</SIF_Element> <SIF_Element ObjectName="LearnerPersonal">PersonalInformation/Name/GivenName</SIF_Element> <SIF_Element ObjectName="LearnerPersonal">PersonalInformation/Name/FamilyName</SIF_Element> <SIF_Element ObjectName="LearnerPersonal">PersonalInformation/Email</SIF_Element> </SIF_Select> <SIF_From ObjectName="LearnerPersonal" /> </SIF_ExtendedQuery>
Example 5.1.11-6: Selecting specific attributes and elements from all LearnerPersonal objects
<SIF_ExtendedQuery> <SIF_Select Distinct="true" RowCount="All"> <SIF_Element ObjectName="LearnerPersonal" /> <SIF_Element ObjectName="LearnerSchoolEnrolment" Alias="Learner Entry Date">EntryDate</SIF_Element> </SIF_Select> <SIF_From ObjectName="LearnerPersonal"> <SIF_Join Type="Inner"> <SIF_JoinOn> <SIF_LeftElement ObjectName="LearnerPersonal">@RefId</SIF_LeftElement> <SIF_RightElement ObjectName="LearnerSchoolEnrolment">@LearnerPersonalRefId</SIF_RightElement> </SIF_JoinOn> </SIF_Join> </SIF_From> <SIF_Where> <SIF_ConditionGroup Type="None"> <SIF_Conditions Type="And"> <SIF_Condition> <SIF_Element ObjectName="LearnerSchoolEnrolment">@SchoolInfoRefId</SIF_Element> <SIF_Operator>EQ</SIF_Operator> <SIF_Value>A3E90785EFDA330DACB00785EFDA330D</SIF_Value> </SIF_Condition> <SIF_Condition> <SIF_Element ObjectName="LearnerSchoolEnrolment">@MembershipType</SIF_Element> <SIF_Operator>EQ</SIF_Operator> <SIF_Value>C</SIF_Value> </SIF_Condition> </SIF_Conditions> </SIF_ConditionGroup> </SIF_Where> <SIF_OrderBy> <SIF_Element ObjectName="LearnerPersonal" Ordering="Ascending">PersonalInformation/Name/FamilyName</SIF_Element> </SIF_OrderBy> </SIF_ExtendedQuery>
Example 5.1.11-8: Selecting LearnerPersonal objects along with each learner's EntryDate from LearnerSchoolEnrolment for a specific school and other LearnerSchoolEnrolmnet values, sorted by learner's last name
<SIF_ExtendedQuery> <SIF_Select Distinct="false" RowCount="All"> <SIF_Element ObjectName="LearnerPersonal" /> <SIF_Element ObjectName="LearnerSchoolEnrolment" /> <SIF_Element ObjectName="SchoolInfo">SchoolName</SIF_Element> </SIF_Select> <SIF_From ObjectName="LearnerPersonal"> <SIF_Join Type="Inner"> <SIF_JoinOn> <SIF_LeftElement ObjectName="LearnerPersonal">@RefId</SIF_LeftElement> <SIF_RightElement ObjectName="LearnerSchoolEnrolment">@LearnerPersonalRefId</SIF_RightElement> </SIF_JoinOn> </SIF_Join> <SIF_Join Type="Inner"> <SIF_JoinOn> <SIF_LeftElement ObjectName="LearnerSchoolEnrolment">@SchoolInfoRefId</SIF_LeftElement> <SIF_RightElement ObjectName="SchoolInfo">@RefId</SIF_RightElement> </SIF_JoinOn> </SIF_Join> </SIF_From> <SIF_Where> <SIF_ConditionGroup Type="None"> <SIF_Conditions Type="None"> <SIF_Condition> <SIF_Element ObjectName="LearnerPersonal">@RefId</SIF_Element> <SIF_Operator>EQ</SIF_Operator> <SIF_Value>12345678901234567890123456789012</SIF_Value> </SIF_Condition> </SIF_Conditions> </SIF_ConditionGroup> </SIF_Where> </SIF_ExtendedQuery>
Example 5.1.11-10: Selecting a specific LearnerPersonal's LearnerSchoolEnrolment objects, along with the corresponding school name for each enrolment

#### 5.1.11.1 Mapping SIF_Query to SIF_ExtendedQuery

While there are differences in how matching objects are returned, note that all non-`SIF_Example` `SIF_Query`-based requests can be mapped to a corresponding `SIF_ExtendedQuery`-based request:

1 | Place `SIF_Query/SIF_QueryObject/@ObjectName` in `SIF_ExtendedQuery/SIF_From/@ObjectName`.
2 | If elements/attributes are specified in `SIF_Query/SIF_QueryObject/SIF_Element`, place them in `SIF_ExtendedQuery/SIF_Select/SIF_Element` with `@ObjectName` set to `SIF_Query/SIF_QueryObject/@ObjectName`. Otherwise in `SIF_Select`, specify an empty `SIF_Element` element with `@ObjectName` set to `SIF_Query/SIF_QueryObject/@ObjectName`.
3 | If `SIF_Query/SIF_ConditionGroup` exists, place it in `SIF_ExtendedQuery/SIF_Where` setting `@ObjectName` to `SIF_Query/SIF_QueryObject/@ObjectName` in every occurrence of `SIF_Element`.
4 | Set `SIF_Select/@Distinct` to `false` and `SIF_Select/@RowCount` to `All`.

Table 5.1.11.1-1: Mapping SIF_Query to SIF_ExtendedQuery
<SIF_Query> <SIF_QueryObject ObjectName="LearnerPersonal"> <SIF_Element>PersonalInformation/Name/GivenName</SIF_Element> <SIF_Element>PersonalInformation/Name/FamilyName</SIF_Element> </SIF_QueryObject> <SIF_ConditionGroup Type="None"> <SIF_Conditions Type="None"> <SIF_Condition> <SIF_Element>@RefId</SIF_Element> <SIF_Operator>EQ</SIF_Operator> <SIF_Value>F0F29E6AE742498D9CB91CBB3BE6890E</SIF_Value> </SIF_Condition> </SIF_Conditions> </SIF_ConditionGroup> </SIF_Query>
Example 5.1.11.1-1: Input SIF_Query
<SIF_ExtendedQuery> <SIF_Select Distinct="false" RowCount="All"> <SIF_Element ObjectName="LearnerPersonal">PersonalInformation/Name/GivenName</SIF_Element> <SIF_Element ObjectName="LearnerPersonal">PersonalInformation/Name/FamilyName</SIF_Element> </SIF_Select> <SIF_From ObjectName="LearnerPersonal" /> <SIF_Where> <SIF_ConditionGroup Type="None"> <SIF_Conditions Type="None"> <SIF_Condition> <SIF_Element ObjectName="LearnerPersonal">@RefId</SIF_Element> <SIF_Operator>EQ</SIF_Operator> <SIF_Value>F0F29E6AE742498D9CB91CBB3BE6890E</SIF_Value> </SIF_Condition> </SIF_Conditions> </SIF_ConditionGroup> </SIF_Where> </SIF_ExtendedQuery>
Example 5.1.11.1-2: Corresponding SIF_ExtendedQuery

### 5.1.12 SIF_ExtendedQueryResults

This element provides a wrapper for data returned in response to a `SIF_ExtendedQuery`. Used in `SIF_Response` and `SIF_ReportObject`.

Figure 5.1.12-1: SIF_ExtendedQueryResults

| Element/@Attribute | Char | Description | Type
--- | --- | --- | --- | ---
| SIF_ExtendedQueryResults |  | This element provides a wrapper for data returned in response to a `SIF_ExtendedQuery`. Used in `SIF_Response` and `SIF_ReportObject`. |
| SIF_ColumnHeaders | M | Provides the element/attribute and caption information for each column supplied in `SIF_ExtendedQuery`. The order must correspond to the order of the elements as requested in `SIF_ExtendedQuery`. |
| SIF_ColumnHeaders/SIF_Element | MR | The element/attribute specified for the column in `SIF_ExtendedQuery`. | xs:normalizedString
@ | ObjectName | M | The object in which the element/attribute occurs. | SIF_RequestObjectNamesType
@ | Alias | O | The caption for the column, if specified in `SIF_ExtendedQuery`. | xs:normalizedString
@ | xsi:type | O | Optionally allows type of column value to be explicitly communicated. |
| SIF_Rows | M | A list of matching rows resulting from the supplied `SIF_ExtendedQuery`. Note that the complete list of rows may span multiple `SIF_Response` messages, per the `SIF_MaxBufferSize` supplied in `SIF_Request`. If there are no matching rows, this is an empty list. |
| SIF_Rows/R | OR | An individual matching row resulting from the supplied `SIF_ExtendedQuery`. |
| SIF_Rows/R/C | MR | Contains the value of each column specified in `SIF_ExtendedQuery/SIF_Select`. The order of the columns must correspond to the order of the elements as requested in `SIF_ExtendedQuery`. Note the number of columns may be expanded from the requested columns if `*` is indicated one or more times in the `SIF_Select` clause. | ExtendedContentType

Table 5.1.12-1: SIF_ExtendedQueryResults
<SIF_ExtendedQueryResults> <SIF_ColumnHeaders> <SIF_Element ObjectName="LearnerPersonal" /> <SIF_Element ObjectName="LearnerSchoolEnrolment" /> <SIF_Element ObjectName="SchoolInfo">SchoolName</SIF_Element> </SIF_ColumnHeaders> <SIF_Rows> <R> <C> <LearnerPersonal RefId="12345678901234567890123456789012"> <!--...--> </LearnerPersonal> </C> <C> <LearnerSchoolEnrolment RefId="AED4AEF825284D7E9F082EBBEB1999FA" LearnerPersonalRefId="12345678901234567890123456789012" SchoolInfoRefId="AED4AEF825284D7E9F082EBBEBB12345" MembershipType="M"> <!--...--> </LearnerSchoolEnrolment> </C> <C> <SchoolName>SIFA High</SchoolName> </C> </R> <R> <C> <LearnerPersonal RefId="12345678901234567890123456789012"> <!--...--> </LearnerPersonal> </C> <C> <LearnerSchoolEnrolment RefId="AED4AEF825284D7E9F082EBBEB1999FA" LearnerPersonalRefId="12345678901234567890123456789012" SchoolInfoRefId="ED4AEF825284D7E9F082EBBEBB678902" MembershipType="G"> <!--...--> </LearnerSchoolEnrolment> </C> <C> <SchoolName>SIFA University</SchoolName> </C> </R> </SIF_Rows> </SIF_ExtendedQueryResults>
Example 5.1.12-2: SIF_ExtendedQueryResults

## 5.2 Messages

### 5.2.1 SIF_Ack

This message is used as an acknowledgement for infrastructure messages. All infrastructure messages will return a `SIF_Ack` as a result to indicate if the request was successful or not. A `SIF_Ack` must contain either a `SIF_Status` element acknowledging a successful result or a `SIF_Error` element describing the failure. The `SIF_Error` element contains a standardized error number as well as a description of the error.

A successful `SIF_Ack` is typically returned to the caller containing a `SIF_Header`, `SIF_OriginalSourceId`, `SIF_OriginalMsgId` and the `SIF_Status` element. In situations where additional information needs to be returned to the caller, a `SIF_Data` element can be added to the `SIF_Status` element.

In addition, successful `SIF_Ack` messages may also be sent to the ZIS under two conditions. The first is when a pull-mode agent requests that a message is to be removed from its queue. The second is when an agent which has invoked SMB wishes to end SMB handling. In that case, the agent sends a "Final" `SIF_Ack` to the ZIS. In each instance the ZIS returns a `SIF_Ack` in response to the agent's `SIF_Ack` message.

Figure 5.2.1-1: SIF_Ack

| Element/@Attribute | Char | Description | Type
--- | --- | --- | --- | ---
| SIF_Ack | M | This message is used as an acknowledgement to an infrastructure message. |
| SIF_Header | M | Header information associated with this message. | SIF_Header
| SIF_OriginalSourceId | M | The `SIF_SourceId` of the infrastructure message for which the `SIF_Ack` serves as a response. | xs:token
| SIF_OriginalMsgId | M | The `SIF_MsgId` of the infrastructure message for which the `SIF_Ack` message serves as a response. | MsgIdType
| SIF_Status | C | This element is used to signal a successful response. | SIF_Status
| SIF_Error | C | This element is used to signal an unsuccessful response. | SIF_Error

Table 5.2.1-1: SIF_Ack
<SIF_Message Version="2.0r1" xmlns="http://www.sifinfo.org/uk/infrastructure/2.x"> <SIF_Ack> <SIF_Header> <SIF_MsgId>AB1058CD3261545A31905937B265CE01</SIF_MsgId> <SIF_Timestamp>2006-02-18T08:39:40-08:00</SIF_Timestamp> <SIF_SourceId>SifInfo_TestZIS</SIF_SourceId> </SIF_Header> <SIF_OriginalSourceId>RamseyLib</SIF_OriginalSourceId> <SIF_OriginalMsgId>1298ACEF3261545A31905937B265CE01</SIF_OriginalMsgId> <SIF_Status> <SIF_Code>0</SIF_Code> <SIF_Data> <SIF_Message Version="2.0r1"> <SIF_Request> <SIF_Header> <SIF_MsgId>A3E90785EFDA330DACB00785EFDA330D</SIF_MsgId> <SIF_Timestamp>2006-02-18T08:39:02-08:00</SIF_Timestamp> <SIF_SourceId>RamseySIS</SIF_SourceId> </SIF_Header> <SIF_Version>2.*</SIF_Version> <SIF_MaxBufferSize>1048576</SIF_MaxBufferSize> <SIF_Query> <SIF_QueryObject ObjectName="LearnerPersonal" /> <SIF_ConditionGroup Type="None"> <SIF_Conditions Type="None"> <SIF_Condition> <SIF_Element>@RefId</SIF_Element> <SIF_Operator>EQ</SIF_Operator> <SIF_Value>9B004AC4F51E4867A2B3B4ED92F46DAE</SIF_Value> </SIF_Condition> </SIF_Conditions> </SIF_ConditionGroup> </SIF_Query> </SIF_Request> </SIF_Message> </SIF_Data> </SIF_Status> </SIF_Ack> </SIF_Message>
Example 5.2.1-2: SIF_Ack Status Message
<SIF_Message Version="2.0r1" xmlns="http://www.sifinfo.org/uk/infrastructure/2.x"> <SIF_Ack> <SIF_Header> <SIF_MsgId>CD5087FE3261545A31905937B265CE01</SIF_MsgId> <SIF_Timestamp>2006-02-18T08:39:40-08:00</SIF_Timestamp> <SIF_SourceId>RamseyLIB</SIF_SourceId> </SIF_Header> <SIF_OriginalSourceId>RamseySIS</SIF_OriginalSourceId> <SIF_OriginalMsgId>1945CD783261545A31905937B265CE01</SIF_OriginalMsgId> <SIF_Error> <SIF_Category>3</SIF_Category> <SIF_Code>5</SIF_Code> <SIF_Desc>Sender's certificate is not trusted</SIF_Desc> <SIF_ExtendedDesc>Agent requires certificate issued by ISD11 CA</SIF_ExtendedDesc> </SIF_Error> </SIF_Ack> </SIF_Message>
Example 5.2.1-4: SIF_Ack Error Message

### 5.2.2 SIF_Event

`SIF_Event` is used to deliver event objects as defined in SIF. Events represent the availability of a new data object, changes to, or deletions of data object.

Figure 5.2.2-1: SIF_Event

| Element/@Attribute | Char | Description | Type
--- | --- | --- | --- | ---
| SIF_Event | M | `SIF_Event` is used to deliver event objects as defined in SIF. |
| SIF_Header | M | Header information associated with this message. | SIF_Header
| SIF_ObjectData | M |  |
| SIF_ObjectData/SIF_EventObject | M | Contains the actual object (partial or whole) that is being added, changed or deleted. | SIF_EventObjectType
@ | ObjectName | M | This is the name of the object being added, changed or deleted. | SIF_SubscribeObjectNamesType
@ | Action | M | This is the action associated with the object that is being conveyed by this `SIF_Event`. | values: Add Delete Change

Table 5.2.2-1: SIF_Event
<SIF_Message Version="2.0r1" xmlns="http://www.sifinfo.org/uk/infrastructure/2.x"> <SIF_Event> <SIF_Header> <SIF_MsgId>AB34DC093261545A31905937B265CE01</SIF_MsgId> <SIF_Timestamp>2006-02-18T20:39:12-08:00</SIF_Timestamp> <SIF_SourceId>RamseySIS</SIF_SourceId> </SIF_Header> <SIF_ObjectData> <SIF_EventObject ObjectName="LearnerPersonal" Action="Change"> <LearnerPersonal RefId="D3E34B359D75101A8C3D00AA001A1652"> <PersonalInformation> <PhoneNumber Type="H"> <Number>05598765432</Number> </PhoneNumber> </PersonalInformation> </LearnerPersonal> </SIF_EventObject> </SIF_ObjectData> </SIF_Event> </SIF_Message>
Example 5.2.2-2: SIF_Event Message with LearnerPersonal changes

### 5.2.3 SIF_Provide

The `SIF_Provide` message is used to attempt registering as the provider of one or more data objects.

Figure 5.2.3-1: SIF_Provide

| Element/@Attribute | Char | Description | Type
--- | --- | --- | --- | ---
| SIF_Provide | M | The`SIF_Provide` message is used for advertising the provision of data objects. |
| SIF_Header | M | Header information associated with this message. | SIF_Header
| SIF_Object | MR | This is the object that is being provided. |
@ | ObjectName | M | The actual name of the object that is being provided. | SIF_ProvideObjectNamesType
| SIF_Object/SIF_ExtendedQuerySupport | O | Whether or not the Agent supports `SIF_ExtendedQuery` for this object. | xs:boolean
| SIF_Object/SIF_Contexts | O | The contexts in which the object is being provided; if omitted, the context is `SIF_Default`. | SIF_Contexts

Table 5.2.3-1: SIF_Provide
<SIF_Message Version="2.0r1" xmlns="http://www.sifinfo.org/uk/infrastructure/2.x"> <SIF_Provide> <SIF_Header> <SIF_MsgId>34DC87FE3261545A31905937B265CE01</SIF_MsgId> <SIF_Timestamp>2006-02-18T20:39:12-08:00</SIF_Timestamp> <SIF_SourceId>RamseySIS</SIF_SourceId> </SIF_Header> <SIF_Object ObjectName="LearnerPersonal" /> <SIF_Object ObjectName="LearnerSchoolEnrolment" /> </SIF_Provide> </SIF_Message>
Example 5.2.3-2: SIF_Provide

### 5.2.4 SIF_Provision

Once registered, this message allows an agent to announce to the ZIS the functionality the agent will provide. The ZIS compares the functionality to its access control list and either returns a failure or a success. Upon success, the ZIS performs an atomic update of its provide/subscribe database entries for the agent to match the objects listed in this message and atomically updates other stored settings for the agent. A ZIS must not allow an agent to perform operations that it did not successfully announce. Agents should be aware that if the access control list changes after a successful `SIF_Provision`, some operations may still be rejected with access control errors.

Figure 5.2.4-1: SIF_Provision

| Element/@Attribute | Char | Description | Type
--- | --- | --- | --- | ---
| SIF_Provision |  | Once registered, this message allows an agent to announce to the ZIS the functionality the agent will provide. The ZIS compares the functionality to its access control list and either returns a failure or a success. Upon success, the ZIS performs an atomic update of its provide/subscribe database entries for the agent to match the objects listed in this message and atomically updates other stored settings for the agent. A ZIS must not allow an agent to perform operations that it did not successfully announce. Agents should be aware that if the access control list changes after a successful `SIF_Provision`, some operations may still be rejected with access control errors. |
| SIF_Header | M | Header information associated with this message. | SIF_Header
| SIF_ProvideObjects | M | A list of objects an Agent wishes to provide. |
| SIF_ProvideObjects/SIF_Object | OR |  |
@ | ObjectName | M | The name of each object. | SIF_ProvideObjectNamesType
| SIF_ProvideObjects/SIF_Object/ SIF_ExtendedQuerySupport | O | Whether or not `SIF_ExtendedQuery` is supported with regard to this object. | xs:boolean
| SIF_ProvideObjects/SIF_Object/ SIF_Contexts | O | Applicable contexts for stated object support. If omitted, the context defaults to `SIF_Default`. | SIF_Contexts
| SIF_SubscribeObjects | M | A list of objects to which an Agent wishes to subscribe. |
| SIF_SubscribeObjects/SIF_Object | OR |  |
@ | ObjectName | M | The name of each object. | SIF_SubscribeObjectNamesType
| SIF_SubscribeObjects/SIF_Object/ SIF_Contexts | O | Applicable contexts for stated object support. If omitted, the context defaults to `SIF_Default`. | SIF_Contexts
| SIF_PublishAddObjects | M | A list of objects for which an Agent wishes to publish `Add` events. |
| SIF_PublishAddObjects/SIF_Object | OR |  |
@ | ObjectName | M | The name of each object. | SIF_SubscribeObjectNamesType
| SIF_PublishAddObjects/SIF_Object/ SIF_Contexts | O | Applicable contexts for stated object support. If omitted, the context defaults to `SIF_Default`. | SIF_Contexts
| SIF_PublishChangeObjects | M | A list of objects for which an Agent wishes to publish `Change` events. |
| SIF_PublishChangeObjects/ SIF_Object | OR |  |
@ | ObjectName | M | The name of each object. | SIF_SubscribeObjectNamesType
| SIF_PublishChangeObjects/ SIF_Object/SIF_Contexts | O | Applicable contexts for stated object support. If omitted, the context defaults to `SIF_Default`. | SIF_Contexts
| SIF_PublishDeleteObjects | M | A list of objects for which an Agent wishes to publish Delete events. |
| SIF_PublishDeleteObjects/ SIF_Object | OR |  |
@ | ObjectName | M | The name of each object. | SIF_SubscribeObjectNamesType
| SIF_PublishDeleteObjects/ SIF_Object/SIF_Contexts | O | Applicable contexts for stated object support. If omitted, the context defaults to `SIF_Default`. | SIF_Contexts
| SIF_RequestObjects | M | A list of objects an Agent wishes to request. |
| SIF_RequestObjects/SIF_Object | OR |  |
@ | ObjectName | M | The name of each object. | SIF_RequestObjectNamesType
| SIF_RequestObjects/SIF_Object/ SIF_ExtendedQuerySupport | O | Optionally specify whether or not `SIF_ExtendedQuery` may be sent in requests for this object. | xs:boolean
| SIF_RequestObjects/SIF_Object/ SIF_Contexts | O | Applicable contexts for stated object support. If omitted, the context defaults to `SIF_Default`. | SIF_Contexts
| SIF_RespondObjects | M | A list of objects for which an Agent wishes to handle requests, whether or not it is the Provider for each object. Note that this list MUST include those objects specified in `SIF_ProvideObjects`. |
| SIF_RespondObjects/SIF_Object | OR |  |
@ | ObjectName | M | The name of each object. | SIF_RequestObjectNamesType
| SIF_RespondObjects/SIF_Object/ SIF_ExtendedQuerySupport | O | Whether or not `SIF_ExtendedQuery` is supported with regard to this object. | xs:boolean
| SIF_RespondObjects/SIF_Object/ SIF_Contexts | O | Applicable contexts for stated object support. If omitted, the context defaults to `SIF_Default`. | SIF_Contexts

Table 5.2.4-1: SIF_Provision
<SIF_Message Version="2.0r1" xmlns="http://www.sifinfo.org/uk/infrastructure/2.x"> <SIF_Provision> <SIF_Header> <SIF_MsgId>A10F92EB649F4A648B5BFC44C7FD965C</SIF_MsgId> <SIF_Timestamp>2006-08-18T11:23:11-08:00</SIF_Timestamp> <SIF_SourceId>RamseySIS</SIF_SourceId> </SIF_Header> <SIF_ProvideObjects> <SIF_Object ObjectName="LearnerPersonal" /> <SIF_Object ObjectName="LearnerSchoolEnrolment" /> </SIF_ProvideObjects> <SIF_SubscribeObjects> <SIF_Object ObjectName="PersonPicture" /> </SIF_SubscribeObjects> <SIF_PublishAddObjects> <SIF_Object ObjectName="LearnerPersonal" /> <SIF_Object ObjectName="LearnerSchoolEnrolment" /> </SIF_PublishAddObjects> <SIF_PublishChangeObjects> <SIF_Object ObjectName="LearnerPersonal" /> <SIF_Object ObjectName="LearnerSchoolEnrolment" /> </SIF_PublishChangeObjects> <SIF_PublishDeleteObjects> <SIF_Object ObjectName="LearnerPersonal" /> <SIF_Object ObjectName="LearnerSchoolEnrolment" /> </SIF_PublishDeleteObjects> <SIF_RequestObjects> <SIF_Object ObjectName="PersonPicture" /> </SIF_RequestObjects> <SIF_RespondObjects> <SIF_Object ObjectName="LearnerPersonal" /> <SIF_Object ObjectName="LearnerSchoolEnrolment" /> </SIF_RespondObjects> </SIF_Provision> </SIF_Message>
Example 5.2.4-2: SIF_Provision

### 5.2.5 SIF_Register

`SIF_Register` is the message for registering an agent with a ZIS. An agent must be registered before it sends out other SIF messages. `SIF_Register` serves to provide the ZIS with the sender's identification information as well as to provide the information that the ZIS will need to contact this agent, should it register in Push mode.

Once a sender registers in the ZIS with the `SIF_Register` message, the sender can use the `SIF_SourceId` value in the header of all other outgoing messages as its identification. It is not necessary to send a `SIF_Register` message each time your agent starts up but it is not an error to do so. If there are any blocked events in the Agent's queue when a ZIS receives the `SIF_Register` message, the blocks will be removed.

Figure 5.2.5-1: SIF_Register

| Element/@Attribute | Char | Description | Type
--- | --- | --- | --- | ---
| SIF_Register | M | `SIF_Register` is the message for registering an agent with a ZIS. |
| SIF_Header | M | Header information associated with this message. | SIF_Header
| SIF_Name | M | This is the descriptive name of the agent that is registering (i.e. Ramsey Media Center). | xs:normalizedString
| SIF_Version | MR | Specifies the SIF Implementation Specification version(s) defining messages the agent can receive. If the ZIS cannot communicate in this format, it should reject the request. The format of `SIF_Version` values can be found in Version Numbers. In a `SIF_Register` message, an individual `SIF_Version` element may also contain the following wildcards: * - Any SIF version <major version>.* - Any minor version plus revisions within a major version (e.g., 1.*) <major version>.<minor version><r>* - Any revision within a minor version (e.g., 1.1r*) Note: As wildcarding was first introduced in version 1.1 of the specification, 1.* does not match versions 1.0, 1.0r1 or 1.0r2. 1.1 or later agents that register with 1.* and wish to also receive messages from pre-1.1 agents must include `SIF_Version` element(s) with the supported pre-1.1 versions. | VersionWithWildcardsType
| SIF_MaxBufferSize | M | Specifies the maximum size of a packet to be returned by the ZIS. The ZIS may return packets smaller than, or equal to, the maximum value. | xs:unsignedInt
| SIF_Mode | M | Specifies the communication mode (Pull or Push) as chosen by the message sender. | values: Push Pull
| SIF_Protocol | C | If `SIF_Mode` is `Push`, `SIF_Protocol` contains protocol information for contacting the agent in Push mode. A Pull-mode agent does not need to send `SIF_Protocol`; if received, a ZIS ignores it. | SIF_Protocol
| SIF_NodeVendor | O | The vendor of the SIF agent. | xs:normalizedString
| SIF_NodeVersion | O | The agent version number. The format of this field is undefined, but it should match the format used in the agent's conformance statement, if the agent is SIF Certified. Examples 2.0.1.11 | xs:normalizedString
| SIF_Application | O | Contains information about the vendor of the product that the agent represents. |
| SIF_Application/SIF_Vendor | M | The name of the company of the product that this agent supports. | xs:normalizedString
| SIF_Application/SIF_Product | M | The name of the product that this agent supports. | xs:normalizedString
| SIF_Application/SIF_Version | M | The version of the product. This field is informative only. | xs:normalizedString
| SIF_Icon | O | HTTP URL referencing an icon for graphical representation of the application/agent. Should range from 16x16 pixels to 128x128 pixels and be of an `image` MIME type commonly supported by Web browsers (e.g. PNG, JPEG, GIF). Agents may optionally follow the more restrictive guidelines at [FAVICON]. | xs:anyURI

Table 5.2.5-1: SIF_Register
<SIF_Message Version="2.0r1" xmlns="http://www.sifinfo.org/uk/infrastructure/2.x"> <SIF_Register> <SIF_Header> <SIF_MsgId>14BA09653261545A31905937B265CE01</SIF_MsgId> <SIF_Timestamp>2006-02-18T20:39:12-06:00</SIF_Timestamp> <SIF_SourceId>AcmeAgent</SIF_SourceId> </SIF_Header> <SIF_Name>Acme Agent for WAP 2.x</SIF_Name> <SIF_Version>2.0r1</SIF_Version> <SIF_MaxBufferSize>524288</SIF_MaxBufferSize> <SIF_Mode>Push</SIF_Mode> <SIF_Protocol Type="HTTPS" Secure="Yes"> <SIF_URL>https://AcmeHost:8030/StudentAdmin</SIF_URL> </SIF_Protocol> <SIF_NodeVersion>2.0.1.20</SIF_NodeVersion> <SIF_Application> <SIF_Vendor>Acme Consulting</SIF_Vendor> <SIF_Product>Web Administration Portal 5.x</SIF_Product> <SIF_Version>5.1.2</SIF_Version> </SIF_Application> </SIF_Register> </SIF_Message>
Example 5.2.5-2: SIF_Register

### 5.2.6 SIF_Request

This message is used to request information in SIF data objects from other SIF nodes. It optionally specifies the query criteria with which to match objects, as well as an optional subset of elements to be returned for matching objects.

Figure 5.2.6-1: SIF_Request

| Element/@Attribute | Char | Description | Type
--- | --- | --- | --- | ---
| SIF_Request | M | `SIF_Request` is used to request information in SIF data objects from other SIF nodes. |
| SIF_Header | M | Header information associated with this message. | SIF_Header
| SIF_Version | MR | Specifies which SIF Implementation Specification version should be used when returning the response data; wildcards are allowed. The responding agent SHOULD return data using the highest version it supports that falls within the specified versions. | VersionWithWildcardsType
| SIF_MaxBufferSize | M | Specifies the maximum size of a response packet to be returned to the requester. The responder may return packets smaller than, or equal to, the maximum value. To guarantee delivery of response packets, requesting agents must not specify a `SIF_MaxBufferSize` greater than its registered `SIF_Register/SIF_MaxBufferSize`. | xs:unsignedInt
| SIF_Query | C | Either `SIF_Query` or `SIF_ExtendedQuery` must be specified, which contain the criteria to be used to match response objects. | SIF_Query
| SIF_ExtendedQuery | C |  | SIF_ExtendedQuery

Table 5.2.6-1: SIF_Request
<SIF_Message Version="2.0r1" xmlns="http://www.sifinfo.org/uk/infrastructure/2.x"> <SIF_Request> <SIF_Header> <SIF_MsgId>A3E90785EFDA330DACB00785EFDA330D</SIF_MsgId> <SIF_Timestamp>2006-02-18T20:39:12-08:00</SIF_Timestamp> <SIF_SourceId>RamseySIS</SIF_SourceId> </SIF_Header> <SIF_Version>2.*</SIF_Version> <SIF_MaxBufferSize>1048576</SIF_MaxBufferSize> <SIF_Query> <SIF_QueryObject ObjectName="LearnerPersonal" /> <SIF_ConditionGroup Type="None"> <SIF_Conditions Type="None"> <SIF_Condition> <SIF_Element>@RefId</SIF_Element> <SIF_Operator>EQ</SIF_Operator> <SIF_Value>9B004AC4F51E4867A2B3B4ED92F46DAE</SIF_Value> </SIF_Condition> </SIF_Conditions> </SIF_ConditionGroup> </SIF_Query> </SIF_Request> </SIF_Message>
Example 5.2.6-2: SIF_Request

### 5.2.7 SIF_Response

`SIF_Response` is used to respond to a `SIF_Request` message. A response may span multiple `SIF_Response` messages.

Figure 5.2.7-1: SIF_Response

| Element/@Attribute | Char | Description | Type
--- | --- | --- | --- | ---
| SIF_Response | M | `SIF_Response` is used to respond to a `SIF_Request` message. |
| SIF_Header | M | Header information associated with this message. The `SIF_DestinationId` needs to be the `SIF_SourceId` of the original `SIF_Request` message being processed. | SIF_Header
| SIF_RequestMsgId | M | This is the message ID of the `SIF_Request` message being processed. It provides a unique match between a `SIF_Response` and a previous `SIF_Request`. Since the ID of each message from an agent is unique, the receiver of a `SIF_Response` message will be able to relate the `SIF_Response` to a `SIF_Request` that it sent out previously. | MsgIdType
| SIF_PacketNumber | M | This element represents the index of the `SIF_Response` message in the sequence of packets that make up a complete response. Its value must be in the range of 1 through n, with n equal to the total number of packets that make up a response. The receiver of a `SIF_Response` message, with the help of the `SIF_MorePackets` and `SIF_PacketNumber` element in each incoming `SIF_Response` message, will be able to interpret and process each `SIF_Response` as part of a complete response to a previous `SIF_Request`. | xs:positiveInteger
| SIF_MorePackets | M | This element provides an indication as to whether there are more packets besides this one to make up a complete response. The necessity of this element stems from the requirement on an agent to break response data to fit into the `SIF_MaxBufferSize` provided in the `SIF_Request`. Agents may also break response data into multiple packets for the benefit of improving performance or for circumventing limitations of the underlying network infrastructure. When this element's value is equal to `No`, it is an indication from the sender to the receiver that it has already sent out all the packets that make up a complete response for a `SIF_Request` as indicated by the `SIF_RequestMsgId` element. | values: Yes No
| SIF_Error | C | The responder returns `SIF_Error`, `SIF_ObjectData` or `SIF_ExtendedQueryResults`. This element allows the Responder to report an error condition that occurs while processing the `SIF_Request`. If a `SIF_Error` element is present, the requesting agent must not expect to receive further `SIF_Responses` to the `SIF_Request`. | SIF_Error
| SIF_ObjectData | C | The `SIF_ObjectData` element contains the data objects matching the supplied criteria in the `SIF_Request` message if the `SIF_Request` contained `SIF_Query`. If the `SIF_Request` contained `SIF_ExtendedQuery`, include `SIF_ExtendedQueryResults`. | SIF_ResponseObjectsType
| SIF_ExtendedQueryResults | C | This element contains the elements requested by `SIF_ExtendedQuery` in `SIF_Request`. | SIF_ExtendedQueryResults

Table 5.2.7-1: SIF_Response
<SIF_Message Version="2.0r1" xmlns="http://www.sifinfo.org/uk/infrastructure/2.x"> <SIF_Response> <SIF_Header> <SIF_MsgId>1BCD10580EF250789012AC0554321EA2</SIF_MsgId> <SIF_Timestamp>2006-02-18T08:39:40-08:00</SIF_Timestamp> <SIF_SourceId>SISAgent</SIF_SourceId> <SIF_DestinationId>NetworkAgent</SIF_DestinationId> </SIF_Header> <SIF_RequestMsgId>FE1078BA3261545A319059376B3A4898</SIF_RequestMsgId> <SIF_PacketNumber>1</SIF_PacketNumber> <SIF_MorePackets>No</SIF_MorePackets> <SIF_ObjectData> <LearnerPersonal RefId="E3E34B359D75101A8C3D00AA00184753"> <PersonalInformation> <Name Type="R"> <FamilyName>Johnson</FamilyName> <GivenName>Alicia</GivenName> </Name> </PersonalInformation> </LearnerPersonal> </SIF_ObjectData> </SIF_Response> </SIF_Message>
Example 5.2.7-2: Sample single-packet SIF_Response to a SIF_Request for the Name element from a LearnerPersonal object
<SIF_Message Version="2.0r1" xmlns="http://www.sifinfo.org/uk/infrastructure/2.x"> <SIF_Response> <SIF_Header> <SIF_MsgId>322925BC9818433E8090D5110EE61DA3</SIF_MsgId> <SIF_Timestamp>2006-04-18T08:39:40-08:00</SIF_Timestamp> <SIF_SourceId>SISAgent</SIF_SourceId> <SIF_DestinationId>NetworkAgent</SIF_DestinationId> </SIF_Header> <SIF_RequestMsgId>FE1078BA3261545A31905937B265CE01</SIF_RequestMsgId> <SIF_PacketNumber>1</SIF_PacketNumber> <SIF_MorePackets>Yes</SIF_MorePackets> <SIF_ObjectData> <LearnerPersonal RefId="E3E34B359D75101A8C3D00AA00184753"> <PersonalInformation> <Name Type="R"> <FamilyName>Johnson</FamilyName> <GivenName>Alicia</GivenName> </Name> </PersonalInformation> </LearnerPersonal> </SIF_ObjectData> </SIF_Response> </SIF_Message>
Example 5.2.7-4: SIF_Response (first packet)
<SIF_Message Version="2.0r1" xmlns="http://www.sifinfo.org/uk/infrastructure/2.x"> <SIF_Response> <SIF_Header> <SIF_MsgId>322925BC9818433E8090D51256786BC9</SIF_MsgId> <SIF_Timestamp>2006-04-18T08:39:49-08:00</SIF_Timestamp> <SIF_SourceId>SISAgent</SIF_SourceId> <SIF_DestinationId>NetworkAgent</SIF_DestinationId> </SIF_Header> <SIF_RequestMsgId>FE1078BA3261545A31905937B265CE01</SIF_RequestMsgId> <SIF_PacketNumber>2</SIF_PacketNumber> <SIF_MorePackets>No</SIF_MorePackets> <SIF_ObjectData> <LearnerPersonal RefId="E3E34B359D75101A8C3D00AA00184753"> <PersonalInformation> <Name Type="R"> <FamilyName>Johnson</FamilyName> <GivenName>Alicia</GivenName> </Name> </PersonalInformation> </LearnerPersonal> </SIF_ObjectData> </SIF_Response> </SIF_Message>
Example 5.2.7-6: SIF_Response (second packet)
<SIF_Message Version="2.0r1" xmlns="http://www.sifinfo.org/uk/infrastructure/2.x"> <SIF_Response> <SIF_Header> <SIF_MsgId>F557D40A1367455E9F01DED76E29260C</SIF_MsgId> <SIF_Timestamp>2006-04-18T08:43:08-08:00</SIF_Timestamp> <SIF_SourceId>SISAgent</SIF_SourceId> <SIF_DestinationId>NetworkAgent</SIF_DestinationId> </SIF_Header> <SIF_RequestMsgId>971D7C7EF2684C7081A7765BF89FAD14</SIF_RequestMsgId> <SIF_PacketNumber>1</SIF_PacketNumber> <SIF_MorePackets>No</SIF_MorePackets> <SIF_ObjectData /> </SIF_Response> </SIF_Message>
Example 5.2.7-8: SIF_Response with no matching objects

### 5.2.8 SIF_Subscribe

This message is used to subscribe to event objects that are contained in this message.

Figure 5.2.8-1: SIF_Subscribe

| Element/@Attribute | Char | Description | Type
--- | --- | --- | --- | ---
| SIF_Subscribe | M | This message is used to subscribe to event objects that are contained in this message. |
| SIF_Header | M | Header information associated with this message. | SIF_Header
| SIF_Object | MR |  |
@ | ObjectName | M | The actual name of the object that is being subscribed to. All valid `SIF_Event`s for this object will be routed to the subscriber. | SIF_SubscribeObjectNamesType
| SIF_Object/SIF_Contexts | O | The contexts to which the subscription applies; if omitted, the context is `SIF_Default`. | SIF_Contexts

Table 5.2.8-1: SIF_Subscribe
<SIF_Message Version="2.0r1" xmlns="http://www.sifinfo.org/uk/infrastructure/2.x"> <SIF_Subscribe> <SIF_Header> <SIF_MsgId>AB2065FD3261545A31905937B265CE01</SIF_MsgId> <SIF_Timestamp>2006-02-18T20:39:12-08:00</SIF_Timestamp> <SIF_SourceId>RamseyLIB</SIF_SourceId> </SIF_Header> <SIF_Object ObjectName="LearnerPersonal" /> <SIF_Object ObjectName="WorkforcePersonal" /> </SIF_Subscribe> </SIF_Message>
Example 5.2.8-2: SIF_Subscribe

### 5.2.9 SIF_SystemControl

A `SIF_SystemControl` message is designed to control the flow of data between an agent and ZIS or vice-versa, and to synchronously retrieve data available from the ZIS. The `SIF_SystemControl` message is a container for a number of specialized control messages. `SIF_SystemControl` messages are handled immediately by receivers and are not persisted in a message queue for later delivery.

Figure 5.2.9-1: SIF_SystemControl

| Element/@Attribute | Char | Description | Type
--- | --- | --- | --- | ---
| SIF_SystemControl | M | This message is designed to control the flow of data an agent and ZIS or vice-versa, and to synchronously retrieve data available from the ZIS. |
| SIF_Header | M | Header information associated with this message. | SIF_Header
| SIF_SystemControlData | M | This element holds the sub-message being sent. | choice of: SIF_Ping SIF_Sleep SIF_Wakeup SIF_GetMessage SIF_GetZoneStatus SIF_GetAgentACL

Table 5.2.9-1: SIF_SystemControl
<SIF_Message Version="2.0r1" xmlns="http://www.sifinfo.org/uk/infrastructure/2.x"> <SIF_SystemControl> <SIF_Header> <SIF_MsgId>C332B8A9DFA5480AB89B6B6F62BE57B3</SIF_MsgId> <SIF_Timestamp>2006-12-27T08:39:40-08:00</SIF_Timestamp> <SIF_SourceId>RamseyLIB</SIF_SourceId> </SIF_Header> <SIF_SystemControlData> <SIF_Ping /> </SIF_SystemControlData> </SIF_SystemControl> </SIF_Message>
Example 5.2.9-2: SIF_SystemControl

### 5.2.10 SIF_Ping

`SIF_Ping` is sent to detect if a ZIS or push-mode agent is ready to receive and process messages.

Figure 5.2.10-1: SIF_Ping

| Element/@Attribute | Char | Description | Type
--- | --- | --- | --- | ---
| SIF_Ping | M | This sub-message detects if an a Push-Mode Agent or ZIS is ready to receive and process messages. | EMPTY

Table 5.2.10-1: SIF_Ping
<SIF_Message Version="2.0r1" xmlns="http://www.sifinfo.org/uk/infrastructure/2.x"> <SIF_SystemControl> <SIF_Header> <SIF_MsgId>C332B8A9DFA5480AB89B6B6F62BE57B3</SIF_MsgId> <SIF_Timestamp>2006-12-27T08:39:40-08:00</SIF_Timestamp> <SIF_SourceId>RamseyLIB</SIF_SourceId> </SIF_Header> <SIF_SystemControlData> <SIF_Ping /> </SIF_SystemControlData> </SIF_SystemControl> </SIF_Message>
Example 5.2.10-2: SIF_Ping
<SIF_Message Version="2.0r1" xmlns="http://www.sifinfo.org/uk/infrastructure/2.x"> <SIF_Ack> <SIF_Header> <SIF_MsgId>AE9E2BD747B94F4D8545E41F482854C8</SIF_MsgId> <SIF_Timestamp>2006-10-14T14:23:20-08:00</SIF_Timestamp> <SIF_SourceId>RamseySIS</SIF_SourceId> </SIF_Header> <SIF_OriginalSourceId>RamseyZIS</SIF_OriginalSourceId> <SIF_OriginalMsgId>9812ABFD3261545A31905937B265CE01</SIF_OriginalMsgId> <SIF_Status> <SIF_Code>1</SIF_Code> </SIF_Status> </SIF_Ack> </SIF_Message>
Example 5.2.10-4: SIF_SystemControl—SIF_Ping ("Okay" status)
<SIF_Message Version="2.0r1" xmlns="http://www.sifinfo.org/uk/infrastructure/2.x"> <SIF_Ack> <SIF_Header> <SIF_MsgId>3C11DFF1451C4E9A8A1F07E03C1D7FBB</SIF_MsgId> <SIF_Timestamp>2006-10-14T14:24:31-08:00</SIF_Timestamp> <SIF_SourceId>RamseySIS</SIF_SourceId> </SIF_Header> <SIF_OriginalSourceId>RamseyZIS</SIF_OriginalSourceId> <SIF_OriginalMsgId>9812ABFD3261545A31905937B265CE01</SIF_OriginalMsgId> <SIF_Status> <SIF_Code>8</SIF_Code> <SIF_Desc>Receiver is sleeping</SIF_Desc> </SIF_Status> </SIF_Ack> </SIF_Message>
Example 5.2.10-6: SIF_SystemControl—SIF_Ping ("Receiver is sleeping" status)
<SIF_Message Version="2.0r1" xmlns="http://www.sifinfo.org/uk/infrastructure/2.x"> <SIF_Ack> <SIF_Header> <SIF_MsgId>1594A3B29DD34786B5EA77998899F49F</SIF_MsgId> <SIF_Timestamp>2006-10-14T14:24:31-08:00</SIF_Timestamp> <SIF_SourceId>RamseyZIS</SIF_SourceId> </SIF_Header> <SIF_OriginalSourceId>RamseySIS</SIF_OriginalSourceId> <SIF_OriginalMsgId>9812ABFD3261545A31905937B265CE01</SIF_OriginalMsgId> <SIF_Error> <SIF_Category>10</SIF_Category> <SIF_Code>4</SIF_Code> <SIF_Desc>Unable to establish connection</SIF_Desc> <SIF_ExtendedDesc>Error 10061: Connection refused</SIF_ExtendedDesc> </SIF_Error> </SIF_Ack> </SIF_Message>
Example 5.2.10-8: SIF_SystemControl—SIF_Ping (Transport error returned)

### 5.2.11 SIF_Sleep

The `SIF_Sleep` message allows an agent to notify a ZIS or a ZIS to notify a push-mode agent that it must not send any more messages to the sender of the `SIF_Sleep`. After the sender receives a `SIF_Ack` indicating that the message was received, the receiver must not send any further messages to the sender.

This message provides the ability to signal an agent or ZIS that the sender will be unable to process further messages until some time in the future. Reasons for sending a `SIF_Sleep` message include the sender is unable to process more data because of limited resources (i.e. disk storage, network bandwidth, etc.), or the sender is being temporarily shutdown and will be unable to receive messages.

Since the sender may send a `SIF_Sleep` message for a variety of reasons, if the receiver sends messages after a `SIF_Sleep` message but prior to receiving a `SIF_Wakeup` or `SIF_Register` message from the sender, an error must be returned. A transport error will occur or be returned if a connection cannot be established with the sender, or the sender may choose to receive the connection but return an error.

If the sender is an agent, the ZIS will continue to hold any messages for the agent in the queue but the ZIS will not send those messages until a `SIF_Wakeup` (or `SIF_Register`) message is received. If an agent is processing a message requiring additional `SIF_Request`s to be sent to the ZIS and a `SIF_Sleep` message is received from the ZIS, the agent will not be able to retrieve the additional data. The agent must abort the processing of the message and only attempt to process the message after receiving a `SIF_Wakeup` message from the ZIS.

An agent or ZIS is not required to be able to send `SIF_Sleep` messages. However, if an agent or ZIS has the ability to send a `SIF_Sleep`, it must also be able to send a `SIF_Wakeup`. Although the sending of `SIF_Sleep` is optional, an agent or ZIS must always be able to process and respond appropriately to these messages if received.

Figure 5.2.11-1: SIF_Sleep

| Element/@Attribute | Char | Description | Type
--- | --- | --- | --- | ---
| SIF_Sleep | M | This sub-message tells a receiver not to send any more messages to the sender. | EMPTY

Table 5.2.11-1: SIF_Sleep
<SIF_Message Version="2.0r1" xmlns="http://www.sifinfo.org/uk/infrastructure/2.x"> <SIF_SystemControl> <SIF_Header> <SIF_MsgId>1594A3B29DD34786B5EA77998899F49F</SIF_MsgId> <SIF_Timestamp>2006-10-14T14:28:19-08:00</SIF_Timestamp> <SIF_SourceId>RamseyZIS</SIF_SourceId> </SIF_Header> <SIF_SystemControlData> <SIF_Sleep /> </SIF_SystemControlData> </SIF_SystemControl> </SIF_Message>
Example 5.2.11-2: SIF_Sleep
<SIF_Message Version="2.0r1" xmlns="http://www.sifinfo.org/uk/infrastructure/2.x"> <SIF_Ack> <SIF_Header> <SIF_MsgId>9F5167FA5CA848F99EB27544B314AF4D</SIF_MsgId> <SIF_Timestamp>2006-10-14T14:29:09-08:00</SIF_Timestamp> <SIF_SourceId>RamseySIS</SIF_SourceId> </SIF_Header> <SIF_OriginalSourceId>RamseyZIS</SIF_OriginalSourceId> <SIF_OriginalMsgId>1594A3B29DD34786B5EA77998899F49F</SIF_OriginalMsgId> <SIF_Status> <SIF_Code>1</SIF_Code> </SIF_Status> </SIF_Ack> </SIF_Message>
Example 5.2.11-4: SIF_Ack with "Okay" status in response to SIF_Sleep

### 5.2.12 SIF_Wakeup

When the "sleeping" agent or ZIS is ready to resume message processing, it will send a `SIF_Wakeup` message. This will signal the receiver that the sender is now able to process messages. Sending a `SIF_Wakeup` message without a previous `SIF_Sleep` message is permissible and is not considered an error.

If there are any blocked events in the Agent's queue when a ZIS receives the `SIF_Wakeup` message, the blocks will be removed.

Since a ZIS may choose to stop sending messages to an agent if a connection cannot be made with that agent, it is recommended that an agent send a `SIF_Wakeup` message to the ZIS upon agent startup.

An agent or ZIS is not required to be able to send `SIF_Wakeup` messages. Although the sending of `SIF_Wakeup` is optional, an agent or ZIS must always be able to process and respond to these messages correctly if received.

Figure 5.2.12-1: SIF_Wakeup

| Element/@Attribute | Char | Description | Type
--- | --- | --- | --- | ---
| SIF_Wakeup | M | This message tells a receiver that the sender is able to process messages. | EMPTY

Table 5.2.12-1: SIF_Wakeup
<SIF_Message Version="2.0r1" xmlns="http://www.sifinfo.org/uk/infrastructure/2.x"> <SIF_SystemControl> <SIF_Header> <SIF_MsgId>715A32E026B0495A826DF84E821949BD</SIF_MsgId> <SIF_Timestamp>2006-10-14T15:34:22-08:00</SIF_Timestamp> <SIF_SourceId>RamseyZIS</SIF_SourceId> </SIF_Header> <SIF_SystemControlData> <SIF_Wakeup /> </SIF_SystemControlData> </SIF_SystemControl> </SIF_Message>
Example 5.2.12-2: SIF_Wakeup
<SIF_Message Version="2.0r1" xmlns="http://www.sifinfo.org/uk/infrastructure/2.x"> <SIF_Ack> <SIF_Header> <SIF_MsgId>5631E28868E3482EAA51B6CDE4145957</SIF_MsgId> <SIF_Timestamp>2006-10-14T15:34:48-08:00</SIF_Timestamp> <SIF_SourceId>RamseySIS</SIF_SourceId> </SIF_Header> <SIF_OriginalSourceId>RamseyZIS</SIF_OriginalSourceId> <SIF_OriginalMsgId>715A32E026B0495A826DF84E821949BD</SIF_OriginalMsgId> <SIF_Status> <SIF_Code>1</SIF_Code> </SIF_Status> </SIF_Ack> </SIF_Message>
Example 5.2.12-4: SIF_Ack with an "Okay" status in response to SIF_Wakeup

#### 5.2.12.1 SIF_Sleep/SIF_Wakeup versus SIF_Register/SIF_Unregister

Using the `SIF_Wakeup` message is the preferred method of communicating that an agent or ZIS is ready to process messages. This is preferable over the use of a `SIF_Register` message because a `SIF_Register` message specifies protocol information while the `SIF_Sleep`/`SIF_Wakeup` pair communicates flow control information. However, when a `SIF_Register` message is processed, the receiver must behave like a `SIF_Wakeup` message was also received.

It is important to note that while `SIF_Sleep` and `SIF_Wakeup` are opposites of one another, this is not the case with `SIF_Register` and `SIF_Unregister`. This is because a `SIF_Unregister` command removes essential agent configuration information such as the provision and subscription lists, which will not be specified by a subsequent `SIF_Register` command. (`SIF_Unregister` also causes any messages pending delivery to the agent to be purged from the agent's queue.) In other words, a `SIF_Register` alone will not reverse the effects of a `SIF_Unregister`.

### 5.2.13 SIF_GetMessage

The `SIF_GetMessage` message provides the mechanism for an agent to pull message from a ZIS. An agent sends a `SIF_GetMessage` and the ZIS returns the next available message, subject to Selective Message Blocking, wrapped in a `SIF_Ack` with a `SIF_Status/SIF_Code` of `0` and the message in the `SIF_Status/SIF_Data` element. If there are no messages to be returned, the ZIS returns a value of `9` in `SIF_Status/SIF_Code`.

If an agent is not registered with a mode of `Pull` the ZIS will return a `SIF_Ack` with an error category of Registration and an error code indicating the agent is registered in Push mode.

Figure 5.2.13-1: SIF_GetMessage

| Element/@Attribute | Char | Description | Type
--- | --- | --- | --- | ---
| SIF_GetMessage | M | This message tells the ZIS to return the first available message to the agent, subject to Selective Message Blocking. | EMPTY

Table 5.2.13-1: SIF_GetMessage
<SIF_Message Version="2.0r1" xmlns="http://www.sifinfo.org/uk/infrastructure/2.x"> <SIF_SystemControl> <SIF_Header> <SIF_MsgId>B0E80A74265A4A75ADDC0ECC50AEF737</SIF_MsgId> <SIF_Timestamp>2006-10-14T15:54:32-08:00</SIF_Timestamp> <SIF_SourceId>RamseySIS</SIF_SourceId> </SIF_Header> <SIF_SystemControlData> <SIF_GetMessage /> </SIF_SystemControlData> </SIF_SystemControl> </SIF_Message>
Example 5.2.13-2: SIF_GetMessage
<SIF_Message Version="2.0r1" xmlns="http://www.sifinfo.org/uk/infrastructure/2.x"> <SIF_Ack> <SIF_Header> <SIF_MsgId>9861A45AAC364607938A7DB440514DDF</SIF_MsgId> <SIF_Timestamp>2006-10-14T15:54:42-08:00</SIF_Timestamp> <SIF_SourceId>RamseyZIS</SIF_SourceId> </SIF_Header> <SIF_OriginalSourceId>RamseySIS</SIF_OriginalSourceId> <SIF_OriginalMsgId>B0E80A74265A4A75ADDC0ECC50AEF737</SIF_OriginalMsgId> <SIF_Status> <SIF_Code>0</SIF_Code> <SIF_Data> <SIF_Message Version="2.0r1"> <SIF_Event> <SIF_Header> <SIF_MsgId>AB34DC093261545A31905937B265CE01</SIF_MsgId> <SIF_Timestamp>2006-10-14T15:40:12-08:00</SIF_Timestamp> <SIF_SourceId>RamseySIS</SIF_SourceId> </SIF_Header> <SIF_ObjectData> <SIF_EventObject ObjectName="LearnerPersonal" Action="Change"> <LearnerPersonal RefId="D3E34B359D75101A8C3D00AA001A1652"> <PersonalInformation> <Name Type="R"> <GivenName>William</GivenName> </Name> </PersonalInformation> </LearnerPersonal> </SIF_EventObject> </SIF_ObjectData> </SIF_Event> </SIF_Message> </SIF_Data> </SIF_Status> </SIF_Ack> </SIF_Message>
Example 5.2.13-4: SIF_Ack in response to SIF_GetMessage
<SIF_Message Version="2.0r1" xmlns="http://www.sifinfo.org/uk/infrastructure/2.x"> <SIF_Ack> <SIF_Header> <SIF_MsgId>9861A45AAC364607938A7DB440514DDF</SIF_MsgId> <SIF_Timestamp>2006-10-14T15:54:42-08:00</SIF_Timestamp> <SIF_SourceId>RamseyZIS</SIF_SourceId> </SIF_Header> <SIF_OriginalSourceId>RamseySIS</SIF_OriginalSourceId> <SIF_OriginalMsgId>B0E80A74265A4A75ADDC0ECC50AEF737</SIF_OriginalMsgId> <SIF_Status> <SIF_Code>9</SIF_Code> </SIF_Status> </SIF_Ack> </SIF_Message>
Example 5.2.13-6: SIF_Ack in response to SIF_GetMessage (no message in queue)

### 5.2.14 SIF_GetZoneStatus

The `SIF_GetZoneStatus` message provides the agent with the ability to synchronously retrieve the current status of the zone, by-passing the asynchronous nature of retrieving the zone status by sending a `SIF_Request` for `SIF_ZoneStatus` and waiting for the arrival of the `SIF_ZoneStatus` response at the top of its queue. Agents may also use the asynchronous model for requesting `SIF_ZoneStatus`, if and when desired.

Figure 5.2.14-1: SIF_GetZoneStatus

| Element/@Attribute | Char | Description | Type
--- | --- | --- | --- | ---
| SIF_GetZoneStatus | M | This message tells the ZIS to return the current `SIF_ZoneStatus` in a `SIF_Ack`. | EMPTY

Table 5.2.14-1: SIF_GetZoneStatus
<SIF_Message Version="2.0r1" xmlns="http://www.sifinfo.org/uk/infrastructure/2.x"> <SIF_SystemControl> <SIF_Header> <SIF_MsgId>91401B5073F54AB1AEBC63E51764C77A</SIF_MsgId> <SIF_Timestamp>2006-10-14T16:09:54-08:00</SIF_Timestamp> <SIF_SourceId>RamseySIS</SIF_SourceId> </SIF_Header> <SIF_SystemControlData> <SIF_GetZoneStatus /> </SIF_SystemControlData> </SIF_SystemControl> </SIF_Message>
Example 5.2.14-2: SIF_GetZoneStatus
<SIF_Message Version="2.0r1" xmlns="http://www.sifinfo.org/uk/infrastructure/2.x"> <SIF_Ack> <SIF_Header> <SIF_MsgId>C4BF5F868EEC4A41AF7DAF316C4E89DC</SIF_MsgId> <SIF_Timestamp>2006-10-14T16:10:42-08:00</SIF_Timestamp> <SIF_SourceId>RamseyZIS</SIF_SourceId> </SIF_Header> <SIF_OriginalSourceId>RamseySIS</SIF_OriginalSourceId> <SIF_OriginalMsgId>91401B5073F54AB1AEBC63E51764C77A</SIF_OriginalMsgId> <SIF_Status> <SIF_Code>0</SIF_Code> <SIF_Data> <SIF_ZoneStatus ZoneId="SIFExampleZone">...</SIF_ZoneStatus> </SIF_Data> </SIF_Status> </SIF_Ack> </SIF_Message>
Example 5.2.14-4: SIF_Ack containing SIF_ZoneStatus

### 5.2.15 SIF_GetAgentACL

The `SIF_GetAgentACL` message provides the agent with the ability to synchronously retrieve its Access Control List permissions in the Zone via `SIF_AgentACL`. Agents may also use the asynchronous model of `SIF_Request` for requesting `SIF_AgentACL`, if and when desired.

Figure 5.2.15-1: SIF_GetAgentACL

| Element/@Attribute | Char | Description | Type
--- | --- | --- | --- | ---
| SIF_GetAgentACL | M | This message tells the ZIS to return the Agent's ACL permissions in a `SIF_Ack`. | EMPTY

Table 5.2.15-1: SIF_GetAgentACL

### 5.2.16 SIF_Unprovide

This message performs the opposite function of `SIF_Provide`. It removes the message sender as a provider of the data objects contained in this message.

Figure 5.2.16-1: SIF_Unprovide

| Element/@Attribute | Char | Description | Type
--- | --- | --- | --- | ---
| SIF_Unprovide | M | This message performs the opposite function of `SIF_Provide`. |
| SIF_Header | M | Header information associated with this message. | SIF_Header
| SIF_Object | MR | This is the object that is being removed from the provider list. |
@ | ObjectName | M | The actual name of the object that is being removed. | SIF_ProvideObjectNamesType
| SIF_Object/SIF_Contexts | O | The contexts from which the object is being removed; if omitted, the context is `SIF_Default`. | SIF_Contexts

Table 5.2.16-1: SIF_Unprovide
<SIF_Message Version="2.0r1" xmlns="http://www.sifinfo.org/uk/infrastructure/2.x"> <SIF_Unprovide> <SIF_Header> <SIF_MsgId>76EFAB543261545A31905937B265CE01</SIF_MsgId> <SIF_Timestamp>2006-02-18T20:39:12-08:00</SIF_Timestamp> <SIF_SourceId>RamseySIS</SIF_SourceId> </SIF_Header> <SIF_Object ObjectName="LearnerPersonal" /> <SIF_Object ObjectName="WorkforcePersonal" /> </SIF_Unprovide> </SIF_Message>
Example 5.2.16-2: SIF_Unprovide

### 5.2.17 SIF_Unregister

This message allows an agent to remove any association it has with the ZIS. By sending this message, the ZIS will remove all provisions and subscriptions it maintains for the sender and discards any messages pending for the agent.

Figure 5.2.17-1: SIF_Unregister

| Element/@Attribute | Char | Description | Type
--- | --- | --- | --- | ---
| SIF_Unregister | M | This message is used to unregister an agent from a Zone. |
| SIF_Header | M | Header information contained in the message. | SIF_Header

Table 5.2.17-1: SIF_Unregister
<SIF_Message Version="2.0r1" xmlns="http://www.sifinfo.org/uk/infrastructure/2.x"> <SIF_Unregister> <SIF_Header> <SIF_MsgId>1057FABD3261545A31905937B265CE01</SIF_MsgId> <SIF_Timestamp>2006-02-18T20:39:12-08:00</SIF_Timestamp> <SIF_SourceId>RamseyFOOD</SIF_SourceId> </SIF_Header> </SIF_Unregister> </SIF_Message>
Example 5.2.17-2: SIF_Unregister

### 5.2.18 SIF_Unsubscribe

This message performs the opposite function of `SIF_Subscribe`. It removes the message sender as a subscriber to the `SIF_Event`s contained in this message.

Figure 5.2.18-1: SIF_Unsubscribe

| Element/@Attribute | Char | Description | Type
--- | --- | --- | --- | ---
| SIF_Unsubscribe | M | This message is used to unsubscribe from `SIF_Event`s. |
| SIF_Header | M | Header information associated with this message. | SIF_Header
| SIF_Object | MR |  |
@ | ObjectName | M | The actual name of the object from which the agent should be unsubscribed. Events pertaining to this object published after successful unsubscription will no longer be queued for delivery to the agent. Events already queued for delivery to the agent prior to unsubscription will be delivered. | SIF_SubscribeObjectNamesType
| SIF_Object/SIF_Contexts | O | The applicable contexts; if omitted, the context is `SIF_Default`. | SIF_Contexts

Table 5.2.18-1: SIF_Unsubscribe
<SIF_Message Version="2.0r1" xmlns="http://www.sifinfo.org/uk/infrastructure/2.x"> <SIF_Unsubscribe> <SIF_Header> <SIF_MsgId>101AE3703261545A31905937B265CE01</SIF_MsgId> <SIF_Timestamp>2006-02-18T20:39:12-08:00</SIF_Timestamp> <SIF_SourceId>RamseyFOOD</SIF_SourceId> </SIF_Header> <SIF_Object ObjectName="LearnerPersonal" /> <SIF_Object ObjectName="WorkforcePersonal" /> </SIF_Unsubscribe> </SIF_Message>
Example 5.2.18-2: SIF_Unsubscribe

## 5.3 Objects

### 5.3.1 SIF_ZoneStatus

The `SIF_ZoneStatus` object is an object that is implicitly provided by all Zone Integration Servers to provide information about the ZIS. Zone Integration Servers MUST provide this object.

Change events are supported on `SIF_ZoneStatus`.

Figure 5.3.1-1: SIF_ZoneStatus

| Element/@Attribute | Char | Description | Type
--- | --- | --- | --- | ---
| SIF_ZoneStatus |  | The `SIF_ZoneStatus` object is an object that is implicitly provided by all Zone Integration Servers to provide information about the ZIS. Zone Integration Servers MUST provide this object. |
@ | ZoneId | M | The identifier for this Zone. It is the same as the `SIF_SourceId` that the ZIS would place in any `SIF_Header` that it creates. | xs:token
| SIF_Name | M | The descriptive name for the zone. | xs:normalizedString
| SIF_Icon | O | HTTP URL referencing an icon for graphical representation of the ZIS/Zone. Should range from 16x16 pixels to 128x128 pixels and be of an `image` MIME type commonly supported by Web browsers (e.g. PNG, JPEG, GIF). Agents may optionally follow the more restrictive guidelines at [FAVICON]. | xs:anyURI
| SIF_Vendor | O | Contains information about the vendor that wrote this ZIS. |
| SIF_Vendor/SIF_Name | M | The name of the company that wrote the ZIS. | xs:normalizedString
| SIF_Vendor/SIF_Product | M | The product name assigned by the vendor to identify this ZIS. | xs:normalizedString
| SIF_Vendor/SIF_Version | M | The version of the vendor's product—not necessarily the SIF version. | xs:normalizedString
| SIF_Providers | C | Encompasses all the providers registered with this ZIS. This element is mandatory if there are providers registered with the ZIS. | List
| SIF_Providers/SIF_Provider | MR |  |
@ | SourceId | M | The identifier of the SIF node that is providing objects. This is the agent or ZIS identifier that would appear in the `SIF_SourceId` field of any `SIF_Header` created by the SIF node. | xs:token
| SIF_Providers/SIF_Provider/ SIF_ObjectList | M |  | List
| SIF_Providers/SIF_Provider/ SIF_ObjectList/SIF_Object | MR |  |
@ | ObjectName | M | The name of the object being provided by this SIF node. | xs:NCName
| SIF_Providers/SIF_Provider/ SIF_ObjectList/SIF_Object/ SIF_ExtendedQuerySupport | M |  | xs:boolean
| SIF_Providers/SIF_Provider/ SIF_ObjectList/SIF_Object/ SIF_Contexts | M |  | SIF_Contexts
| SIF_Subscribers | C | Encompasses all the subscribers registered with this ZIS. This element is mandatory if there are subscribers registered with the ZIS. | List
| SIF_Subscribers/SIF_Subscriber | MR |  |
@ | SourceId | M | The identifier of the SIF node that is subscribing to the object events. This is the agent or ZIS identifier that would appear in the `SIF_SourceId` field of any `SIF_Header` created by the SIF node. | xs:token
| SIF_Subscribers/SIF_Subscriber/ SIF_ObjectList | M |  | List
| SIF_Subscribers/SIF_Subscriber/ SIF_ObjectList/SIF_Object | MR |  |
@ | ObjectName | M | The name of the object being subscribed to by this SIF node. | xs:NCName
| SIF_Subscribers/SIF_Subscriber/ SIF_ObjectList/SIF_Object/ SIF_Contexts | M |  | SIF_Contexts
| SIF_AddPublishers | C | Encompasses all the `Add` `SIF_Event` publishers registered with this zone. | List
| SIF_AddPublishers/SIF_Publisher | MR |  |
@ | SourceId | M | The identifier of the SIF node that can publish the `SIF_Event`. This is the agent identifier that would appear in the `SIF_SourceId` field of any `SIF_Header` created by the agent. | xs:token
| SIF_AddPublishers/SIF_Publisher/ SIF_ObjectList | M |  | List
| SIF_AddPublishers/SIF_Publisher/ SIF_ObjectList/SIF_Object | MR |  |
@ | ObjectName | M | The name of the object being published by this agent. | xs:NCName
| SIF_AddPublishers/SIF_Publisher/ SIF_ObjectList/SIF_Object/ SIF_Contexts | M |  | SIF_Contexts
| SIF_ChangePublishers | C | Encompasses all the `Change` `SIF_Event` publishers registered with this zone. | List
| SIF_ChangePublishers/SIF_Publisher | MR |  |
@ | SourceId | M | The identifier of the SIF node that can publish the `SIF_Event`. This is the agent identifier that would appear in the `SIF_SourceId` field of any `SIF_Header` created by the agent. | xs:token
| SIF_ChangePublishers/SIF_Publisher/ SIF_ObjectList | M |  | List
| SIF_ChangePublishers/SIF_Publisher/ SIF_ObjectList/SIF_Object | MR |  |
@ | ObjectName | M | The name of the object being published by this agent. | xs:NCName
| SIF_ChangePublishers/SIF_Publisher/ SIF_ObjectList/SIF_Object/ SIF_Contexts | M |  | SIF_Contexts
| SIF_DeletePublishers | C | Encompasses all the `Delete` `SIF_Event` publishers registered with this zone. | List
| SIF_DeletePublishers/SIF_Publisher | MR |  |
@ | SourceId | M | The identifier of the SIF node that can publish the `SIF_Event`. This is the agent identifier that would appear in the `SIF_SourceId` field of any `SIF_Header` created by the agent. | xs:token
| SIF_DeletePublishers/SIF_Publisher/ SIF_ObjectList | M |  | List
| SIF_DeletePublishers/SIF_Publisher/ SIF_ObjectList/SIF_Object | MR |  |
@ | ObjectName | M | The name of the object being published by this agent. | xs:NCName
| SIF_DeletePublishers/SIF_Publisher/ SIF_ObjectList/SIF_Object/ SIF_Contexts | M |  | SIF_Contexts
| SIF_Responders | C | Encompasses all the responders registered with this zone. | List
| SIF_Responders/SIF_Responder | MR |  |
@ | SourceId | M | The identifier of the SIF node that can respond. This is the agent identifier that would appear in the `SIF_SourceId` field of any `SIF_Header` created by the agent. | xs:token
| SIF_Responders/SIF_Responder/ SIF_ObjectList | M |  | List
| SIF_Responders/SIF_Responder/ SIF_ObjectList/SIF_Object | MR |  |
@ | ObjectName | M | The name of the object for which the agent can respond to requests. | xs:NCName
| SIF_Responders/SIF_Responder/ SIF_ObjectList/SIF_Object/ SIF_ExtendedQuerySupport | M |  | xs:boolean
| SIF_Responders/SIF_Responder/ SIF_ObjectList/SIF_Object/ SIF_Contexts | M |  | SIF_Contexts
| SIF_Requesters | C | Encompasses all the requesters registered with this zone. | List
| SIF_Requesters/SIF_Requester | MR |  |
@ | SourceId | M | The identifier of the SIF node that can request an object. This is the agent identifier that would appear in the `SIF_SourceId` field of any `SIF_Header` created by the agent. | xs:token
| SIF_Requesters/SIF_Requester/ SIF_ObjectList | M |  | List
| SIF_Requesters/SIF_Requester/ SIF_ObjectList/SIF_Object | MR |  |
@ | ObjectName | M | The name of the object being requested by this agent. | xs:NCName
| SIF_Requesters/SIF_Requester/ SIF_ObjectList/SIF_Object/ SIF_ExtendedQuerySupport | M |  | xs:boolean
| SIF_Requesters/SIF_Requester/ SIF_ObjectList/SIF_Object/ SIF_Contexts | M |  | SIF_Contexts
| SIF_SIFNodes | C | Encompasses all of the nodes registered with the ZIS. This element is mandatory if there are SIF nodes registered. | List
| SIF_SIFNodes/SIF_SIFNode | MR |  |
@ | Type | M | The type of the node registered with the ZIS. Note that `ZIS` is forward-looking and not used currently; all information about this Zone/ZIS is contained outside `SIF_SIFNodes`. | values: Agent ZIS
| SIF_SIFNodes/SIF_SIFNode/ SIF_Name | M | The descriptive name of the SIF node (i.e. Ramsey Food Services). | xs:normalizedString
| SIF_SIFNodes/SIF_SIFNode/ SIF_Icon | O | HTTP URL referencing an icon for graphical representation of the application/agent. Should range from 16x16 pixels to 128x128 pixels and be of an `image` MIME type commonly supported by Web browsers (e.g. PNG, JPEG, GIF). Agents may optionally follow the more restrictive guidelines at [FAVICON]. | xs:anyURI
| SIF_SIFNodes/SIF_SIFNode/ SIF_NodeVendor | O | The vendor of the SIF agent. | xs:normalizedString
| SIF_SIFNodes/SIF_SIFNode/ SIF_NodeVersion | O | The agent version number. The format of this field is undefined, but it should match the format used in the agent's conformance statement, if the agent is SIF Certified. Examples 2.0.1.11 | xs:normalizedString
| SIF_SIFNodes/SIF_SIFNode/ SIF_Application | O | Contains information about the vendor of the product that the agent represents. |
| SIF_SIFNodes/SIF_SIFNode/ SIF_Application/SIF_Vendor | M | The name of the company of the product that this agent supports. | xs:normalizedString
| SIF_SIFNodes/SIF_SIFNode/ SIF_Application/SIF_Product | M | The name of the product that this agent supports. | xs:normalizedString
| SIF_SIFNodes/SIF_SIFNode/ SIF_Application/SIF_Version | M | The version of the product. This field is informative only. | xs:normalizedString
| SIF_SIFNodes/SIF_SIFNode/ SIF_SourceId | M | The agent or ZIS identifier. This is the same value that the SIF node would place in any `SIF_Header` that it would create. | xs:token
| SIF_SIFNodes/SIF_SIFNode/ SIF_Mode | M | Specifies the communication mode (Pull or Push) as chosen by the message sender. | values: Push Pull
| SIF_SIFNodes/SIF_SIFNode/ SIF_Protocol | O | Describes the currently active protocol that the SIF node is using to communicate with the ZIS. | SIF_Protocol
| SIF_SIFNodes/SIF_SIFNode/ SIF_VersionList | M |  | List
| SIF_SIFNodes/SIF_SIFNode/ SIF_VersionList/SIF_Version | MR | This is the version or versions of the SIF Implementation Specification that define(s) the messages the SIF node can receive. For agents, this information was communicated when the SIF node registered with the ZIS. | VersionWithWildcardsType
| SIF_SIFNodes/SIF_SIFNode/ SIF_AuthenticationLevel | O | This is the level of authentication that the SIF node supports when it wants to communicate via a secure channel. | SIF_AuthenticationLevel
| SIF_SIFNodes/SIF_SIFNode/ SIF_EncryptionLevel | O | This is the level of encryption that the SIF node supports when it wants to communicate via a secure channel. | SIF_EncryptionLevel
| SIF_SIFNodes/SIF_SIFNode/ SIF_MaxBufferSize | M | Specifies that the ZIS should never send packets larger than this value. Query responses from other providers are controlled by the `SIF_MaxBufferSize` attribute in the `SIF_Request` message. | xs:unsignedInt
| SIF_SIFNodes/SIF_SIFNode/ SIF_Sleeping | M | This element shows whether the SIF node is ready to process messages. | values: No The SIF node is ready to process messages Yes The SIF node is sleeping and cannot process messages
| SIF_SupportedAuthentication | C | Enumerates the various authentication protocols that the ZIS supports. If the ZIS supports an authentication protocol this element is mandatory. | List
| SIF_SupportedAuthentication/ SIF_ProtocolName | MR | Describes a particular authentication protocol supported. | values: X.509
| SIF_SupportedProtocols | M | Enumerates the various communication transport protocols that are supported by the ZIS. | List
| SIF_SupportedProtocols/SIF_Protocol | MR |  | SIF_Protocol
| SIF_SupportedVersions | M | Enumerates the versions of the SIF Implementation Specification that this ZIS can use when communicating with the agent. | List
| SIF_SupportedVersions/SIF_Version | MR | Lists a specific SIF Implementation Specification version. | VersionType
| SIF_AdministrationURL | O | Should a ZIS vendor provide an administration interface for the zone via a URL, the ZIS can make the URL available in `SIF_ZoneStatus`. Agent administrators can use the URL to access zone administration features, should they have permission to do so. | xs:anyURI
| SIF_Contexts | M |  | SIF_Contexts
| SIF_Metadata | O |  | SIF_Metadata
| SIF_ExtendedElements | O |  | SIF_ExtendedElements

Table 5.3.1-1: SIF_ZoneStatus
<SIF_ZoneStatus ZoneId="RamseyZIS"> <SIF_Name>Ramsey Elementary</SIF_Name> <SIF_Vendor> <SIF_Name>ZoneMaster, Inc.</SIF_Name> <SIF_Product>ZonePlus Zone Integration Server</SIF_Product> <SIF_Version>3.01</SIF_Version> </SIF_Vendor> <SIF_Providers> <SIF_Provider SourceId="RamseySIS"> <SIF_ObjectList> <SIF_Object ObjectName="LearnerPersonal"> <SIF_ExtendedQuerySupport>false</SIF_ExtendedQuerySupport> <SIF_Contexts> <SIF_Context>SIF_Default</SIF_Context> </SIF_Contexts> </SIF_Object> <SIF_Object ObjectName="LearnerSchoolEnrolment"> <SIF_ExtendedQuerySupport>false</SIF_ExtendedQuerySupport> <SIF_Contexts> <SIF_Context>SIF_Default</SIF_Context> </SIF_Contexts> </SIF_Object> </SIF_ObjectList> </SIF_Provider> </SIF_Providers> <SIF_Subscribers> <SIF_Subscriber SourceId="RamseyFOOD"> <SIF_ObjectList> <SIF_Object ObjectName="LearnerPersonal"> <SIF_Contexts> <SIF_Context>SIF_Default</SIF_Context> </SIF_Contexts> </SIF_Object> <SIF_Object ObjectName="LearnerPersonalEnrolment"> <SIF_Contexts> <SIF_Context>SIF_Default</SIF_Context> </SIF_Contexts> </SIF_Object> </SIF_ObjectList> </SIF_Subscriber> <SIF_Subscriber SourceId="RamseyLIB"> <SIF_ObjectList> <SIF_Object ObjectName="LearnerPersonal"> <SIF_Contexts> <SIF_Context>SIF_Default</SIF_Context> </SIF_Contexts> </SIF_Object> <SIF_Object ObjectName="LearnerSchoolEnrolment"> <SIF_Contexts> <SIF_Context>SIF_Default</SIF_Context> </SIF_Contexts> </SIF_Object> </SIF_ObjectList> </SIF_Subscriber> </SIF_Subscribers> <SIF_SIFNodes> <SIF_SIFNode Type="Agent"> <SIF_Name>Ramsey Food Services</SIF_Name> <SIF_SourceId>RamseyFOOD</SIF_SourceId> <SIF_Mode>Push</SIF_Mode> <SIF_Protocol Type="HTTPS" Secure="Yes"> <SIF_URL>https://RamseyNT:8010/FoodService</SIF_URL> </SIF_Protocol> <SIF_VersionList> <SIF_Version>2.0r1</SIF_Version> </SIF_VersionList> <SIF_MaxBufferSize>16384</SIF_MaxBufferSize> <SIF_Sleeping>No</SIF_Sleeping> </SIF_SIFNode> <SIF_SIFNode Type="Agent"> <SIF_Name>Ramsey Media Resource Center</SIF_Name> <SIF_SourceId>RamseyLIB</SIF_SourceId> <SIF_Mode>Pull</SIF_Mode> <SIF_Protocol Type="HTTPS" Secure="Yes"> <SIF_URL>https://RamseyNT:8020/Library</SIF_URL> </SIF_Protocol> <SIF_VersionList> <SIF_Version>2.0r1</SIF_Version> </SIF_VersionList> <SIF_MaxBufferSize>16384</SIF_MaxBufferSize> <SIF_Sleeping>No</SIF_Sleeping> </SIF_SIFNode> <SIF_SIFNode Type="Agent"> <SIF_Name>Ramsey Administration</SIF_Name> <SIF_SourceId>RamseySIS</SIF_SourceId> <SIF_Mode>Push</SIF_Mode> <SIF_Protocol Type="HTTPS" Secure="Yes"> <SIF_URL>https://RamseyNT:8030/StudentAdmin</SIF_URL> </SIF_Protocol> <SIF_VersionList> <SIF_Version>2.0r1</SIF_Version> </SIF_VersionList> <SIF_MaxBufferSize>16384</SIF_MaxBufferSize> <SIF_Sleeping>No</SIF_Sleeping> </SIF_SIFNode> </SIF_SIFNodes> <SIF_SupportedAuthentication> <SIF_ProtocolName>X.509</SIF_ProtocolName> </SIF_SupportedAuthentication> <SIF_SupportedProtocols> <SIF_Protocol Type="HTTPS" Secure="Yes"> <SIF_URL>https://RamseyNT:8000/ZIS</SIF_URL> </SIF_Protocol> <SIF_Protocol Type="HTTP" Secure="No"> <SIF_URL>http://RamseyNT:8000/ZIS</SIF_URL> </SIF_Protocol> </SIF_SupportedProtocols> <SIF_SupportedVersions> <SIF_Version>2.0r1</SIF_Version> </SIF_SupportedVersions> <SIF_AdministrationURL>http://RamseyNT:8000/Administer</SIF_AdministrationURL> <SIF_Contexts> <SIF_Context>SIF_Default</SIF_Context> </SIF_Contexts> </SIF_ZoneStatus>
Example 5.3.1-2: SIF_ZoneStatus

### 5.3.2 SIF_AgentACL

This object provides an Agent its access control list (ACL) settings in the Zone. It does not communicate which objects the Agent is currently registered as providing, subscribing, publishing, requesting, or responding; it simply lists the ACL rights granted to the Agent in the Zone. When objects are absent from any of the access lists, the Agent does not have the necessary rights to perform the given action on the object. While an Agent may asynchronously request this object from the ZIS via `SIF_Request`, it is typically returned synchronously in response to the `SIF_SystemControl` message `SIF_GetAgentACL`; it is also returned synchronously in response to `SIF_Register`.

Typically only `Change` events are reported.

Figure 5.3.2-1: SIF_AgentACL

| Element/@Attribute | Char | Description | Type
--- | --- | --- | --- | ---
| SIF_AgentACL |  | This object provides an Agent its access control list (ACL) settings in the Zone. |
| SIF_ProvideAccess | M | Access control list by object for `SIF_Provide` and corresponding section in `SIF_Provision`. | List
| SIF_ProvideAccess/SIF_Object | OR |  |
@ | ObjectName | M | The name of each object. | xs:NCName
| SIF_ProvideAccess/SIF_Object/ SIF_Contexts | M | List of contexts in which rights for the given action/object apply. | SIF_Contexts
| SIF_SubscribeAccess | M | Access control list by object for `SIF_Subscribe` and corresponding section in `SIF_Provision`. | List
| SIF_SubscribeAccess/SIF_Object | OR |  |
@ | ObjectName | M | The name of each object. | xs:NCName
| SIF_SubscribeAccess/SIF_Object/ SIF_Contexts | M | List of contexts in which rights for the given action/object apply. | SIF_Contexts
| SIF_PublishAddAccess | M | Access control list by object for corresponding section in `SIF_Provision`, whether the Agent has the right to publish `Add` events. | List
| SIF_PublishAddAccess/SIF_Object | OR |  |
@ | ObjectName | M | The name of each object. | xs:NCName
| SIF_PublishAddAccess/SIF_Object/ SIF_Contexts | M | List of contexts in which rights for the given action/object apply. | SIF_Contexts
| SIF_PublishChangeAccess | M | Access control list by object for corresponding section in `SIF_Provision`, whether the Agent has the right to publish `Change` events. | List
| SIF_PublishChangeAccess/SIF_Object | OR |  |
@ | ObjectName | M | The name of each object. | xs:NCName
| SIF_PublishChangeAccess/SIF_Object/ SIF_Contexts | M | List of contexts in which rights for the given action/object apply. | SIF_Contexts
| SIF_PublishDeleteAccess | M | Access control list by object for corresponding section in `SIF_Provision`, whether the Agent has the right to publish Delete events. | List
| SIF_PublishDeleteAccess/SIF_Object | OR |  |
@ | ObjectName | M | The name of each object. | xs:NCName
| SIF_PublishDeleteAccess/SIF_Object/ SIF_Contexts | M | List of contexts in which rights for the given action/object apply. | SIF_Contexts
| SIF_RequestAccess | M | Access control list by object for `SIF_Request` and corresponding section in `SIF_Provision`. | List
| SIF_RequestAccess/SIF_Object | OR |  |
@ | ObjectName | M | The name of each object. | xs:NCName
| SIF_RequestAccess/SIF_Object/ SIF_Contexts | M | List of contexts in which rights for the given action/object apply. | SIF_Contexts
| SIF_RespondAccess | M | Access control list by object for corresponding section in `SIF_Provision`, whether the Agent has the right to respond to requests for an object regardless of being the Provider of that object. | List
| SIF_RespondAccess/SIF_Object | OR |  |
@ | ObjectName | M | The name of each object. | xs:NCName
| SIF_RespondAccess/SIF_Object/ SIF_Contexts | M | List of contexts in which rights for the given action/object apply. | SIF_Contexts
| SIF_Metadata | O |  | SIF_Metadata
| SIF_ExtendedElements | O |  | SIF_ExtendedElements

Table 5.3.2-1: SIF_AgentACL
<SIF_AgentACL> <SIF_ProvideAccess> <SIF_Object ObjectName="LearnerPersonal"> <SIF_Contexts> <SIF_Context>SIF_Default</SIF_Context> </SIF_Contexts> </SIF_Object> </SIF_ProvideAccess> <SIF_SubscribeAccess> <SIF_Object ObjectName="WorkforcePersonal"> <SIF_Contexts> <SIF_Context>SIF_Default</SIF_Context> </SIF_Contexts> </SIF_Object> </SIF_SubscribeAccess> <SIF_PublishAddAccess> <SIF_Object ObjectName="LearnerPersonal"> <SIF_Contexts> <SIF_Context>SIF_Default</SIF_Context> </SIF_Contexts> </SIF_Object> </SIF_PublishAddAccess> <SIF_PublishChangeAccess> <SIF_Object ObjectName="LearnerPersonal"> <SIF_Contexts> <SIF_Context>SIF_Default</SIF_Context> </SIF_Contexts> </SIF_Object> </SIF_PublishChangeAccess> <SIF_PublishDeleteAccess> <SIF_Object ObjectName="LearnerPersonal"> <SIF_Contexts> <SIF_Context>SIF_Default</SIF_Context> </SIF_Contexts> </SIF_Object> </SIF_PublishDeleteAccess> <SIF_RequestAccess> <SIF_Object ObjectName="WorkforcePersonal"> <SIF_Contexts> <SIF_Context>SIF_Default</SIF_Context> </SIF_Contexts> </SIF_Object> </SIF_RequestAccess> <SIF_RespondAccess> <SIF_Object ObjectName="LearnerPersonal"> <SIF_Contexts> <SIF_Context>SIF_Default</SIF_Context> </SIF_Contexts> </SIF_Object> </SIF_RespondAccess> </SIF_AgentACL>
Example 5.3.2-2: SIF_AgentACL