3.4.5.1.1 Receiving an XATMUSER_MTAG_RMOPEN Message
When the XA Resource Manager Bridge Facet receives an XATMUSER_MTAG_RMOPEN message (section 2.2.3.2.5), it MUST perform the following actions:
If the State field of the receiving Connection is set to Idle:
Set the State field of the receiving Connection to Processing Open Request (section 3.4.1.1.2).
Otherwise:
The message MUST be processed as an invalid message as specified in section 3.1.6 and processing of this message halted.
Test if all of the following conditions are satisfied:
If all the conditions are met:
Attempt to find an XA Resource Manager object in the XA Resource Manager Table that meets the following conditions:
The Data Source Name field is set to the value of the DSN field of the message.
If an XA Resource Manager object is found:
If the State field of the found XA Resource Manager object is set to Recovering:
Set the XA Resource Manager object referenced by the receiving connection to the located XA Resource Manager object.
Increment the Call Count field of the XA Resource Manager object.
Add the receiving connection to the Pending Open Connections Table referenced by the located XA Resource Manager object.
Set the state of the receiving connection to Active.
Otherwise, if the State field of XA Resource Manager object is set to Active:
If the Call Count field of the XA Resource Manager object is greater than 0:
Increment the Call Count field of the XA Resource Manager object.
Set the State field of the Connection to Active.
Add the receiving connection to Request Connections Table referenced by the found XA Resource Manager object.
Set the XA Resource Manager object of the receiving connection to the located XA Resource Manager object.
Send an XATMUSER_MTAG_RMOPENOK message (section 2.2.3.2.6) on the receiving connection with the following settings:
localRmId is set to the XA Resource Manager Identifier field of the located XA Resource Manager object.
guidRm is set to the Resource Manager Global Identifier field of the located XA Resource Manager object.
Otherwise:
Send an XATMUSER_MTAG_RMNONEXISTENT message (section 2.2.3.2.1) on the receiving connection.
Set the connection state to Ended.
Otherwise:
Send an XATMUSER_MTAG_E_RMNOTAVAILABLE message (section 2.2.3.2.2) on the receiving connection.
Set the connection state to Ended.
Otherwise:
Attempt to load XA Switch for XA Resource Manager using the XaDllFileName field of the message:
If successful:
Attempt to create a new XA Resource Manager object with the following values:
The Resource Manager Global Identifier field is set to newly created GUID.
The XA Resource Manager Identifier field is set to the value of the incremented XA Resource Manager Identifier Index.
The Data Source Name field is set to the DSN field of the message.
The State field is set to Idle.
The XA Switch set to loaded XA Switch.
The Recovery Interval field SHOULD be set to XaTmMinWarmRecoveryInterval.<46>
The Single Pipe field set to FALSE.
The Call Count field is set to 1.
The XA DLL Name field is set to the XaDllFileName field of the message.
If successful:
Set the XA Resource Manager of the receiving connection to the created XA Resource Manager object.
Call xa_open function on the XA Switch referenced by the new XA Resource Manager object with the following arguments:
Data Source Name of the created XA Resource Manager object.
XA Resource Manager Identifier of the created XA Resource Manager object.
TMNOFLAGS.
If the outcome is set to XA_OK:
Write the created XA Resource Manager object to the XA Resource Manager Durable Log.
Add the created XA Resource Manager object to the XA Resource Manager Table referenced by the XA Resource Manager Bridge Facet.
Set the State field of the XA Resource Manager object to Active.
Add receiving connection to Request Connections Table referenced by the XA Resource Manager object.
Set the State of Connection to Active.
Send an XATMUSER_MTAG_RMOPENOK message on the receiving connection with the following arguments:
The XA Resource Manager Identifier field of the created XA Resource Manager.
The Resource Manager Global Identifier field of the created XA Resource Manager.
Otherwise if outcome is set to XAER_PROTO:
Set the State field of the created XA Resource Manager object to Ended.
Send an XATMUSER_MTAG_E_RMPROTOCOL message (section 2.2.3.2.4) on the receiving connection.
Set the connection state to Ended.
Otherwise:<47>
Set the State field of the created XA Resource Manager object to Ended.
Send an XATMUSER_MTAG_E_RMOPENFAILED message (section 2.2.3.2.3) on the receiving connection.
Set connection state to Ended.
Otherwise:
Send an XATMUSER_MTAG_E_RMOPENFAILED message using the receiving connection.
Set connection state to Ended.
Otherwise:
Send an XATMUSER_MTAG_E_RMOPENFAILED message using the receiving connection.
Set connection state to Ended.
Otherwise:
XA Resource Manager Bridge Facet MAY:<48>
Send an XATMUSER_MTAG_E_RMOPENFAILED message (section 2.2.3.2.3) using the receiving connection.
Set the connection state to Ended.