Compare Revisions

The credentials to download the source code are:
 Username: svnusers
 Password: svnusers

Ignore whitespace Rev 635 → Rev 634

/branches/v3/xsd/PSTN.xsd
0,0 → 1,418
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://uri.etsi.org/ngn/params/xml/simservs/pstn" xmlns:ns1="http://uri.etsi.org/ngn/params/xml/simservs/pstn"
targetNamespace="http://uri.etsi.org/ngn/params/xml/simservs/pstn"
elementFormDefault="qualified">
<xs:annotation>
<xs:documentation>XML Schema definition for mappingof some PSTN
into
SIP MIME Bodies
</xs:documentation>
</xs:annotation>
<!--Definition of simple types -->
<xs:simpleType name="OneBitType">
<xs:restriction base="xs:string">
<xs:pattern value="[0-1]" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TwoBitType">
<xs:restriction base="xs:string">
<xs:pattern value="[0-1][0-1]" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="ThreeBitType">
<xs:restriction base="xs:string">
<xs:pattern value="[0-1][0-1][0-1]" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="FourBitType">
<xs:restriction base="xs:string">
<xs:pattern value="[0-1][0-1][0-1][0-1]" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="FiveBitType">
<xs:restriction base="xs:string">
<xs:pattern value="[0-1][0-1][0-1][0-1][0-1]" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="SixBitType">
<xs:restriction base="xs:string">
<xs:pattern value="[0-1][0-1][0-1][0-1][0-1][0-1]" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="SevenBitType">
<xs:restriction base="xs:string">
<xs:pattern value="[0-1][0-1][0-1][0-1][0-1][0-1][0-1]" />
</xs:restriction>
</xs:simpleType>
<!--Definition of complex types -->
<!--Definition of BearerCapability Octets -->
<xs:complexType name="BCOctet3Type">
<xs:sequence>
<xs:element name="CodingStandard" type="TwoBitType" />
<xs:element name="InformationTransferCabability"
type="FiveBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="BCOctet4Type">
<xs:sequence>
<xs:element name="TransferMode" type="TwoBitType" />
<xs:element name="InformationTransferRate" type="FiveBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="BCOctet4-1Type">
<xs:sequence>
<xs:element name="RateMultiplier" type="SevenBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="BCOctet5Type">
<xs:sequence>
<xs:element name="Layer1Identification" type="TwoBitType" />
<xs:element name="UserInfoLayer1Protocol" type="FiveBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="BCOctet5aType">
<xs:sequence>
<xs:element name="SynchronousAsynchronous" type="OneBitType" />
<xs:element name="Negotiation" type="OneBitType" />
<xs:element name="UserRate" type="FiveBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="BCOctet5bV110Type">
<xs:sequence>
<xs:element name="IntermediateRate" type="TwoBitType" />
<xs:element name="NIConTX" type="OneBitType" />
<xs:element name="NIConRX" type="OneBitType" />
<xs:element name="FlowControlOnTX" type="OneBitType" />
<xs:element name="FlowControlOnRX" type="OneBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="BCOctet5bV120Type">
<xs:sequence>
<xs:element name="RateAdaptionHeader" type="OneBitType" />
<xs:element name="MultipleFrameEstablishmentSupport"
type="OneBitType" />
<xs:element name="ModeOfOperation" type="OneBitType" />
<xs:element name="LogicalLinkIdentifier" type="OneBitType" />
<xs:element name="Assignor" type="OneBitType" />
<xs:element name="InbandOutbandNegotiation" type="OneBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="BCOctet5cType">
<xs:sequence>
<xs:element name="NumberOfStopBits" type="TwoBitType" />
<xs:element name="NumberOfDataBits" type="TwoBitType" />
<xs:element name="Parity" type="ThreeBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="BCOctet5dType">
<xs:sequence>
<xs:element name="DuplexMode" type="OneBitType" />
<xs:element name="ModemType" type="SixBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="BCOctet6Type">
<xs:sequence>
<xs:element name="Layer2Identification" type="TwoBitType" />
<xs:element name="UserInfoLayer2Protocol" type="FiveBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="BCOctet7Type">
<xs:sequence>
<xs:element name="Layer3Identification" type="TwoBitType" />
<xs:element name="UserInfoLayer3Protocol" type="FiveBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="BCOctet7aType">
<xs:sequence>
<xs:element name="AdditionalLayer3Info" type="FourBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="BCOctet7bType">
<xs:sequence>
<xs:element name="AdditionalLayer3Info" type="FourBitType" />
</xs:sequence>
</xs:complexType>
<!--Definition of High Layer Compatibility Octets -->
<xs:complexType name="HLOctet3Type">
<xs:sequence>
<xs:element name="CodingStandard" type="TwoBitType" />
<xs:element name="Interpretation" type="ThreeBitType" />
<xs:element name="PresentationMethod" type="TwoBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="HLOctet4Type">
<xs:sequence>
<xs:element name="HighLayerCharacteristics" type="SevenBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="HLOctet4aMaintenanceType">
<xs:sequence>
<xs:element name="HighLayerCharacteristics" type="SevenBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="HLOctet4aAudioType">
<xs:sequence>
<xs:element name="VideoTelephonyCharacteristics"
type="SevenBitType" />
</xs:sequence>
</xs:complexType>
<!--Definition of Low Layer Compatibility Octets -->
<xs:complexType name="LLOctet3Type">
<xs:sequence>
<xs:element name="CodingStandard" type="TwoBitType" />
<xs:element name="InformationTransferCapability"
type="FiveBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet3aType">
<xs:sequence>
<xs:element name="NegotiationIndicator" type="OneBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet4Type">
<xs:sequence>
<xs:element name="TransferMode" type="TwoBitType" />
<xs:element name="InformationTransferRate" type="FiveBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet4-1Type">
<xs:sequence>
<xs:element name="RateMultiplier" type="SevenBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet5Type">
<xs:sequence>
<xs:element name="Layer1Identification" type="TwoBitType" />
<xs:element name="UserInfoLayer1Protocol" type="FiveBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet5aType">
<xs:sequence>
<xs:element name="SynchronousAsynchronous" type="OneBitType" />
<xs:element name="Negotiation" type="OneBitType" />
<xs:element name="UserRate" type="FiveBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet5bV110Type">
<xs:sequence>
<xs:element name="IntermediateRate" type="TwoBitType" />
<xs:element name="NIConTX" type="OneBitType" />
<xs:element name="NIConRX" type="OneBitType" />
<xs:element name="FlowControlOnTX" type="OneBitType" />
<xs:element name="FlowControlOnRX" type="OneBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet5bV120Type">
<xs:sequence>
<xs:element name="RateAdaptionHeader" type="OneBitType" />
<xs:element name="MultipleFrameEstablishmentSupport"
type="OneBitType" />
<xs:element name="ModeOfOperation" type="OneBitType" />
<xs:element name="LogicalLinkIdentifier" type="OneBitType" />
<xs:element name="Assignor" type="OneBitType" />
<xs:element name="InbandOutbandNegotiation" type="OneBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet5cType">
<xs:sequence>
<xs:element name="NumberOfStopBits" type="TwoBitType" />
<xs:element name="NumberOfDataBits" type="TwoBitType" />
<xs:element name="Parity" type="ThreeBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet5dType">
<xs:sequence>
<xs:element name="DuplexMode" type="OneBitType" />
<xs:element name="ModemType" type="SixBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet6Type">
<xs:sequence>
<xs:element name="Layer2Identification" type="TwoBitType" />
<xs:element name="UserInfoLayer2Protocol" type="FiveBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet6aHDLCType">
<xs:sequence>
<xs:element name="Mode" type="TwoBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet6aUserSpecificType">
<xs:sequence>
<xs:element name="UserSpecificLayer2Information"
type="SevenBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet6bType">
<xs:sequence>
<xs:element name="WindowSize" type="SevenBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet7Type">
<xs:sequence>
<xs:element name="Layer3Identification" type="TwoBitType" />
<xs:element name="UserInfoLayer3Protocol" type="FiveBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet7aUserSpecificType">
<xs:sequence>
<xs:element name="OptionalLayer3Information"
type="SevenBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet7aX25Type">
<xs:sequence>
<xs:element name="Mode" type="TwoBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet7bX25Type">
<xs:sequence>
<xs:element name="DefaultPacketSize" type="FourBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet7cType">
<xs:sequence>
<xs:element name="PacketWindowSize" type="SevenBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet7aTR9577Type">
<xs:sequence>
<xs:element name="AdditionalLayer3Info" type="FourBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LLOctet7bTR9577Type">
<xs:sequence>
<xs:element name="AdditionalLayer3Info" type="FourBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="DispOctet3Type">
<xs:sequence>
<xs:element name="DisplayInformation" type="SevenBitType" />
</xs:sequence>
</xs:complexType>
<!--Definition of the information elements -->
<xs:complexType name="BearerCapabilityType">
<xs:sequence>
<xs:element name="BCoctet3" type="BCOctet3Type" />
<xs:element name="BCoctet4" type="BCOctet4Type" />
<xs:element name="BCoctet4-1" type="BCOctet4-1Type"
minOccurs="0" />
<xs:element name="BCoctet5" type="BCOctet5Type"
minOccurs="0" />
<xs:element name="BCoctet5a" type="BCOctet5aType"
minOccurs="0" />
<xs:element name="BCoctet5bV110" type="BCOctet5bV110Type"
minOccurs="0" />
<xs:element name="BCoctet5bV120" type="BCOctet5bV120Type"
minOccurs="0" />
<xs:element name="BCoctet5c" type="BCOctet5cType"
minOccurs="0" />
<xs:element name="BCoctet5d" type="BCOctet5dType"
minOccurs="0" />
<xs:element name="BCoctet6" type="BCOctet6Type"
minOccurs="0" />
<xs:element name="BCoctet7" type="BCOctet7Type"
minOccurs="0" />
<xs:element name="BCoctet7a" type="BCOctet7aType"
minOccurs="0" />
<xs:element name="BCoctet7b" type="BCOctet7bType"
minOccurs="0" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="HighLayerCompatibilityType">
<xs:sequence>
<xs:element name="HLOctet3" type="HLOctet3Type" />
<xs:element name="HLOctet4" type="HLOctet4Type" />
<xs:element name="HLOctet4aMaintenance" type="HLOctet4aMaintenanceType"
minOccurs="0" />
<xs:element name="HLOctet4Audio" type="HLOctet4aAudioType"
minOccurs="0" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="LowLayerCompatibilityType">
<xs:sequence>
<xs:element name="LLOctet3" type="LLOctet3Type" />
<xs:element name="LLOctet3a" type="LLOctet3aType"
minOccurs="0" />
<xs:element name="LLOctet4" type="LLOctet4Type" />
<xs:element name="LLOctet4-1" type="LLOctet4-1Type"
minOccurs="0" />
<xs:element name="LLOctet5" type="LLOctet5Type"
minOccurs="0" />
<xs:element name="LLOctet5a" type="LLOctet5aType"
minOccurs="0" />
<xs:element name="LLOctet5bV110" type="LLOctet5bV110Type"
minOccurs="0" />
<xs:element name="LLOctet5bV120" type="LLOctet5bV120Type"
minOccurs="0" />
<xs:element name="LLOctet5c" type="LLOctet5cType"
minOccurs="0" />
<xs:element name="LLOctet5d" type="LLOctet5dType"
minOccurs="0" />
<xs:element name="LLOctet6" type="LLOctet6Type"
minOccurs="0" />
<xs:element name="LLOctet6aHDLC" type="LLOctet6aHDLCType"
minOccurs="0" />
<xs:element name="LLOctet6aUserSpecific" type="LLOctet6aUserSpecificType"
minOccurs="0" />
<xs:element name="LLOctet6b" type="LLOctet6bType"
minOccurs="0" />
<xs:element name="LLOctet7" type="LLOctet7Type" />
<xs:element name="LLOctet7aUserSpecific" type="LLOctet7aUserSpecificType"
minOccurs="0" />
<xs:element name="LLOctet7aX25" type="LLOctet7aX25Type"
minOccurs="0" />
<xs:element name="LLOctet7bX25" type="LLOctet7bX25Type"
minOccurs="0" />
<xs:element name="LLOctet7c" type="LLOctet7cType"
minOccurs="0" />
<xs:element name="LLOctet7aTR9577" type="LLOctet7aTR9577Type"
minOccurs="0" />
<xs:element name="LLOctet7bTR9577" type="LLOctet7bTR9577Type"
minOccurs="0" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="DisplayType">
<xs:sequence>
<xs:element name="DispOctet3" type="DispOctet3Type" />
</xs:sequence>
</xs:complexType>
<!--Definition of progress indicator -->
<xs:complexType name="ProgressOctet3Type">
<xs:sequence>
<xs:element name="CodingStandard" type="TwoBitType" />
<xs:element name="Location" type="FourBitType" />
</xs:sequence>
<!--ETSI ETSI TS 124 503 V8.15.0 (2013-07) 323 Release 7 -->
</xs:complexType>
<xs:complexType name="ProgressOctet4Type">
<xs:sequence>
<xs:element name="ProgressDescription" type="SevenBitType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="ProgressIndicatorType">
<xs:sequence>
<xs:element name="ProgressOctet3" type="ProgressOctet3Type" />
<xs:element name="ProgressOctet4" type="ProgressOctet4Type" />
</xs:sequence>
</xs:complexType>
<!--Definition of document structure -->
<xs:element name="PSTN-transit">
<xs:complexType>
<xs:sequence>
<xs:element name="BearerInfomationElement"
type="BearerCapabilityType" maxOccurs="2" />
<xs:element name="HighLayerCompatibility"
type="HighLayerCompatibilityType" minOccurs="0"
maxOccurs="2" />
<xs:element name="LowLayerCompatibility"
type="LowLayerCompatibilityType" minOccurs="0" />
<xs:element name="ProgressIndicator" type="ProgressIndicatorType"
minOccurs="0" maxOccurs="unbounded" />
<xs:element name="Display" type="DisplayType"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Property changes:
Added: svn:keywords
## -0,0 +1 ##
+LastChangedDate
\ No newline at end of property
Index: v3/xsd/ACR_CB.xsd
===================================================================
--- v3/xsd/ACR_CB.xsd (nonexistent)
+++ v3/xsd/ACR_CB.xsd (revision 634)
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ xmlns:ss="http://uri.etsi.org/ngn/params/xml/simservs/xcap"
+ xmlns:cp="urn:ietf:params:xml:ns:common-policy" xmlns:ocp="urn:oma:xml:xdm:common-policy"
+ targetNamespace="http://uri.etsi.org/ngn/params/xml/simservs/xcap"
+ elementFormDefault="qualified" attributeFormDefault="unqualified">
+ <!-- import common policy definitions -->
+ <xs:import namespace="urn:ietf:params:xml:ns:common-policy"
+ schemaLocation="common-policy.xsd" />
+ <!-- import OMA common policy extensions -->
+ <xs:import namespace="urn:oma:xml:xdm:common-policy"
+ schemaLocation="xdm_commonPolicy-v1_0.xsd" />
+ <!-- incoming communication barring rule set based on the common policy
+ rule set. -->
+ <xs:element name="incoming-communication-barring"
+ substitutionGroup="ss:absService">
+ <xs:annotation>
+ <xs:documentation>This is the incoming communication barring
+ configuration document.
+ </xs:documentation>
+ </xs:annotation>
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="ss:simservType">
+ <xs:sequence>
+ <!-- add service specific elements here -->
+ <xs:element ref="cp:ruleset"
+ minOccurs="0" />
+ </xs:sequence>
+ </xs:extension>
+ <!-- service specific attributes can be defined here -->
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <!-- outgoing communication barring rule set based on the common policy
+ rule set. -->
+ <xs:element name="outgoing-communication-barring"
+ substitutionGroup="ss:absService">
+ <xs:annotation>
+ <xs:documentation>This is the outgoing communication barring
+ configuration
+ document.
+ </xs:documentation>
+ </xs:annotation>
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="ss:simservType">
+ <xs:sequence>
+ <!-- add service specific elements here -->
+ <xs:element ref="cp:ruleset"
+ minOccurs="0" />
+ </xs:sequence>
+ </xs:extension>
+ <!-- service specific attributes can be defined here -->
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <!-- communication barring specific extensions to IETF common policy
+ actions -->
+ <xs:element name="allow" type="ss:allow-action-type" />
+ <!-- communication barring specific type declarations -->
+ <!-- <xs:simpleType name="allow-action-type" final="list restriction"> -->
+ <xs:simpleType name="allow-action-type">
+ <xs:restriction base="xs:boolean" />
+ </xs:simpleType>
+</xs:schema>
\ No newline at end of file
/v3/xsd/ACR_CB.xsd
Property changes:
Added: svn:keywords
## -0,0 +1 ##
+LastChangedDate
\ No newline at end of property
Index: v3/xsd/CDIV.xsd
===================================================================
--- v3/xsd/CDIV.xsd (nonexistent)
+++ v3/xsd/CDIV.xsd (revision 634)
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ xmlns:ss="http://uri.etsi.org/ngn/params/xml/simservs/xcap"
+ xmlns:cp="urn:ietf:params:xml:ns:common-policy" xmlns:ocp="urn:oma:xml:xdm:common-policy"
+ targetNamespace="http://uri.etsi.org/ngn/params/xml/simservs/xcap"
+ elementFormDefault="qualified" attributeFormDefault="unqualified">
+ <!-- import common policy definitions -->
+ <xs:import namespace="urn:ietf:params:xml:ns:common-policy"
+ schemaLocation="common-policy.xsd" />
+ <!-- import OMA common policy extensions -->
+ <xs:import namespace="urn:oma:xml:xdm:common-policy"
+ schemaLocation="xdm_commonPolicy-v1_0.xsd" />
+ <!-- communication diversion specific extensions to IETF common policy
+ conditions. The cp:conditionsType is expanded with the elements: ss:not-registered,
+ ss:busy, ss:no-answer, ss:notreachable, ss:media as optional elements -->
+ <!-- communication diversion rule set based on the common policy rule
+ set. -->
+ <xs:element name="communication-diversion"
+ substitutionGroup="ss:absService">
+ <xs:annotation>
+ <xs:documentation>This is the communication diversion
+ configuration
+ document.
+ </xs:documentation>
+ </xs:annotation>
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="ss:simservType">
+ <xs:sequence>
+ <!-- add service specific elements here -->
+ <xs:element ref="cp:ruleset"
+ minOccurs="0" />
+ </xs:sequence>
+ </xs:extension>
+ <!-- service specific attributes can be defined here -->
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <!-- communication diversion specific extensions to IETF common policy
+ actions -->
+ <xs:element name="forward-to" type="ss:forward-to-type" />
+ <xs:simpleType name="reveal-URIoptions-type">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="false" />
+ <xs:enumeration value="not-reveal-GRUU" />
+ <xs:enumeration value="true" />
+ </xs:restriction>
+ </xs:simpleType>
+ <!-- communication diversion specific type declarations -->
+ <xs:complexType name="forward-to-type">
+ <xs:sequence>
+ <xs:element name="target" type="xs:anyURI"
+ minOccurs="1" maxOccurs="1" />
+ <xs:element name="notify-caller" type="xs:boolean"
+ default="true" minOccurs="0" />
+ <xs:element name="reveal-identity-to-caller"
+ type="ss:reveal-URIoptions-type" default="true"
+ minOccurs="0" />
+ <xs:element name="reveal-served-user-identity-to-caller"
+ type="ss:reveal-URIoptions-type" default="true"
+ minOccurs="0" />
+ <xs:element name="notify-served-user" type="xs:boolean"
+ default="false" minOccurs="0" />
+ <xs:element name="notify-served-user-on-outbound-call"
+ type="xs:boolean" default="false" minOccurs="0" />
+ <xs:element name="reveal-identity-to-target"
+ type="ss:reveal-URIoptions-type" default="true"
+ minOccurs="0" />
+ <xs:element ref="ss:NoReplyTimer" minOccurs="0" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="NoReplyTimer">
+ <xs:simpleType>
+ <xs:restriction base="xs:positiveInteger">
+ <xs:minInclusive value="5" />
+ <xs:maxInclusive value="180" />
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+</xs:schema>
\ No newline at end of file
/v3/xsd/CDIV.xsd
Property changes:
Added: svn:keywords
## -0,0 +1 ##
+LastChangedDate
\ No newline at end of property
Index: v3/xsd/CDIVN.xsd
===================================================================
--- v3/xsd/CDIVN.xsd (nonexistent)
+++ v3/xsd/CDIVN.xsd (revision 634)
@@ -0,0 +1,226 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<xs:schema targetNamespace="http://uri.etsi.org/ngn/params/xml/comm-div-info"
+ xmlns:tns="http://uri.etsi.org/ngn/params/xml/comm-div-info"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://uri.etsi.org/ngn/params/xml/comm-div-info"
+ elementFormDefault="qualified" attributeFormDefault="unqualified">
+ <!-- This import brings in the XML language definition -->
+ <xs:import namespace="http://www.w3.org/XML/1998/namespace"
+ schemaLocation="xml.xsd" />
+ <!-- Communication Diversion Information. This is the top-level XML element -->
+ <xs:element name="comm-div-info" type="comm-div-info-type" />
+ <!-- Communication Diversion Information Type. This is the top-level
+ XML element -->
+ <xs:complexType name="comm-div-info-type">
+ <xs:sequence>
+ <xs:element name="comm-div-subs-info" type="comm-div-subs-info-type"
+ minOccurs="0" />
+ <xs:element name="comm-div-ntfy-info" type="comm-div-ntfy-info-type"
+ minOccurs="0" />
+ <xs:any namespace="##other" processContents="lax"
+ minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ <xs:attribute name="entity" type="xs:anyURI" use="required" />
+ </xs:complexType>
+ <!--- Communication Diversion Subscription Type. Used at Subscription
+ time to select Communication Diversions for notification, when to notify
+ them and what to notify. -->
+ <xs:complexType name="comm-div-subs-info-type">
+ <xs:sequence>
+ <xs:element name="comm-div-selection-criteria"
+ type="comm-div-selection-criteria-type" minOccurs="0" />
+ <xs:element name="comm-div-ntfy-trigger-criteria"
+ type="comm-div-ntfy-trigger-criteria-type" minOccurs="0" />
+ <xs:element name="comm-div-info-selection-criteria"
+ type="comm-div-info-selection-criteria-type" minOccurs="0" />
+ <xs:any namespace="##other" processContents="lax"
+ minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ <xs:anyAttribute namespace="##other"
+ processContents="lax" />
+ </xs:complexType>
+ <!--- Communication Diversion Notification Information Type Used while
+ notifying the User about the Communication Diversion -->
+ <xs:complexType name="comm-div-ntfy-info-type">
+ <xs:sequence>
+ <xs:element name="originating-user-info" type="user-info-type"
+ minOccurs="0" />
+ <xs:element name="diverting-user-info" type="xs:anyURI"
+ minOccurs="0" />
+ <xs:element name="diverted-to-user-info" type="xs:anyURI"
+ minOccurs="0" />
+ <xs:element name="diversion-time-info" type="xs:dateTime"
+ minOccurs="0" />
+ <xs:element name="diversion-reason-info" type="diversion-reason-info-type"
+ minOccurs="0" />
+ <xs:element name="diversion-rule-info" type="diversion-rule-info-type"
+ minOccurs="0" />
+ <xs:any namespace="##other" processContents="lax"
+ minOccurs="0" maxOccurs="unbounded" />
+ <xs:element name="previous-cdivn-state" type="cdivn-states-types"
+ minOccurs="0" maxOccurs="1" />
+ </xs:sequence>
+ <xs:anyAttribute namespace="##other"
+ processContents="lax" />
+ </xs:complexType>
+ <!-- COMMUNICATION DIVERSION SELECTION CRITERIA -->
+ <xs:complexType name="comm-div-selection-criteria-type">
+ <xs:sequence>
+ <xs:element name="originating-user-selection-criteria"
+ type="user-selection-criteria-type" minOccurs="0" />
+ <xs:element name="diverting-user-selection-criteria"
+ type="xs:anyURI" minOccurs="0" />
+ <xs:element name="diverted-to-user-selection-criteria"
+ type="xs:anyURI" minOccurs="0" />
+ <xs:element name="diversion-time-selection-criteria"
+ type="time-range-selection-criteria-type" minOccurs="0" />
+ <xs:element name="diversion-reason-selection-criteria"
+ type="diversion-reason-selection-criteria-type"
+ minOccurs="0" />
+ <xs:any namespace="##other" processContents="lax"
+ minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ <xs:anyAttribute namespace="##other"
+ processContents="lax" />
+ </xs:complexType>
+ <!-- COMMUNICATION DIVERSION NOTIFICATION TRIGGER CRITERIA -->
+ <xs:complexType name="comm-div-ntfy-trigger-criteria-type">
+ <xs:sequence>
+ <xs:element name="notification-time-selection-criteria"
+ type="time-range-selection-criteria-type" minOccurs="0" />
+ <xs:element name="presence-status-selection-criteria"
+ type="presence-status-selection-criteria-type"
+ minOccurs="0" />
+ <xs:element name="notification-buffer-interval"
+ minOccurs="0" default="86400">
+ <xs:simpleType>
+ <xs:restriction base="xs:integer">
+ <xs:maxInclusive value="86400" />
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:any namespace="##other" processContents="lax"
+ minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ <xs:anyAttribute namespace="##other"
+ processContents="lax" />
+ </xs:complexType>
+ <!-- COMMUNICATION DIVERSION INFORMATION SELECTION CRITERIA -->
+ <xs:complexType name="comm-div-info-selection-criteria-type">
+ <xs:sequence>
+ <xs:element name="disable-originating-user-info"
+ type="xs:boolean" default="false" minOccurs="0" />
+ <xs:element name="disable-diverting-user-info"
+ type="xs:boolean" default="false" minOccurs="0" />
+ <xs:element name="disable-diverted-to-user-info"
+ type="xs:boolean" default="false" minOccurs="0" />
+ <xs:element name="disable-diversion-time-info"
+ type="xs:boolean" default="false" minOccurs="0" />
+ <xs:element name="disable-diversion-reason-info"
+ type="xs:boolean" default="false" minOccurs="0" />
+ <xs:element name="disable-diversion-rule-info"
+ type="xs:boolean" default="false" minOccurs="0" />
+ <xs:any namespace="##other" processContents="lax"
+ minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ <xs:anyAttribute namespace="##other"
+ processContents="lax" />
+ </xs:complexType>
+
+ <!-- User Info Type -->
+ <xs:complexType name="user-info-type">
+ <xs:sequence>
+ <xs:element name="user-name" type="xs:string"
+ minOccurs="0" maxOccurs="1" />
+ <xs:element name="user-URI" type="xs:anyURI" />
+ </xs:sequence>
+ <xs:anyAttribute namespace="##other"
+ processContents="lax" />
+ </xs:complexType>
+ <!-- CDIVN FSM STATES -->
+ <xs:simpleType name="cdivn-states-types">
+ <xs:list itemType="cdivn-states-type" />
+ </xs:simpleType>
+ <xs:simpleType name="cdivn-states-type">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="IDLE" />
+ <xs:enumeration value="DIVERSION_NOTIFIED" />
+ <xs:enumeration value="DIVERSION_NOT_NOTIFIED" />
+ </xs:restriction>
+ </xs:simpleType>
+ <!-- DIVERSION REASON INFO -->
+
+ <xs:simpleType name="diversion-reason-info-types">
+ <xs:list itemType="diversion-reason-info-type" />
+ </xs:simpleType>
+ <xs:simpleType name="diversion-reason-info-type">
+ <xs:restriction base="xs:integer">
+ <xs:enumeration value="404" />
+ <xs:enumeration value="486" />
+ <xs:enumeration value="408" />
+ <xs:enumeration value="302" />
+ <xs:enumeration value="487" />
+ <xs:enumeration value="480" />
+ <xs:enumeration value="503" />
+ </xs:restriction>
+ </xs:simpleType>
+ <!-- DIVERSION RULE INFO -->
+ <xs:complexType name="diversion-rule-info-type">
+ <xs:sequence>
+ <xs:element name="diversion-rule" type="xs:string" />
+ </xs:sequence>
+ <xs:anyAttribute namespace="##other"
+ processContents="lax" />
+ </xs:complexType>
+ <!-- ORIGINATING USER SELECTION CRITERIA -->
+ <xs:complexType name="user-selection-criteria-type">
+ <xs:sequence>
+ <xs:element name="user-info" type="user-info-type"
+ minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ <xs:anyAttribute namespace="##other"
+ processContents="lax" />
+ </xs:complexType>
+ <!-- DIVERSION REASON SELECTION CRITERIA -->
+ <xs:complexType name="diversion-reason-selection-criteria-type">
+ <xs:sequence>
+ <xs:element name="diversion-reason-info" type="diversion-reason-info-types" />
+ </xs:sequence>
+ <xs:anyAttribute namespace="##other"
+ processContents="lax" />
+ </xs:complexType>
+ <!-- TIME RANGE SELECTION CRITERIA -->
+ <xs:complexType name="time-range-selection-criteria-type">
+ <xs:sequence>
+ <xs:element name="time-range" type="time-range-type"
+ minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ <xs:anyAttribute namespace="##other"
+ processContents="lax" />
+ </xs:complexType>
+ <!-- TIME RANGE INFO -->
+ <xs:complexType name="time-range-type">
+ <xs:sequence>
+ <xs:element name="start-time" type="xs:dateTime" />
+ <xs:element name="end-time" type="xs:dateTime" />
+ </xs:sequence>
+ <xs:anyAttribute namespace="##other"
+ processContents="lax" />
+ </xs:complexType>
+ <!-- PRESENCE STATUS SELECTION CRITERIA -->
+ <xs:complexType name="presence-status-selection-criteria-type">
+ <xs:sequence>
+ <xs:element name="presence-status-info" type="presence-status-info-type"
+ minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ <xs:anyAttribute namespace="##other"
+ processContents="lax" />
+ </xs:complexType>
+ <!-- PRESENCE STATUS INFo -->
+ <xs:complexType name="presence-status-info-type">
+ <xs:sequence>
+ <xs:element name="presence-status" type="xs:string" />
+ </xs:sequence>
+ <xs:anyAttribute namespace="##other"
+ processContents="lax" />
+ </xs:complexType>
+</xs:schema>
/v3/xsd/CDIVN.xsd
Property changes:
Added: svn:keywords
## -0,0 +1 ##
+LastChangedDate
\ No newline at end of property
Index: v3/xsd/CONF.xsd
===================================================================
--- v3/xsd/CONF.xsd (nonexistent)
+++ v3/xsd/CONF.xsd (revision 634)
@@ -0,0 +1,342 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<xs:schema targetNamespace="urn:ietf:params:xml:ns:conference-info"
+ xmlns:tns="urn:ietf:params:xml:ns:conference-info" xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ xmlns="urn:ietf:params:xml:ns:conference-info" elementFormDefault="qualified"
+ attributeFormDefault="unqualified">
+ <!-- This imports the xml:language definition -->
+ <xs:import namespace="http://www.w3.org/XML/1998/namespace"
+ schemaLocation="xml.xsd" />
+ <!-- CONFERENCE ELEMENT -->
+ <xs:element name="conference-info" type="conference-type" />
+ <!-- CONFERENCE TYPE -->
+ <xs:complexType name="conference-type">
+ <xs:sequence>
+ <xs:element name="conference-description" type="conference-description-type"
+ minOccurs="0" />
+ <xs:element name="host-info" type="host-type"
+ minOccurs="0" />
+ <xs:element name="conference-state" type="conference-state-type"
+ minOccurs="0" />
+ <xs:element name="users" type="users-type"
+ minOccurs="0" />
+ <xs:element name="sidebars-by-ref" type="uris-type"
+ minOccurs="0" />
+ <xs:element name="sidebars-by-val" type="sidebars-by-val-type"
+ minOccurs="0" />
+ <xs:any namespace="##other" processContents="lax"
+ minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ <xs:attribute name="entity" type="xs:anyURI" use="required" />
+ <xs:attribute name="state" type="state-type" use="optional"
+ default="full" />
+ <xs:attribute name="version" type="xs:unsignedInt"
+ use="optional" />
+ <xs:anyAttribute namespace="##other"
+ processContents="lax" />
+ </xs:complexType>
+ <!-- STATE TYPE -->
+ <xs:simpleType name="state-type">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="full" />
+ <xs:enumeration value="partial" />
+ <xs:enumeration value="deleted" />
+ </xs:restriction>
+ </xs:simpleType>
+ <!-- CONFERENCE DESCRIPTION TYPE -->
+ <xs:complexType name="conference-description-type">
+ <xs:sequence>
+ <xs:element name="display-text" type="xs:string"
+ minOccurs="0" />
+ <xs:element name="subject" type="xs:string"
+ minOccurs="0" />
+ <xs:element name="free-text" type="xs:string"
+ minOccurs="0" />
+ <xs:element name="keywords" type="keywords-type"
+ minOccurs="0" />
+ <xs:element name="conf-uris" type="uris-type"
+ minOccurs="0" />
+ <xs:element name="service-uris" type="uris-type"
+ minOccurs="0" />
+ <xs:element name="maximum-user-count" type="xs:unsignedInt"
+ minOccurs="0" />
+ <xs:element name="available-media" type="conference-media-type"
+ minOccurs="0" />
+ <xs:any namespace="##other" processContents="lax"
+ minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ <xs:anyAttribute namespace="##other"
+ processContents="lax" />
+ </xs:complexType>
+ <!-- HOST TYPE -->
+ <xs:complexType name="host-type">
+ <xs:sequence>
+ <xs:element name="display-text" type="xs:string"
+ minOccurs="0" />
+ <xs:element name="web-page" type="xs:anyURI"
+ minOccurs="0" />
+ <xs:element name="uris" type="uris-type"
+ minOccurs="0" />
+ <xs:any namespace="##other" processContents="lax"
+ minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ <xs:anyAttribute namespace="##other"
+ processContents="lax" />
+ </xs:complexType>
+ <!-- CONFERENCE STATE TYPE -->
+ <xs:complexType name="conference-state-type">
+ <xs:sequence>
+ <xs:element name="user-count" type="xs:unsignedInt"
+ minOccurs="0" />
+ <xs:element name="active" type="xs:boolean"
+ minOccurs="0" />
+ <xs:element name="locked" type="xs:boolean"
+ minOccurs="0" />
+ <xs:any namespace="##other" processContents="lax"
+ minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ <xs:anyAttribute namespace="##other"
+ processContents="lax" />
+ </xs:complexType>
+ <!-- CONFERENCE MEDIA TYPE -->
+ <xs:complexType name="conference-media-type">
+ <xs:sequence>
+ <xs:element name="entry" type="conference-medium-type"
+ maxOccurs="unbounded" />
+ </xs:sequence>
+ <xs:anyAttribute namespace="##other"
+ processContents="lax" />
+ </xs:complexType>
+ <!-- CONFERENCE MEDIUM TYPE -->
+ <xs:complexType name="conference-medium-type">
+ <xs:sequence>
+ <xs:element name="display-text" type="xs:string"
+ minOccurs="0" />
+ <xs:element name="type" type="xs:string" />
+ <xs:element name="status" type="media-status-type"
+ minOccurs="0" />
+ <xs:any namespace="##other" processContents="lax"
+ minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ <xs:attribute name="label" type="xs:string" use="required" />
+ <xs:anyAttribute namespace="##other"
+ processContents="lax" />
+ </xs:complexType>
+ <!-- URIs TYPE -->
+ <xs:complexType name="uris-type">
+ <xs:sequence>
+ <xs:element name="entry" type="uri-type"
+ maxOccurs="unbounded" />
+ </xs:sequence>
+ <xs:attribute name="state" type="state-type" use="optional"
+ default="full" />
+ <xs:anyAttribute namespace="##other"
+ processContents="lax" />
+ </xs:complexType>
+ <!-- URI TYPE -->
+ <xs:complexType name="uri-type">
+ <xs:sequence>
+ <xs:element name="uri" type="xs:anyURI" />
+ <xs:element name="display-text" type="xs:string"
+ minOccurs="0" />
+ <xs:element name="purpose" type="xs:string"
+ minOccurs="0" />
+ <xs:element name="modified" type="execution-type"
+ minOccurs="0" />
+ <xs:any namespace="##other" processContents="lax"
+ minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ <xs:anyAttribute namespace="##other"
+ processContents="lax" />
+ </xs:complexType>
+ <!-- KEYWORDS TYPE -->
+ <xs:simpleType name="keywords-type">
+ <xs:list itemType="xs:string" />
+ </xs:simpleType>
+ <!-- USERS TYPE -->
+ <xs:complexType name="users-type">
+ <xs:sequence>
+ <xs:element name="user" type="user-type"
+ minOccurs="0" maxOccurs="unbounded" />
+ <xs:any namespace="##other" processContents="lax"
+ minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ <xs:attribute name="state" type="state-type" use="optional"
+ default="full" />
+ <xs:anyAttribute namespace="##other"
+ processContents="lax" />
+ </xs:complexType>
+ <!-- USER TYPE -->
+ <xs:complexType name="user-type">
+ <xs:sequence>
+ <xs:element name="display-text" type="xs:string"
+ minOccurs="0" />
+ <xs:element name="associated-aors" type="uris-type"
+ minOccurs="0" />
+ <xs:element name="roles" type="user-roles-type"
+ minOccurs="0" />
+ <xs:element name="languages" type="user-languages-type"
+ minOccurs="0" />
+ <xs:element name="cascaded-focus" type="xs:anyURI"
+ minOccurs="0" />
+ <xs:element name="endpoint" type="endpoint-type"
+ minOccurs="0" maxOccurs="unbounded" />
+ <xs:any namespace="##other" processContents="lax"
+ minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ <xs:attribute name="entity" type="xs:anyURI" />
+ <xs:attribute name="state" type="state-type" use="optional"
+ default="full" />
+ <xs:anyAttribute namespace="##other"
+ processContents="lax" />
+ </xs:complexType>
+ <!-- USER ROLES TYPE -->
+ <xs:complexType name="user-roles-type">
+ <xs:sequence>
+ <xs:element name="entry" type="xs:string"
+ maxOccurs="unbounded" />
+ </xs:sequence>
+ <xs:anyAttribute namespace="##other"
+ processContents="lax" />
+ </xs:complexType>
+ <!-- USER LANGUAGES TYPE -->
+ <xs:simpleType name="user-languages-type">
+ <xs:list itemType="xs:language" />
+ </xs:simpleType>
+ <!-- ENDPOINT TYPE -->
+ <xs:complexType name="endpoint-type">
+ <xs:sequence>
+ <xs:element name="display-text" type="xs:string"
+ minOccurs="0" />
+ <xs:element name="referred" type="execution-type"
+ minOccurs="0" />
+ <xs:element name="status" type="endpoint-status-type"
+ minOccurs="0" />
+ <xs:element name="joining-method" type="joining-type"
+ minOccurs="0" />
+ <xs:element name="joining-info" type="execution-type"
+ minOccurs="0" />
+ <xs:element name="disconnection-method" type="disconnection-type"
+ minOccurs="0" />
+ <xs:element name="disconnection-info" type="execution-type"
+ minOccurs="0" />
+ <xs:element name="media" type="media-type"
+ minOccurs="0" maxOccurs="unbounded" />
+ <xs:element name="call-info" type="call-type"
+ minOccurs="0" />
+ <xs:any namespace="##other" processContents="lax"
+ minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ <xs:attribute name="entity" type="xs:string" />
+ <xs:attribute name="state" type="state-type" use="optional"
+ default="full" />
+ <xs:anyAttribute namespace="##other"
+ processContents="lax" />
+ </xs:complexType>
+ <!-- ENDPOINT STATUS TYPE -->
+ <xs:simpleType name="endpoint-status-type">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="pending" />
+ <xs:enumeration value="dialing-out" />
+ <xs:enumeration value="dialing-in" />
+ <xs:enumeration value="alerting" />
+ <xs:enumeration value="on-hold" />
+ <xs:enumeration value="connected" />
+ <xs:enumeration value="muted-via-focus" />
+ <xs:enumeration value="disconnecting" />
+ <xs:enumeration value="disconnected" />
+ </xs:restriction>
+ </xs:simpleType>
+ <!-- JOINING TYPE -->
+ <xs:simpleType name="joining-type">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="dialed-in" />
+ <xs:enumeration value="dialed-out" />
+ <xs:enumeration value="focus-owner" />
+ </xs:restriction>
+ </xs:simpleType>
+ <!-- DISCONNECTION TYPE -->
+ <xs:simpleType name="disconnection-type">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="departed" />
+ <xs:enumeration value="booted" />
+ <xs:enumeration value="failed" />
+ <xs:enumeration value="busy" />
+ </xs:restriction>
+ </xs:simpleType>
+ <!-- EXECUTION TYPE -->
+ <xs:complexType name="execution-type">
+ <xs:sequence>
+ <xs:element name="when" type="xs:dateTime"
+ minOccurs="0" />
+ <xs:element name="reason" type="xs:string"
+ minOccurs="0" />
+ <xs:element name="by" type="xs:anyURI" minOccurs="0" />
+ </xs:sequence>
+ <xs:anyAttribute namespace="##other"
+ processContents="lax" />
+ </xs:complexType>
+ <!-- CALL TYPE -->
+ <xs:complexType name="call-type">
+ <xs:choice>
+ <xs:element name="sip" type="sip-dialog-id-type" />
+ <xs:any namespace="##other" processContents="lax"
+ minOccurs="0" maxOccurs="unbounded" />
+ </xs:choice>
+ <xs:anyAttribute namespace="##other"
+ processContents="lax" />
+ </xs:complexType>
+ <!-- SIP DIALOG ID TYPE -->
+ <xs:complexType name="sip-dialog-id-type">
+ <xs:sequence>
+ <xs:element name="display-text" type="xs:string"
+ minOccurs="0" />
+ <xs:element name="call-id" type="xs:string" />
+ <xs:element name="from-tag" type="xs:string" />
+ <xs:element name="to-tag" type="xs:string" />
+ <xs:any namespace="##other" processContents="lax"
+ minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ <xs:anyAttribute namespace="##other"
+ processContents="lax" />
+ </xs:complexType>
+ <!-- MEDIA TYPE -->
+ <xs:complexType name="media-type">
+ <xs:sequence>
+ <xs:element name="display-text" type="xs:string"
+ minOccurs="0" />
+ <xs:element name="type" type="xs:string"
+ minOccurs="0" />
+ <xs:element name="label" type="xs:string"
+ minOccurs="0" />
+ <xs:element name="src-id" type="xs:string"
+ minOccurs="0" />
+ <xs:element name="status" type="media-status-type"
+ minOccurs="0" />
+ <xs:any namespace="##other" processContents="lax"
+ minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ <xs:attribute name="id" type="xs:string" use="required" />
+ <xs:anyAttribute namespace="##other"
+ processContents="lax" />
+ </xs:complexType>
+ <!-- MEDIA STATUS TYPE -->
+ <xs:simpleType name="media-status-type">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="recvonly" />
+ <xs:enumeration value="sendonly" />
+ <xs:enumeration value="sendrecv" />
+ <xs:enumeration value="inactive" />
+ </xs:restriction>
+ </xs:simpleType>
+ <!-- SIDEBARS BY VAL TYPE -->
+ <xs:complexType name="sidebars-by-val-type">
+ <xs:sequence>
+ <xs:element name="entry" type="conference-type"
+ minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ <xs:attribute name="state" type="state-type" use="optional"
+ default="full" />
+ <xs:anyAttribute namespace="##other"
+ processContents="lax" />
+ </xs:complexType>
+</xs:schema>
/v3/xsd/CONF.xsd
Property changes:
Added: svn:keywords
## -0,0 +1 ##
+LastChangedDate
\ No newline at end of property
Index: v3/xsd/Ims3gpp.xsd
===================================================================
--- v3/xsd/Ims3gpp.xsd (nonexistent)
+++ v3/xsd/Ims3gpp.xsd (revision 634)
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified" attributeFormDefault="unqualified"
+ version="1">
+ <xs:complexType name="tIMS3GPP">
+ <xs:sequence>
+ <xs:choice>
+ <xs:element name="alternative-service" type="tAlternativeService" />
+ <xs:element name="service-info" type="xs:string" />
+ </xs:choice>
+ <xs:any namespace="##any" processContents="lax"
+ minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ <xs:attribute name="version" type="xs:decimal" use="required" />
+ <xs:anyAttribute />
+ </xs:complexType>
+ <xs:complexType name="tAlternativeService">
+ <xs:sequence>
+ <xs:element name="type" type="tType" />
+ <xs:element name="reason" type="xs:string" />
+ <xs:any namespace="##any" processContents="lax"
+ minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ <xs:anyAttribute />
+ </xs:complexType>
+ <xs:complexType name="tType">
+ <xs:sequence>
+ <xs:any namespace="##any" processContents="lax"
+ minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ <xs:anyAttribute />
+ </xs:complexType>
+ <xs:complexType name="tAction">
+ <xs:sequence>
+ <xs:any namespace="##any" processContents="lax"
+ minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ <xs:anyAttribute />
+ </xs:complexType>
+
+ <!-- root element -->
+ <xs:element name="ims-3gpp" type="tIMS3GPP" />
+
+ <!-- emergency element for //ims-3gpp//alternative-service//type -->
+ <xs:element name="emergency">
+ <xs:complexType />
+ </xs:element>
+
+ <!-- restoration element for //ims-3gpp//alternative-service//type -->
+ <xs:element name="restoration">
+ <xs:complexType />
+ </xs:element>
+
+ <!-- action element for //ims-3gpp//alternative-service -->
+ <xs:element name="action" type="tAction" />
+
+ <!-- emergency-registration element for //ims-3gpp//alternative-service//action -->
+ <xs:element name="emergency-registration">
+ <xs:complexType />
+ </xs:element>
+
+ <!-- initial-registration element for //ims-3gpp//alternative-service//action -->
+ <xs:element name="initial-registration">
+ <xs:complexType />
+ </xs:element>
+</xs:schema>
/v3/xsd/Ims3gpp.xsd
Property changes:
Added: svn:keywords
## -0,0 +1 ##
+LastChangedDate
\ No newline at end of property
Index: v3/xsd/MCID.xsd
===================================================================
--- v3/xsd/MCID.xsd (nonexistent)
+++ v3/xsd/MCID.xsd (revision 634)
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ xmlns="http://uri.etsi.org/ngn/params/xml/simservs/mcid"
+ targetNamespace="http://uri.etsi.org/ngn/params/xml/simservs/mcid"
+ elementFormDefault="qualified">
+ <xs:annotation>
+ <xs:documentation>XML Schema Definition to the mcid
+ request-response
+ to the Malicious Communication
+ Identification simulation service
+ </xs:documentation>
+ </xs:annotation>
+ <!--Definition of simple types -->
+ <xs:simpleType name="bitType">
+ <xs:restriction base="xs:string">
+ <xs:pattern value="[0-1]" />
+ </xs:restriction>
+ </xs:simpleType>
+ <!--Definition of complex types -->
+ <xs:complexType name="requestType">
+ <xs:sequence>
+ <xs:element name="McidRequestIndicator" type="bitType" />
+ <xs:element name="HoldingIndicator" type="bitType" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="responseType">
+ <xs:sequence>
+ <xs:element name="McidResponseIndicator" type="bitType" />
+ <xs:element name="HoldingProvidedIndicator" type="bitType" />
+ </xs:sequence>
+ </xs:complexType>
+ <!--Definition of document structure -->
+ <xs:element name="mcid">
+ <xs:complexType>
+ <xs:choice>
+ <xs:element name="request" type="requestType" />
+ <xs:element name="response" type="responseType" />
+ </xs:choice>
+ </xs:complexType>
+ </xs:element>
+</xs:schema>
\ No newline at end of file
/v3/xsd/MCID.xsd
Property changes:
Added: svn:keywords
## -0,0 +1 ##
+LastChangedDate
\ No newline at end of property
Index: v3/xsd/OIP-OIR.xsd
===================================================================
--- v3/xsd/OIP-OIR.xsd (nonexistent)
+++ v3/xsd/OIP-OIR.xsd (revision 634)
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:ss="http://uri.etsi.org/ngn/params/xml/simservs/xcap"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://uri.etsi.org/ngn/params/xml/simservs/xcap"
+ elementFormDefault="qualified" attributeFormDefault="unqualified">
+ <xs:element name="originating--identity--presentation--restriction"
+ substitutionGroup="ss:absService">
+ <xs:annotation>
+ <xs:documentation>Originating Identity presentation
+ Restriction
+ </xs:documentation>
+ </xs:annotation>
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="ss:simservType">
+ <xs:sequence>
+ <xs:element name="default--behaviour"
+ default="presentation--restricted"
+ minOccurs="0">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration
+ value="presentation--restricted" />
+ <xs:enumeration
+ value="presentation--not--restricted" />
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="originating--identity--presentation"
+ type="ss:simservType" substitutionGroup="ss:absService">
+ <xs:annotation>
+ <xs:documentation>Originating Identity Presentation
+ </xs:documentation>
+ </xs:annotation>
+ </xs:element>
+</xs:schema>
\ No newline at end of file
/v3/xsd/OIP-OIR.xsd
Property changes:
Added: svn:keywords
## -0,0 +1 ##
+LastChangedDate
\ No newline at end of property
Index: v3/xsd/ResourceList.xsd
===================================================================
--- v3/xsd/ResourceList.xsd (nonexistent)
+++ v3/xsd/ResourceList.xsd (revision 634)
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<xs:schema xmlns="urn:ietf:params:xml:ns:resource-lists"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified"
+ elementFormDefault="qualified" targetNamespace="urn:ietf:params:xml:ns:resource-lists">
+ <xs:import namespace="http://www.w3.org/XML/1998/namespace"
+ schemaLocation="xml.xsd" />
+ <xs:complexType name="listType">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="display-name"
+ type="display-nameType" />
+ <xs:sequence maxOccurs="unbounded" minOccurs="0">
+ <xs:choice>
+ <xs:element name="list">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="listType" />
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="external" type="externalType" />
+ <xs:element name="entry" type="entryType" />
+ <xs:element name="entry-ref" type="entry-refType" />
+ </xs:choice>
+ </xs:sequence>
+ <xs:any maxOccurs="unbounded" minOccurs="0"
+ namespace="##other" processContents="lax" />
+ </xs:sequence>
+ <xs:attribute name="name" type="xs:string" use="optional" />
+ <xs:anyAttribute namespace="##other"
+ processContents="lax" />
+ </xs:complexType>
+ <xs:complexType name="entryType">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="display-name">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="display-nameType" />
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:any maxOccurs="unbounded" minOccurs="0"
+ namespace="##other" processContents="lax" />
+ </xs:sequence>
+ <xs:attribute name="uri" type="xs:anyURI" use="required" />
+ <xs:anyAttribute namespace="##other"
+ processContents="lax" />
+ </xs:complexType>
+ <xs:complexType name="entry-refType">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="display-name"
+ type="display-nameType" />
+ <xs:any maxOccurs="unbounded" minOccurs="0"
+ namespace="##other" processContents="lax" />
+ </xs:sequence>
+ <xs:attribute name="ref" type="xs:anyURI" use="required" />
+ <xs:anyAttribute namespace="##other"
+ processContents="lax" />
+ </xs:complexType>
+ <xs:complexType name="externalType">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="display-name"
+ type="display-nameType" />
+ <xs:any maxOccurs="unbounded" minOccurs="0"
+ namespace="##other" processContents="lax" />
+ </xs:sequence>
+ <xs:attribute name="anchor" type="xs:anyURI" />
+ <xs:anyAttribute namespace="##other"
+ processContents="lax" />
+ </xs:complexType>
+ <xs:element name="resource-lists">
+ <xs:complexType>
+ <xs:sequence maxOccurs="unbounded" minOccurs="0">
+ <xs:element name="list" type="listType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:complexType name="display-nameType">
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute ref="xml:lang" />
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+</xs:schema>
/v3/xsd/ResourceList.xsd
Property changes:
Added: svn:keywords
## -0,0 +1 ##
+LastChangedDate
\ No newline at end of property
Index: v3/xsd/SupplementaryServices.xsd
===================================================================
--- v3/xsd/SupplementaryServices.xsd (nonexistent)
+++ v3/xsd/SupplementaryServices.xsd (revision 634)
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema targetNamespace="http://uri.etsi.org/ngn/params/xml/simservs/xcap"
+ xmlns:ss="http://uri.etsi.org/ngn/params/xml/simservs/xcap"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
+ attributeFormDefault="unqualified">
+
+ <xs:include schemaLocation="simservs.xsd" />
+ <xs:include schemaLocation="TIP-TIR.xsd" />
+ <xs:include schemaLocation="OIP-OIR.xsd" />
+ <xs:include schemaLocation="CDIV.xsd" />
+ <xs:include schemaLocation="ACR_CB.xsd" />
+ <xs:include schemaLocation="cug.xsd" />
+
+</xs:schema>
\ No newline at end of file
/v3/xsd/SupplementaryServices.xsd
Property changes:
Added: svn:keywords
## -0,0 +1 ##
+LastChangedDate
\ No newline at end of property
Index: v3/xsd/TIP-TIR.xsd
===================================================================
--- v3/xsd/TIP-TIR.xsd (nonexistent)
+++ v3/xsd/TIP-TIR.xsd (revision 634)
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:ss="http://uri.etsi.org/ngn/params/xml/simservs/xcap"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://uri.etsi.org/ngn/params/xml/simservs/xcap"
+ elementFormDefault="qualified" attributeFormDefault="unqualified">
+ <xs:element name="terminating-identity-presentation-restriction"
+ substitutionGroup="ss:absService">
+ <xs:annotation>
+ <xs:documentation>Terminating Identity presentation
+ Restriction
+ </xs:documentation>
+ </xs:annotation>
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="ss:simservType">
+ <xs:sequence>
+ <xs:element name="default-behaviour"
+ default="presentation-restricted" minOccurs="0">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration
+ value="presentation-restricted" />
+ <xs:enumeration
+ value="presentation-not-restricted" />
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="terminating-identity-presentation"
+ type="ss:simservType" substitutionGroup="ss:absService">
+ <xs:annotation>
+ <xs:documentation>Terminating Identity Presentation
+ </xs:documentation>
+ </xs:annotation>
+ </xs:element>
+</xs:schema>
\ No newline at end of file
/v3/xsd/TIP-TIR.xsd
Property changes:
Added: svn:keywords
## -0,0 +1 ##
+LastChangedDate
\ No newline at end of property
Index: v3/xsd/common-policy.xsd
===================================================================
--- v3/xsd/common-policy.xsd (nonexistent)
+++ v3/xsd/common-policy.xsd (revision 634)
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema targetNamespace="urn:ietf:params:xml:ns:common-policy"
+ xmlns:cp="urn:ietf:params:xml:ns:common-policy" xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified" attributeFormDefault="unqualified">
+ <!-- /ruleset -->
+ <xs:element name="ruleset">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:restriction base="xs:anyType">
+ <xs:sequence>
+ <xs:element name="rule" type="cp:ruleType"
+ minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ </xs:restriction>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <!-- /ruleset/rule -->
+ <xs:complexType name="ruleType">
+ <xs:complexContent>
+ <xs:restriction base="xs:anyType">
+ <xs:sequence>
+ <xs:element name="conditions" type="cp:conditionsType"
+ minOccurs="0" />
+ <xs:element name="actions" type="cp:extensibleType"
+ minOccurs="0" />
+ <xs:element name="transformations" type="cp:extensibleType"
+ minOccurs="0" />
+ </xs:sequence>
+ <xs:attribute name="id" type="xs:ID" use="required" />
+ </xs:restriction>
+ </xs:complexContent>
+ </xs:complexType>
+ <!-- //rule/conditions -->
+ <xs:complexType name="conditionsType">
+ <xs:complexContent>
+ <xs:restriction base="xs:anyType">
+ <xs:choice maxOccurs="unbounded">
+ <xs:element name="identity" type="cp:identityType"
+ minOccurs="0" />
+ <xs:element name="sphere" type="cp:sphereType"
+ minOccurs="0" />
+ <xs:element name="validity" type="cp:validityType"
+ minOccurs="0" />
+ <xs:any namespace="##other" processContents="lax"
+ minOccurs="0" maxOccurs="unbounded" />
+ </xs:choice>
+ </xs:restriction>
+ </xs:complexContent>
+ </xs:complexType>
+ <!-- //conditions/identity -->
+ <xs:complexType name="identityType">
+ <xs:complexContent>
+ <xs:restriction base="xs:anyType">
+ <xs:choice minOccurs="1" maxOccurs="unbounded">
+ <xs:element name="one" type="cp:oneType" />
+ <xs:element name="many" type="cp:manyType" />
+ <xs:any namespace="##other" processContents="lax" />
+ </xs:choice>
+ </xs:restriction>
+ </xs:complexContent>
+ </xs:complexType>
+ <!-- //identity/one -->
+ <xs:complexType name="oneType">
+ <xs:complexContent>
+ <xs:restriction base="xs:anyType">
+ <xs:sequence>
+ <xs:any namespace="##other" minOccurs="0"
+ processContents="lax" />
+ </xs:sequence>
+ <xs:attribute name="id" type="xs:anyURI"
+ use="required" />
+ </xs:restriction>
+ </xs:complexContent>
+ </xs:complexType>
+ <!-- //identity/many -->
+ <xs:complexType name="manyType">
+ <xs:complexContent>
+ <xs:restriction base="xs:anyType">
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element name="except" type="cp:exceptType" />
+ <xs:any namespace="##other" minOccurs="0"
+ processContents="lax" />
+ </xs:choice>
+ <xs:attribute name="domain" use="optional"
+ type="xs:string" />
+ </xs:restriction>
+ </xs:complexContent>
+ </xs:complexType>
+ <!-- //many/except -->
+ <xs:complexType name="exceptType">
+ <xs:attribute name="domain" type="xs:string" use="optional" />
+ <xs:attribute name="id" type="xs:anyURI" use="optional" />
+ </xs:complexType>
+ <!-- //conditions/sphere -->
+ <xs:complexType name="sphereType">
+ <xs:complexContent>
+ <xs:restriction base="xs:anyType">
+ <xs:attribute name="value" type="xs:string"
+ use="required" />
+ </xs:restriction>
+ </xs:complexContent>
+ </xs:complexType>
+ <!-- //conditions/validity -->
+ <xs:complexType name="validityType">
+ <xs:complexContent>
+ <xs:restriction base="xs:anyType">
+ <xs:sequence minOccurs="1" maxOccurs="unbounded">
+ <xs:element name="from" type="xs:dateTime" />
+ <xs:element name="until" type="xs:dateTime" />
+ </xs:sequence>
+ </xs:restriction>
+ </xs:complexContent>
+ </xs:complexType>
+ <!-- //rule/actions or //rule/transformations -->
+ <xs:complexType name="extensibleType">
+ <xs:complexContent>
+ <xs:restriction base="xs:anyType">
+ <xs:sequence>
+ <xs:any namespace="##other" processContents="lax"
+ minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ </xs:restriction>
+ </xs:complexContent>
+ </xs:complexType>
+</xs:schema>
/v3/xsd/common-policy.xsd
Property changes:
Added: svn:keywords
## -0,0 +1 ##
+LastChangedDate
\ No newline at end of property
Index: v3/xsd/cug.xsd
===================================================================
--- v3/xsd/cug.xsd (nonexistent)
+++ v3/xsd/cug.xsd (revision 634)
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ xmlns="http://uri.etsi.org/ngn/params/xml/simservs/xcap" xmlns:ss="http://uri.etsi.org/ngn/params/xml/simservs/xcap"
+ targetNamespace="http://uri.etsi.org/ngn/params/xml/simservs/xcap"
+ elementFormDefault="qualified" attributeFormDefault="unqualified">
+ <xs:annotation>
+ <xs:documentation>XML Schema Definition for the closed user
+ group
+ parameter
+ </xs:documentation>
+ </xs:annotation>
+ <!-- Because of some XSD to TTCN-3 mapping limitations, xcap.xsd=simservs.xsd
+ with modifications -->
+ <!--xs:include schemaLocation="xcap.xsd"/ -->
+ <!--Definition of simple types -->
+ <xs:simpleType name="twobitType">
+ <xs:restriction base="xs:string">
+ <xs:pattern value="[0-1][0-1]" />
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="networkIdentityType">
+ <xs:restriction base="xs:hexBinary">
+ <xs:length value="1" />
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="sixteenbitType">
+ <xs:restriction base="xs:hexBinary">
+ <xs:length value="2" />
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="cugIndexType">
+ <xs:restriction base="xs:integer">
+ <xs:minInclusive value="0" />
+ <xs:maxInclusive value="32767" />
+ </xs:restriction>
+ </xs:simpleType>
+ <!--Definition of complex types -->
+ <xs:complexType name="cugRequestType">
+ <xs:sequence>
+ <xs:element name="outgoingAccessRequest" type="xs:boolean" />
+ <xs:element name="cugIndex" type="cugIndexType"
+ minOccurs="0" />
+ </xs:sequence>
+ </xs:complexType>
+ <!--Definition of document structure -->
+ <xs:element name="cug" substitutionGroup="ss:absService">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="ss:simservType">
+ <xs:sequence>
+ <xs:element name="cugCallOperation"
+ type="cugRequestType" minOccurs="0" />
+ <xs:element name="networkIndicator"
+ type="networkIdentityType" minOccurs="0" />
+ <xs:element name="cugInterlockBinaryCode"
+ type="sixteenbitType" minOccurs="0" />
+ <xs:element name="cugCommunicationIndicator"
+ type="twobitType" minOccurs="0" />
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+</xs:schema>
/v3/xsd/cug.xsd
Property changes:
Added: svn:keywords
## -0,0 +1 ##
+LastChangedDate
\ No newline at end of property
Index: v3/xsd/cw.xsd
===================================================================
--- v3/xsd/cw.xsd (nonexistent)
+++ v3/xsd/cw.xsd (revision 634)
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema targetNamespace="urn:3gpp:ns:cw:1.0" xmlns:cw10="urn:3gpp:ns:cw:1.0"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
+ attributeFormDefault="unqualified">
+ <xs:complexType name="tEmptyType" />
+ <xs:complexType name="tCWtype">
+ <xs:sequence>
+ <xs:element name="communication-waiting-indication"
+ minOccurs="0" maxOccurs="1" type="cw10:tEmptyType" />
+ <xs:any namespace="##other" processContents="lax"
+ minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ <xs:anyAttribute namespace="##other"
+ processContents="lax" />
+ </xs:complexType>
+ <xs:element name="ims-cw" type="cw10:tCWtype" />
+</xs:schema>
\ No newline at end of file
Index: v3/xsd/geopriv10basic.xsd
===================================================================
--- v3/xsd/geopriv10basic.xsd (nonexistent)
+++ v3/xsd/geopriv10basic.xsd (revision 634)
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema targetNamespace="urn:ietf:params:xml:ns:pidf:geopriv10:basicPolicy"
+ xmlns:tns="urn:ietf:params:xml:ns:pidf:geopriv10:basicPolicy"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
+ attributeFormDefault="unqualified">
+
+ <!-- This import brings in the XML language attribute xml:lang -->
+ <xs:import namespace="http://www.w3.org/XML/1998/namespace"
+ schemaLocation="xml.xsd" />
+
+ <xs:complexType name="locPolicyType">
+ <xs:sequence>
+ <xs:element name="retransmission-allowed" type="xs:boolean"
+ minOccurs="0" maxOccurs="1" />
+ <xs:element name="retention-expiry" type="xs:dateTime"
+ minOccurs="0" maxOccurs="1" />
+ <xs:element name="external-ruleset" type="xs:anyURI"
+ minOccurs="0" maxOccurs="1" />
+ <xs:element name="note-well" type="tns:notewell"
+ minOccurs="0" maxOccurs="1" />
+ <xs:any namespace="##other" processContents="lax"
+ minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="notewell">
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute ref="xml:lang" />
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+</xs:schema>
+
Index: v3/xsd/pidf.xsd
===================================================================
--- v3/xsd/pidf.xsd (nonexistent)
+++ v3/xsd/pidf.xsd (revision 634)
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema targetNamespace="urn:ietf:params:xml:ns:pidf"
+ xmlns:tns="urn:ietf:params:xml:ns:pidf" xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified" attributeFormDefault="unqualified">
+ <!-- RFC 3863 -->
+
+
+ <!-- This import brings in the XML language attribute xml:lang -->
+ <xs:import namespace="http://www.w3.org/XML/1998/namespace"
+ schemaLocation="xml.xsd" />
+
+ <xs:element name="presence" type="tns:presence" />
+
+ <xs:complexType name="presence">
+ <xs:sequence>
+ <xs:element name="tuple" type="tns:tuple"
+ minOccurs="0" maxOccurs="unbounded" />
+ <xs:element name="note" type="tns:note"
+ minOccurs="0" maxOccurs="unbounded" />
+ <xs:any namespace="##other" processContents="lax"
+ minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ <xs:attribute name="entity" type="xs:anyURI" use="required" />
+ </xs:complexType>
+
+ <xs:complexType name="tuple">
+ <xs:sequence>
+ <xs:element name="status" type="tns:status" />
+ <xs:any namespace="##other" processContents="lax"
+ minOccurs="0" maxOccurs="unbounded" />
+ <xs:element name="contact" type="tns:contact"
+ minOccurs="0" />
+ <xs:element name="note" type="tns:note"
+ minOccurs="0" maxOccurs="unbounded" />
+ <xs:element name="timestamp" type="xs:dateTime"
+ minOccurs="0" />
+ </xs:sequence>
+ <xs:attribute name="id" type="xs:ID" use="required" />
+ </xs:complexType>
+
+ <xs:complexType name="status">
+ <xs:sequence>
+ <xs:element name="basic" type="tns:basic"
+ minOccurs="0" />
+ <xs:any namespace="##other" processContents="lax"
+ minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:simpleType name="basic">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="open" />
+ <xs:enumeration value="closed" />
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:complexType name="contact">
+ <xs:simpleContent>
+ <xs:extension base="xs:anyURI">
+ <xs:attribute name="priority" type="tns:qvalue" />
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:complexType name="note">
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute ref="xml:lang" />
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:simpleType name="qvalue">
+ <xs:restriction base="xs:decimal">
+ <xs:pattern value="0(.[0-9]{0,3})?" />
+ <xs:pattern value="1(.0{0,3})?" />
+ </xs:restriction>
+ </xs:simpleType>
+
+ <!-- Global Attributes -->
+ <xs:attribute name="mustUnderstand" type="xs:boolean"
+ default="0">
+ <xs:annotation>
+ <xs:documentation>
+ This attribute may be used on any element within an optional
+ PIDF extension to indicate that the corresponding element must
+ be understood by the PIDF processor if the enclosing optional
+ element is to be handled.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+</xs:schema>
+
Index: v3/xsd/pidf_lo.xsd
===================================================================
--- v3/xsd/pidf_lo.xsd (nonexistent)
+++ v3/xsd/pidf_lo.xsd (revision 634)
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema targetNamespace="urn:ietf:params:xml:ns:pidf:geopriv10"
+ xmlns:tns="urn:ietf:params:xml:ns:pidf:geopriv10" xmlns:gbp="urn:ietf:params:xml:ns:pidf:geopriv10:basicPolicy"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
+ attributeFormDefault="unqualified">
+
+ <xs:import namespace="urn:ietf:params:xml:ns:pidf:geopriv10:basicPolicy"
+ schemaLocation="geopriv10basic.xsd" />
+
+ <!-- This import brings in the XML language attribute xml:lang -->
+
+ <xs:import namespace="http://www.w3.org/XML/1998/namespace"
+ schemaLocation="xml.xsd" />
+
+ <xs:element name="geopriv" type="tns:geopriv" />
+
+ <xs:complexType name="geopriv">
+ <xs:sequence>
+ <xs:element name="location-info" type="tns:locInfoType"
+ minOccurs="1" maxOccurs="1" />
+ <xs:element name="usage-rules" type="gbp:locPolicyType"
+ minOccurs="1" maxOccurs="1" />
+ <xs:element name="method" type="tns:locMethod"
+ minOccurs="0" maxOccurs="1" />
+ <xs:element name="provided-by" type="tns:locProvidedBy"
+ minOccurs="0" maxOccurs="1" />
+ <xs:any namespace="##other" processContents="lax"
+ minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="locInfoType">
+ <xs:sequence>
+ <xs:any namespace="##other" processContents="lax"
+ minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="locMethod">
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute ref="xml:lang" />
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:complexType name="locProvidedBy">
+ <xs:sequence>
+ <xs:any namespace="##other" processContents="skip"
+ minOccurs="1" maxOccurs="unbounded" />
+ </xs:sequence>
+ </xs:complexType>
+
+</xs:schema>
+
Index: v3/xsd/regInfo.xsd
===================================================================
--- v3/xsd/regInfo.xsd (nonexistent)
+++ v3/xsd/regInfo.xsd (revision 634)
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema targetNamespace="urn:ietf:params:xml:ns:reginfo"
+ xmlns:tns="urn:ietf:params:xml:ns:reginfo" xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified" attributeFormDefault="unqualified">
+ <!-- RFC 3680 clause 5.4 -->
+
+ <!-- This import brings in the XML language attribute xml:lang -->
+ <xs:import namespace="http://www.w3.org/XML/1998/namespace"
+ schemaLocation="xml.xsd" />
+ <xs:element name="reginfo">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="tns:registration" minOccurs="0"
+ maxOccurs="unbounded" />
+ <xs:any namespace="##other" processContents="lax"
+ minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ <xs:attribute name="version" type="xs:nonNegativeInteger"
+ use="required" />
+ <xs:attribute name="state" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="full" />
+ <xs:enumeration value="partial" />
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="registration">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="tns:contact" minOccurs="0"
+ maxOccurs="unbounded" />
+ <xs:any namespace="##other" processContents="lax"
+ minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ <xs:attribute name="aor" type="xs:anyURI" use="required" />
+ <xs:attribute name="id" type="xs:string" use="required" />
+ <xs:attribute name="state" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="init" />
+ <xs:enumeration value="active" />
+ <xs:enumeration value="terminated" />
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="contact">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="uri" type="xs:anyURI" />
+ <xs:element name="display-name" minOccurs="0">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute ref="xml:lang"
+ use="optional" />
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="unknown-param" minOccurs="0"
+ maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="name"
+ type="xs:string" use="required" />
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:any namespace="##other" processContents="lax"
+ minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ <xs:attribute name="state" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="active" />
+ <xs:enumeration value="terminated" />
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="event" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="registered" />
+ <xs:enumeration value="created" />
+ <xs:enumeration value="refreshed" />
+ <xs:enumeration value="shortened" />
+ <xs:enumeration value="expired" />
+ <xs:enumeration value="deactivated" />
+ <xs:enumeration value="probation" />
+ <xs:enumeration value="unregistered" />
+ <xs:enumeration value="rejected" />
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="duration-registered" type="xs:unsignedLong" />
+ <xs:attribute name="expires" type="xs:unsignedLong" />
+ <xs:attribute name="retry-after" type="xs:unsignedLong" />
+ <xs:attribute name="id" type="xs:string" use="required" />
+ <xs:attribute name="q" type="xs:string" />
+ <xs:attribute name="callid" type="xs:string" />
+ <xs:attribute name="cseq" type="xs:unsignedLong" />
+ </xs:complexType>
+ </xs:element>
+</xs:schema>
Index: v3/xsd/simservs.xsd
===================================================================
--- v3/xsd/simservs.xsd (nonexistent)
+++ v3/xsd/simservs.xsd (revision 634)
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- TS 27.173 / 183 023 -->
+<xs:schema targetNamespace="http://uri.etsi.org/ngn/params/xml/simservs/xcap"
+ xmlns:ss="http://uri.etsi.org/ngn/params/xml/simservs/xcap"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
+ attributeFormDefault="unqualified">
+
+ <!-- The element "simservs" maps to the Common Parts of an NGN PSTN/ISDN
+ Simulation services document -->
+
+ <xs:element name="simservs">
+ <xs:annotation>
+ <xs:documentation>XML Schema for data manipulation of ETSI
+ NGN PSTN/ISDN Simulation Services
+ </xs:documentation>
+ </xs:annotation>
+ <xs:complexType>
+ <xs:sequence>
+ <xs:group ref="ss:absServiceGroup" minOccurs="0"
+ maxOccurs="unbounded" />
+ <xs:element name="extensions" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:any namespace="##other"
+ processContents="lax" minOccurs="0"
+ maxOccurs="unbounded" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:anyAttribute namespace="##any"
+ processContents="lax" />
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="absService" abstract="true" type="ss:simservType" />
+
+ <xs:complexType name="simservType">
+ <xs:attribute name="active" type="xs:boolean" use="optional"
+ default="true" />
+ <xs:anyAttribute namespace="##any"
+ processContents="lax" />
+ </xs:complexType>
+
+ <!-- service specific IETF common policy condition elements -->
+ <xs:element name="anonymous" type="ss:empty-element-type" />
+ <xs:element name="presence-status" type="ss:presence-status-activity-type" />
+ <xs:element name="media" type="ss:media-type1" />
+ <xs:element name="communication-diverted" type="ss:empty-element-type" />
+ <xs:element name="rule-deactivated" type="ss:empty-element-type" />
+ <xs:element name="not-registered" type="ss:empty-element-type" />
+ <xs:element name="busy" type="ss:empty-element-type" />
+ <xs:element name="no-answer" type="ss:empty-element-type" />
+ <xs:element name="not-reachable" type="ss:empty-element-type" />
+ <xs:element name="roaming" type="ss:empty-element-type" />
+
+ <!-- service specific type declarations -->
+ <xs:simpleType name="media-type1">
+ <xs:restriction base="xs:string" />
+ </xs:simpleType>
+ <xs:simpleType name="presence-status-activity-type">
+ <xs:restriction base="xs:string" />
+ </xs:simpleType>
+ <xs:complexType name="empty-element-type" />
+
+ <!-- ETSI substitutionGroup workaround, because TTCN-3 does not support
+ mapping of substitutionGroup -->
+ <xs:group name="absServiceGroup">
+ <xs:choice>
+ <!-- default -->
+ <xs:element ref="ss:absService" />
+ <!-- TIP-TRI -->
+ <xs:element
+ ref="ss:terminating-identity-presentation-restriction" />
+ <xs:element ref="ss:terminating-identity-presentation" />
+ <!-- OIP-OIR -->
+ <xs:element
+ ref="ss:originating--identity--presentation--restriction" />
+ <xs:element ref="ss:originating--identity--presentation" />
+ <!-- CDIV -->
+ <xs:element ref="ss:communication-diversion" />
+ <!-- ACR-CB -->
+ <xs:element ref="ss:incoming-communication-barring" />
+ <xs:element ref="ss:outgoing-communication-barring" />
+ <!-- CUG -->
+ <!-- <xs:element ref="cug"/> -->
+ </xs:choice>
+ </xs:group>
+
+</xs:schema>
\ No newline at end of file
/v3/xsd/simservs.xsd
Property changes:
Added: svn:keywords
## -0,0 +1 ##
+LastChangedDate
\ No newline at end of property
Index: v3/xsd/xdm_commonPolicy-v1_0.xsd
===================================================================
--- v3/xsd/xdm_commonPolicy-v1_0.xsd (nonexistent)
+++ v3/xsd/xdm_commonPolicy-v1_0.xsd (revision 634)
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- XDM - Common Policy version - 1.0 date - 27 Jun 2008 FILE INFORMATION
+ OMA Permanent Document File: OMA-SUP-XSD_xdm_commonPolicy-V1_0_2-20080627-A
+ Type: Text - Schema Description Public Reachable Information Path: http://www.openmobilealliance.org/tech/profiles
+ Name: xdm_commonPolicy-v1_0.xsd NORMATIVE INFORMATION Information about this
+ file can be found in the specification OMA-TS-XDM_Core-V1_1 available at
+ http://www.openmobilealliance.org/ Send comments to [email protected]
+ LEGAL DISCLAIMER Use of this document is subject to all of the terms and
+ conditions of the Use Agreement located at http://www.openmobilealliance.org/UseAgreement.html
+ You may use this document or any part of the document for internal or educational
+ purposes only, provided you do not modify, edit or take out of context the
+ information in this document in any manner. Information contained in this
+ document may be used, at your sole risk, for any purposes. You may not use
+ this document in any other manner without the prior written permission of
+ the Open Mobile Alliance. The Open Mobile Alliance authorizes you to copy
+ this document, provided that you retain all copyright and other proprietary
+ notices contained in the original materials on any copies of the materials
+ and that you comply strictly with these terms. This copyright permission
+ does not constitute an endorsement of the products or services. The Open
+ Mobile Alliance assumes no responsibility for errors or omissions in this
+ document. Each Open Mobile Alliance member has agreed to use reasonable endeavors
+ to inform the Open Mobile Alliance in a timely manner of Essential IPR as
+ it becomes aware that the Essential IPR is related to the prepared or published
+ specification. However, the members do not have an obligation to conduct
+ IPR searches. The declared Essential IPR is publicly available to members
+ and non-members of the Open Mobile Alliance and may be found on the "OMA
+ IPR Declarations" list at http://www.openmobilealliance.org/ipr.html. The
+ Open Mobile Alliance has not conducted an independent IPR review of this
+ document and the information contained herein, and makes no representations
+ or warranties regarding third party IPR, including without limitation patents,
+ copyrights or trade secret rights. This document may contain inventions for
+ which you must obtain licenses from third parties before making, using or
+ selling the inventions. Defined terms above are set forth in the schedule
+ to the Open Mobile Alliance Application Form. NO REPRESENTATIONS OR WARRANTIES
+ (WHETHER EXPRESS OR IMPLIED) ARE MADE BY THE OPEN MOBILE ALLIANCE OR ANY
+ OPEN MOBILE ALLIANCE MEMBER OR ITS AFFILIATES REGARDING ANY OF THE IPR'S
+ REPRESENTED ON THE "OMA IPR DECLARATIONS" LIST, INCLUDING, BUT NOT LIMITED
+ TO THE ACCURACY, COMPLETENESS, VALIDITY OR RELEVANCE OF THE INFORMATION OR
+ WHETHER OR NOT SUCH RIGHTS ARE ESSENTIAL OR NON-ESSENTIAL. THE OPEN MOBILE
+ ALLIANCE IS NOT LIABLE FOR AND HEREBY DISCLAIMS ANY DIRECT, INDIRECT, PUNITIVE,
+ SPECIAL, INCIDENTAL, CONSEQUENTIAL, OR EXEMPLARY DAMAGES ARISING OUT OF OR
+ IN CONNECTION WITH THE USE OF DOCUMENTS AND THE INFORMATION CONTAINED IN
+ THE DOCUMENTS. Copyright 2008 Open Mobile Alliance Ltd. All Rights Reserved.
+ Used with the permission of the Open Mobile Alliance Ltd. under the terms
+ set forth above. -->
+
+<xs:schema targetNamespace="urn:oma:xml:xdm:common-policy"
+ xmlns="urn:oma:xml:xdm:common-policy" xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified" attributeFormDefault="unqualified">
+
+ <!-- OMA specific "conditions" child elements -->
+ <xs:element name="other-identity" type="emptyType" />
+
+ <xs:element name="external-list">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="entry" type="anchorType"
+ minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="anonymous-request" type="emptyType" />
+
+ <xs:complexType name="anchorType">
+ <xs:attribute name="anc" type="xs:anyURI" />
+ <xs:anyAttribute processContents="lax" />
+ </xs:complexType>
+
+ <xs:complexType name="emptyType" />
+
+</xs:schema>
/v3/xsd/xdm_commonPolicy-v1_0.xsd
Property changes:
Added: svn:keywords
## -0,0 +1 ##
+LastChangedDate
\ No newline at end of property
Index: v3/xsd/xml.xsd
===================================================================
--- v3/xsd/xml.xsd (nonexistent)
+++ v3/xsd/xml.xsd (revision 634)
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema targetNamespace="http://www.w3.org/XML/1998/namespace"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema" xml:lang="en">
+
+ <xs:attribute name="lang">
+ <xs:simpleType>
+ <xs:union memberTypes="xs:language">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="" />
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:union>
+ </xs:simpleType>
+ </xs:attribute>
+
+ <xs:attribute name="space">
+ <xs:simpleType>
+ <xs:restriction base="xs:NCName">
+ <xs:enumeration value="default" />
+ <xs:enumeration value="preserve" />
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+
+ <xs:attribute name="base" type="xs:anyURI">
+ </xs:attribute>
+
+ <xs:attribute name="id" type="xs:ID">
+ </xs:attribute>
+
+ <xs:attributeGroup name="specialAttrs">
+ <xs:attribute ref="xml:base" />
+ <xs:attribute ref="xml:lang" />
+ <xs:attribute ref="xml:space" />
+ <xs:attribute ref="xml:id" />
+ </xs:attributeGroup>
+</xs:schema>
Index: v3/xsd
===================================================================
--- v3/xsd (nonexistent)
+++ v3/xsd (revision 634)
/v3/xsd
Property changes:
Added: svn:ignore
## -0,0 +1 ##
+ttcn3view
Index: v3/ttcn/LibSip_SimpleMsgSummaryTypes.ttcn
===================================================================
--- v3/ttcn/LibSip_SimpleMsgSummaryTypes.ttcn (nonexistent)
+++ v3/ttcn/LibSip_SimpleMsgSummaryTypes.ttcn (revision 634)
@@ -0,0 +1,57 @@
+/**
+ * @author STF 406, 471
+ * @version $Id: LibSip_SimpleMsgSummaryTypes.ttcn 488 2010-11-08 10:17:19Z pintar $
+ * @desc This module provides the SMS type system for SIP tests.
+ * This module is part of LibSipV3.
+*/
+module LibSip_SimpleMsgSummaryTypes {
+ // RFC 3842
+ group SMSConstants {
+
+ // IMS ETSI name MWI application
+ const charstring c_imsEtsiMwiApplication := "application/simple-message-summary";
+
+ // msg_status line := "Message-Waiting"
+ const charstring c_messageWaiting := "Message-Waiting";
+
+ // msg_status line := "Message-Account"
+ const charstring c_messageAccount := "Message-Account";
+
+ // msg_summary line := "Voice-Message"
+ const charstring c_voiceMessage := "Voice-Message";
+
+ }
+
+ group SMSTypes {
+ type record SimpleMsgSummary {
+ // Simple_message_summary
+ Msg_status_line msg_status_line,
+ Msg_account msg_account optional,
+ Msg_summary_line_list msg_summary_line_list optional,
+ Opt_msg_headers opt_msg_headers optional
+ }
+
+ type record Msg_status_line {
+ charstring msg_type,
+ charstring msg_status
+ }
+
+ type record Msg_account {
+ charstring msg_type_account,
+ charstring account_URI
+ }
+
+ type set of Msg_summary_line Msg_summary_line_list;
+
+ type record Msg_summary_line {
+ charstring msg_context_class,
+ charstring msgs,
+ charstring urgent_msgs optional
+ }
+
+ type set of charstring Opt_msg_headers;
+
+
+ // type integer msgcount length(1); //msgs and urgent_msgs can be dividet into subtypes
+ }
+}
\ No newline at end of file
Index: v3/ttcn/LibSip_Templates.ttcn
===================================================================
--- v3/ttcn/LibSip_Templates.ttcn (nonexistent)
+++ v3/ttcn/LibSip_Templates.ttcn (revision 634)
@@ -0,0 +1,4607 @@
+/**
+ * @author STF 346, STF366, STF368, STF369, STF450, STF471
+ * @version $Id$
+ * @desc This module defines SIP Templates for message, header, and
+ * structured types. <br>
+ * Note that any changes made to the definitions in this module
+ * may be overwritten by future releases of this library
+ * End users are encouraged to contact the distributers of this
+ * module regarding their modifications or additions.
+ * This module is part of LibSipV3.
+ * @remark Any additions to the templates shall follow the design rules and always modify base templates only; Existing templates shall not be changed or removed - change requests shall be made to http://t-ort.etsi.org
+ */
+module LibSip_Templates {
+ // LibSip
+ import from LibSip_SIPTypesAndValues all;
+ import from LibSip_SDPTypes all;
+ import from LibSip_Interface all;
+ import from LibSip_PIXITS all;
+ import from LibSip_XMLTypes all;
+ import from LibSip_SimpleMsgSummaryTypes all;
+ import from LibSip_MessageBodyTypes all;
+
+ import from NoTargetNamespace language "XSD" all
+ with {
+ extension "File:../xsd/Ims3gpp.xsd";
+ }
+
+ import from urn_ietf_params_xml_ns_conference_info language "XSD" all
+ with {
+ extension "File:../xsd/CONF.xsd";
+ }
+
+ import from http_uri_etsi_org_ngn_params_xml_simservs_pstn language "XSD" all
+ with {
+ extension "File:../xsd/PSTN.xsd";
+ }
+
+ import from http_uri_etsi_org_ngn_params_xml_simservs_xcap language "XSD" all
+ with {
+ extension "File:../xsd/SupplementaryServices.xsd";
+ }
+
+ import from http_uri_etsi_org_ngn_params_xml_simservs_mcid language "XSD" all
+ with {
+ extension "File:../xsd/MCID.xsd";
+ }
+
+ import from urn_ietf_params_xml_ns_resource_lists language "XSD" all
+ with {
+ extension "File:../xsd/ResourceList.xsd";
+ }
+
+ import from http_uri_etsi_org_ngn_params_xml_comm_div_info language "XSD" all
+ with {
+ extension "File:../xsd/CDIVN.xsd";
+ }
+
+ import from urn_3gpp_ns_cw_1_0 language "XSD" all
+ with {
+ extension "File:../xsd/cw.xsd";
+ }
+
+ group SubFields {
+
+ template(value) Addr_Union m_AddrUnion_NameAddr(template(value) NameAddr p_nameAddr) := {nameAddr := p_nameAddr}
+
+ template(value) Addr_Union m_AddrUnion_DisplayAndSipUrl(
+ template(value) charstring p_displayName,
+ template(value) SipUrl p_addrSpec
+ ) := {
+ nameAddr := m_CallingAddr(p_displayName, p_addrSpec)
+ }
+
+ template(value) NameAddr m_NameAddr(
+ template(omit) charstring p_displayName := omit,
+ template(value) SipUrl p_addrSpec
+ ) := {
+ displayName := p_displayName,
+ addrSpec := p_addrSpec
+ }
+
+ template(value) NameAddr m_CallingAddr(
+ template(value) charstring p_displayName,
+ template(value) SipUrl p_addrSpec
+ ) := m_NameAddr(p_displayName, p_addrSpec);
+
+ template(present) NameAddr mw_NameAddr(
+ template charstring p_displayName,
+ template(present) SipUrl p_addrSpec := ?
+ ) := {
+ displayName := p_displayName,
+ addrSpec := p_addrSpec
+ }
+
+ template(present) CommaParam_List mw_digestResponse(
+ template(present) GenericParam p_genericParam := ?
+ ) := superset(p_genericParam);
+
+ //* c_Integrity_protected_yes
+ /**
+ * @desc send template for parameter list with CPC set to a specific value
+ * @param p_ISUP_CPC_value CPC parameter value
+ * former PX_SIP_ISUP_CPC_VALUE
+ */
+ template(value) SemicolonParam_List m_cpc(
+ template(value) charstring p_ISUP_CPC_value := "prison"
+ ) := {
+ {
+ "cpc",
+ {tokenOrHost := p_ISUP_CPC_value}
+ }
+ }
+
+ template(value) SemicolonParam_List m_ReasonParams(
+ template(omit) GenValue p_cause := omit,
+ template(value) GenValue p_text
+ ) := {
+ m_Cause(p_cause), m_Text(p_text)
+ }
+
+ template(present) SemicolonParam_List mw_ReasonParams(
+ template GenValue p_cause,
+ template GenValue p_text
+ ) := {
+ mw_Cause_base(p_cause), mw_Text(p_text)
+ }
+
+ template(value) ReasonValue m_ReasonValue_Base := {
+ token := "",
+ reasonParams := omit
+ }
+
+ template(present) ReasonValue mw_ReasonValue_Base := {
+ token := ?,
+ reasonParams := *
+ }
+
+ template(value) ReasonValue m_ReasonValue_param(
+ template(value) GenValue p_cause,
+ template(value) GenValue p_text
+ ) modifies m_ReasonValue_Base := {
+ reasonParams := m_ReasonParams(p_cause, p_text)
+ }
+
+ template(present) ReasonValue mw_ReasonValue_param(
+ template GenValue p_cause,
+ template GenValue p_text
+ ) modifies mw_ReasonValue_Base := {
+ reasonParams := mw_ReasonParams(p_cause, p_text)
+ }
+
+ template(value) ReasonValue m_ReasonValue(
+ template(value) GenValue p_cause,
+ template(value) GenValue p_text
+ ) modifies m_ReasonValue_param := {
+ token := "Q.850"
+ }
+
+ template(present) ReasonValue mw_ReasonValue(
+ template GenValue p_cause,
+ template GenValue p_text
+ ) modifies mw_ReasonValue_param := {
+ token := "Q.850"
+ }
+
+ template(value) ReasonValue m_ReasonValueSIP(
+ template(value) GenValue p_cause,
+ template(value) GenValue p_text
+ ) modifies m_ReasonValue_param := {
+ token := "SIP"
+ }
+
+ template(present) ReasonValue mw_ReasonValueSIP(
+ template GenValue p_cause,
+ template GenValue p_text
+ ) modifies mw_ReasonValue_param := {
+ token := "SIP"
+ }
+
+ template(present) RouteBody mw_routeBody(
+ template(present) SipUrl p_sipurl := ?
+ ) := {
+ nameAddr := mw_NameAddr(*, p_sipurl),
+ rrParam := *
+ }
+
+ template(value) SentProtocol m_SentProtocol(
+ template(value) charstring p_protocol
+ ) := {
+ protocolName := c_sipName,
+ protocolVersion := c_sipVersion,
+ transport := p_protocol
+ }
+
+ template(value) SipUrl m_BasicSipUrl := {
+ scheme := (c_sipScheme),
+ components := {
+ sip := {
+ userInfo := {
+ userOrTelephoneSubscriber := "", //* charstring
+ password :=
+ omit //* optional charstring
+ },
+ hostPort := {
+ host := omit, //* hostname, IPv4 or IPv6 as a charstring
+ portField :=
+ omit //* p_userprofile.currPort - optional integer
+ }
+ }
+ },
+ urlParameters := omit,
+ headers := omit
+ }
+
+ template(value) SipUrl m_SipUrl_currDomain_Base(
+ template(value) SipUserProfile p_userprofile
+ ) modifies m_BasicSipUrl := {
+ components := {
+ sip := {
+ userInfo := {
+ userOrTelephoneSubscriber := p_userprofile.publUsername
+ }
+ }
+ }
+ }
+
+ template(value) SipUrl m_SipUrl_currDomain(
+ template(value) SipUserProfile p_userprofile
+ ) modifies m_SipUrl_currDomain_Base := {
+ components := {
+ sip := {
+ hostPort := {
+ host :=
+ p_userprofile
+ .homeDomain //* hostname, IPv4 or IPv6 as a charstring
+ }
+ }
+ }
+ }
+
+ template(value) SipUrl m_SipUrl_contactIpaddr(
+ template(value) SipUserProfile p_userprofile
+ ) modifies m_SipUrl_currDomain_Base := {
+ components := {
+ sip := {
+ hostPort := {
+ host := p_userprofile.contactIpaddr, //* hostname, IPv4 or IPv6 as a charstring
+ portField :=
+ p_userprofile
+ .contactPort //* optional integer
+ }
+ }
+ }
+ }
+ /**
+ * @desc send template with SIP userinfo
+ * @param p_userprofile SIP user profile values
+ * @param p_ISUP_CPC_value CPC parameter value
+ * former PX_SIP_ISUP_CPC_VALUE
+ */
+ template(value) SipUrl m_SipUrl_contactIpaddrAndCpc(
+ template(value) SipUserProfile p_userprofile,
+ template(value) charstring p_ISUP_CPC_value := "prison"
+ ) modifies m_SipUrl_contactIpaddr := {
+ components := {
+ sip := {
+ userInfo := {
+ userOrTelephoneSubscriber :=
+ p_userprofile.publUsername & "; cpc=" &
+ p_ISUP_CPC_value
+ }
+ }
+ }
+ }
+
+ template(value) SipUrl m_SipUrl_currIpaddr(
+ template(value) SipUserProfile p_userprofile
+ ) modifies m_SipUrl_currDomain_Base := {
+ components := {
+ sip := {
+ hostPort := {
+ host := p_userprofile.currIpaddr, //* hostname, IPv4 or IPv6 as a charstring
+ portField :=
+ p_userprofile
+ .currPort //* optional integer
+ }
+ }
+ }
+ }
+
+ template(value) SipUrl m_SipUrl_Anonymous modifies m_BasicSipUrl := {
+ components := {
+ sip := {
+ userInfo := {
+ userOrTelephoneSubscriber :=
+ "Anonymous" //* charstring
+ },
+ hostPort := {
+ host :=
+ "Anonymous.invalid" //* hostname, IPv4 or IPv6 as a charstring
+ }
+ }
+ }
+ }
+
+ template(value) SipUrl m_SipUrl_NumberHostHeader(
+ template(value) charstring p_number,
+ template(value) charstring p_host,
+ template(omit) AmpersandParam_List p_urlParameters := omit
+ ) modifies m_BasicSipUrl := {
+ components := {
+ sip := {
+ userInfo := {userOrTelephoneSubscriber := p_number},
+ hostPort := {host := p_host}
+ }
+ },
+ urlParameters := p_urlParameters
+ }
+
+ template(value) SipUrl m_SipUrl_NumberHostParam(
+ template(value) charstring p_number,
+ template(value) charstring p_host,
+ template(omit) AmpersandParam_List p_urlParameters := omit
+ ) modifies m_SipUrl_NumberHostHeader := {
+ components := {sip := {hostPort := {portField := c_defaultSipPort}}}
+ }
+
+ template(value) SipUrl m_SipUrl_NumberHostParam_woPort(
+ template(value) charstring p_number,
+ template(value) charstring p_host,
+ template(omit) AmpersandParam_List p_urlParameters := omit
+ ) modifies m_SipUrl_NumberHostParam := {
+ components := {sip := {hostPort := {portField := omit}}}
+ }
+
+ template(present) SipUrl m_BasicTelUrl := {
+ scheme := (c_telScheme),
+ components := {tel := {subscriber := ""}},
+ urlParameters := omit,
+ headers := omit
+ }
+
+ template(value) SipUrl m_TelUrl_publUser(
+ template(value) SipUserProfile p_userprofile
+ ) modifies m_BasicTelUrl := {
+ components := {
+ tel := {
+ subscriber :=
+ p_userprofile
+ .publUsername //* charstring
+ }
+ }
+ }
+
+ template(present) SipUrl mw_TelUrl := {
+ scheme := c_telScheme,
+ components := {tel := {subscriber := ?}},
+ urlParameters := *,
+ headers := *
+ }
+
+ template(present) SipUrl mw_SipUrl := {
+ scheme := c_sipScheme,
+ components := {
+ sip := {
+ userInfo := {
+ userOrTelephoneSubscriber := ?,
+ password := *
+ },
+ hostPort := {
+ host := *,
+ portField := *
+ }
+ }
+ },
+ urlParameters := *,
+ headers := *
+ }
+
+ template(present) SipUrl mw_TelSip_unavailableInvalidUri := (mw_TelSip_unavailableInvalidUri1, mw_TelSip_unavailableInvalidUri2);
+
+ template(present) SipUrl mw_TelSip_unavailableInvalidUri1 modifies mw_SipUrl := {
+ components := {
+ sip := {
+ userInfo := {
+ userOrTelephoneSubscriber := "unavailable"
+ },
+ hostPort := {
+ host := "anonymous.invalid",
+ portField := c_defaultSipPort
+ }
+ }
+ }
+ }
+ template(present) SipUrl mw_TelSip_unavailableInvalidUri2 modifies mw_TelUrl := {
+ components := {tel := {subscriber := "unavailable"}}
+ }
+
+ template(present) SipUrl mw_TelSip_unavailableUri(
+ template(value) charstring p_host
+ ) := (mw_TelSip_unavailableUri1, mw_TelSip_unavailableUri2(p_host));
+
+ template(present) SipUrl mw_TelSip_unavailableUri1 modifies mw_TelUrl := {
+ components := {tel := {subscriber := "unavailable"}}
+ }
+
+ template(present) SipUrl mw_TelSip_unavailableUri2(
+ template(value) charstring p_host
+ ) modifies mw_SipUrl := {
+ components := {
+ sip := {
+ userInfo := {
+ userOrTelephoneSubscriber := "unavailable"
+ },
+ hostPort := {
+ host := p_host,
+ portField := c_defaultSipPort
+ }
+ }
+ }
+ }
+
+ template(present) SipUrl mw_SipUrl_Number(
+ template(present) charstring p_number := ?
+ ) modifies mw_SipUrl := {
+ components := {
+ sip := {
+ userInfo := {userOrTelephoneSubscriber := p_number},
+ hostPort := ?
+ }
+ }
+ }
+
+ template(present) SipUrl mw_TelSipUrl_Number(
+ template(present) charstring p_number := ?
+ ) := (mw_SipUrl_Number(p_number), mw_TelSipUrl_Number2(p_number));
+
+ template(present) SipUrl mw_TelSipUrl_Number1(
+ template(present) charstring p_number := ?
+ ) := mw_SipUrl_Number(p_number);
+
+ template(present) SipUrl mw_TelSipUrl_Number2(
+ template(present) charstring p_number := ?
+ ) modifies mw_TelUrl := {
+ components := {
+ tel := {
+ subscriber := p_number
+ }
+ }
+ }
+
+ template(present) SipUrl mw_SipUrl_Host(
+ template charstring p_host
+ ) modifies mw_SipUrl := {
+ components := {
+ sip := {
+ userInfo := *,
+ hostPort := {host := p_host}
+ }
+ }
+ }
+
+ template(present) SipUrl mw_SipUrl_User_Host(
+ template(present) charstring p_user := ?,
+ template charstring p_host
+ ) modifies mw_SipUrl := {
+ components := {
+ sip := {
+ userInfo := {userOrTelephoneSubscriber := p_user},
+ hostPort := {
+ host :=
+ p_host //* hostname, IPv4 or IPv6 as a charstring
+ }
+ }
+ },
+ urlParameters := {m_UserPhone}
+ }
+
+ template(present) SipUrl mw_SipUrl_Anonymous modifies mw_SipUrl := {
+ components := {
+ sip := {
+ userInfo := {
+ userOrTelephoneSubscriber := pattern "[a,A][n,N][o,O][n,N][y,Y][m,M][o,O][u,U][s,s]" //* charstring
+ },
+ hostPort := {
+ host :=
+ pattern
+ "[a,A]nonymous.invalid" //* hostname, IPv4 or IPv6 as a charstring
+ }
+ }
+ }
+ }
+
+ template(present) SipUrl mw_SipUrl_urlParam(
+ template SemicolonParam_List p_urlParameters
+ ) modifies mw_SipUrl := {
+ urlParameters := p_urlParameters
+ }
+
+ template(present) ContactAddress mw_ContactAddress := {
+ addressField := ?,
+ contactParams := *
+ }
+
+ template(present) HostPort mw_hostPort(
+ template charstring p_host,
+ template integer p_portField
+ ) := {
+ host := p_host,
+ portField := p_portField
+ }
+
+ template(present) StatusLine mw_statusLine_any := {
+ sipVersion := c_sipNameVersion,
+ statusCode := ?,
+ reasonPhrase := ?
+ }
+
+ template(present) StatusLine mw_statusLine(
+ in template(present) integer p_statusCode := ?,
+ in template(present) charstring p_reasonPhrase := ?
+ ) modifies mw_statusLine_any := {
+ statusCode := p_statusCode,
+ reasonPhrase := p_reasonPhrase
+ }
+
+ template(present) StatusLine mw_statusLine1xx modifies mw_statusLine_any := {statusCode := (100 .. 199)}
+
+ template(present) StatusLine mw_statusLine2xx modifies mw_statusLine_any := {statusCode := (200 .. 299)}
+
+ template(present) StatusLine mw_statusLine3xx modifies mw_statusLine_any := {statusCode := (300 .. 399)}
+
+ template(present) StatusLine mw_statusLine4xx modifies mw_statusLine_any := {statusCode := (400 .. 499)}
+
+ template(present) StatusLine mw_statusLine5xx modifies mw_statusLine_any := {statusCode := (500 .. 599)}
+
+ template(present) StatusLine mw_statusLine6xx modifies mw_statusLine_any := {statusCode := (600 .. 699)}
+
+ template(present) StatusLine mw_statusLineFinal modifies mw_statusLine_any := {statusCode := (200 .. 699)}
+
+ template(present) NameAddr mw_NameAddr_DispName_User_Host(
+ template charstring p_dn,
+ template(present) charstring p_user := ?,
+ template charstring p_host
+ ) := {
+ displayName := p_dn,
+ addrSpec := {
+ scheme := c_sipScheme, //* contains "sip"
+ components := {
+ sip := {
+ userInfo := {
+ userOrTelephoneSubscriber := p_user,
+ password := *
+ },
+ hostPort := {
+ host := p_host, //* hostname, IPv4 or IPv6 as a charstring
+ portField :=
+ * //* optional integer
+ }
+ }
+ },
+ urlParameters := {m_UserPhone},
+ headers := *
+ }
+ }
+
+ template(present) Addr_Union mw_AddrUnion_Nameaddr(
+ template charstring p_dn,
+ template(present) charstring p_user := ?,
+ template charstring p_host
+ ) := {
+ nameAddr := mw_NameAddr_DispName_User_Host(p_dn, p_user, p_host)
+ }
+
+ template(present) Addr_Union mw_AddrUnion_SipUrl(
+ template(present) charstring p_user := ?,
+ template charstring p_host
+ ) := {
+ addrSpecUnion := mw_SipUrl_User_Host(p_user, p_host)
+ }
+
+
+ } //* end group Subfields
+
+ group HeaderFieldTemplates {
+ template(value) LibSip_SIPTypesAndValues.Allow m_Allow(
+ template(value) Method_List p_methods
+ ) := {
+ fieldName := ALLOW_E,
+ methods := p_methods
+ }
+
+ template(present) LibSip_SIPTypesAndValues.Allow mw_Allow(
+ template(value) charstring p_method
+ ) := {
+ fieldName := ALLOW_E,
+ methods := superset(p_method)
+ }
+
+ template(value) GenericParam m_Cause(
+ template(omit) GenValue p_cause := omit
+ ) := {
+ id := "cause",
+ paramValue := p_cause
+ }
+
+ template(present) GenericParam mw_Cause_base(
+ template GenValue p_cause
+ ) := {
+ id := "cause",
+ paramValue := p_cause
+ }
+
+ template(present) GenericParam mw_Cause(
+ template(value) charstring p_cause
+ ) := {
+ id := ?,
+ paramValue := { tokenOrHost := pattern "*{p_cause}*" }
+ }
+
+ template(value) Authorization m_Authorization(
+ template(value) Credentials p_credentials
+ ) := {
+ fieldName := AUTHORIZATION_E,
+ body := {p_credentials}
+ }
+
+ template(value) Authorization m_Authorization_digest(
+ template(value) CommaParam_List p_commaParam_List
+ ) := {
+ fieldName := AUTHORIZATION_E,
+ body := {{digestResponse := p_commaParam_List}}
+ }
+
+ template(present) Authorization mw_Authorization_digest(
+ template(present) CommaParam_List p_commaParam_List := ?
+ ) := {
+ fieldName := AUTHORIZATION_E,
+ body := {{digestResponse := p_commaParam_List}}
+ }
+
+ template(value) Authorization m_add_Authorization_digest(
+ template(value) Authorization p_auth,
+ template(value) CommaParam_List p_commaParam_List
+ ) := {
+ fieldName := AUTHORIZATION_E,
+ body := {{digestResponse := f_merge_CommaParam_List(p_auth.body[0].digestResponse, p_commaParam_List)}}
+ }
+
+ template(present) Authorization mw_Authorization_other := {
+ fieldName := AUTHORIZATION_E,
+ body := {{otherResponse := ?}}
+ }
+
+ template(value) Contact m_Contact(
+ template(value) SipUrl p_sipUrl
+ ) := {
+ fieldName := CONTACT_E,
+ contactBody := {
+ contactAddresses := {
+ {
+ addressField := {addrSpecUnion := p_sipUrl},
+ contactParams := omit
+ }
+ }
+ } //* end contactBody
+ } //* end m_Contact
+
+ template(value) Contact m_Contact_profile(
+ template(value) SipUserProfile p_userprofile
+ ) := {
+ fieldName := CONTACT_E,
+ contactBody := {
+ contactAddresses := {
+ {
+ addressField := {addrSpecUnion := m_SipUrl_contactIpaddr(p_userprofile)},
+ contactParams := omit
+ }
+ }
+ } //* end
+ //* contactBody
+ } //* end m_Contact
+
+
+ template(value) Contact m_Contact_profile_expires(
+ template(value) SipUserProfile p_userprofile,
+ template(value) GenValue p_expires
+ ) := {
+ fieldName := CONTACT_E,
+ contactBody := {
+ contactAddresses := {
+ {
+ addressField := {addrSpecUnion := m_SipUrl_contactIpaddr(p_userprofile)},
+ contactParams := {
+ {
+ "expires",
+ p_expires
+ }
+ }
+ }
+ }
+ } //* end contactBody
+ } //* end m_Contact
+
+ template(value) From m_From(
+ template(value) NameAddr p_nameAddr,
+ template(value) GenValue p_tag_str
+ ) := {
+ fieldName := FROM_E,
+ addressField := {nameAddr := p_nameAddr}, //* end addressField
+ fromParams := {
+ {
+ id := c_tagId,
+ paramValue := p_tag_str
+ }
+ }
+ }
+
+ template(value) From m_From_Anonymous(
+ template(value) GenValue p_tag_str
+ ) := {
+ fieldName := FROM_E,
+ addressField := {
+ nameAddr :=
+ m_NameAddr(
+ "Anonymous",
+ //* optional charstring
+ m_SipUrl_Anonymous //* SipUrl
+ )
+ }, //* end addressField
+ fromParams := {
+ {
+ id := c_tagId,
+ paramValue := p_tag_str
+ }
+ }
+ }
+
+ template(value) From m_From_SipUrl(
+ template(value) SipUrl p_sipUrl
+ ) := {
+ fieldName := FROM_E,
+ addressField := {
+ nameAddr :=
+ m_NameAddr(
+ omit,
+ //* optional charstring
+ p_sipUrl //* SipUrl
+ )
+ }, //* end addressField
+ fromParams := omit
+ }
+
+ template(value) Event m_Event_base := {
+ fieldName := EVENT_E,
+ eventType := "",
+ eventParams := omit
+ }
+
+ template(value) Event m_Event_refer modifies m_Event_base := {eventType := "refer"}
+
+ template(value) Event m_Event_conference modifies m_Event_base := {eventType := "conference"}
+
+ template(value) Event m_Event_presence modifies m_Event_base := {eventType := "presence"}
+
+ template(value) Event m_Event_reg modifies m_Event_base := {eventType := "reg"}
+
+ template(value) Event m_Event_cdiv modifies m_Event_base := {eventType := "comm-div-info"}
+
+ template(value) Event m_Event_mcid := m_Event_cdiv;
+
+ template(value) Expires m_Expires_base := {
+ fieldName := EXPIRES_E,
+ deltaSec := ""
+ }
+
+ template(value) Expires m_Expires_600000 modifies m_Expires_base := {deltaSec := "600000"}
+
+ template(value) Expires m_Expires(
+ template(value) charstring p_deltaSec
+ ) modifies m_Expires_base := {
+ deltaSec := p_deltaSec
+ }
+
+ template(present) Expires mw_Expires(
+ template(present) charstring p_deltaSec := ?
+ ) := {
+ fieldName := EXPIRES_E,
+ deltaSec := p_deltaSec
+ }
+
+ template(value) HistoryInfo m_HistoryInfo(
+ template(value) HistoryInfo_List p_HistoryInfo_List
+ ) := {
+ fieldName := HISTORY_INFO_E,
+ historyInfoList := p_HistoryInfo_List
+ }
+
+ template(present) HistoryInfo mw_HistoryInfo(
+ template(present) HistoryInfo_List p_HistoryInfo_List := ?
+ ) := {
+ fieldName := HISTORY_INFO_E,
+ historyInfoList := p_HistoryInfo_List
+ }
+
+ template(value) HistoryInfoEntry m_HistoryInfoEntry(
+ template(value) SipUrl p_Url,
+ template(omit) IntegerList p_index := omit,
+ template(omit) SemicolonParam_List p_paramlist := omit
+ ) := {
+ nameAddr := m_NameAddr(omit, p_Url),
+ hiIndex := p_index,
+ hiExtention := p_paramlist
+ }
+
+ template(present) HistoryInfoEntry mw_HistoryInfoEntry(
+ template(present) SipUrl p_Url := ?,
+ template IntegerList p_index,
+ template SemicolonParam_List p_paramlist
+ ) := {
+ nameAddr := mw_NameAddr(*, p_Url),
+ hiIndex := p_index,
+ hiExtention := p_paramlist
+ }
+
+ template(value) PAssertedID m_PAssertedID(
+ template(value) Addr_Union p_pAssertedIDValue
+ ) := {
+ fieldName := P_ASSERTED_ID_E,
+ pAssertedIDValueList := {p_pAssertedIDValue}
+ }
+
+ template(value) PAssertedID m_PAssertedID_2x(
+ template(value) Addr_Union p_pAssertedIDValue,
+ template(value) Addr_Union p_pAssertedIDValue2
+ ) modifies m_PAssertedID := {
+ pAssertedIDValueList := {p_pAssertedIDValue, p_pAssertedIDValue2}
+ }
+
+ template(present) PAssertedID mw_PAssertedID(
+ template(present) PAssertedIDValue p_pAssertedIDValue := ?
+ ) := {
+ fieldName := P_ASSERTED_ID_E,
+ pAssertedIDValueList := {p_pAssertedIDValue}
+ }
+
+ template(present) PAssertedIDValue mw_PAssertedIDValue(
+ template(present) SipUrl p_SipUrl := ?
+ ) := {
+ nameAddr := {
+ displayName := *,
+ addrSpec := p_SipUrl
+ }
+ }
+
+ template(value) PPreferredID m_PPreferredID(
+ template(value) Addr_Union p_pPreferredIDValue
+ ) := {
+ fieldName := P_PREFERRED_ID_E,
+ pPreferredIDValueList := {p_pPreferredIDValue}
+ }
+
+ template(value) Privacy m_Privacy(
+ template(value) PrivacyValue p_privacy
+ ) := {
+ fieldName := PRIVACY_E,
+ privValueList := {p_privacy}
+ }
+
+ template(present) Privacy mw_Privacy_Base(
+ template(present) charstring p_value := ?
+ ) := {
+ fieldName := PRIVACY_E,
+ privValueList := {*, p_value, *}
+ }
+
+ template(present) Privacy mw_Privacy_id := mw_Privacy_Base("id");
+
+ template(present) Privacy mw_Privacy_user := mw_Privacy_Base("user");
+
+ template(value) RAck m_RAck(
+ integer p_responseNum,
+ integer p_seqNumber,
+ charstring p_method
+ ) := {
+ fieldName := RACK_E,
+ responseNum := p_responseNum,
+ seqNumber := p_seqNumber,
+ method := p_method
+ }
+
+ template(value) Reason m_Reason(
+ template(value) integer p_cause
+ ) := {
+ fieldName := REASON_E,
+ reasonValues := {m_ReasonValue({tokenOrHost := int2str(valueof(p_cause))}, { tokenOrHost := "dummy"})}
+ }
+
+ template(value) Reason m_Reason21 := {
+ fieldName := REASON_E,
+ reasonValues := {m_ReasonValue({tokenOrHost := int2str(21)}, { tokenOrHost := "call reject"})}
+ }
+
+ template(present) Reason mw_Reason_Base := {
+ fieldName := REASON_E,
+ reasonValues := {}
+ }
+
+ template(present) Reason mw_Reason(
+ template(value) GenValue p_cause
+ ) modifies mw_Reason_Base := {
+ reasonValues := {mw_ReasonValue(p_cause, ?)}
+ }
+
+ template(present) Reason mw_ReasonSIP(
+ template(value) GenValue p_cause
+ ) modifies mw_Reason_Base := {
+ reasonValues := {mw_ReasonValueSIP(p_cause, ?)}
+ }
+
+ template(value) RecordRoute m_recordRoute_currIpAddr(
+ template(value) SipUserProfile p_userprofile
+ ) := {
+ fieldName := RECORD_ROUTE_E,
+ routeBody := {
+ {
+ nameAddr := {
+ displayName := omit,
+ addrSpec := {
+ scheme := c_sipScheme, //* contains "sip"
+ components := {
+ sip := {
+ userInfo := omit,
+ hostPort := {
+ host := p_userprofile.currIpaddr,
+ portField := p_userprofile.currPort
+ }
+ }
+ },
+ urlParameters := omit,
+ headers := omit
+ }
+ },
+ rrParam := omit
+ }
+ }
+ }
+
+ template(value) RecordRoute m_recordRoute_currIpAddr_params(
+ template(value) SipUserProfile p_userprofile,
+ template(value) SemicolonParam_List p_urlParameters
+ ) := {
+ fieldName := RECORD_ROUTE_E,
+ routeBody := {
+ {
+ nameAddr := {
+ displayName := omit,
+ addrSpec := {
+ scheme := c_sipScheme, //* contains "sip"
+ components := {
+ sip := {
+ userInfo := omit,
+ hostPort := {
+ host := p_userprofile.currIpaddr,
+ portField := p_userprofile.currPort
+ }
+ }
+ },
+ urlParameters := p_urlParameters,
+ headers := omit
+ }
+ },
+ rrParam := omit
+ }
+ }
+ }
+
+ template(value) RouteBody m_routeBody_currIpAddr(
+ template(value) SipUserProfile p_userprofile
+ ) := {
+ nameAddr := {
+ displayName := omit,
+ addrSpec := {
+ scheme := c_sipScheme, //* contains "sip"
+ components := {
+ sip := {
+ userInfo := omit,
+ hostPort := {
+ host := p_userprofile.homeDomain,
+ portField := p_userprofile.currPort
+ }
+ }
+ },
+ urlParameters := omit,
+ headers := omit
+ }
+ },
+ rrParam := omit
+ }
+
+ template(value) ReferredBy m_ReferredBy_SipUrl(
+ template(value) SipUrl p_sipUrl
+ ) := {
+ fieldName := REFERRED_BY_E,
+ nameAddr :=
+ m_NameAddr(
+ // STF471 {displayName
+ omit,
+ // := omit,
+ p_sipUrl // addrSpec:=p_sipUrl}
+ ),
+ referredbyIdParams := omit
+ }
+
+ template(value) ReferTo m_ReferTo_SipUrl(
+ template(value) SipUrl p_sipUrl,
+ template(value) GenValue p_method
+ ) := {
+ fieldName := REFER_TO_E,
+ nameAddr :=
+ m_NameAddr(
+ // STF471 {displayName
+ omit,
+ // := omit,
+ p_sipUrl // addrSpec:=p_sipUrl}
+ ),
+ referToParams := {
+ {
+ id := "method",
+ paramValue := p_method
+ }
+ }
+ }
+
+ template(value) ReferSub m_ReferSub(
+ template(value) boolean p_value
+ ) := {
+ fieldName := REFER_SUB_E,
+ referSubValue := p_value,
+ referSubParams := omit
+ }
+
+ template(value) Replaces m_Replaces(
+ template(value) charstring p_callId,
+ template(value) GenValue p_toTag,
+ template(value) GenValue p_fromTag
+ ) := {
+ fieldName := REPLACES_E,
+ callid := p_callId,
+ replacesParams := {
+ {
+ id := "to-tag",
+ paramValue := p_toTag
+ },
+ {
+ id := "from-tag",
+ paramValue := p_fromTag
+ }
+ }
+ }
+
+ template(value) Require m_Require_empty := {
+ fieldName := REQUIRE_E,
+ optionsTags := {""}
+ }
+
+ template(value) Require m_Require_replaces modifies m_Require_empty := {optionsTags := {c_replaces}}
+
+ template(value) Require m_Require_100rel modifies m_Require_empty := {optionsTags := {c_tag100rel}}
+
+ template(value) Require m_Require_prec modifies m_Require_empty := {optionsTags := {c_tagPrecond}}
+
+ template(value) SubscriptionState m_SubscriptionState_active := {
+ fieldName := SUBSCRIPTION_STATE_E,
+ subState := "active",
+ substateParams := {
+ {
+ id := "expires",
+ paramValue := {tokenOrHost := "60000"}
+ }
+ }
+ }
+
+ template(value) Supported m_Supported_empty := {
+ fieldName := SUPPORTED_E,
+ optionsTags := {""}
+ }
+
+ template(value) Supported m_Supported_fromChange modifies m_Supported_empty := {optionsTags := {c_tagFromChange}}
+
+ template(value) Supported m_Supported_prec modifies m_Supported_empty := {optionsTags := {c_tagPrecond}}
+
+ template(value) Supported m_Supported_100rel modifies m_Supported_empty := {optionsTags := {c_tag100rel}}
+
+ template(value) Supported m_Supported_100rel_prec modifies m_Supported_empty := {optionsTags := {c_tag100rel, c_tagPrecond}}
+
+ template(value) GenericParam m_Text(
+ template(value) GenValue p_text
+ ) := {
+ id := "text",
+ paramValue := p_text
+ }
+
+ template(present) GenericParam mw_Text(
+ template GenValue p_text
+ ) := {
+ id := "text",
+ paramValue := p_text
+ }
+
+ template(value) GenericParam m_UserPhone := {
+ id := "user",
+ paramValue := { quotedString := "phone" }
+ }
+
+ template(value) GenericParam m_UserToUserEncodingHex := {
+ id := "encoding",
+ paramValue := { quotedString := "hex" }
+ }
+
+ template(value) UserToUser m_UserToUserData(
+ template(value) UserToUser.uuiData p_U2UData
+ ) := {
+ fieldName := USER_TO_USER_E,
+ uuiData := p_U2UData,
+ uuiParam := m_UserToUserEncodingHex
+ }
+
+ template(value) To m_To(
+ template(value) SipUrl p_sipUrl
+ ) := {
+ fieldName := TO_E,
+ addressField := {
+ nameAddr :=
+ m_NameAddr(
+ "ETSI Tester",
+ //* optional charstring
+ p_sipUrl //* SipUrl
+ )
+ }, //* end addressField
+ toParams := omit
+ }
+
+ template(value) To m_To_SipUrl(
+ template(value) SipUrl p_sipUrl
+ ) modifies m_To := {
+ addressField := {
+ nameAddr := {
+ displayName :=
+ omit //* optional charstring
+ }
+ } //* end addressField
+ }
+
+ template(present) To mw_To_NameAddr_SipUrl(
+ template charstring p_dn,
+ template(present) charstring p_user := ?,
+ template charstring p_host
+ ) := {
+ fieldName := TO_E,
+ addressField := (mw_AddrUnion_Nameaddr(p_dn, p_user, p_host), mw_AddrUnion_SipUrl(p_user, p_host)),
+ toParams := *
+ }
+
+ template(present) To mw_To(
+ template(present) SipUrl p_sipUrl := ?
+ ) := {
+ fieldName := TO_E,
+ addressField := {nameAddr := mw_NameAddr(*, p_sipUrl)},
+ toParams := *
+ }
+
+ template(present) From mw_From(
+ template(present) SipUrl p_sipUrl := ?
+ ) := {
+ fieldName := FROM_E,
+ addressField := {nameAddr := mw_NameAddr(*, p_sipUrl)},
+ fromParams := *
+ }
+
+ template(present) From mw_From_NameAddr_SipUrl(
+ template charstring p_dn,
+ template(present) charstring p_user := ?,
+ template charstring p_host
+ ) := {
+ fieldName := FROM_E,
+ addressField := (mw_AddrUnion_Nameaddr(p_dn, p_user, p_host), mw_AddrUnion_SipUrl(p_user, p_host)),
+ fromParams := *
+ }
+ template(value) ViaBody m_ViaBody_currIpaddr(
+ template(value) charstring p_branch_val,
+ template(value) SipUserProfile p_userprofile
+ ) := {
+ sentProtocol := m_SentProtocol(PX_SIP_TRANSPORT),
+ sentBy := {
+ host := p_userprofile.currIpaddr,
+ portField := p_userprofile.currPort
+ },
+ viaParams := {
+ {
+ id := c_branchId,
+ paramValue := {
+ tokenOrHost := p_branch_val
+ }
+ }
+ }
+ }
+
+ template(present) ViaBody mw_ViaBody_interface(
+ template(present) HostPort p_hostport := ?
+ ) := {
+ sentProtocol := m_SentProtocol(PX_SIP_TRANSPORT),
+ sentBy := {
+ host := p_hostport.host,
+ portField := p_hostport.portField
+ },
+ viaParams := *
+ }
+
+ template(present) Via mw_Via(
+ template(present) ViaBody p_viabody := ?
+ ) := {
+ fieldName := VIA_E,
+ viaBody := {*, p_viabody, *} // superset(p_viabody)
+ }
+
+ template(present) CallId mw_CallId_any := {
+ fieldName := CALL_ID_E,
+ callid := ?
+ }
+
+ template(present) Require mw_Require_Base := {
+ fieldName := REQUIRE_E,
+ optionsTags := {}
+ }
+
+ template(present) Require mw_Require_not_100rel modifies mw_Require_Base := {optionsTags := superset(complement(c_tag100rel))}
+
+ template(present) Require mw_require_100rel modifies mw_Require_Base := {optionsTags := superset(c_tag100rel)}
+
+ template(present) RecordRoute mw_recordroute(
+ template(present) RouteBody p_routeBody := ?
+ ) := {
+ fieldName := RECORD_ROUTE_E,
+ routeBody := {*, p_routeBody, *} // superset(p_routeBody)
+ }
+
+ template(present) Route mw_route(
+ template(present) RouteBody_List p_routeBody := ?
+ ) := {
+ fieldName := ROUTE_E,
+ routeBody := p_routeBody
+ }
+
+ template(present) Supported mw_Supported_Base := {
+ fieldName := SUPPORTED_E,
+ optionsTags := {}
+ }
+
+ template(present) Supported mw_Supported_100rel_prec modifies mw_Supported_Base := {optionsTags := superset(c_tag100rel, c_tagPrecond)}
+
+ template(present) Supported mw_Supported_100rel modifies mw_Supported_Base := {optionsTags := superset(c_tag100rel)}
+
+ template(present) Supported mw_Supported_fromChange modifies mw_Supported_Base := {optionsTags := superset(c_tagFromChange)}
+
+ template(present) UserToUser mw_UserToUserData(
+ template(present) UserToUser.uuiData p_U2UData := ?
+ ) := {
+ fieldName := USER_TO_USER_E,
+ uuiData := p_U2UData,
+ uuiParam := ?
+ }
+
+ template(present) Contact mw_Contact_conference := {
+ fieldName := CONTACT_E,
+ contactBody := {
+ contactAddresses := {
+ {
+ addressField := {
+ nameAddr := {
+ displayName := *,
+ addrSpec := {
+ scheme := ?,
+ components := ?,
+ urlParameters := {
+ {
+ "isfocus",
+ *
+ },
+ *
+ },
+ headers := *
+ }
+ }
+ },
+ contactParams := *
+ }
+ }
+ }
+ }
+
+ template(value) AlertInfo m_AlertInfo_Base := {
+ fieldName := ALERT_INFO_E,
+ alertInfoBody := {}
+ }
+
+ template(value) AlertInfo m_AlertInfo(
+ template(value) charstring p_urn
+ ) modifies m_AlertInfo_Base := {
+ alertInfoBody := {
+ {
+ p_urn,
+ omit
+ }
+ }
+ }
+
+ template(present) AlertInfo mw_AlertInfo(
+ template(present) charstring p_urn := ?
+ ) modifies m_AlertInfo_Base := {
+ alertInfoBody :=
+ superset(
+ {
+ p_urn,
+ omit
+ }
+ )
+ }
+
+
+ } //* end of group HeaderFieldTemplates
+
+
+ group MessageTemplates {
+
+ group dummy_templates {
+
+ group dummy_parameter_send {
+
+ template(value) RequestLine m_requestLine_dummy(
+ template(value) Method p_method
+ ) := {
+ method := p_method,
+ requestUri := c_unavailableUri,
+ sipVersion := c_sipNameVersion
+ }
+
+ template(value) MessageHeader m_msgHeader_dummy := {
+ accept := omit,
+ acceptContact := omit,
+ acceptEncoding := omit,
+ acceptLanguage := omit,
+ alertInfo := omit,
+ allow := omit,
+ allowEvents := omit, //* RFC3265
+ authenticationInfo := omit,
+ authorization := omit,
+ callId := c_empty_CallId,
+ callInfo := omit,
+ contact := omit,
+ contentDisposition := omit,
+ contentEncoding := omit,
+ contentLanguage := omit,
+ contentLength := {
+ fieldName := CONTENT_LENGTH_E,
+ len := 0
+ },
+ contentType := omit, //* if message body present m,
+ //* else not present
+ cSeq := c_empty_cSeq,
+ date := omit,
+ errorInfo := omit,
+ event := omit, //* RFC3265
+ expires := omit,
+ fromField := c_empty_From,
+ geolocation := omit,
+ geolocationRouting := omit,
+ historyInfo := omit, //* RFC4244
+ inReplyTo := omit,
+ maxForwards := c_maxForwards70,
+ mimeVersion := omit,
+ minExpires := omit,
+ minSE := omit, //* RFC4028
+ organization := omit,
+ pAccessNetworkInfo := omit, //* RFC3455
+ pAssertedID := omit,
+ pAssertedService := omit,
+ pAssociatedURI := omit,
+ path := omit, //* RFC3327
+ pCalledPartyID := omit, //* RFC3455
+ pChargingFunctionAddresses := omit, //* RFC3455
+ pChargingVector := omit, //* RFC3455
+ pEarlyMedia := omit, //* RFC5009
+ pMediaAuthorization := omit, //* RFC3313
+ pPreferredID := omit,
+ pPreferredService := omit,
+ priority := omit,
+ privacy := omit,
+ proxyAuthenticate := omit,
+ proxyAuthorization := omit,
+ proxyRequire := omit,
+ pVisitedNetworkID := omit, //* RFC3455
+ rAck := omit,
+ rSeq := omit,
+ reason := omit,
+ recordRoute := omit,
+ requestDisposition := omit,
+ referredBy := omit, //* RFC3892 - REFER method
+ referTo := omit, //* RFC3515 - REFER method
+ referSub := omit, //* RFC4488 - REFER method
+ replaces := omit, //* RFC3891
+ replyTo := omit,
+ require := omit,
+ retryAfter := omit,
+ route := omit,
+ securityClient := omit, //* RFC3329
+ securityServer := omit, //* RFC3329
+ securityVerify := omit, //* RFC3329
+ server := omit,
+ serviceRoute := omit, //* RFC3608
+ sessionExpires := omit, //* RFC4028
+ sessionId := omit,
+ sipETag := omit,
+ sipIfMatch := omit,
+ subject := omit,
+ subscriptionState := omit, //* RFC3265
+ supported := omit,
+ timestamp := omit,
+ toField := c_empty_To,
+ unsupported := omit,
+ userToUser := omit,
+ userAgent := omit,
+ via := c_empty_Via,
+ warning := omit,
+ wwwAuthenticate := omit,
+ undefinedHeader_List := omit
+ }
+
+
+ } //* group dummy_parameter_send
+
+ group dummy_parameter_receive {
+
+ template(present) RequestLine mw_requestLine_dummy(
+ Method p_method
+ ) := {
+ method := p_method,
+ requestUri := ?,
+ sipVersion := c_sipNameVersion
+ }
+
+ template(present) MessageHeader mw_msgHeader_dummy := {
+ accept := *,
+ acceptContact := *,
+ acceptEncoding := *,
+ acceptLanguage := *,
+ alertInfo := *,
+ allow := *,
+ allowEvents := *, //* RFC3265
+ authenticationInfo := *,
+ authorization := *,
+ callId := ?,
+ callInfo := *,
+ contact := *,
+ contentDisposition := *,
+ contentEncoding := *,
+ contentLanguage := *,
+ contentLength := ?,
+ contentType := *,
+ cSeq := ?,
+ date := *,
+ errorInfo := *,
+ event := *, //* RFC3265
+ expires := *,
+ fromField := ?,
+ geolocation := *,
+ geolocationRouting := *,
+ historyInfo := *, //* RFC4244
+ inReplyTo := *,
+ maxForwards := *,
+ mimeVersion := *,
+ minExpires := *,
+ minSE := *, //* RFC4028
+ organization := *,
+ pAccessNetworkInfo := *, //* RFC3455
+ pAssertedID := *,
+ pAssertedService := *,
+ pAssociatedURI := *,
+ path := *, //* RFC3327
+ pCalledPartyID := *, //* RFC3455
+ pChargingFunctionAddresses := *, //* RFC3455
+ pChargingVector := *, //* RFC3455
+ pEarlyMedia := *, //* RFC5009
+ pMediaAuthorization := *, //* RFC3313
+ pPreferredID := *,
+ pPreferredService := *,
+ priority := *,
+ privacy := *,
+ proxyAuthenticate := *,
+ proxyAuthorization := *,
+ proxyRequire := *,
+ pVisitedNetworkID := *, //* RFC3455
+ rAck := *,
+ rSeq := *,
+ reason := *,
+ recordRoute := *,
+ requestDisposition := *,
+ referredBy := *, //* RFC3892 - REFER method
+ referTo := *, //* RFC3515 - REFER method
+ referSub := *, //* RFC4488 - REFER method
+ replaces := *, //* RFC 3891
+ replyTo := *,
+ require := *,
+ retryAfter := *,
+ route := *,
+ securityClient := *, //* RFC3329
+ securityServer := *, //* RFC3329
+ securityVerify := *, //* RFC3329
+ server := *,
+ serviceRoute := *, //* RFC3608
+ sessionExpires := *, //* RFC4028
+ sessionId := *,
+ sipETag := *,
+ sipIfMatch := *,
+ subject := *,
+ subscriptionState := *, //* RFC3265
+ supported := *,
+ timestamp := *,
+ toField := ?,
+ unsupported := *,
+ userToUser := *,
+ userAgent := *,
+ via := ?,
+ warning := *,
+ wwwAuthenticate := *,
+ undefinedHeader_List := *
+ }
+
+
+ } //* end group dummy_parameter_receive
+
+ group dummy_request_templates_send {
+
+ template(value) ACK_Request m_ACK_Dummy := {
+ requestLine := m_requestLine_dummy(ACK_E),
+ msgHeader := m_msgHeader_dummy,
+ messageBody := omit,
+ payload := omit
+ }
+
+ template(value) BYE_Request m_BYE_Dummy := {
+ requestLine := m_requestLine_dummy(BYE_E),
+ msgHeader := m_msgHeader_dummy,
+ messageBody := omit,
+ payload := omit
+ }
+
+ template(value) CANCEL_Request m_CANCEL_Dummy := {
+ requestLine := m_requestLine_dummy(CANCEL_E),
+ msgHeader := m_msgHeader_dummy,
+ messageBody := omit,
+ payload := omit
+ }
+
+ template(value) INFO_Request m_INFO_Dummy := {
+ requestLine := m_requestLine_dummy(INFO_E),
+ msgHeader := m_msgHeader_dummy,
+ messageBody := omit,
+ payload := omit
+ }
+
+ template(value) INVITE_Request m_INVITE_Dummy := {
+ requestLine := m_requestLine_dummy(INVITE_E),
+ msgHeader := m_msgHeader_dummy,
+ messageBody := omit,
+ payload := omit
+ }
+
+ template(value) MESSAGE_Request m_MESSAGE_Dummy := {
+ requestLine := m_requestLine_dummy(MESSAGE_E),
+ msgHeader := m_msgHeader_dummy,
+ messageBody := omit,
+ payload := omit
+ }
+
+ template(value) NOTIFY_Request m_NOTIFY_Dummy := {
+ requestLine := m_requestLine_dummy(NOTIFY_E),
+ msgHeader := m_msgHeader_dummy,
+ messageBody := omit,
+ payload := omit
+ }
+
+ template(value) OPTIONS_Request m_OPTIONS_Dummy := {
+ requestLine := m_requestLine_dummy(OPTIONS_E),
+ msgHeader := m_msgHeader_dummy,
+ messageBody := omit,
+ payload := omit
+ }
+
+ template(value) PRACK_Request m_PRACK_Dummy := {
+ requestLine := m_requestLine_dummy(PRACK_E),
+ msgHeader := m_msgHeader_dummy,
+ messageBody := omit,
+ payload := omit
+ }
+
+ template(value) PUBLISH_Request m_PUBLISH_Dummy := {
+ requestLine := m_requestLine_dummy(PUBLISH_E),
+ msgHeader := m_msgHeader_dummy,
+ messageBody := omit,
+ payload := omit
+ }
+
+ template(value) REGISTER_Request m_REGISTER_Dummy := {
+ requestLine := m_requestLine_dummy(REGISTER_E),
+ msgHeader := m_msgHeader_dummy,
+ messageBody := omit,
+ payload := omit
+ }
+
+ template(value) REFER_Request m_REFER_Dummy := {
+ requestLine := m_requestLine_dummy(REFER_E),
+ msgHeader := m_msgHeader_dummy,
+ messageBody := omit,
+ payload := omit
+ }
+
+ template(value) SUBSCRIBE_Request m_SUBSCRIBE_Dummy := {
+ requestLine := m_requestLine_dummy(SUBSCRIBE_E),
+ msgHeader := m_msgHeader_dummy,
+ messageBody := omit,
+ payload := omit
+ }
+
+ template(value) UPDATE_Request m_UPDATE_Dummy := {
+ requestLine := m_requestLine_dummy(UPDATE_E),
+ msgHeader := m_msgHeader_dummy,
+ messageBody := omit,
+ payload := omit
+ }
+
+
+ } //* end group dummy_request_templates_send
+ group dummy_request_templates_receive {
+
+ template(present) ACK_Request mw_ACK_Dummy := {
+ requestLine := mw_requestLine_dummy(ACK_E),
+ msgHeader := mw_msgHeader_dummy,
+ messageBody := *,
+ payload := *
+ }
+
+ template(present) BYE_Request mw_BYE_Dummy := {
+ requestLine := mw_requestLine_dummy(BYE_E),
+ msgHeader := mw_msgHeader_dummy,
+ messageBody := *,
+ payload := *
+ }
+
+ template(present) CANCEL_Request mw_CANCEL_Dummy := {
+ requestLine := mw_requestLine_dummy(CANCEL_E),
+ msgHeader := mw_msgHeader_dummy,
+ messageBody := *,
+ payload := *
+ }
+
+ template(present) INFO_Request mw_INFO_Dummy := {
+ requestLine := mw_requestLine_dummy(INFO_E),
+ msgHeader := mw_msgHeader_dummy,
+ messageBody := *,
+ payload := *
+ }
+
+ template(present) INVITE_Request mw_INVITE_Dummy := {
+ requestLine := mw_requestLine_dummy(INVITE_E),
+ msgHeader := mw_msgHeader_dummy,
+ messageBody := *,
+ payload := *
+ }
+
+ template(present) MESSAGE_Request mw_MESSAGE_Dummy := {
+ requestLine := mw_requestLine_dummy(MESSAGE_E),
+ msgHeader := mw_msgHeader_dummy,
+ messageBody := *,
+ payload := *
+ }
+
+ template(present) OPTIONS_Request mw_OPTIONS_Dummy := {
+ requestLine := mw_requestLine_dummy(OPTIONS_E),
+ msgHeader := mw_msgHeader_dummy,
+ messageBody := *,
+ payload := *
+ }
+
+ template(present) NOTIFY_Request mw_NOTIFY_Dummy := {
+ requestLine := mw_requestLine_dummy(NOTIFY_E),
+ msgHeader := mw_msgHeader_dummy,
+ messageBody := *,
+ payload := *
+ }
+
+ template(present) PRACK_Request mw_PRACK_Dummy := {
+ requestLine := mw_requestLine_dummy(PRACK_E),
+ msgHeader := mw_msgHeader_dummy,
+ messageBody := *,
+ payload := *
+ }
+
+ template(present) PUBLISH_Request mw_PUBLISH_Dummy := {
+ requestLine := mw_requestLine_dummy(PUBLISH_E),
+ msgHeader := mw_msgHeader_dummy,
+ messageBody := *,
+ payload := *
+ }
+
+ template(present) REFER_Request mw_REFER_Dummy := {
+ requestLine := mw_requestLine_dummy(REFER_E),
+ msgHeader := mw_msgHeader_dummy,
+ messageBody := *,
+ payload := *
+ }
+
+ template(present) REGISTER_Request mw_REGISTER_Dummy := {
+ requestLine := mw_requestLine_dummy(REGISTER_E),
+ msgHeader := mw_msgHeader_dummy,
+ messageBody := *,
+ payload := *
+ }
+
+ template(present) SUBSCRIBE_Request mw_SUBSCRIBE_Dummy := {
+ requestLine := mw_requestLine_dummy(SUBSCRIBE_E),
+ msgHeader := mw_msgHeader_dummy,
+ messageBody := *,
+ payload := *
+ }
+
+ template(present) UPDATE_Request mw_UPDATE_Dummy := {
+ requestLine := mw_requestLine_dummy(UPDATE_E),
+ msgHeader := mw_msgHeader_dummy,
+ messageBody := *,
+ payload := *
+ }
+
+
+ } //* end group dummy_request_templates_receive
+
+ group dummy_response_templates_send {
+
+ template(value) Response m_Response_Dummy := {
+ statusLine := c_statusLine100,
+ msgHeader := m_msgHeader_dummy,
+ messageBody := omit,
+ payload := omit
+ }
+
+
+ } //* group dummy_response_templates_send
+
+ group dummy_response_templates_receive {
+
+ template(present) Response mw_Response_Dummy := {
+ statusLine := ?,
+ msgHeader := mw_msgHeader_dummy,
+ messageBody := *,
+ payload := *
+ }
+
+
+ } //* group dummy_response_templates_receive
+ }
+
+ group base_templates {
+
+ template(value) CSeq m_cSeq(
+ template(value) integer p_seqNumber,
+ template(value) charstring p_method
+ ) := {
+ fieldName := CSEQ_E,
+ seqNumber := p_seqNumber,
+ method := p_method
+ }
+
+ template(value) ContentLength m_contentLength(
+ template(value) integer p_len
+ ) := {
+ fieldName := CONTENT_LENGTH_E,
+ len := p_len
+ }
+
+ template(value) ContentType m_contentType(
+ template(value) charstring p_mediaType
+ ) := {
+ fieldName := CONTENT_TYPE_E,
+ mediaType := p_mediaType
+ }
+
+ template(present) ContentType mw_contentType(
+ in template(present) charstring p_mediaType := ?
+ ) := {
+ fieldName := CONTENT_TYPE_E,
+ mediaType := p_mediaType
+ }
+
+ group request_send {
+
+ template(value) ACK_Request m_ACK_Request_Base(
+ template(value) SipUrl p_requestUri,
+ template(omit) CallId p_callId := omit,
+ template(omit) CSeq p_cSeq := omit,
+ template(value) From p_from,
+ template(value) To p_to,
+ template(value) Via p_via
+ ) modifies m_ACK_Dummy := {
+ requestLine := {requestUri := p_requestUri},
+ msgHeader := {
+ callId := p_callId,
+ cSeq := m_cSeq(p_cSeq.seqNumber, "ACK"), // STF471
+ // {fieldName:=CSEQ_E,
+ // seqNumber:=
+ // p_cSeq.seqNumber,
+ // method:=
+ // "ACK"},
+ fromField := p_from,
+ toField := p_to,
+ via := p_via
+ }
+ }
+
+ template(value) ACK_Request m_ACK_Request_withRecordRoute(
+ template(value) SipUrl p_requestUri,
+ template(omit) CallId p_callId := omit,
+ template(omit) CSeq p_cSeq := omit,
+ template(value) From p_from,
+ template(value) To p_to,
+ template(value) Via p_via,
+ template(value) Route p_route
+ ) modifies m_ACK_Request_Base := {
+ msgHeader := {
+ route := p_route,
+ contentLength := m_contentLength(0)
+ }
+ }
+
+ template(value) BYE_Request m_BYE_Request_Base(
+ template(value) SipUrl p_requestUri,
+ template(omit) CallId p_callId := omit,
+ template(omit) CSeq p_cSeq := omit,
+ template(value) From p_from,
+ template(value) To p_to,
+ template(value) Via p_via
+ ) modifies m_BYE_Dummy := {
+ requestLine := {requestUri := p_requestUri},
+ msgHeader := {
+ callId := p_callId,
+ cSeq := p_cSeq,
+ fromField := p_from,
+ toField := p_to,
+ via := p_via
+ }
+ }
+
+ template(value) CANCEL_Request m_CANCEL_Request_Base(
+ template(value) SipUrl p_requestUri,
+ template(omit) CallId p_callId := omit,
+ template(omit) CSeq p_cSeq := omit,
+ template(value) From p_from,
+ template(value) To p_to,
+ template(value) Via p_via
+ ) modifies m_CANCEL_Dummy := {
+ requestLine := {requestUri := p_requestUri},
+ msgHeader := {
+ callId := p_callId,
+ cSeq := p_cSeq,
+ fromField := p_from,
+ toField := p_to,
+ via := p_via
+ }
+ }
+
+ template(value) INFO_Request m_INFO_Request_Base(
+ template(value) SipUrl p_requestUri,
+ template(omit) CallId p_callId := omit,
+ template(omit) CSeq p_cSeq := omit,
+ template(value) From p_from,
+ template(value) To p_to,
+ template(value) Via p_via
+ ) modifies m_INFO_Dummy := {
+ requestLine := {requestUri := p_requestUri},
+ msgHeader := {
+ callId := p_callId,
+ cSeq := p_cSeq,
+ fromField := p_from,
+ toField := p_to,
+ via := p_via
+ }
+ }
+
+ template(value) INVITE_Request m_INVITE_Request_Base(
+ template(value) SipUrl p_requestUri,
+ template(omit) CallId p_callId := omit,
+ template(omit) CSeq p_cSeq := omit,
+ template(value) From p_from,
+ template(value) To p_to,
+ template(value) Via p_via,
+ template(value) Contact p_contact
+ ) modifies m_INVITE_Dummy := {
+ requestLine := {requestUri := p_requestUri},
+ msgHeader := {
+ callId := p_callId,
+ contact := p_contact,
+ cSeq := p_cSeq,
+ fromField := p_from,
+ toField := p_to,
+ via := p_via
+ }
+ }
+
+ template(value) MESSAGE_Request m_MESSAGE_Request_Base(
+ template(value) SipUrl p_requestUri,
+ template(omit) CallId p_callId := omit,
+ template(omit) CSeq p_cSeq := omit,
+ template(value) From p_from,
+ template(value) To p_to,
+ template(value) Via p_via
+ ) modifies m_MESSAGE_Dummy := {
+ requestLine := {requestUri := p_requestUri},
+ msgHeader := {
+ callId := p_callId,
+ cSeq := p_cSeq,
+ fromField := p_from,
+ toField := p_to,
+ via := p_via
+ }
+ }
+
+ template(value) NOTIFY_Request m_NOTIFY_Request_Base(
+ template(value) SipUrl p_requestUri,
+ template(omit) CallId p_callId := omit,
+ template(omit) CSeq p_cSeq := omit,
+ template(value) From p_from,
+ template(value) To p_to,
+ template(value) Via p_via
+ ) modifies m_NOTIFY_Dummy := {
+ requestLine := {requestUri := p_requestUri},
+ msgHeader := {
+ callId := p_callId,
+ cSeq := m_cSeq(p_cSeq.seqNumber, "NOTIFY"), // STF471
+ // {fieldName:=CSEQ_E,
+ // seqNumber:=
+ // p_cSeq.seqNumber,
+ // method:=
+ // "NOTIFY"},
+ fromField := p_from,
+ toField := p_to,
+ via := p_via
+ }
+ }
+
+ template(value) OPTIONS_Request m_OPTIONS_Request_Base(
+ template(value) SipUrl p_requestUri,
+ template(omit) CallId p_callId := omit,
+ template(omit) CSeq p_cSeq := omit,
+ template(value) From p_from,
+ template(value) To p_to,
+ template(value) Via p_via
+ ) modifies m_OPTIONS_Dummy := {
+ requestLine := {requestUri := p_requestUri},
+ msgHeader := {
+ callId := p_callId,
+ cSeq := m_cSeq(p_cSeq.seqNumber, "OPTIONS"), // STF471
+ // {fieldName:=CSEQ_E,
+ // seqNumber:=
+ // p_cSeq.seqNumber,
+ // method:=
+ // "OPTIONS"},
+ fromField := p_from,
+ toField := p_to,
+ via := p_via
+ }
+ }
+
+ template(value) PRACK_Request m_PRACK_Request_Base(
+ template(value) SipUrl p_requestUri,
+ template(omit) CallId p_callId := omit,
+ template(omit) CSeq p_cSeq := omit,
+ template(value) From p_from,
+ template(value) To p_to,
+ template(value) Via p_via,
+ template(value) RAck p_RAck
+ ) modifies m_PRACK_Dummy := {
+ requestLine := {requestUri := p_requestUri},
+ msgHeader := {
+ callId := p_callId,
+ cSeq := m_cSeq(p_cSeq.seqNumber, "PRACK"), // STF471
+ // {fieldName:=CSEQ_E,
+ // seqNumber:=
+ // p_cSeq.seqNumber,
+ // method:=
+ // "PRACK"},
+ fromField := p_from,
+ rAck := p_RAck,
+ toField := p_to,
+ via := p_via
+ },
+ messageBody := omit
+ }
+
+ template(value) PUBLISH_Request m_PUBLISH_Request_Base(
+ template(value) SipUrl p_requestUri,
+ template(omit) CallId p_callId := omit,
+ template(omit) CSeq p_cSeq := omit,
+ template(value) From p_from,
+ template(value) To p_to,
+ template(value) Via p_via,
+ template(omit) Event p_event := omit,
+ template(omit) RAck p_RAck := omit,
+ template(value) MessageBody p_mb
+ ) modifies m_PUBLISH_Dummy := {
+ requestLine := {requestUri := p_requestUri},
+ msgHeader := {
+ callId := p_callId,
+ contentLength := m_contentLength(f_MessageBodyLength(p_mb)), // STF471
+ // {fieldName
+ // :=
+ // CONTENT_LENGTH_E,
+ // len:=
+ // f_MessageBodyLength(valueof(p_mb))},
+ contentType := m_contentType(c_plainText), // STF471
+ // {fieldName
+ // :=
+ // CONTENT_TYPE_E,
+ // mediaType
+ // :=
+ // c_plainText/*c_sdp*/},
+ cSeq := m_cSeq(p_cSeq.seqNumber, "PUBLISH"), // STF471
+ // {fieldName:=CSEQ_E,
+ // seqNumber:=
+ // p_cSeq.seqNumber,
+ // method:=
+ // "PUBLISH"},
+ event := p_event,
+ rAck := p_RAck,
+ fromField := p_from,
+ toField := p_to,
+ via := p_via
+ },
+ messageBody := p_mb
+ }
+
+ template(value) REFER_Request m_REFER_Request_Base(
+ template(value) SipUrl p_requestUri,
+ template(omit) CallId p_callId := omit,
+ template(omit) CSeq p_cSeq := omit,
+ template(omit) Contact p_contact := omit,
+ template(value) From p_from,
+ template(value) To p_to,
+ template(value) Via p_via,
+ template(omit) ReferTo p_referTo := omit,
+ template(omit) ReferredBy p_referredBy := omit
+ ) modifies m_REFER_Dummy := {
+ requestLine := {requestUri := p_requestUri},
+ msgHeader := {
+ callId := p_callId,
+ contact := p_contact,
+ cSeq := m_cSeq(p_cSeq.seqNumber, "REFER"), // STF471
+ // {fieldName:=CSEQ_E,
+ // seqNumber:=
+ // p_cSeq.seqNumber,
+ // method:=
+ // "REFER"},
+ fromField := p_from,
+ referTo := p_referTo,
+ referredBy := p_referredBy,
+ toField := p_to,
+ via := p_via
+ }
+ }
+
+ template(value) REFER_Request m_REFER_Request_replaces(
+ template(value) SipUrl p_requestUri,
+ template(omit) CallId p_callId := omit,
+ template(omit) CSeq p_cSeq := omit,
+ template(omit) Contact p_contact := omit,
+ template(value) From p_from,
+ template(value) To p_to,
+ template(value) Via p_via,
+ template(value) ReferTo p_referTo,
+ template(value) ReferredBy p_referredBy,
+ template(value) Replaces p_replaces,
+ template(omit) Require p_require := omit
+ ) modifies m_REFER_Request_Base := {
+ msgHeader := {
+ replaces := p_replaces,
+ require := p_require
+ }
+ }
+
+ template(value) REGISTER_Request m_REGISTER_Request_Base(
+ template(value) SipUrl p_requestUri,
+ template(omit) CallId p_callId := omit,
+ template(omit) CSeq p_cSeq := omit,
+ template(value) From p_from,
+ template(value) To p_to,
+ template(value) Via p_via,
+ template(omit) Contact p_contact := omit,
+ template(omit) Authorization p_authorization := omit
+ ) modifies m_REGISTER_Dummy := {
+ requestLine := {requestUri := p_requestUri},
+ msgHeader := {
+ authorization := p_authorization,
+ callId := p_callId,
+ contact := p_contact,
+ cSeq := p_cSeq,
+ fromField := p_from,
+ toField := p_to,
+ supported := {
+ fieldName := SUPPORTED_E,
+ optionsTags := {"path"}
+ },
+ via := p_via
+ }
+ }
+
+ template(value) SUBSCRIBE_Request m_SUBSCRIBE_Request_Base(
+ template(value) SipUrl p_requestUri,
+ template(omit) CallId p_callId := omit,
+ template(omit) CSeq p_cSeq := omit,
+ template(value) From p_from,
+ template(value) To p_to,
+ template(value) Via p_via
+ ) modifies m_SUBSCRIBE_Dummy := {
+ requestLine := {requestUri := p_requestUri},
+ msgHeader := {
+ callId := p_callId,
+ cSeq := m_cSeq(p_cSeq.seqNumber, "SUBSCRIBE"), // STF471
+ // {fieldName:=CSEQ_E,
+ // seqNumber:=
+ // p_cSeq.seqNumber,
+ // method:=
+ // "SUBSCRIBE"},
+ fromField := p_from,
+ toField := p_to,
+ via := p_via
+ }
+ }
+
+ template(value) UPDATE_Request m_UPDATE_Request_Base(
+ template(value) SipUrl p_requestUri,
+ template(omit) CallId p_callId := omit,
+ template(omit) CSeq p_cSeq := omit,
+ template(value) From p_from,
+ template(value) To p_to,
+ template(value) Via p_via,
+ template(omit) Contact p_contact := omit,
+ template(value) MessageBody p_mb
+ ) modifies m_UPDATE_Dummy := {
+ requestLine := {requestUri := p_requestUri},
+ msgHeader := {
+ callId := p_callId,
+ contact := p_contact,
+ contentLength := m_contentLength(f_MessageBodyLength(p_mb)), // STF471
+ // {fieldName
+ // :=
+ // CONTENT_LENGTH_E,
+ // len:=
+ // f_MessageBodyLength(valueof(p_mb))},
+ contentType := m_contentType(c_sdpApplication), // STF471
+ // {fieldName
+ // :=
+ // CONTENT_TYPE_E,
+ // mediaType
+ // :=
+ // c_sdp},
+ cSeq := m_cSeq(p_cSeq.seqNumber, "UPDATE"), // STF471
+ // {fieldName:=CSEQ_E,
+ // seqNumber:=
+ // p_cSeq.seqNumber,
+ // method:=
+ // "UPDATE"},
+ fromField := p_from,
+ toField := p_to,
+ via := p_via
+ },
+ messageBody := p_mb
+ }
+
+
+ } //* end of group message_send
+
+ group request_receive {
+
+ template(present) ACK_Request mw_ACK_Request_Base(
+ template CallId p_callId
+ ) modifies mw_ACK_Dummy := {
+ msgHeader := {callId := p_callId}
+ }
+
+ template(present) BYE_Request mw_BYE_Request_Base(
+ template CallId p_callId
+ ) modifies mw_BYE_Dummy := {
+ msgHeader := {callId := p_callId}
+ }
+
+ template(present) CANCEL_Request mw_CANCEL_Request_Base(
+ template CallId p_callId
+ ) modifies mw_CANCEL_Dummy := {
+ msgHeader := {callId := p_callId}
+ }
+
+ template(present) INFO_Request mw_INFO_Request_Base(
+ template CallId p_callId
+ ) modifies mw_INFO_Dummy := {
+ msgHeader := {callId := p_callId}
+ }
+
+ template(present) INVITE_Request mw_INVITE_Request_Base modifies mw_INVITE_Dummy := {requestLine := {method := INVITE_E}}
+
+ template(present) MESSAGE_Request mw_MESSAGE_Request_Base modifies mw_MESSAGE_Dummy := {msgHeader := {contact := *}}
+
+ template(present) NOTIFY_Request mw_NOTIFY_Request_Base(
+ template CallId p_callId
+ ) modifies mw_NOTIFY_Dummy := {
+ msgHeader := {callId := p_callId}
+ }
+
+ template(present) OPTIONS_Request mw_OPTIONS_Request_Base(
+ template CallId p_callId
+ ) modifies mw_OPTIONS_Dummy := {
+ msgHeader := {callId := p_callId}
+ }
+
+ template(present) PRACK_Request mw_PRACK_Request_Base(
+ template CallId p_callId
+ ) modifies mw_PRACK_Dummy := {
+ msgHeader := {callId := p_callId}
+ }
+
+ template(present) PUBLISH_Request mw_PUBLISH_Request_Base(
+ template CallId p_callId
+ ) modifies mw_PUBLISH_Dummy := {
+ msgHeader := {callId := p_callId}
+ }
+
+ template(present) REFER_Request mw_REFER_Request_Base(
+ template CallId p_callId
+ ) modifies mw_REFER_Dummy := {
+ msgHeader := {callId := p_callId}
+ }
+
+ template(present) REFER_Request mw_REFER_Request(
+ template CallId p_callId,
+ template(value) SipUrl p_requestUri,
+ template(value) SipUrl p_referredBy
+ ) modifies mw_REFER_Request_Base := {
+ requestLine := {requestUri := p_requestUri},
+ msgHeader := {
+ referredBy := {
+ fieldName := REFERRED_BY_E,
+ nameAddr := mw_NameAddr(*, p_referredBy), // STF471
+ // {displayName
+ // :=
+ // *,
+ // addrSpec
+ // :=
+ // p_referredBy},
+ referredbyIdParams := *
+ }
+ }
+ }
+
+ template(present) INVITE_Request mw_INVITE_Request(
+ template Require p_require,
+ template(value) SipUrl p_referredBy
+ ) modifies mw_INVITE_Request_Base := {
+ msgHeader := {
+ require := p_require,
+ referredBy := {
+ fieldName := REFERRED_BY_E,
+ nameAddr := mw_NameAddr(*, p_referredBy), // STF471
+ // {displayName
+ // :=
+ // *,
+ // addrSpec
+ // :=
+ // p_referredBy},
+ referredbyIdParams := *
+ }
+ }
+ }
+
+ template(present) REGISTER_Request mw_REGISTER_Request_Base modifies mw_REGISTER_Dummy := {requestLine := {method := REGISTER_E}}
+
+ template(present) SUBSCRIBE_Request mw_SUBSCRIBE_Request_Base modifies mw_SUBSCRIBE_Dummy := {requestLine := {method := SUBSCRIBE_E}}
+
+ template(present) UPDATE_Request mw_UPDATE_Request_Base(template CallId p_callId) modifies mw_UPDATE_Dummy := {msgHeader := {callId := p_callId}}
+
+
+ } //* end group request_receive
+
+ group response_send {
+
+ template(value) Response m_Response_Base(
+ template(value) StatusLine p_statusLine,
+ template(omit) CallId p_callId := omit,
+ template(omit) CSeq p_cSeq := omit,
+ template(value) From p_from,
+ template(value) To p_to,
+ template(value) Via p_via
+ ) modifies m_Response_Dummy := {
+ statusLine := p_statusLine,
+ msgHeader := {
+ callId := p_callId,
+ cSeq := p_cSeq,
+ fromField := p_from,
+ maxForwards := omit,
+ toField := p_to,
+ via := p_via
+ },
+ messageBody := omit,
+ payload := omit
+ }
+
+
+ } //* end group response_send
+
+ group response_receive {
+
+ template(present) Response mw_Response_Base(
+ template(present) StatusLine p_statusLine := ?,
+ template CallId p_callId,
+ template CSeq p_cSeq
+ ) modifies mw_Response_Dummy := {
+ statusLine := p_statusLine,
+ msgHeader := {
+ callId := p_callId,
+ contentLength := *,
+ cSeq := p_cSeq,
+ fromField := ?,
+ maxForwards := *,
+ toField := ?,
+ via := ?
+ }
+ }
+
+ template(present) Response mw_Response_StatusCode_Base(
+ template(present) StatusLine.statusCode p_statusCode := ?,
+ template CallId p_callId,
+ template CSeq p_cSeq
+ ) modifies mw_Response_Dummy := {
+ statusLine := mw_statusLine(p_statusCode, ?),
+ msgHeader := {
+ callId := p_callId,
+ contentLength := *,
+ cSeq := p_cSeq,
+ fromField := ?,
+ maxForwards := *,
+ toField := ?,
+ via := ?
+ }
+ }
+
+ template(present) Response mw_Response_1xx_Base(
+ template CallId p_callId,
+ template CSeq p_cSeq
+ ) modifies mw_Response_Dummy := {
+ statusLine := mw_statusLine1xx,
+ msgHeader := {
+ callId := p_callId,
+ contentLength := *,
+ cSeq := p_cSeq,
+ fromField := ?,
+ maxForwards := *,
+ toField := ?,
+ via := ?
+ }
+ }
+
+ template(present) Response mw_Response_2xx_Base(
+ template CallId p_callId,
+ template CSeq p_cSeq
+ ) modifies mw_Response_1xx_Base := {
+ statusLine := mw_statusLine2xx
+ }
+
+ template(present) Response mw_Response_3xx_Base(
+ template CallId p_callId,
+ template CSeq p_cSeq
+ ) modifies mw_Response_1xx_Base := {
+ statusLine := mw_statusLine3xx
+ }
+
+ template(present) Response mw_Response_4xx_Base(
+ template CallId p_callId,
+ template CSeq p_cSeq
+ ) modifies mw_Response_1xx_Base := {
+ statusLine := mw_statusLine4xx
+ }
+
+ template(present) Response mw_Response_5xx_Base(
+ template CallId p_callId,
+ template CSeq p_cSeq
+ ) modifies mw_Response_1xx_Base := {
+ statusLine := mw_statusLine5xx
+ }
+
+ template(present) Response mw_Response_6xx_Base(
+ template CallId p_callId,
+ template CSeq p_cSeq
+ ) modifies mw_Response_1xx_Base := {
+ statusLine := mw_statusLine6xx
+ }
+
+ template(present) Response mw_Response_Algorithm(
+ template(present) StatusLine p_statusLine := ?,
+ template CallId p_callId,
+ template CSeq p_cSeq,
+ template(present) CredentialsList p_credentialsList
+ ) modifies mw_Response_Base := {
+ statusLine := mw_statusLine(p_statusLine.statusCode, ?),
+ msgHeader := {
+ authorization := {
+ fieldName := AUTHORIZATION_E,
+ body := p_credentialsList
+ }
+ }
+ }
+
+
+ } //* end group message_receive
+
+
+ } //* end group full_templates
+
+ group modified_templates {
+
+ group request_send {
+
+ template(value) ACK_Request m_ACK_Request_route(
+ template(value) SipUrl p_requestUri,
+ template(omit) CallId p_callId := omit,
+ template(omit) CSeq p_cSeq := omit,
+ template(value) From p_from,
+ template(value) To p_to,
+ template(value) Via p_via,
+ template(omit) Route p_route := omit
+ ) modifies m_ACK_Request_Base := {
+ msgHeader := {route := p_route}
+ }
+
+ template(value) ACK_Request m_ACK_Request_sdp(
+ template(value) SipUrl p_requestUri,
+ template(omit) CallId p_callId := omit,
+ template(omit) CSeq p_cSeq := omit,
+ template(value) From p_from,
+ template(value) To p_to,
+ template(value) Via p_via,
+ template(value) MessageBody p_mb
+ ) modifies m_ACK_Request_Base := {
+ msgHeader := {
+ contentLength := m_contentLength(f_MessageBodyLength(p_mb)), // STF471
+ // {fieldName
+ // :=
+ // CONTENT_LENGTH_E,
+ // len:=
+ // f_MessageBodyLength(valueof(p_mb))},
+ contentType := m_contentType(c_sdpApplication)
+ },
+ messageBody := p_mb
+ }
+
+ template(value) BYE_Request m_BYE_Request_cause(
+ template(value) SipUrl p_requestUri,
+ template(omit) CallId p_callId := omit,
+ template(omit) CSeq p_cSeq := omit,
+ template(value) From p_from,
+ template(value) To p_to,
+ template(value) Via p_via,
+ template(value) integer p_cause
+ ) modifies m_BYE_Request_Base := {
+ msgHeader := {reason := m_Reason(p_cause)}
+ }
+
+ template(value) INVITE_Request m_INVITE_Request_sdp(
+ template(value) SipUrl p_requestUri,
+ template(omit) CallId p_callId := omit,
+ template(omit) CSeq p_cSeq := omit,
+ template(value) From p_from,
+ template(value) To p_to,
+ template(value) Via p_via,
+ template(value) Contact p_contact,
+ template(value) MessageBody p_mb
+ ) modifies m_INVITE_Request_Base := {
+ msgHeader := {
+ contentLength := m_contentLength(f_MessageBodyLength(p_mb)), // STF471
+ // {fieldName
+ // :=
+ // CONTENT_LENGTH_E,
+ // len:=
+ // f_MessageBodyLength(valueof(p_mb))},
+ contentType := m_contentType(c_sdpApplication)
+ },
+ messageBody := p_mb
+ }
+
+ template(value) INVITE_Request m_INVITE_Request_ResourceList(
+ template(value) SipUrl p_requestUri,
+ template(omit) CallId p_callId := omit,
+ template(omit) CSeq p_cSeq := omit,
+ template(value) From p_from,
+ template(value) To p_to,
+ template(value) Via p_via,
+ template(value) Contact p_contact,
+ template(value) MessageBody p_mb
+ ) modifies m_INVITE_Request_Base := {
+ msgHeader := {
+ contentLength := m_contentLength(f_MessageBodyLength(p_mb)), // STF471
+ // {fieldName
+ // :=
+ // CONTENT_LENGTH_E,
+ // len:=
+ // f_MessageBodyLength(p_mb)},
+ contentType := m_contentType(c_xmlresourcelistApplication), // STF471
+ // {fieldName
+ // :=
+ // CONTENT_TYPE_E,
+ // mediaType
+ // :=
+ // "application/resource-lists+xml"},
+ contentDisposition := {
+ fieldName := CONTENT_DISPOSITION_E,
+ dispositionType := "recipient-list",
+ dispositionParams := omit
+ },
+ require := {
+ fieldName := REQUIRE_E,
+ optionsTags := {"recipient-list-invite"}
+ }
+ },
+ messageBody := p_mb
+ }
+
+ template(value) REFER_Request m_REFER_Request_route(
+ template(value) SipUrl p_requestUri,
+ template(omit) CallId p_callId := omit,
+ template(omit) CSeq p_cSeq := omit,
+ template(omit) Contact p_contact := omit,
+ template(value) From p_from,
+ template(value) To p_to,
+ template(value) Via p_via,
+ template(value) ReferTo p_referTo,
+ template(value) ReferredBy p_referredBy,
+ template(value) Route p_route
+ ) modifies m_REFER_Request_Base := {
+ msgHeader := {route := p_route}
+ }
+
+ template(value) REGISTER_Request m_REGISTER_Request_expires(
+ template(value) SipUrl p_requestUri,
+ template(omit) CallId p_callId := omit,
+ template(omit) CSeq p_cSeq := omit,
+ template(value) From p_from,
+ template(value) To p_to,
+ template(value) Via p_via,
+ template(omit) Contact p_contact := omit,
+ template(omit) Authorization p_authorization := omit,
+ template(value) charstring p_expires
+ ) modifies m_REGISTER_Request_Base := {
+ msgHeader := {
+ authorization := p_authorization,
+ expires := m_Expires(p_expires)
+ }
+ }
+
+ template(value) NOTIFY_Request m_NOTIFY_Request_contact(
+ template(value) SipUrl p_requestUri,
+ template(omit) CallId p_callId := omit,
+ template(omit) CSeq p_cSeq := omit,
+ template(value) From p_from,
+ template(value) To p_to,
+ template(value) Via p_via,
+ template(omit) Contact p_contact := omit
+ ) modifies m_NOTIFY_Request_Base := {
+ msgHeader := {
+ contact := p_contact,
+ event := m_Event_reg,
+ subscriptionState := m_SubscriptionState_active
+ }
+ }
+
+ template(value) NOTIFY_Request m_NOTIFY_Request_sipfrag(
+ template(value) SipUrl p_requestUri,
+ template(omit) CallId p_callId := omit,
+ template(omit) CSeq p_cSeq := omit,
+ template(value) From p_from,
+ template(value) To p_to,
+ template(value) Via p_via,
+ template(value) charstring p_state,
+ template(value) charstring p_sipfrag
+ ) modifies m_NOTIFY_Request_Base := {
+ requestLine := {
+ method := NOTIFY_E,
+ requestUri := {
+ scheme := ?,
+ components := {
+ sip := {
+ userInfo := *,
+ hostPort := p_requestUri.components.sip.hostPort
+ }
+ }
+ }
+ },
+ msgHeader := {
+ contentLength := m_contentLength(lengthof(p_sipfrag)), // STF471
+ // {fieldName
+ // :=
+ // CONTENT_LENGTH_E,
+ // len:=
+ // lengthof(p_sipfrag)},
+ contentType := m_contentType(c_sipfragMessage), // STF471
+ // {fieldName
+ // :=
+ // CONTENT_TYPE_E,
+ // mediaType
+ // :=
+ // "message/sipfrag"},
+ subscriptionState := {
+ fieldName := SUBSCRIPTION_STATE_E,
+ subState := p_state,
+ substateParams := omit
+ },
+ event := m_Event_refer
+ },
+ messageBody := {sipfrag := p_sipfrag}
+ }
+
+ template(value) UPDATE_Request m_UPDATE_Request_route(
+ template(value) SipUrl p_requestUri,
+ template(omit) CallId p_callId := omit,
+ template(omit) CSeq p_cSeq := omit,
+ template(value) From p_from,
+ template(value) To p_to,
+ template(value) Via p_via,
+ template(omit) Contact p_contact := omit,
+ template(value) MessageBody p_mb,
+ template(value) Route p_route
+ ) modifies m_UPDATE_Request_Base := {
+ msgHeader := {route := p_route}
+ }
+
+
+ } //* end group request_send
+
+
+ group request_receive {
+
+ template(present) BYE_Request mw_BYE_Request_Reason(
+ template CallId p_callId,
+ template(value) GenValue p_cause
+ ) modifies mw_BYE_Request_Base := {
+ msgHeader := {reason := mw_Reason(p_cause)}
+ }
+
+ template(present) BYE_Request mw_BYE_Request_ReasonSIP(
+ template CallId p_callId,
+ template(value) GenValue p_cause
+ ) modifies mw_BYE_Request_Base := {
+ msgHeader := {reason := mw_ReasonSIP(p_cause)}
+ }
+
+ template(present) BYE_Request mw_BYE_Request_headerfieldlist(
+ template CallId p_callId,
+ template(present) SipUrl p_requestUri,
+ template(present) To p_to := ?,
+ template(present) From p_from := ?,
+ template CSeq p_cSeq,
+ template Route p_route,
+ template RecordRoute p_recordRoute,
+ template Reason p_reason
+ ) modifies mw_BYE_Request_Base := {
+ requestLine := {requestUri := p_requestUri},
+ msgHeader := {
+ callId := p_callId,
+ toField := p_to,
+ fromField := p_from,
+ cSeq := p_cSeq,
+ route := p_route,
+ recordRoute := p_recordRoute,
+ reason := p_reason
+ }
+ }
+
+ template(present) BYE_Request mw_BYE_Request_UserToUser(
+ template CallId p_callId
+ ) modifies mw_BYE_Request_Base := {
+ msgHeader := {userToUser := ?}
+ }
+
+
+ template(present) INVITE_Request mw_INVITE_Request_RequestURI(
+ template(present) SipUrl p_sipUrl := ?
+ ) modifies mw_INVITE_Dummy := {
+ requestLine := {
+ requestUri := p_sipUrl,
+ sipVersion := c_sipNameVersion
+ }
+ }
+
+ template(present) INFO_Request mw_INFO_Request_MB(
+ template CallId p_callId,
+ template MessageBody p_mb
+ ) modifies mw_INFO_Request_Base := {
+ messageBody := p_mb
+ }
+
+ template(present) INVITE_Request mw_INVITE_Request_expires modifies mw_INVITE_Request_Base := {msgHeader := {expires := ?}}
+
+ template(present) INVITE_Request mw_INVITE_Request_callid(
+ template CallId p_callId
+ ) modifies mw_INVITE_Request_Base := {
+ msgHeader := {callId := p_callId}
+ }
+
+ template(present) INVITE_Request mw_INVITE_Request_MB(
+ template CallId p_callId,
+ template MessageBody p_mb
+ ) modifies mw_INVITE_Request_callid := {
+ messageBody := p_mb
+ }
+
+ template(present) INVITE_Request mw_INVITE_Request_noPaccessNetworkInfo(
+ template CallId p_callId
+ ) modifies mw_INVITE_Request_callid := {
+ msgHeader := {pAccessNetworkInfo := omit}
+ }
+
+ template(present) INVITE_Request mw_INVITE_Request_PaccessNetworkInfo(
+ template CallId p_callId
+ ) modifies mw_INVITE_Request_callid := {
+ msgHeader := {pAccessNetworkInfo := ?}
+ }
+
+ template(present) INVITE_Request mw_INVITE_MSRP_Session(
+ template(present) SDP_media_field p_media_MSRP := ?
+ ) modifies mw_INVITE_Request_Base := {
+ messageBody := {
+ sdpMessageBody := {
+ protocol_version := ?,
+ origin := ?,
+ session_name := ?,
+ information := *,
+ uri := *,
+ emails := *,
+ phone_numbers := *,
+ connection := *,
+ bandwidth := *,
+ times := ?,
+ timezone_adjustments := *,
+ key := *,
+ attributes := *,
+ media_list := {
+ {
+ media_field := p_media_MSRP,
+ information := *,
+ connections := *,
+ bandwidth := *,
+ key := *,
+ attributes := {
+ {
+ msrp := {
+ attr_value :=
+ pattern
+ "path:msrp://*"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ template(present) REGISTER_Request mw_REGISTER_Request_ISC(
+ template PAccessNetworkInfo p_access,
+ template PVisitedNetworkID p_visited
+ ) modifies mw_REGISTER_Request_Base := {
+ msgHeader := {
+ pAccessNetworkInfo := p_access,
+ pVisitedNetworkID := p_visited
+ }
+ }
+
+ template(present) UPDATE_Request mw_UPDATE_Request_SDP(
+ template CallId p_callId,
+ template MessageBody p_mb
+ ) modifies mw_UPDATE_Request_Base := {
+ messageBody := p_mb
+ }
+
+ template(present) NOTIFY_Request mw_NOTIFY_Request_MB(
+ template CallId p_callId,
+ template MessageBody p_mb
+ ) modifies mw_NOTIFY_Request_Base := {
+ messageBody := p_mb
+ }
+
+
+ } //* end group request_receive
+
+ group response_send {
+
+ template(value) Response m_Response_AlertInfo(
+ template(value) StatusLine p_statusLine,
+ template(omit) CallId p_callId := omit,
+ template(omit) CSeq p_cSeq := omit,
+ template(value) From p_from,
+ template(value) To p_to,
+ template(value) Via p_via,
+ template(value) Contact p_contact,
+ template(value) AlertInfo p_alertInfo
+ ) modifies m_Response_Contact := {
+ msgHeader := {alertInfo := p_alertInfo}
+ }
+
+ template(value) Response m_Response_Contact(
+ template(value) StatusLine p_statusLine,
+ template(omit) CallId p_callId := omit,
+ template(omit) CSeq p_cSeq := omit,
+ template(value) From p_from,
+ template(value) To p_to,
+ template(value) Via p_via,
+ template(omit) Contact p_contact := omit
+ ) modifies m_Response_Base := {
+ msgHeader := {contact := p_contact}
+ }
+
+ template(value) Response m_Response_ext(
+ template(value) StatusLine p_statusLine,
+ template(omit) CallId p_callId := omit,
+ template(omit) CSeq p_cSeq := omit,
+ template(value) From p_from,
+ template(value) To p_to,
+ template(value) Via p_via,
+ template(omit) Route p_route := omit,
+ template(omit) RecordRoute p_recordroute := omit
+ ) modifies m_Response_Base := {
+ msgHeader := {
+ route := p_route, // f_route(),
+ recordRoute :=
+ p_recordroute // f_recordroute()
+ }
+ }
+
+ template(value) Response m_Response_mbody(
+ template(value) StatusLine p_statusLine,
+ template(omit) CallId p_callId := omit,
+ template(omit) CSeq p_cSeq := omit,
+ template(value) From p_from,
+ template(value) To p_to,
+ template(value) Via p_via,
+ template(omit) Route p_route := omit,
+ template(omit) RecordRoute p_recordroute := omit,
+ template(value) MessageBody p_mb
+ ) modifies m_Response_ext := {
+ msgHeader := {
+ contentLength := m_contentLength(f_MessageBodyLength(p_mb)), // STF471
+ // {fieldName
+ // :=
+ // CONTENT_LENGTH_E,
+ // len:=
+ // f_MessageBodyLength(valueof(p_mb))},
+ contentType := m_contentType(c_sdpApplication)
+ },
+ messageBody := p_mb
+ }
+
+ template(value) Response m_Response_mbody_contact (
+ template(value) StatusLine p_statusLine,
+ template(omit) CallId p_callId := omit,
+ template(omit) CSeq p_cSeq := omit,
+ template(value) From p_from,
+ template(value) To p_to,
+ template(value) Via p_via,
+ template(omit) Route p_route := omit,
+ template(omit) RecordRoute p_recordroute := omit,
+ template(value) MessageBody p_mb,
+ template(value) Contact p_contact
+ ) modifies m_Response_mbody := {
+ msgHeader := {
+ contact := p_contact
+ }
+ }
+
+
+ template(value) Response m_Response_PAsserted_Privacy(
+ template(value) StatusLine p_statusLine,
+ template(omit) CallId p_callId := omit,
+ template(omit) CSeq p_cSeq := omit,
+ template(value) From p_from,
+ template(value) To p_to,
+ template(value) Via p_via,
+ template(value) Route p_route,
+ template(value) RecordRoute p_recordroute,
+ template(value) PAssertedID p_pAssertedID,
+ template(value) Privacy p_privacy
+ ) modifies m_Response_ext := {
+ msgHeader := {
+ pAssertedID := p_pAssertedID,
+ privacy := p_privacy
+ }
+ }
+
+ template(present) Response mw_Response_PAsserted_Privacy_Supported(
+ template(present) StatusLine p_statusLine := ?,
+ template CallId p_callId,
+ template CSeq p_cSeq,
+ template PAssertedID p_pAssertedID,
+ template Privacy p_privacy,
+ template Supported p_supported
+ ) modifies mw_Response_Base := {
+ statusLine := mw_statusLine(p_statusLine.statusCode, ?),
+ msgHeader := {
+ pAssertedID := p_pAssertedID,
+ privacy := p_privacy,
+ supported := p_supported
+ }
+ }
+
+ template(value) Response m_Response_PAsserted_Privacy_mbody(
+ template(value) StatusLine p_statusLine,
+ template(omit) CallId p_callId := omit,
+ template(omit) CSeq p_cSeq := omit,
+ template(value) From p_from,
+ template(value) To p_to,
+ template(value) Via p_via,
+ template(value) Route p_route,
+ template(value) RecordRoute p_recordroute,
+ template(value) PAssertedID p_pAssertedID,
+ template(value) Privacy p_privacy,
+ template(value) MessageBody p_mb
+ ) modifies m_Response_ext := {
+ msgHeader := {
+ contentLength := m_contentLength(f_MessageBodyLength(p_mb)), // STF471
+ // {fieldName
+ // :=
+ // CONTENT_LENGTH_E,
+ // len:=
+ // f_MessageBodyLength(valueof(p_mb))},
+ contentType := m_contentType(c_sdpApplication), // STF471
+ // {fieldName
+ // :=
+ // CONTENT_TYPE_E,
+ // mediaType
+ // :=
+ // c_sdpApplication
+ // },
+ pAssertedID := p_pAssertedID,
+ privacy := p_privacy
+ },
+ messageBody := p_mb
+ }
+
+
+ } //* end group response_send
+
+
+ group response_receive {
+
+ template(present) Response mw_Response_Expires(
+ template(present) StatusLine p_statusLine := ?,
+ template CallId p_callId,
+ template CSeq p_cSeq,
+ template(present) DeltaSec p_deltaSec := ?
+ ) modifies mw_Response_Base := {
+ statusLine := mw_statusLine(p_statusLine.statusCode, ?),
+ msgHeader := {expires := mw_Expires(p_deltaSec)}
+ }
+
+ template(present) Response mw_Response_PAsserted_Privacy(
+ template(present) StatusLine p_statusLine := ?,
+ template CallId p_callId,
+ template CSeq p_cSeq,
+ template PAssertedID p_pAssertedID,
+ template Privacy p_privacy
+ ) modifies mw_Response_Base := {
+ statusLine := mw_statusLine(p_statusLine.statusCode, ?),
+ msgHeader := {
+ pAssertedID := p_pAssertedID,
+ privacy := p_privacy
+ }
+ }
+
+ template(present) Response mw_Response_Reason(
+ template(present) StatusLine p_statusLine := ?,
+ template CallId p_callId,
+ template CSeq p_cSeq,
+ template(value) GenValue p_cause
+ ) modifies mw_Response_Base := {
+ statusLine := mw_statusLine(p_statusLine.statusCode, ?),
+ msgHeader := {reason := mw_Reason(p_cause)}
+ }
+
+ template(present) Response mw_Response_RecordRoute(
+ template(present) StatusLine p_statusLine := ?,
+ template CallId p_callId,
+ template CSeq p_cSeq,
+ template RecordRoute p_recordRoute
+ ) modifies mw_Response_Base := {
+ statusLine := mw_statusLine(p_statusLine.statusCode, ?),
+ msgHeader := {recordRoute := p_recordRoute}
+ }
+
+ template(present) Response mw_Response_Via(
+ template(present) StatusLine p_statusLine := ?,
+ template CallId p_callId,
+ template CSeq p_cSeq,
+ template(present) Via p_via := ?
+ ) modifies mw_Response_Base := {
+ statusLine := mw_statusLine(p_statusLine.statusCode, ?),
+ msgHeader := {via := p_via}
+ }
+
+ template(present) Response mw_Response_Contact(
+ template(present) StatusLine p_statusLine := ?,
+ template CallId p_callId,
+ template CSeq p_cSeq,
+ template Contact p_contact
+ ) modifies mw_Response_Base := {
+ statusLine := mw_statusLine(p_statusLine.statusCode, ?),
+ msgHeader := {contact := p_contact}
+ }
+
+ template(present) Response mw_Response_AlertInfo(
+ template(present) StatusLine p_statusLine := ?,
+ template CallId p_callId,
+ template CSeq p_cSeq,
+ template AlertInfo p_alertInfo
+ ) modifies mw_Response_Base := {
+ statusLine := mw_statusLine(p_statusLine.statusCode, ?),
+ msgHeader := {alertInfo := p_alertInfo}
+ }
+
+ template(present) Response mw_Response_HistoryInfo(
+ template(present) StatusLine p_statusLine := ?,
+ template CallId p_callId,
+ template CSeq p_cSeq,
+ template HistoryInfo p_historyInfo
+ ) modifies mw_Response_Base := {
+ statusLine := mw_statusLine(p_statusLine.statusCode, ?),
+ msgHeader := {historyInfo := p_historyInfo}
+ }
+
+ template(present) Response mw_Response_messageBody(
+ template(present) StatusLine p_statusLine := ?,
+ template CallId p_callId,
+ template CSeq p_cSeq,
+ template Require p_require,
+ template MessageBody p_mb
+ ) modifies mw_Response_Base := {
+ statusLine := mw_statusLine(p_statusLine.statusCode, ?),
+ msgHeader := {require := p_require},
+ messageBody := p_mb
+ }
+
+ template(present) Response mw_Response_Require(
+ template(present) StatusLine p_statusLine := ?,
+ template CallId p_callId,
+ template CSeq p_cSeq,
+ template Require p_require
+ ) modifies mw_Response_Base := {
+ statusLine := mw_statusLine(p_statusLine.statusCode, ?),
+ msgHeader := {require := p_require}
+ }
+
+ template(present) Response mw_Response_Require_ifpresent(
+ template(present) StatusLine p_statusLine := ?,
+ template CallId p_callId,
+ template CSeq p_cSeq,
+ template(present) Require p_require
+ ) modifies mw_Response_Base := {
+ statusLine := mw_statusLine(p_statusLine.statusCode, ?),
+ msgHeader := {require := p_require ifpresent}
+ }
+
+ template(present) Response mw_Response_Supported(
+ template(present) StatusLine p_statusLine := ?,
+ template CallId p_callId,
+ template CSeq p_cSeq,
+ template Supported p_supported
+ ) modifies mw_Response_Base := {
+ statusLine := mw_statusLine(p_statusLine.statusCode, ?),
+ msgHeader := {supported := p_supported}
+ }
+
+ template(present) Response mw_Response_UserToUser(
+ template(present) StatusLine p_statusLine := ?,
+ template CallId p_callId,
+ template CSeq p_cSeq
+ ) modifies mw_Response_Base := {
+ statusLine := mw_statusLine(p_statusLine.statusCode, ?),
+ msgHeader := {userToUser := ?}
+ }
+
+
+ } //* end group response_receive
+
+
+ } //* end group modified_templates
+
+
+ } //* end group MessageTemplates
+
+ group SDP_Templates {
+
+ group SDP_Messages {
+
+ group base_templates {
+
+ template(value) SDP_Message m_SDP_base := {
+ protocol_version := 0, //* v=0
+ origin := {
+ user_name := PX_SIP_SDP_USER_NAME,
+ session_id := PX_SIP_SDP_SESSION_ID,
+ session_version := "0",
+ net_type := c_in,
+ addr_type := c_ip4,
+ addr := ""
+ },
+ //* o=voicesession 12345 12345 IN IP4 172.27.1.219
+ session_name := "Voice Session", //* s=Voice Session
+ information := omit,
+ uri := omit,
+ emails := omit,
+ phone_numbers := omit,
+ connection := omit,
+ bandwidth := omit,
+ times := {
+ {
+ time_field := {"0", "0"},
+ time_repeat := omit
+ }
+ }, //* t=0 0
+ timezone_adjustments := omit,
+ key := omit,
+ attributes := omit,
+ media_list := omit
+ }
+
+ template(value) SDP_Message m_SDP(
+ template(value) SDP_media_desc p_media,
+ template(value) SipUserProfile p_userprofile
+ ) modifies m_SDP_base := {
+ origin := {
+ addr := p_userprofile.contactIpaddr
+ },
+ //* o=voicesession 12345 12345 IN IP4 172.27.1.219
+ connection := {
+ net_type := c_in,
+ addr_type := c_ip4,
+ conn_addr := {
+ addr := p_userprofile.bearerIpaddr,
+ ttl := omit,
+ num_of_addr := omit
+ }
+ }, //* c=IN
+ //* IP4
+ //* 172.27.1.219
+ media_list := {p_media}
+ }
+
+ template(value) SDP_Message m_SDP_mediaList(
+ template(value) SDP_media_desc_list p_media_list,
+ template(value) SipUserProfile p_userprofile
+ ) modifies m_SDP_base := {
+ origin := {
+ addr := p_userprofile.contactIpaddr
+ },
+ //* o=voicesession 12345 12345 IN IP4 172.27.1.219
+ connection := {
+ net_type := c_in,
+ addr_type := c_ip4,
+ conn_addr := {
+ addr := p_userprofile.bearerIpaddr,
+ ttl := omit,
+ num_of_addr := omit
+ }
+ }, //* c=IN
+ //* IP4
+ //* 172.27.1.219
+ media_list := p_media_list
+ }
+
+ template(value) SDP_Message m_SDP_media_attr_preconditions(
+ template(value) SDP_media_desc p_media,
+ template(value) SipUserProfile p_userprofile,
+ template(value) SDP_attribute_list p_attribute_list
+ ) modifies m_SDP := {
+ media_list := {
+ {
+ media_field := {
+ media := c_audio,
+ ports := {
+ port_number := 8500,
+ num_of_ports := omit
+ },
+ transport := c_rtpAvp,
+ fmts := {"0"}
+ }, //* m=audio
+ //* 8500
+ //* RTP/AVP
+ //* 0
+ information := omit,
+ connections := omit,
+ bandwidth := omit,
+ key := omit,
+ attributes := p_attribute_list
+ }
+ }
+ }
+
+ template(value) SDP_Message m_SDP_attribute(
+ template(value) SDP_media_desc p_media,
+ template(value) SipUserProfile p_userprofile,
+ template(value) SDP_attribute p_loc_attribute
+ ) modifies m_SDP := {
+ attributes := {p_loc_attribute}
+ }
+
+ template(present) SDP_Message mw_SDP := {
+ protocol_version := 0, //* v=0
+ origin := ?,
+ session_name := ?,
+ information := omit,
+ uri := omit,
+ emails := omit,
+ phone_numbers := omit,
+ connection := ?,
+ bandwidth := omit,
+ times := {
+ {
+ time_field := {"0", "0"},
+ time_repeat := omit
+ }
+ }, //* t=0 0
+ timezone_adjustments := omit,
+ key := omit,
+ attributes := omit,
+ media_list := ?
+ }
+
+
+ } //* end group base_templates
+
+ group modified_templates {
+ template(value) SDP_Message m_SDP_bandwidth(
+ template(value) SDP_media_desc p_media,
+ template(value) SipUserProfile p_userprofile
+ ) modifies m_SDP := {
+ bandwidth := {
+ {
+ PX_SIP_SDP_B_MODIFIER,
+ PX_SIP_SDP_B_BANDWIDTH
+ }
+ }
+ }
+
+ template(value) SDP_Message m_SDP_unacceptable(
+ template(value) SDP_media_desc p_media,
+ template(value) SipUserProfile p_userprofile
+ ) modifies m_SDP := {
+ protocol_version := 1, //* v=1 unacceptable version of
+ //* SDP
+ bandwidth := {
+ {
+ PX_SIP_SDP_B_MODIFIER,
+ PX_SIP_SDP_B_BANDWIDTH
+ }
+ }
+ }
+
+ template(value) SDP_Message m_SDP_encrypted(
+ template(value) SDP_media_desc p_media,
+ template(value) SipUserProfile p_userprofile
+ ) modifies m_SDP := {
+ bandwidth := {
+ {
+ PX_SIP_SDP_B_MODIFIER,
+ PX_SIP_SDP_B_BANDWIDTH
+ }
+ },
+ key := {
+ method := "base64", // prompt
+ key := "blablabla"
+ }
+ }
+
+
+ } //* end group modified_templates
+
+
+ } //* end group SDP_Messages
+
+ group SDP_Fields {
+
+ template(value) SDP_media_desc m_media(template(value) SDP_media_field p_mf) := {
+ media_field := p_mf,
+ information := omit,
+ connections := omit,
+ bandwidth := omit,
+ key := omit,
+ attributes := omit
+ }
+
+ template(value) SDP_media_desc m_mediaFieldBandwdthAttributes(
+ template(value) SDP_media_field p_mf,
+ template(omit) SDP_bandwidth_list p_bw_l := omit,
+ template(omit) SDP_attribute_list p_attributes := omit
+ ) := {
+ media_field := p_mf,
+ information := omit,
+ connections := omit,
+ bandwidth := p_bw_l,
+ key := omit,
+ attributes := p_attributes
+ }
+
+ template(value) SDP_media_desc m_media_dynPT(
+ template(value) charstring p_payloadType,
+ template(value) charstring p_encoding,
+ template(value) charstring p_clockrate,
+ template(omit) charstring p_parameters := omit,
+ template(omit) SDP_key p_sdpKey := omit
+ ) := {
+ media_field := {
+ media := c_audio, //* "audio",
+ ports := {
+ port_number := 8500,
+ num_of_ports := omit
+ },
+ transport := c_rtpAvp, //* "RTP/AVP",
+ fmts := { p_payloadType }
+ }, //* m=audio 8500 RTP/AVP 8
+ information := omit,
+ connections := omit,
+ bandwidth := omit,
+ key := p_sdpKey,
+ attributes := {{rtpmap := {
+ payload_type := p_payloadType,
+ codec := {
+ encoding := p_encoding,
+ clockrate := p_clockrate,
+ parameters := p_parameters
+ }
+ }
+ }} //* a=rtpmap:8 PCMA/8000
+ }
+
+ /**
+ * @desc send template with specific media transport and attribute values
+ * @param p_mediaAttribute parameter for SDP media transport supported by the IUT
+ * former PX_SIP_SDP_media_transport
+ * @param p_mediaAttribute parameter for SDP media attribute supported by the IUT,
+ * former PX_SIP_SDP_media_attribute_Exp & PX_SIP_SDP_media_transport_Exp
+ * @param p_mediaType parameter for SDP media type supported by the IUT,
+ * former PX_SIP_SDP_MEDIA_VIDEO
+ */
+ template(value) SDP_media_desc m_media_unsupported(
+ template(value) charstring p_mediaTransport,
+ template(value) SDP_attribute_rtpmap p_mediaAttribute,
+ template(value) charstring p_mediaType := "video"
+ ) := {
+ media_field := {
+ media := p_mediaType,
+ ports := {
+ port_number := 11500,
+ num_of_ports := omit
+ },
+ transport := p_mediaTransport,
+ fmts := {"99"}
+ }, //* m=audio 8500 RTP/AVP 0
+ information := omit,
+ connections := omit,
+ bandwidth := omit,
+ key := omit,
+ attributes := {{rtpmap := p_mediaAttribute}}
+ }
+
+ template(value) SDP_bandwidth m_bandwidth(
+ template(value) charstring p_loc_m,
+ template(value) integer p_loc_b
+ ) := {
+ modifier := p_loc_m,
+ bandwidth := p_loc_b
+ }
+
+ template(value) SDP_bandwidth m_bandwidth_as_64 := {
+ modifier := "AS",
+ bandwidth := 64
+ }
+
+ template(present) SDP_bandwidth mw_bandwidth_rs := {
+ modifier := "RS",
+ bandwidth := ?
+ }
+
+ template(present) SDP_bandwidth mw_bandwidth_rr := {
+ modifier := "RR",
+ bandwidth := ?
+ }
+
+ template(value) SDP_media_field m_media_field(
+ template(value) charstring p_media,
+ template(value) integer p_portNum,
+ template(value) charstring p_transport,
+ template(value) charstring p_fmts
+ ) := {
+ media := p_media,
+ ports := {
+ port_number := p_portNum,
+ num_of_ports := omit
+ },
+ transport := p_transport,
+ fmts := {p_fmts}
+ }
+
+ template(present) SDP_media_field mw_media_PCMU := {
+ media := c_audio,
+ ports := {
+ port_number := ?,
+ num_of_ports := *
+ },
+ transport := c_rtpAvp,
+ fmts := {"0"}
+ }
+
+ template(present) SDP_media_field mw_media_PCMA := {
+ media := c_audio,
+ ports := {
+ port_number := 8500,
+ num_of_ports := omit
+ },
+ transport := c_rtpAvp,
+ fmts := {"8"}
+ }
+
+ template(present) SDP_media_field mw_media_PCMA_U_DPT := {
+ media := c_audio,
+ ports := {
+ port_number := ?,
+ num_of_ports := *
+ },
+ transport := c_rtpAvp,
+ fmts := {*}
+ }
+
+ template(present) SDP_media_field mw_media_T38 := {
+ media := c_image,
+ ports := {
+ port_number := ?,
+ num_of_ports := *
+ },
+ transport := pattern "*ptl", //* udptl,tcptl
+ fmts := {"t38"}
+ }
+
+ template(present) SDP_media_field mw_media_G722 := {
+ media := c_audio,
+ ports := {
+ port_number := ?,
+ num_of_ports := *
+ },
+ transport := "RTP/AVP",
+ fmts := {"9"}
+ }
+
+ template(present) SDP_media_field mw_media_AMR_DPT := {
+ media := c_audio,
+ ports := {
+ port_number := ?,
+ num_of_ports := *
+ },
+ transport := c_rtpAvp,
+ fmts := {*}
+ }
+
+ template(present) SDP_media_field mw_media_MSRP := {
+ media := c_msrp,
+ ports := {
+ port_number := ?,
+ num_of_ports := omit
+ },
+ transport := c_msrpTcp,
+ fmts := {*}
+ }
+
+ template(value) SDP_attribute m_attribute_sendonly := {sendonly := {}}
+ template(present) SDP_attribute mw_attribute_sendonly := {sendonly := {}}
+ // MRO
+ template(value) SDP_attribute m_attribute_recvonly := {recvonly := {}}
+ template(present) SDP_attribute mw_attribute_recvonly := {recvonly := {}}
+ // MRO
+ template(value) SDP_attribute m_attribute_sendrecv := {sendrecv := {}}
+ template(present) SDP_attribute mw_attribute_sendrecv := {sendrecv := {}}
+ // MRO
+ template(value) SDP_attribute m_attribute_inactive := {inactive := {}}
+ template(present) SDP_attribute mw_attribute_inactive := {inactive := {}}
+ // MRO
+ template(present) SDP_attribute mw_attribute_sendonly_inactive := (mw_attribute_sendonly, mw_attribute_inactive);
+ template SDP_attribute mw_attribute_sendrecv_recvonly_omit := (mw_attribute_sendrecv, mw_attribute_recvonly, omit);
+ template(value) SDP_attribute m_attribute_base(
+ template(value) SDP_attribute_rtpmap p_attr_value
+ ) := {
+ rtpmap := p_attr_value
+ }
+ /**
+ * @desc send template for a specific media attribute
+ * @param attribte value, former PX_SIP_SDP_DYN & " " & PX_SIP_SDP_MEDIA_TRANSPORT_AMR
+ */
+ template(value) SDP_attribute m_attribute_AMR_DPT(//"0 AMR"
+ template(value) SDP_attribute_rtpmap p_attr_value := {"0", {"AMR", "8000", omit}}
+ ) := m_attribute_base(p_attr_value);
+ /**
+ * @desc send template for a specific media attribute
+ * @param attribte value, former PX_SIP_SDP_DYN & " " & PX_SIP_SDP_MEDIA_TRANSPORT_CLE
+ */
+ template(value) SDP_attribute m_attribute_CLEARMODE_DPT(//"0 CLEARMODE/8000"
+ template(value) SDP_attribute_rtpmap p_attr_value := {"0", {"CLEARMODE", "8000", omit}}
+ ) := m_attribute_base(p_attr_value);
+ /**
+ * @desc send template for a specific media attribute
+ * @param attribte value, former PX_SIP_SDP_ENCODING_ATTRIBUTE_G222
+ */
+ template(value) SDP_attribute m_attribute_G722(//"9 G722/8000"
+ template(value) SDP_attribute_rtpmap p_attr_value := {"9", {"G722", "8000", omit}}
+ ) := m_attribute_base(p_attr_value);
+ /**
+ * @desc send template for a specific media attribute
+ * @param attribte value, former PX_SIP_SDP_ENCODING_ATTRIBUTE_PCMU
+ */
+ template(value) SDP_attribute m_attribute_PCMU(//"0 PCMU/8000"
+ template(value) SDP_attribute_rtpmap p_attr_value := {"0", {"PCMU", "8000", omit}}
+ ) := m_attribute_base(p_attr_value);
+ /**
+ * @desc send template for a specific media attribute
+ * @param attribte value, former PX_SIP_SDP_DYN & " " & PX_SIP_SDP_MEDIA_TRANSPORT_PCMU
+ */
+ template(value) SDP_attribute m_attribute_PCMU_DPT(//"0 PCMU/8000"
+ template(value) SDP_attribute_rtpmap p_attr_value := {"0", {"PCMU", "8000", omit}}
+ ) := m_attribute_base(p_attr_value);
+ /**
+ * @desc send template for a specific media attribute
+ * @param attribte value, former PX_SIP_SDP_ENCODING_ATTRIBUTE_PCMA
+ */
+ template(value) SDP_attribute m_attribute_PCMA(//"8 PCMA/8000"
+ template(value) SDP_attribute_rtpmap p_attr_value := {"8", {"PCMA", "8000", omit}}
+ ) := m_attribute_base(p_attr_value);
+ /**
+ * @desc send template for a specific media attribute
+ * @param attribte value, former PX_SIP_SDP_DYN & " " & PX_SIP_SDP_MEDIA_TRANSPORT_PCMA
+ */
+ template(value) SDP_attribute m_attribute_PCMA_DPT(//"0 PCMA/8000"
+ template(value) SDP_attribute_rtpmap p_attr_value := {"0", {"PCMA", "8000", omit}}
+ ) := m_attribute_base(p_attr_value);
+
+ template(present) SDP_attribute mw_attribute_T38 := {
+ unknown := {
+ name := ?,
+ attr_value := pattern "*t38*"
+ }
+ }
+
+ template(value) SDP_attribute m_attribute_curr(
+ template(value) charstring p_preconditionType,
+ template(value) charstring p_statusType,
+ template(value) charstring p_direction
+ ) := {
+ curr := {
+ preconditionType := p_preconditionType,
+ statusType := p_statusType,
+ direction := p_direction
+ }
+ }
+
+ template(present) SDP_attribute mw_attribute_curr := {curr := ?}
+
+ template(value) SDP_attribute m_attribute_des(
+ template(value) charstring p_preconditionType,
+ template(value) charstring p_strength,
+ template(value) charstring p_statusType,
+ template(value) charstring p_direction
+ ) := {
+ des := {
+ preconditionType := p_preconditionType,
+ strength := p_strength,
+ statusType := p_statusType,
+ direction := p_direction
+ }
+ }
+
+ template(present) SDP_attribute mw_attribute_des := {des := ?}
+
+ template(value) SDP_attribute m_attribute_conf(
+ template(value) charstring p_preconditionType,
+ template(value) charstring p_statusType,
+ template(value) charstring p_direction
+ ) := {
+ conf := {
+ preconditionType := p_preconditionType,
+ statusType := p_statusType,
+ direction := p_direction
+ }
+ }
+
+
+ } //* end group SDP_Fields
+
+
+ } //* end group SDP_Templates
+
+ group SimpleMsgSummary_Templates {
+
+ template(value) SimpleMsgSummary m_SMS(
+ template(value) Msg_summary_line_list p_summaryLineList,
+ template(value) charstring p_uri
+ ) := {
+ msg_status_line := m_msgStatusLine_yes,
+ msg_account := m_msgAccount(p_uri),
+ msg_summary_line_list := p_summaryLineList,
+ opt_msg_headers := omit
+ }
+
+ template(present) SimpleMsgSummary mw_SMS := {
+ msg_status_line := ?,
+ msg_account := *,
+ msg_summary_line_list := *,
+ opt_msg_headers := *
+ }
+
+ template(present) SimpleMsgSummary mw_SMS_yes modifies mw_SMS := {
+ msg_status_line := mw_msgStatusLine_yes
+ }
+
+ template(present) SimpleMsgSummary mw_SMS_yesUri modifies mw_SMS_yes := {
+ msg_account := mw_msgAccount
+ }
+
+ template(present) SimpleMsgSummary mw_SMS_yesVoice modifies mw_SMS_yes := {
+ msg_summary_line_list := {mw_msgSummaryLine(c_voiceMessage)}
+ }
+
+ template(present) SimpleMsgSummary mw_SMS_yesUriVoice modifies mw_SMS_yesUri := {
+ msg_summary_line_list := {mw_msgSummaryLine(c_voiceMessage)}
+ }
+
+ template(value) Msg_status_line m_msgStatusLine_yes := {
+ msg_type := c_messageWaiting,
+ msg_status := "yes"
+ }
+
+ template(present) Msg_status_line mw_msgStatusLine_yes := {
+ msg_type := c_messageWaiting,
+ msg_status := "yes"
+ }
+
+ template(value) Msg_account m_msgAccount(
+ template(value) charstring p_uri
+ ) := {
+ msg_type_account := c_messageAccount,
+ account_URI :=
+ p_uri // m_SipUrl_NumberHostParam(PX_IMS_SUT_UE2_PUBLIC_USER,PX_IMS_SUT_UE2_HOME_DOMAIN,omit)
+ }
+
+ template(present) Msg_account mw_msgAccount := {
+ msg_type_account := c_messageAccount,
+ account_URI := ?
+ }
+
+ template(value) Msg_summary_line m_msgSummaryLine(
+ template(value) charstring p_msgContexClass,
+ template(value) charstring p_msgs,
+ template(value) charstring p_urgent_msgs
+ ) := {
+ msg_context_class := p_msgContexClass,
+ msgs := p_msgs,
+ urgent_msgs := p_urgent_msgs
+ }
+
+ template(present) Msg_summary_line mw_msgSummaryLine(
+ template(present) charstring p_msgContexClass := ?
+ ) := {
+ msg_context_class := p_msgContexClass,
+ msgs := ?,
+ urgent_msgs := *
+ }
+
+
+ } // end group Templates_SMS
+
+ group MessageBodies {
+
+ template(value) MessageBody m_MBody_SDP(
+ template(value) SDP_Message p_SDP
+ ) := {
+ sdpMessageBody := p_SDP
+ }
+
+ template(value) MessageBody m_MBody_XML(
+ template(value) XmlBody p_xmlBody
+ ) := {
+ xmlBody := p_xmlBody
+ }
+
+ template(value) MessageBody m_mBody_SMS(
+ template(value) SimpleMsgSummary p_SMS
+ ) := {
+ simpleMsgSummary := p_SMS
+ }
+
+ template(value) MessageBody m_MBody_longPlainText := {textplain := c_longMessageContent_1300Bytes}
+
+ template(value) MessageBody m_mBody_plainText(
+ template(value) charstring p_plaitext
+ ) := {
+ textplain := p_plaitext
+ }
+
+ template(value) MessageBody m_MBody_sipfrag(
+ template(value) charstring p_sipfrag
+ ) := {
+ sipfrag := p_sipfrag
+ }
+
+ template(value) MessageBody m_MBody_MIMESdpXml(
+ template(value) SDP_Message p_sdp,
+ template(value) XmlBody p_xmlBody
+ ) := {
+ mimeMessageBody := {
+ boundary := "--" & PX_SIP_MIME_BOUNDARY,
+ mimeEncapsulatedList := {
+ {
+ content_type := c_sdpApplication,
+ content_disposition := omit,
+ mime_encapsulated_part := {sdpMessageBody := p_sdp}
+ },
+ {
+ content_type := c_ims3gppCwApplication,
+ content_disposition := omit,
+ mime_encapsulated_part := {xmlBody := p_xmlBody}
+ }
+ }
+ }
+ }
+
+ template(value) MessageBody m_MBody_MIMESdpEncrypted(
+ template(value) SDP_Message p_sdp
+ ) := {
+ mimeMessageBody := {
+ boundary := "--" & PX_SIP_MIME_BOUNDARY,
+ mimeEncapsulatedList := {
+ {
+ content_type := "application/sdp",
+ content_disposition := "attachment;handling=required;filename=smime.p7",
+ mime_encapsulated_part := {sdpMessageBody := p_sdp}
+ }
+ }
+ }
+ }
+
+ template(present) MessageBody mw_MBody_SDP(
+ template(present) SDP_Message p_SDP := ?
+ ) := {
+ sdpMessageBody := p_SDP
+ }
+
+ template(present) MessageBody mw_MBody_XML(
+ template(present) XmlBody p_xmlBody := ?
+ ) := {
+ xmlBody := p_xmlBody
+ }
+
+ template(present) MessageBody mw_mBody_SMS(
+ template(present) SimpleMsgSummary p_SMS := ?
+ ) := {
+ simpleMsgSummary := p_SMS
+ }
+
+ template(present) MessageBody mw_MBody_MIMESdpXml(
+ template(present) SDP_Message p_sdp := ?,
+ template(present) XmlBody p_xmlBody := ?
+ ) := {
+ mimeMessageBody := {
+ boundary := ?,
+ mimeEncapsulatedList := {
+ {
+ content_type := ?,
+ content_disposition := *,
+ mime_encapsulated_part := {sdpMessageBody := p_sdp}
+ },
+ {
+ content_type := ?,
+ content_disposition := *,
+ mime_encapsulated_part := {xmlBody := p_xmlBody}
+ }
+ }
+ }
+ }
+
+ template(present) MessageBody mw_MBody_MIME_Ims3gpp(
+ template charstring p_disposition,
+ template(present) Ims_3gpp p_ims3gpp := ?
+ ) := {
+ mimeMessageBody := {
+ boundary := ?,
+ mimeEncapsulatedList := {
+ *,
+ {
+ content_type := c_ims3gppApplication,
+ content_disposition := p_disposition,
+ mime_encapsulated_part := {xmlBody := {ims3gpp := p_ims3gpp}}
+ },
+ *
+ }
+ }
+ }
+
+ template(present) MessageBody mw_MBody_MIME_Ims3gppCW(
+ template charstring p_disposition,
+ template(present) Ims_3gpp p_ims3gpp := ?
+ ) := {
+ mimeMessageBody := {
+ boundary := ?,
+ mimeEncapsulatedList := {
+ *,
+ {
+ content_type := c_ims3gppCwApplication,
+ content_disposition := p_disposition,
+ mime_encapsulated_part := {xmlBody := {ims3gpp := p_ims3gpp}}
+ },
+ *
+ }
+ }
+ }
+
+ }
+ /*
+ *
+ * @desc group TemplatePreparationFunctions contain functions which are used for templates
+ */
+ group TemplatePreparationFunctions {
+
+ group MessageBody_Calculation {
+
+ /**
+ * @desc Calculation of Message Body length
+ * @param p_mb_par contain message body part
+ * @return message body length
+ */
+ function f_MessageBodyLength(
+ template(value) MessageBody p_mb_par
+ ) return integer {
+
+ var integer v_result := 0;
+ if (PX_MB_LENGTH_FROM_ENCVAL) {
+ // by default it is set to true
+ // in case the codec encodes the variant selector, this
+ // needs to be changed to ischosen...
+ v_result := lengthof(encvalue(p_mb_par)) / 8; // length
+ // in
+ // bytes,
+ // let get
+ // length
+ // of
+ // encoded
+ // value
+ }
+ else {
+
+ // assume SDP_Message ONLY in the message body
+ if (ischosen(p_mb_par.sdpMessageBody)) {
+ v_result := f_SDPlength(valueof(p_mb_par.sdpMessageBody));
+ }
+
+ // assume XML_Body ONLY in the message body
+ if (ischosen(p_mb_par.xmlBody)) {
+ v_result := f_XMLBody_Length(valueof(p_mb_par.xmlBody), PX_USE_FX_FOR_XML_LENGTH);
+ }
+
+ // assume simpleMsgSummary_Body ONLY in the message body
+ if (ischosen(p_mb_par.simpleMsgSummary)) {
+ v_result := f_simpleMsgSummaryBody_Length(valueof(p_mb_par.simpleMsgSummary));
+ }
+
+ // assume MIME_Message in the message body
+ if (ischosen(p_mb_par.mimeMessageBody)) {
+ v_result := f_MIMElength(valueof(p_mb_par.mimeMessageBody));
+ }
+
+ // assume sipfrag in the message body
+ if (ischosen(p_mb_par.sipfrag)) {
+ v_result := f_TextPlainLength(p_mb_par); // same
+ // function
+ // due to
+ // same
+ // type
+ // with
+ // textplain
+ }
+
+ // assume textplain in the message body
+ if (ischosen(p_mb_par.textplain)) {
+ v_result := f_TextPlainLength(p_mb_par);
+ }
+ }
+
+ return v_result;
+ }
+
+
+ group SDP_Len_calculation {
+ /**
+ * @desc Calculation of SDP length
+ * @param p_mb contain sdp message
+ * @return sdp_lenght
+ */
+ function f_SDPlength(
+ SDP_Message p_mb
+ ) return integer {
+ var integer i, j, k, v_len_con0, v_len_con1, v_len_con2, v_len_attr;
+ var integer v_result := 2;
+ //* due to empty line beginning of message body
+ var charstring v_auxstring;
+
+ v_result := 2 + c_CRlen + lengthof(int2str(p_mb.protocol_version)); //* "v="
+ v_auxstring := p_mb.origin.user_name & " " & p_mb.origin.session_id & " " & p_mb.origin.session_version & " " & p_mb.origin.net_type & " " & p_mb.origin.addr_type & " " & p_mb.origin.addr;
+ v_result := v_result + 2 + c_CRlen + lengthof(v_auxstring); //* "o="
+ v_result := v_result + 2 + c_CRlen + lengthof(p_mb.session_name); //* "s="
+ if (isvalue(p_mb.information)) {
+ v_auxstring := valueof(p_mb.information);
+ v_result := v_result + 2 + c_CRlen + lengthof(v_auxstring);
+ } //* "i= "
+ if (isvalue(p_mb.uri)) {
+ v_auxstring := valueof(p_mb.uri);
+ v_result := v_result + 2 + c_CRlen + lengthof(v_auxstring);
+ } //* "u="
+ if (isvalue(p_mb.emails)) {
+ for (i := 0; i < lengthof(p_mb.emails); i := i + 1) {
+ v_result := v_result + 2 + c_CRlen + lengthof(p_mb.emails[i].addr_or_phone); //* "e="
+ if (isvalue(p_mb.emails[i].disp_name)) {
+ v_auxstring := valueof(p_mb.emails[i].disp_name);
+ v_result := v_result + 1 + lengthof(v_auxstring);
+ }
+ }
+ }
+
+ if (isvalue(p_mb.phone_numbers)) {
+ for (i := 0; i < lengthof(p_mb.phone_numbers); i := i + 1) {
+ v_result := v_result + 2 + c_CRlen + lengthof(p_mb.phone_numbers[i].addr_or_phone); //* "p=
+ //* "
+ if (isvalue(p_mb.phone_numbers[i].disp_name)) {
+ v_auxstring := valueof(p_mb.phone_numbers[i].disp_name);
+ v_result := v_result + 1 + lengthof(v_auxstring);
+ }
+ }
+ }
+
+ if (isvalue(p_mb.connection)) {
+ v_len_con0 := f_SDPlength_connection(valueof(p_mb.connection));
+ v_result := v_result + v_len_con0;
+ } //* "c="
+ if (isvalue(p_mb.bandwidth)) {
+ for (i := 0; i < lengthof(p_mb.bandwidth); i := i + 1) {
+ //* "b= "
+ v_auxstring := p_mb.bandwidth[i].modifier & " ";
+ v_result := v_result + 2 + c_CRlen + lengthof(v_auxstring) + lengthof(int2str(p_mb.bandwidth[i].bandwidth));
+ }
+ }
+
+ for (i := 0; i < lengthof(p_mb.times); i := i + 1) {
+ v_auxstring := p_mb.times[i].time_field.start_time & " " & p_mb.times[i].time_field.stop_time;
+ v_result := v_result + 2 + c_CRlen + lengthof(v_auxstring); //* "t="
+ if (isvalue(p_mb.times[i].time_repeat)) {
+ for (j := 0; j < lengthof(p_mb.times[i].time_repeat); j := j + 1) {
+ v_result := v_result + 2 + c_CRlen + lengthof(int2str(p_mb.times[i].time_repeat[j].repeat_interval.time)); //* "r="
+ if (isvalue(p_mb.times[i].time_repeat[j].repeat_interval.unit)) {
+ v_auxstring := valueof(p_mb.times[i].time_repeat[j].repeat_interval.unit);
+ v_result := v_result + 1 + lengthof(v_auxstring);
+ }
+
+ v_result := v_result + 1 + lengthof(int2str(p_mb.times[i].time_repeat[j].active.time));
+ if (isvalue(p_mb.times[i].time_repeat[j].active.unit)) {
+ v_auxstring := valueof(p_mb.times[i].time_repeat[j].active.unit);
+ v_result := v_result + 1 + lengthof(v_auxstring);
+ }
+
+ for (k := 0; k < lengthof(p_mb.times[i].time_repeat[j].offsets); k := k + 1) {
+ v_result := v_result + 1 + lengthof(int2str(p_mb.times[i].time_repeat[j].offsets[k].time));
+ if (isvalue(p_mb.times[i].time_repeat[j].offsets[k].unit)) {
+ v_auxstring := valueof(p_mb.times[i].time_repeat[j].offsets[k].unit);
+ v_result := v_result + 1 + lengthof(v_auxstring);
+ }
+ }
+ }
+ }
+ }
+
+ if (isvalue(p_mb.timezone_adjustments)) {
+ log("*** " & __SCOPE__ & ": INFO: timezone adjustments have not been considered in SDP length calculation yet ***");
+ } //* "z="
+ if (isvalue(p_mb.key)) {
+ v_result := v_result + 2 + c_CRlen + lengthof(p_mb.key.method); //* "k=
+ //* "
+ if (isvalue(p_mb.key.key)) {
+ v_auxstring := valueof(p_mb.key.key);
+ v_result := v_result + 1 + lengthof(v_auxstring);
+ }
+ }
+ if (isvalue(p_mb.attributes)) {
+ for (i := 0; i < lengthof(p_mb.attributes); i := i + 1) {
+
+
+ //* "a= "
+ v_len_con1 := f_SDPlength_attribute(p_mb.attributes[i]);
+ v_result := v_result + v_len_con1;
+ }
+ } //* "a="
+ if (isvalue(p_mb.media_list)) {
+ for (i := 0; i < lengthof(p_mb.media_list); i := i + 1) {
+ //* "m= "
+ //* for each media_field
+ //* log("p_mb.media_list[i ] ",p_mb.media_list[i
+ //* ] );
+ v_result := v_result + 2 + c_CRlen + lengthof(p_mb.media_list[i].media_field.media) + 1 + lengthof(int2str(p_mb.media_list[i].media_field.ports.port_number));
+
+
+ if (isvalue(p_mb.media_list[i].media_field.ports.num_of_ports)) {
+ v_result := v_result + 1 + lengthof(int2str(valueof(p_mb.media_list[i].media_field.ports.num_of_ports)));
+ }
+ v_result := v_result + 1 + lengthof(p_mb.media_list[i].media_field.transport);
+ for (j := 0; j < lengthof(p_mb.media_list[i].media_field.fmts); j := j + 1) {
+ v_result := v_result + 1 + lengthof(p_mb.media_list[i].media_field.fmts[j]);
+ }
+
+ if (isvalue(p_mb.media_list[i].information)) {
+ v_auxstring := valueof(p_mb.media_list[i].information);
+ v_result := v_result + 2 + c_CRlen + lengthof(v_auxstring); //* "i= "
+ }
+ if (isvalue(p_mb.media_list[i].connections)) {
+ for (j := 0; j < lengthof(p_mb.media_list[i].connections); j := j + 1) {
+ v_len_con2 := f_SDPlength_connection(p_mb.media_list[i].connections[j]);
+ v_result := v_result + v_len_con2;
+ } //* end for
+ }
+ if (isvalue(p_mb.media_list[i].bandwidth)) {
+ //* "b= "
+ for (j := 0; j < lengthof(p_mb.media_list[i].bandwidth); j := j + 1) {
+ v_result := v_result + 2 + c_CRlen + lengthof(p_mb.media_list[i].bandwidth[j].modifier) + 1 + lengthof(int2str(p_mb.media_list[i].bandwidth[j].bandwidth));
+ } //* end for
+ }
+ if (isvalue(p_mb.media_list[i].key)) {
+ //* "k= "
+ v_result := v_result + 1 + lengthof(p_mb.media_list[i].key.method);
+ if (isvalue(p_mb.media_list[i].key.key)) {
+ v_auxstring := valueof(p_mb.media_list[i].key.key);
+ v_result := v_result + 1 + lengthof(v_auxstring);
+ }
+ }
+ if (isvalue(p_mb.media_list[i].attributes)) {
+ for (j := 0; j < lengthof(p_mb.media_list[i].attributes); j := j + 1) {
+
+ //* "a= "
+ v_len_attr := f_SDPlength_attribute(p_mb.media_list[i].attributes[j]);
+ v_result := v_result + v_len_attr;
+ } //* end for j
+ }
+ } //* end for i
+ } //* end if media_list
+ return v_result;
+ }
+ //* end function f_SDPlength
+ function f_SDPlength_connection(
+ SDP_connection p_element
+ ) return integer {
+ //* "c="
+ var integer v_result := 0;
+ v_result := v_result + 2 + c_CRlen + lengthof(p_element.net_type & " " & p_element.addr_type & " " & p_element.conn_addr.addr);
+ if (isvalue(p_element.conn_addr.ttl) and p_element.conn_addr.ttl > 0) {
+ v_result := v_result + 1 + lengthof(int2str(valueof(p_element.conn_addr.ttl)));
+ }
+ if (isvalue(p_element.conn_addr.num_of_addr) and p_element.conn_addr.num_of_addr > 0) {
+ v_result := v_result + 1 + lengthof(int2str(valueof(p_element.conn_addr.num_of_addr)));
+ }
+ return v_result;
+ } //* f_SDPlength_connection
+
+ function f_SDPlength_attribute(
+ SDP_attribute p_element
+ ) return integer {
+ //* "a="
+ var integer v_result := 0;
+ if (ischosen(p_element.cat)) {
+ v_result := v_result + 2 + c_CRlen + lengthof("cat:" & p_element.cat.attr_value);
+ }
+ if (ischosen(p_element.keywds)) {
+ v_result := v_result + 2 + c_CRlen + lengthof("keywds:" & p_element.keywds.attr_value);
+ }
+ if (ischosen(p_element.tool)) {
+ v_result := v_result + 2 + c_CRlen + lengthof("tool:" & p_element.tool.attr_value);
+ }
+ if (ischosen(p_element.ptime)) {
+ v_result := v_result + 2 + c_CRlen + lengthof("ptime:" & p_element.ptime.attr_value);
+ }
+ if (ischosen(p_element.recvonly)) {
+ v_result := v_result + c_CRlen + lengthof("recvonly");
+ }
+ if (ischosen(p_element.sendrecv)) {
+ v_result := v_result + c_CRlen + lengthof("sendrecv");
+ }
+ if (ischosen(p_element.sendonly)) {
+ v_result := v_result + c_CRlen + lengthof("sendonly");
+ }
+ if (ischosen(p_element.inactive)) {
+ v_result := v_result + c_CRlen + lengthof("inactive");
+ }
+ if (ischosen(p_element.orient)) {
+ v_result := v_result + 2 + c_CRlen + lengthof("orient:" & p_element.orient.attr_value);
+ }
+ if (ischosen(p_element.sdp_type)) {
+ v_result := v_result + 2 + c_CRlen + lengthof("type:" & p_element.sdp_type.attr_value);
+ }
+ if (ischosen(p_element.charset)) {
+ v_result := v_result + 2 + c_CRlen + lengthof("charset" & p_element.charset.attr_value);
+ }
+ if (ischosen(p_element.sdplang)) {
+ v_result := v_result + 2 + c_CRlen + lengthof("sdplang:" & p_element.sdplang.attr_value);
+ }
+ if (ischosen(p_element.lang)) {
+ v_result := v_result + 2 + c_CRlen + lengthof("lang:" & p_element.lang.attr_value);
+ }
+ if (ischosen(p_element.framerate)) {
+ v_result := v_result + 2 + c_CRlen + lengthof("framerate:" & p_element.framerate.attr_value);
+ }
+ if (ischosen(p_element.quality)) {
+ v_result := v_result + 2 + c_CRlen + lengthof("quality:" & p_element.quality.attr_value);
+ }
+ if (ischosen(p_element.fmtp)) {
+ v_result := v_result + 2 + c_CRlen + lengthof("fmtp:" & p_element.fmtp.format & " " & f_fmtpparams_to_charstring(p_element.fmtp.params));
+ }
+ if (ischosen(p_element.curr)) {
+ v_result := v_result + 2 + c_CRlen + lengthof("curr:" & p_element.curr.preconditionType & " " & p_element.curr.statusType & " " & p_element.curr.direction);
+ }
+ if (ischosen(p_element.des)) {
+ v_result := v_result + 2 + c_CRlen + lengthof("des:" & p_element.des.preconditionType & " " & p_element.des.strength & " " & p_element.des.statusType & " " & p_element.des.direction);
+ }
+ if (ischosen(p_element.conf)) {
+ v_result := v_result + 2 + c_CRlen + lengthof("conf:" & p_element.conf.preconditionType & " " & p_element.conf.statusType & " " & p_element.conf.direction);
+ }
+ if (ischosen(p_element.rtpmap)) {
+ v_result := v_result + 2 + c_CRlen + lengthof("rtpmap:" & f_rtpmap_to_charstring(p_element.rtpmap));
+ }
+ if (ischosen(p_element.rtcp)) {
+ v_result := v_result + 2 + c_CRlen + lengthof("rtcp:" & f_rtcp_to_charstring(p_element.rtcp));
+ }
+ if (ischosen(p_element.unknown)) {
+ v_result := v_result + 2 + c_CRlen + lengthof(p_element.unknown.name);
+ if (isvalue(p_element.unknown.attr_value)) {
+ v_result := v_result + lengthof(":" & p_element.unknown.attr_value);
+ }
+ }
+ //* log("axr: length attribute=", v_result);
+ return v_result;
+ } //* f_SDPlength_attribute
+
+ function f_fmtpparams_to_charstring(
+ SDP_attribute_fmtp_format_specific_params p_params
+ ) return charstring {
+ var charstring v_result := "";
+ if(ischosen(p_params.unstructured)){
+ v_result := p_params.unstructured;
+ }
+ else
+ {
+ for(var integer v_idx := 0; v_idx < lengthof(p_params.paramList); v_idx := v_idx + 1) {
+ if(v_idx != 0)
+ {
+ v_result := v_result & "; "
+ }
+ v_result := v_result & p_params.paramList[v_idx].id;
+ if(ispresent(p_params.paramList[v_idx].paramValue)){
+ if(ischosen(p_params.paramList[v_idx].paramValue.tokenOrHost))
+ {
+ v_result := v_result & "=" & p_params.paramList[v_idx].paramValue.tokenOrHost;
+ }
+ else
+ {
+ v_result := v_result & "=""" & p_params.paramList[v_idx].paramValue.quotedString & """";
+ }
+ }
+ }
+ }
+ return v_result;
+ }
+
+ function f_rtpmap_to_charstring(
+ SDP_attribute_rtpmap p_rtpmap
+ ) return charstring {
+ var charstring v_result := "";
+ v_result := p_rtpmap.payload_type & " " & p_rtpmap.codec.encoding & "/" & p_rtpmap.codec.clockrate;
+ if(ispresent(p_rtpmap.codec.parameters))
+ {
+ v_result := v_result & "/" & p_rtpmap.codec.parameters;
+ }
+ return v_result;
+ }
+
+ function f_rtcp_to_charstring(
+ SDP_attribute_rtcp p_rtcp
+ ) return charstring {
+ var charstring v_result := int2str(p_rtcp.portnumber);
+ if(ispresent(p_rtcp.connection))
+ {
+ v_result := v_result & " " & p_rtcp.connection.net_type & " " & p_rtcp.connection.addr_type & " " & p_rtcp.connection.conn_addr.addr;
+ if(ispresent(p_rtcp.connection.conn_addr.ttl))
+ {
+ v_result := v_result & "/" & int2str(p_rtcp.connection.conn_addr.ttl);
+ if(ispresent(p_rtcp.connection.conn_addr.num_of_addr))
+ {
+ v_result := v_result & "/" & int2str(p_rtcp.connection.conn_addr.num_of_addr);
+ }
+ }
+ }
+ return v_result;
+ }
+
+ } //* group SDPlen_calculation
+
+ group XML_Len_calculation {
+
+ /**
+ * @desc Declaration of external functions to calculate length of message bodies switching of internal or external functions are made by boolean module parameter/PIXIT USE_FX_FOR_XML_LENGTH declared at top of this module
+ */
+ external function fx_calculateXMLBodyLen(
+ XmlBody p_mb
+ ) return integer;
+
+ /**
+ * @desc Calculation of XML body length
+ * @param p_mb contain XML body
+ * @return xml_length
+ */
+ function f_XMLBody_Length(
+ XmlBody p_mb,
+ boolean p_ext_func
+ ) return integer {
+ var integer v_result := 0;
+
+ if (p_ext_func) {
+ v_result := fx_calculateXMLBodyLen(p_mb);
+ }
+ else {
+ // assume ConferenceInfo ONLY in the XML message
+ // body
+ if (ischosen(p_mb.conference)) {
+ v_result := f_XMLBody_ConferenceInfo_Length(p_mb.conference);
+ }
+
+ // assume CUG ONLY in the XML message body
+ if (ischosen(p_mb.cug)) {
+ v_result := f_XMLBody_Cug_Length(p_mb.cug);
+ }
+
+ // assume MCID ONLY in the XML message body
+ if (ischosen(p_mb.mcid)) {
+ v_result := f_XMLBody_Mcid_Length(p_mb.mcid);
+ }
+
+ // assume CW ONLY in the XML message body
+ if (ischosen(p_mb.cw)) {
+ v_result := f_XMLBody_Cw_Length(p_mb.cw);
+ }
+
+ // assume CDIV ONLY in the XML message body
+ if (ischosen(p_mb.cdivn)) {
+ v_result := f_XMLBody_Cdivn_Length(p_mb.cdivn);
+ }
+
+ // assume PSTNTransit ONLY in the XML message body
+ if (ischosen(p_mb.pstnTransit)) {
+ v_result := f_XMLBody_PSTNTransit_Length(p_mb.pstnTransit);
+ }
+
+ // assume Simservs ONLY in the XML message body
+ if (ischosen(p_mb.simservs)) {
+ v_result := f_XMLBody_Simservs_Length(p_mb.simservs);
+ }
+
+ // assume ResourceLists ONLY in the XML message body
+ if (ischosen(p_mb.resourceLists)) {
+ v_result := f_XMLBody_ResourceList_Length(p_mb.resourceLists);
+ }
+
+ // assume Ims3GPP ONLY in the XML message body
+ if (ischosen(p_mb.ims3gpp)) {
+ v_result := f_XMLBody_Ims3GPP_Length(p_mb.ims3gpp);
+ }
+ /**
+ * Add aditional checks regarding to new variants, also implement appropriate function for calculation
+ */
+ }
+ return v_result;
+ } //* f_XMLBodyLength
+
+ group XMLBodies_calculation {
+
+ /**
+ * @desc Calculation of XML ConferenceInfo element length
+ * @param p_mb contain XML ConfInfo body
+ * @return xml_length
+ */
+ function f_XMLBody_ConferenceInfo_Length(
+ template(value) Conference_type p_mb
+ ) return integer {
+ var integer v_result := lengthof(encvalue(p_mb)) / 8;
+ return v_result;
+ } //* f_XMLBody_ConferenceInfo_Length
+
+ /**
+ * @desc Calculation of XML CUG element length
+ * @param p_mb contain XML CUG body
+ * @return xml_length
+ */
+ function f_XMLBody_Cug_Length(
+ template(value) Cug p_mb
+ ) return integer {
+ var integer v_result := lengthof(encvalue(p_mb)) / 8;
+ return v_result;
+ } //* f_XMLBody_Cug_Length
+
+ /**
+ * @desc Calculation of XML MCID element length
+ * @param p_mb contain XML MCID body
+ * @return xml_length
+ */
+ function f_XMLBody_Mcid_Length(
+ template(value) Mcid p_mb
+ ) return integer {
+ var integer v_result := lengthof(encvalue(p_mb)) / 8;
+
+ return v_result;
+ } //* f_XMLBody_Mcid_Length
+
+ /**
+ * @desc Calculation of XML CW element length
+ * @param p_mb contain XML CW body
+ * @return xml_length
+ */
+ function f_XMLBody_Cw_Length(
+ template(value) Ims_cw p_mb
+ ) return integer {
+ var integer v_result := lengthof(encvalue(p_mb)) / 8;
+
+ return v_result;
+ } //* f_XMLBody_Cw_Length
+
+ /**
+ * @desc Calculation of XML CDIVN element length
+ * @param p_mb contain XML CDIVN body
+ * @return xml_length
+ */
+ function f_XMLBody_Cdivn_Length(
+ template(value) Comm_div_info_type p_mb
+ ) return integer {
+ var integer v_result := lengthof(encvalue(p_mb)) / 8;
+
+ return v_result;
+ } //* f_XMLBody_Cdivn_Length
+
+ /**
+ * @desc Calculation of XML PSTNTransit element length
+ * @param p_mb contain XML PSTNTransit body
+ * @return xml_length
+ */
+ function f_XMLBody_PSTNTransit_Length(
+ template(value) PSTN_transit p_mb
+ ) return integer {
+ var integer v_result := lengthof(encvalue(p_mb)) / 8;
+ return v_result;
+ } //* f_XMLBody_PSTNTransit_Length
+
+ /**
+ * @desc Calculation of XML Simservs element length
+ * @param p_mb contain XML Simservs body
+ * @return xml_length
+ */
+ function f_XMLBody_Simservs_Length(
+ template(value) Simservs p_mb
+ ) return integer {
+ var integer v_result := lengthof(encvalue(p_mb)) / 8;
+ return v_result;
+ } //* f_XMLBody_Simservs_Length
+
+ /**
+ * @desc Calculation of XML ResourceList length
+ * @param p_mb contain XML ResourceList body
+ * @return xml_length
+ */
+ function f_XMLBody_ResourceList_Length(
+ template(value) Resource_lists p_mb
+ ) return integer {
+ var integer v_result := lengthof(encvalue(p_mb)) / 8;
+ return v_result;
+ } //* f_XMLBody_ResourceList_Length
+
+ /**
+ * @desc Calculation of XML Ims3GPP length
+ * @param p_mb contain XML Ims3GPP body
+ * @return xml_length
+ */
+ function f_XMLBody_Ims3GPP_Length(
+ template(value) TIMS3GPP p_mb
+ ) return integer {
+ var integer v_result := lengthof(encvalue(p_mb)) / 8;
+ return v_result;
+ } //* f_XMLBody_Ims3GPP_Length
+
+
+ } //* XMLBodies_calculation
+
+
+ } //* group XMLlen_calculation
+
+ group simpleMsgSummaryBody_Length {
+
+ function f_simpleMsgSummaryBody_Length(
+ SimpleMsgSummary p_mb
+ ) return integer {
+ var integer i;
+ var integer v_result := 2;
+
+
+ //* due to empty line beginning of message body
+ var charstring v_auxstring;
+
+ v_result := 2 + lengthof(p_mb.msg_status_line.msg_type) + 2 + lengthof(p_mb.msg_status_line.msg_status) + c_CRlen; //* "Message-Waiting:
+ //* yes"
+ if (isvalue(p_mb.msg_account))
+ //* "Message-Account"
+ {
+ v_result := v_result + 2 + lengthof(p_mb.msg_account.msg_type_account) + 2 + lengthof(p_mb.msg_account.account_URI) + c_CRlen;
+ }
+ if (isvalue(p_mb.msg_summary_line_list)) {
+ for (i := 0; i < lengthof(p_mb.msg_summary_line_list); i := i + 1) {
+ v_result := v_result + 2 + c_CRlen + lengthof(p_mb.msg_summary_line_list[i].msg_context_class) + 2 + lengthof(p_mb.msg_summary_line_list[i].msgs);
+ if (isvalue(p_mb.msg_summary_line_list[i].urgent_msgs)) {
+ v_auxstring := valueof(p_mb.msg_summary_line_list[i].urgent_msgs);
+ v_result := v_result + 1 + lengthof(v_auxstring);
+ }
+ }
+ }
+ if (isvalue(p_mb.opt_msg_headers)) {
+ for (i := 0; i < lengthof(p_mb.opt_msg_headers); i := i + 1) {
+ v_result := v_result + 2 + c_CRlen + lengthof(p_mb.opt_msg_headers[i]);
+ }
+ }
+ return v_result;
+ }
+ }
+
+ group MIME_Len_calculation {
+ /**
+ * @desc Calculation of MIME length
+ * @param p_mb contain MIME message
+ * @return xml_length
+ */
+ function f_MIMElength(
+ MIME_Message p_mb
+ ) return integer {
+ var integer i;
+ var integer v_result := 2;
+ // 0d0a
+ v_result := v_result + lengthof(p_mb.boundary) + 2 /*0d0a*/;
+
+ for (i := 0; i < lengthof(p_mb.mimeEncapsulatedList); i := i + 1) {
+
+ v_result := v_result + lengthof("Content-Type: ") + lengthof(p_mb.mimeEncapsulatedList[i].content_type) + 2 /*0d0a*/;
+
+ if (isvalue(p_mb.mimeEncapsulatedList[i].content_disposition)) {
+ v_result := v_result + lengthof("Content-Disposition: ") + lengthof(p_mb.mimeEncapsulatedList[i].content_disposition) + 2 /*0d0a*/;
+ }
+
+ // v_result := v_result +2/*0d0a*/; ??? to check
+ // assume SDP_Message ONLY in the message body
+ if (ischosen(p_mb.mimeEncapsulatedList[i].mime_encapsulated_part.sdpMessageBody)) {
+ v_result := v_result + f_SDPlength(p_mb.mimeEncapsulatedList[i].mime_encapsulated_part.sdpMessageBody);
+ }
+
+ // assume XML_Body ONLY in the message body
+ if (ischosen(p_mb.mimeEncapsulatedList[i].mime_encapsulated_part.xmlBody)) {
+ v_result := v_result + f_XMLBody_Length(p_mb.mimeEncapsulatedList[i].mime_encapsulated_part.xmlBody, PX_USE_FX_FOR_XML_LENGTH);
+ }
+ // //assume XML_Message ONLY in the message body
+ // if (ischosen(p_mb.mimeEncapsulatedList[i ]
+ // .mime_encapsulated_part.xmlMessage))
+ // {
+ // v_result := v_result +
+ // f_XMLlength(p_mb.mimeEncapsulatedList[i ]
+ // .mime_encapsulated_part.xmlMessage,
+ // USE_FX_FOR_XML_LENGTH );
+ // };
+ // v_result := v_result +2/*0d0a*/; ??? to check
+ }
+
+ // v_result := v_result +2/*0d0a*/; ??? to check
+ return v_result;
+ } //* f_MIMElength
+
+
+ } //* group MIMElen_calculation
+
+ group TextPlain_Len_calculation {
+ /**
+ * @desc Calculation of messagebody-textplain type length
+ * @param p_mb contain textplain message
+ * @return lenght
+ */
+ function f_TextPlainLength(
+ template(value) MessageBody p_mb
+ ) return integer {
+ var integer v_result := 0;
+
+ v_result := v_result + lengthof(p_mb.textplain);
+
+ return v_result;
+ } //* end function f_TextPlainLength
+
+
+ } //* end group TextPlainLen_calculation
+
+
+ } //* group MessageBody_Calculation
+
+
+ group GiveHeaders {
+ /**
+ * @desc Return component variable of recordRoute header if vc_boo_recordRoute is true
+ * @return component variable of recordRoute header
+ */
+ function f_recordroute(
+ ) runs on SipComponent
+ return template(omit) RecordRoute {
+ var template(omit) RecordRoute v_recordRoute := omit;
+ if (vc_boo_recordRoute) {
+ return vc_recordRoute;
+ }
+ else {
+ return (v_recordRoute);
+ }
+ }
+
+ /**
+ * @desc Return component variable of Route header if vc_boo_route is true
+ * @return component variable of recordRoute header
+ */
+ function f_route(
+ ) runs on SipComponent
+ return template(omit) Route {
+ var template(omit) Route v_route := omit;
+ if (vc_boo_route) {
+ return vc_route;
+ }
+ else {
+ return (v_route);
+ }
+ }
+
+
+ } //* end group GiveHeaders
+
+ group others {
+
+ /*
+ *
+ * @desc function combines two comma parameter lists
+ * @param p_list1 first list
+ * @param p_list2 second list
+ * @return comma parameter list that contains parameters from both input lists
+ * @verdict
+ */
+ function f_merge_CommaParam_List(
+ template(value) CommaParam_List p_list1,
+ template(value) CommaParam_List p_list2
+ ) return template(value) CommaParam_List {
+ var template(value) CommaParam_List p_result;
+ var integer i, v_limit1 := lengthof(p_list1);
+ for (i := 0; i < v_limit1; i := i + 1) {
+ p_result[i] := p_list1[i];
+ }
+ for (i := 0; i < lengthof(p_list2); i := i + 1) {
+ p_result[i + v_limit1] := p_list2[i];
+ }
+ return p_result;
+ }
+
+
+ } //* end group others
+
+
+ } //* group TemplatePreparationFunctions
+} //* end module LibSip_Templates
/v3/ttcn/LibSip_Templates.ttcn
Property changes:
Added: svn:keywords
## -0,0 +1 ##
+Id
\ No newline at end of property
Index: v3/ttcn/LibSip_Library.ttcn
===================================================================
--- v3/ttcn/LibSip_Library.ttcn (nonexistent)
+++ v3/ttcn/LibSip_Library.ttcn (revision 634)
@@ -0,0 +1,23 @@
+/**
+ * @author STF471
+ * @version $Id: LibSip_Steps.ttcn 614 2014-07-07 10:01:14Z tepelmann $
+ * @desc This module provides all modules of the LibSip as public imports.
+ * Importing this module will automatically import all here listed modules,
+ * no other LibSip_xxx module import needed in this case.
+ * This module is part of LibSipV3.
+ */
+module LibSip_Library {
+
+ public import from LibSip_Interface all;
+ public import from LibSip_MessageBodyTypes all;
+ public import from LibSip_PIXITS all;
+ public import from LibSip_SDPTypes all;
+ public import from LibSip_SimpleMsgSummaryTypes all;
+ public import from LibSip_SMSFunctions all;
+ public import from LibSip_SMSTemplates all;
+ public import from LibSip_SMSTypesAndValues all;
+ public import from LibSip_Steps all;
+ public import from LibSip_Templates all;
+ public import from LibSip_XMLTypes all;
+
+}
\ No newline at end of file
Index: v3/ttcn/LibSip_MessageBodyTypes.ttcn
===================================================================
--- v3/ttcn/LibSip_MessageBodyTypes.ttcn (nonexistent)
+++ v3/ttcn/LibSip_MessageBodyTypes.ttcn (revision 634)
@@ -0,0 +1,60 @@
+/******************************************************************************
+ * @author STF 346, STF366, STF368, STF369, STF450, STF471
+ * @version $Id: LibSip_MessageBodyTypes.ttcn 622 2014-07-10 14:50:54Z nikolajev $
+ * @desc This module provides the types used for alternative SIP message
+ * body variants and combinations.
+ * This module is part of LibSipV3.
+ */
+
+module LibSip_MessageBodyTypes {
+ import from LibSip_SDPTypes all;
+ import from LibSip_SimpleMsgSummaryTypes all;
+ import from LibSip_XMLTypes all;
+
+ /*
+ * Simple body types that can be used instead of the more detailed XML and SDP
+ * without codec support
+ * */
+ //type charstring XmlBody;
+ //type charstring SDP_Message;
+
+ group MIMETypes {
+ type union MIME_Encapsulated_Parts {
+ SDP_Message sdpMessageBody,
+ XmlBody xmlBody // if there is XML body
+ }
+
+ type record MIME_Encapsulated_Part {
+ charstring content_type,
+ charstring content_disposition optional,
+ MIME_Encapsulated_Parts mime_encapsulated_part
+ }
+
+ type record MIME_Message {
+ charstring boundary,
+ // len:
+ MimeEncapsulatedList mimeEncapsulatedList
+ }
+
+ type record of MIME_Encapsulated_Part MimeEncapsulatedList;
+
+
+ } // group MIMETypes
+
+ type union MessageBody {
+ SDP_Message sdpMessageBody,
+ // if there is only SDP part
+ // XMLMessage xmlMessage, // if there is XML message (with header and body)
+ XmlBody xmlBody,
+ // if there is XML body
+ MIME_Message mimeMessageBody,
+ // if there is SDP and encapsulated ISUP part
+ charstring sipfrag,
+ // if content-Type is message/sipfrag (cp. NOTIFY, cp TS124147 A.4.3.1.2)
+ charstring textplain,
+ // if content type is text/plain (for testing long messages)
+ SimpleMsgSummary simpleMsgSummary,
+ // RFC 3842
+ octetstring smsMessage // encoded SMS message 3GPP 23.040, 24.011
+ }
+}
Index: v3/ttcn/LibSip_PIXITS.ttcn
===================================================================
--- v3/ttcn/LibSip_PIXITS.ttcn (nonexistent)
+++ v3/ttcn/LibSip_PIXITS.ttcn (revision 634)
@@ -0,0 +1,137 @@
+/**
+ * @author STF 346, STF366, STF368, STF369, STF450, STF471
+ * @version $Id$
+ * @desc This module provides module parameters used within the SIP
+ * protocol for timers, SDP formats etc.
+ * This module is part of LibSipV3.
+ */
+module LibSip_PIXITS {
+ // LibCommon
+ import from LibCommon_BasicTypesAndValues all;
+ import from LibCommon_DataStrings all;
+
+ // ____________________________ PIXIT-S_______________________________
+ group SIP_PIXITparameters {
+ group SDPParameter {
+
+ /**
+ * @desc charstring for SDP user name
+ */
+ modulepar charstring PX_SIP_SDP_USER_NAME := "voicesession";
+
+ /**
+ * @desc charstring for SDP session identifier
+ */
+ modulepar charstring PX_SIP_SDP_SESSION_ID := "30000";
+
+ /**
+ * @desc charstring for SDP dynamic port
+ */
+ modulepar charstring PX_SIP_SDP_DYN := "0";
+
+ /**
+ * @desc charstring for SDP bandwidth modifier
+ */
+ modulepar charstring PX_SIP_SDP_B_MODIFIER := "AS";
+
+ /**
+ * @desc integer for SDP bandwidth value
+ */
+ modulepar integer PX_SIP_SDP_B_BANDWIDTH := 64;
+
+ /**
+ * @desc charstring for SDP media attribute encoding supported by the IUT
+ */
+ modulepar charstring PX_SIP_SDP_ENCODING := "PCMU";
+
+ /**
+ * @desc charstring for SDP media attribute encoding clockrate supported by the IUT
+ */
+ modulepar charstring PX_SIP_SDP_CLOCKRATE := "8000";
+
+ } // group SDP Parameter
+ group XMLCOnfiguration{
+
+ /**
+ * @desc boolean for MessageBody length calculation based on encvalue operation result
+ */
+ modulepar boolean PX_MB_LENGTH_FROM_ENCVAL := true;
+
+ /**
+ * @desc boolean for MessageBody length calculation to be performed by external function
+ */
+ modulepar boolean PX_USE_FX_FOR_XML_LENGTH := false;
+ }
+
+ group SupportedOptions {
+
+ /**
+ * @desc charstring for Used Transport in upper case "UDP"/"TCP"
+ */
+ modulepar charstring PX_SIP_TRANSPORT := "UDP";
+
+
+ } // group SupportedOptions{
+
+ group RegistrationParameters {
+
+ /**
+ * @desc boolean for the SIP user if it have to register itself before executing a test case
+ */
+ modulepar boolean PX_SIP_REGISTRATION := false;
+
+ /**
+ * @desc charstring for PX_AUTH_ALGORITHM security algorithm Possible values: MD5 or AKAv1-MD5
+ */
+ modulepar charstring PX_AUTH_ALGORITHM := "AKAv1-MD5";
+
+
+ } // group Registration parameters
+
+ group SwitchToEnableAuthentication {
+ /**
+ * @desc boolean for option controlling if authentication is enabled/disabled for REGISTER messages
+ */
+ modulepar boolean PX_SIP_REGISTER_AUTHENTICATION_ENABLED := true;
+
+ /**
+ * @desc boolean for option controlling if authentication is enabled/disabled for INVITE messages
+ */
+ modulepar boolean PX_SIP_INVITE_AUTHENTICATION_ENABLED := false;
+
+
+ } // group SwitchToEnableAuthentication
+
+ group SIP_Timers {
+ /**
+ * @desc float for TWait default value for waiting an operator action
+ */
+ modulepar float PX_SIP_TWAIT := 30.0;
+
+ /**
+ * @desc float for TAck default value for waiting an acknowledgement
+ */
+ modulepar float PX_SIP_TACK := 8.0;
+
+ /**
+ * @desc float for TResp default value for waiting for a response from the IUT
+ */
+ modulepar float PX_SIP_TRESP := 15.0;
+
+ /**
+ * @desc float for TNoAct default value for waiting no message from the IUT Value given for PX_TNOACT should be less than value of SHORT_REGISTRATION constant (which is currently "3" (seconds))
+ */
+ modulepar float PX_SIP_TNOACT := 1.0;
+
+ } // group SIP_Timers
+
+ group MimePart {
+ /**
+ * @desc charstring for delimiter value used in mime multipart message to separate message body parts
+ */
+ modulepar charstring PX_SIP_MIME_BOUNDARY := "boundary1";
+
+ } // group MimePart
+
+ } // group SIP_PIXITparameters
+} // end module LibSip_PIXITS
/v3/ttcn/LibSip_PIXITS.ttcn
Property changes:
Added: svn:keywords
## -0,0 +1 ##
+Id
\ No newline at end of property
Index: v3/ttcn/LibSip_SMSFunctions.ttcn3
===================================================================
--- v3/ttcn/LibSip_SMSFunctions.ttcn3 (nonexistent)
+++ v3/ttcn/LibSip_SMSFunctions.ttcn3 (revision 634)
@@ -0,0 +1,48 @@
+/**
+ * @author STF 435, 471
+ * @version $Id$
+ * @desc This module provides the functions used by the test component
+ * for SIP-SMS over IMS as specified in 3GPP 24-341 tests.
+ * This module is part of LibSipV3.
+ */
+module LibSip_SMSFunctions {
+ import from LibSip_SMSTypesAndValues all;
+
+ function f_IA5_2oct(
+ charstring p_ASCII_String
+ ) return octetstring {
+ var integer i;
+ var integer j;
+ var integer v_Length := lengthof(p_ASCII_String);
+ var integer v_Temp;
+ var octetstring v_Noctets := ''O;
+ var bitstring v_TempBitSrc := ''B;
+ var bitstring v_TempBitDes := ''B;
+
+ if ((v_Length <= 0) or (v_Length > 160) or (((v_Length * 7) mod 8) != 0)) {
+ log("*** " & __SCOPE__ & "INFO: Invalid value of input string length ***");
+ }
+
+ for (i := 0; i < v_Length; i := i + 1) {
+ v_Temp := char2int(p_ASCII_String[i]);
+ v_TempBitSrc := int2bit(v_Temp, 8);
+
+ for (j := 1; j <= 7; j := j + 1) {
+
+ v_TempBitDes := v_TempBitSrc[8 - j] & v_TempBitDes;
+
+ if (((7 * i + j) mod 8) == 0) {
+
+ v_Noctets := v_Noctets & bit2oct(v_TempBitDes);
+ v_TempBitDes := ''B;
+ }
+ }
+ }
+
+ return v_Noctets;
+ } // f_IA5_2oct
+
+ external function fx_GetSC_TimeStamp(
+ integer p_TimeZone
+ ) return TP_ServiceCentreTimeStamp_Type;
+} // End of module LibSip_SMSFunctions
\ No newline at end of file
Index: v3/ttcn/LibSip_SMSTemplates.ttcn3
===================================================================
--- v3/ttcn/LibSip_SMSTemplates.ttcn3 (nonexistent)
+++ v3/ttcn/LibSip_SMSTemplates.ttcn3 (revision 634)
@@ -0,0 +1,304 @@
+/**
+ * @author STF 435, STF 471
+ * @version $Id$
+ * @desc This module provides the types used by the test component
+ * for SIP-SMS over IMS as specified in 3GPP 24-341 tests.
+ * This module is part of LibSipV3.
+ */
+module LibSip_SMSTemplates {
+ import from LibCommon_DataStrings all;
+ import from LibSip_SMSTypesAndValues all;
+ import from LibSip_SMSFunctions all;
+
+ group SMS_Templates_Group {
+
+ /* Non-SMS Type Constraints */
+ template(present) TypeOfNumberingPlan mw_TypeOfNumberingPlanAny := {
+ extBit := ?,
+ typeOfNumber := ?,
+ numberingPlanId := ?
+ }
+
+ template(value) TypeOfNumberingPlan m_TypeOfNumberingPlan := {
+ extBit := '1'B,
+ typeOfNumber := '001'B, // international number
+ numberingPlanId :=
+ '0001'B // ISDN/telephony numbering plan (Rec. E.164/E.163)
+ }
+
+ template(present) TypeOfNumberingPlan mw_TypeOfNumberingPlan := mw_TypeOfNumberingPlanAny;
+
+ /* End Non-SMS Type Constraints */
+ template(value) RP_OriginatorAddress_dl m_RP_OriginatorAddress_dl := {
+ spare := omit,
+ iei := omit,
+ iel := '06'O, // 6 semi-octets
+ typeOfNumberingPlan := m_TypeOfNumberingPlan,
+ digits := '001122'O
+ }
+
+ template(present) RP_OriginatorAddress_ul mw_RP_OriginatorAddress_ul := {
+ spare := omit,
+ iei := omit,
+ iel := '00'O
+ }
+
+ template(present) RP_DestinationAddress_ul mw_RP_DestinationAddress_ul := {
+ spare := omit,
+ iei := omit,
+ iel := ?,
+ typeOfNumberingPlan := mw_TypeOfNumberingPlan,
+ digits := ?
+ }
+ template(omit) RP_DestinationAddress_dl m_RP_DestinationAddress_dl := {
+ spare := omit,
+ iei := omit,
+ iel := '00'O
+ }
+
+ template(omit) RP_UserData m_RP_UserData_DELIVER(
+ octetstring p_Digits
+ ) := {
+ spare := omit,
+ iei := omit,
+ iel := int2oct((153 + lengthof(p_Digits)), 1),
+ tP_PDU := {SMS_DELIVER := m_SMS_DELIVER(p_Digits)}
+ }
+
+ template(value) RP_UserData m_RP_UserData_SUBMIT_REPORT := {
+ spare := '0'B,
+ iei := c_IEI_RP_UserData,
+ iel := '0A'O, // the TPDU data length is 10 octets
+ tP_PDU := {SMS_SUBMIT_REPORT := m_SMS_SUBMIT_REPORT}
+ }
+ template(value) RP_UserData m_RP_UserData_STATUS_REPORT(
+ template(value) TP_MessageReference_Type p_MessageRef,
+ template(value) TP_Address_Type p_RecipientAddress,
+ template(value) TP_ServiceCentreTimeStamp_Type p_SCTP
+ ) modifies m_RP_UserData_SUBMIT_REPORT := {
+ tP_PDU := {SMS_STATUS_REPORT := m_SMS_STATUS_REPORT(p_MessageRef, p_RecipientAddress, p_SCTP)}
+ }
+
+ template(present) RP_UserData mw_RP_UserData_SUBMIT := {
+ spare := omit,
+ iei := omit,
+ iel := ?,
+ tP_PDU := {SMS_SUBMIT := mw_SMS_SUBMIT_VPF_REF}
+ }
+
+ template(present) RP_UserData mw_RP_UserData_DELIVER_REPORT := {
+ spare := '0'B,
+ iei := c_IEI_RP_UserData,
+ iel := ?,
+ tP_PDU := {SMS_DELIVER_REPORT := mw_SMS_DELIVER_REPORT}
+ }
+
+ /* End SM-RP Type Constraints */
+ /* SM-RP PDU Constraints */
+ template(value) RP_DATA_dl_Type m_RP_DATA_dl_base := {
+ spare5 := '00000'B,
+ rP_MessageTypeIndicator := c_MT_RP_DATA_dl,
+ rP_MessageReference := '00'O,
+ rP_OriginatorAddress := m_RP_OriginatorAddress_dl,
+ rP_DestinationAddress := m_RP_DestinationAddress_dl,
+ rP_UserData := m_RP_UserData_DELIVER('0000'O)
+ }
+
+ template(value) RP_DATA_dl_Type m_RP_DATA_dl_DELIVER(
+ octetstring p_Digits
+ ) modifies m_RP_DATA_dl_base := {rP_UserData := m_RP_UserData_DELIVER(p_Digits)}
+
+ template(value) RP_DATA_dl_Type m_RP_DATA_dl_STATUS_REPORT(
+ template(value) TP_MessageReference_Type p_MessageRef,
+ template(value) TP_Address_Type p_RecipientAddress,
+ template(value) TP_ServiceCentreTimeStamp_Type p_SCTP
+ ) modifies m_RP_DATA_dl_base := {
+ rP_UserData := m_RP_UserData_STATUS_REPORT(p_MessageRef, p_RecipientAddress, p_SCTP)
+ }
+
+
+ template(present) RP_DATA_ul_Type mw_RP_DATA_ul_SUBMIT := {
+ spare5 := '00000'B,
+ rP_MessageTypeIndicator := c_MT_RP_DATA_ul,
+ rP_MessageReference := ?,
+ rP_OriginatorAddress := mw_RP_OriginatorAddress_ul,
+ rP_DestinationAddress := mw_RP_DestinationAddress_ul,
+ rP_UserData := mw_RP_UserData_SUBMIT
+ }
+
+ template(value) RP_ACK_Type m_RP_ACK_SUBMIT_REPORT(
+ template(value) Oct1 p_msgReference := '00'O
+ ) := {
+ spare5 := '00000'B,
+ rP_MessageTypeIndicator := c_MT_RP_ACK_dl,
+ rP_MessageReference := p_msgReference,
+ rP_UserData := m_RP_UserData_SUBMIT_REPORT
+ }
+
+ template(present) RP_ACK_Type mw_RP_ACK_DELIVER_REPORT := {
+ spare5 := '00000'B,
+ rP_MessageTypeIndicator := c_MT_RP_ACK_ul,
+ rP_MessageReference := ?,
+ rP_UserData := mw_RP_UserData_DELIVER_REPORT
+ }
+
+ /* End SM-RP PDU Constraints */
+ /* SM-TP Type Constraints */
+ template(value) TP_ProtocolIdentifier_Type mw_TP_ProtocolIdentifier := {
+ pidType := '01'B,
+ interworking := '0'B,
+ pidValue := '00000'B
+ }
+
+ template(value) TP_ProtocolIdentifier_Type m_TP_ProtocolIdentifier := {
+ pidType := '01'B,
+ interworking := '0'B,
+ pidValue := '00000'B
+ }
+
+ template(value) TP_DataCodingScheme_Type m_TP_DataCodingScheme := {
+ codingGroup := '0000'B,
+ codeValue := '0000'B
+ }
+
+ template(present) TP_Address_Type mw_TP_AddressAny := {
+ iel := ?,
+ typeOfNumberingPlan := mw_TypeOfNumberingPlanAny,
+ digits := *
+ }
+
+ template(value) TP_Address_Type m_TP_Address(
+ octetstring p_Digits
+ ) := {
+ iel := int2oct(2 * lengthof(p_Digits), 1),
+ // length is number of useful semi-octets
+ // as p_digits is declared as octetstring the number must be even
+ typeOfNumberingPlan := m_TypeOfNumberingPlan,
+ digits := p_Digits
+ }
+
+ template(value) TP_ParameterIndicator_Type m_TP_ParameterIndicator := {
+ extBit1 := '0'B,
+ spare4 := '0000'B,
+ tP_UDL := '0'B,
+ tP_DCS := '0'B,
+ tP_PID := '1'B
+ }
+
+ /* End SM-TP Type Constraints */
+ /* SM-TP PDU Constraints */
+ template(value) SMS_DELIVER_Type m_SMS_DELIVER(
+ octetstring p_Digits
+ ) := {
+ tP_ReplyPath := '0'B,
+ tP_UserDataHeaderIndicator := '0'B,
+ tP_StatusReportIndication := '1'B,
+ spare2 := '00'B,
+ tP_MoreMessagesToSend := '0'B,
+ tP_MessageTypeIndicator := c_MT_SMS_DELIVER,
+ tP_OriginatingAddress := m_TP_Address(p_Digits),
+ tP_ProtocolIdentifier := m_TP_ProtocolIdentifier,
+ tP_DataCodingScheme_Type := m_TP_DataCodingScheme,
+ tP_ServiceCentreTimeStamp := fx_GetSC_TimeStamp(0), // Time Zone 0 assumed
+ tP_UserDataLength := int2oct(160, 1),
+ tP_UserData := f_IA5_2oct(c_Fox)
+ }
+
+ template(present) SMS_DELIVER_REPORT_Type mw_SMS_DELIVER_REPORT := {
+ spare1 := '0'B,
+ tP_UserDataHeaderIndicator := '0'B,
+ spare4 := '0000'B,
+ tP_MessageTypeIndicator := c_MT_SMS_DELIVER_REPORT,
+ tP_FailureCause := omit,
+ tP_ParameterIndicator := ?,
+ tP_ProtocolIdentifier := mw_TP_ProtocolIdentifier,
+ tP_DataCodingScheme_Type := *,
+ tP_UserDataLength := *,
+ tP_UserData := *
+ }
+
+ template(present) SMS_SUBMIT_Type mw_SMS_SUBMIT := {
+ tP_ReplyPath := '0'B,
+ tP_UserDataHeaderIndicator := '0'B,
+ tP_StatusReportRequest := '1'B,
+ tP_ValidityPeriodFormat := '??'B,
+ tP_RejectDuplicates := '0'B,
+ tP_MessageTypeIndicator := c_MT_SMS_SUBMIT,
+ tP_MessageReference := ?,
+ tP_DestinationAddress := mw_TP_AddressAny,
+ tP_ProtocolIdentifier := mw_TP_ProtocolIdentifier,
+ tP_DataCodingScheme_Type := ?,
+ tP_ValidityPeriod := *,
+ tP_UserDataLength := int2oct(160, 1),
+ tP_UserData :=
+ ? // any data will do: 140 octets
+ }
+
+ template(present) SMS_SUBMIT_Type mw_SMS_SUBMIT_VPF_NP modifies mw_SMS_SUBMIT := {
+ tP_ValidityPeriodFormat := '00'B,
+ tP_ValidityPeriod := omit
+ }
+
+ template(present) SMS_SUBMIT_Type mw_SMS_SUBMIT_VPF_REF modifies mw_SMS_SUBMIT := {
+ tP_ValidityPeriodFormat := '10'B,
+ tP_ValidityPeriod := ?
+ }
+
+ template(present) SMS_SUBMIT_Type mw_SMS_SUBMIT_VPF_ENH modifies mw_SMS_SUBMIT := {
+ tP_ValidityPeriodFormat := '01'B,
+ tP_ValidityPeriod := ?
+ }
+
+ template(present) SMS_SUBMIT_Type mw_SMS_SUBMIT_VPF_ABS modifies mw_SMS_SUBMIT := {
+ tP_ValidityPeriodFormat := '11'B,
+ tP_ValidityPeriod := ?
+ }
+
+ template(value) SMS_SUBMIT_REPORT_Type m_SMS_SUBMIT_REPORT := {
+ spare1 := '0'B,
+ tP_UserDataHeaderIndicator := '0'B,
+ spare4 := '0000'B,
+ tP_MessageTypeIndicator := c_MT_SMS_SUBMIT_REPORT,
+ tP_FailureCause := omit,
+ tP_ParameterIndicator := m_TP_ParameterIndicator,
+ tP_ServiceCentreTimeStamp := fx_GetSC_TimeStamp(0), // Time Zone 0 assumed
+ tP_ProtocolIdentifier := m_TP_ProtocolIdentifier,
+ tP_DataCodingScheme_Type := omit,
+ tP_UserDataLength := omit,
+ tP_UserData := omit
+ }
+
+ template(value) SMS_STATUS_REPORT_Type m_SMS_STATUS_REPORT(
+ template(value) TP_MessageReference_Type p_MessageRef,
+ template(value) TP_Address_Type p_RA,
+ template(value) TP_ServiceCentreTimeStamp_Type p_SCTP
+ ) := {
+ // TS 34.229-1 clause A.7.5
+ spare1 := '0'B,
+ tP_UserDataHeaderIndicator := '0'B,
+ tP_StatusReportQualifier := '0'B,
+ spare2 := '00'B,
+ tP_MoreMessagesToSend := '0'B,
+ tP_MessageTypeIndicator := c_MT_SMS_STATUS_REPORT,
+ tP_MessageReference := p_MessageRef,
+ tP_RecipientAddress := p_RA,
+ tP_ServiceCentreTimeStamp := p_SCTP,
+ tP_DischargeTime := '00000000000000'H,
+ tP_Status := {
+ reserved := '0'B,
+ status := '0000000'B
+ },
+ tP_ParameterIndicator := m_TP_ParameterIndicator,
+ tP_ProtocolIdentifier := m_TP_ProtocolIdentifier,
+ tP_DataCodingScheme_Type := omit,
+ tP_UserDataLength := omit,
+ tP_UserData := omit
+ }
+
+
+
+
+
+ /* End SM-TP PDU Constraints */
+ } // group SMS_Templates_Group
+} // End of module LibSip_SMSTypesAndValues
\ No newline at end of file
Index: v3/ttcn/LibSip_SMSTypesAndValues.ttcn
===================================================================
--- v3/ttcn/LibSip_SMSTypesAndValues.ttcn (nonexistent)
+++ v3/ttcn/LibSip_SMSTypesAndValues.ttcn (revision 634)
@@ -0,0 +1,485 @@
+/******************************************************************************
+ * @author STF 435, STF471
+ * @version $Id$
+ * @desc This module contains the type definitions for SMS messages as specified in
+ * 3GPP 24-011 and 3GPP 23-040 Rel 8 and 9.
+ * SMS over IMS is specified in 3GPP 24-341.
+ * This module is part of LibSipV3.
+ */
+module LibSip_SMSTypesAndValues {
+ import from LibCommon_DataStrings all;
+
+ group SMS_Declarations {
+
+ const RP_MessageTypeIndicator_Type c_MT_RP_DATA_ul := '000'B;
+ /* RP_DATA_ul */
+ const RP_MessageTypeIndicator_Type c_MT_RP_DATA_dl := '001'B;
+ /* RP_DATA_dl */
+ const RP_MessageTypeIndicator_Type c_MT_RP_ACK_ul := '010'B;
+ /* RP_ACK_ul */
+ const RP_MessageTypeIndicator_Type c_MT_RP_ACK_dl := '011'B;
+ /* RP_ACK_dl */
+ const RP_MessageTypeIndicator_Type c_MT_RP_ERROR_ul := '100'B;
+ /* RP_ERROR_ul */
+ const RP_MessageTypeIndicator_Type c_MT_RP_ERROR_dl := '101'B;
+ /* RP_ERROR_dl */
+ const RP_MessageTypeIndicator_Type c_MT_RP_SMMA := '110'B;
+ /* RP_SMMA */
+ const TP_MessageTypeIndicator_Type c_MT_SMS_DELIVER := '00'B;
+ /* SMS DELIVER */
+ const TP_MessageTypeIndicator_Type c_MT_SMS_DELIVER_REPORT := '00'B;
+ /* SMS DELIVER REPORT */
+ const TP_MessageTypeIndicator_Type c_MT_SMS_STATUS_REPORT := '10'B;
+ /* SMS STATUS REPORT */
+ const TP_MessageTypeIndicator_Type c_MT_SMS_COMMAND := '10'B;
+ /* SMS COMMAND */
+ const TP_MessageTypeIndicator_Type c_MT_SMS_SUBMIT := '01'B;
+ /* SMS SUBMIT, SMS SUBMIT REPORT */
+ const TP_MessageTypeIndicator_Type c_MT_SMS_SUBMIT_REPORT := '01'B;
+ /* SMS SUBMIT, SMS SUBMIT REPORT */
+ const Bit7 c_IEI_RP_UserData := '1000001'B;
+ /* 24.011 cl. 8.2.5.3 */
+ const charstring c_Fox := "The quick brown fox jumps over the lazy dog's back. Kaufen Sie Ihrer Frau vier bequeme Pelze. - 0123456789 - THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG'S BACK.";
+
+
+
+ type record TypeOfNumberingPlan {
+ /* 24.008 cl. 10.5.4.7, 10.5.4.9, 10.5.4.13 */
+ Bit1 extBit,
+ /* Extension Bit */
+ Bit3 typeOfNumber,
+ /* Type Of Number */
+ Bit4 numberingPlanId /* Numbering Plan Identification */
+ }
+ /* SM-RP Type Declarations */
+ type Bit3 RP_MessageTypeIndicator_Type;
+ /* 24.011 cl. 8.2.2 */
+ type Oct1 RP_MessageReference_Type;
+ /* 24.011 cl. 8.2.3 */
+ type record RP_OriginatorAddress_dl {
+ /* 24.011 cl. 8.2.5.1 */
+ Bit1 spare optional,
+ /* 0 */
+ Bit7 iei optional,
+ /* 0101 1110 */
+ Oct1 iel,
+ /* min value 2 and max value is 11 */
+ TypeOfNumberingPlan typeOfNumberingPlan,
+ /* */
+ octetstring digits length(1 .. 10)
+ }
+
+ type record RP_OriginatorAddress_ul {
+ /* 24.011 cl. 8.2.5.1 */
+ Bit1 spare optional,
+ /* 0 */
+ Bit7 iei optional,
+ /* 0101 1110 */
+ Oct1 iel /* 0 */
+ }
+
+ type record RP_DestinationAddress_ul {
+ /* 24.011 cl. 8.2.5.2 */
+ Bit1 spare optional,
+ /* 0 */
+ Bit7 iei optional,
+ /* 0101 1110 */
+ Oct1 iel,
+ /* min value 2 and max value is 11 */
+ TypeOfNumberingPlan typeOfNumberingPlan,
+ /* */
+ octetstring digits length(1 .. 10)
+ }
+ type record RP_DestinationAddress_dl {
+ /* 24.011 cl. 8.2.5.2 */
+ Bit1 spare optional,
+ /* 0 */
+ Bit7 iei optional,
+ /* 0101 1110 */
+ Oct1 iel /* 0 */
+ }
+
+ type record RP_UserData {
+ /* 24.011 cl. 8.2.5.3 */
+ Bit1 spare optional,
+ /* 0, present in case of TLV; omit in case of LV */
+ Bit7 iei optional,
+ /* 1000001, present in case of TLV; omit in case of LV */
+ Oct1 iel,
+ /* */
+ TP_PDU_Type tP_PDU /* <= 232 octets */
+ }
+
+ type record RP_Cause {
+ /* 24.011 cl. 8.2.5.4 */
+ Bit1 spare optional,
+ /* present in case of TLV; omit in case of LV */
+ Bit7 iei optional,
+ /* present in case of TLV; omit in case of LV */
+ Oct1 iel,
+ /* 2 or 3 */
+ Bit1 extBit1,
+ /* 0 */
+ Bit7 causeValue1,
+ /* Table 8.4/3GPP TS 24.011 */
+ Bit1 extBit2,
+ /* 0 */
+ Bit7 causeValue2,
+ /* Table 8.4/3GPP TS 24.011 */
+ Oct1 diagnostic optional /* Parameters included in the return error from MAP */
+ }
+
+ /* End SM-RP Type Declarations */
+ /* SM-RP PDU Declarations */
+ type record RP_DATA_dl_Type {
+ /* 24.011 cl. 7.3.1.1
+ Direction: n -> ue */
+ Bit5 spare5,
+ /* cl. 8.2.2 M V 5 bits */
+ RP_MessageTypeIndicator_Type rP_MessageTypeIndicator,
+ /* cl. 8.2.2 M V 3 bits */
+ RP_MessageReference_Type rP_MessageReference,
+ /* cl. 8.2.3 M LV 1 */
+ RP_OriginatorAddress_dl rP_OriginatorAddress,
+ /* cl. 8.2.5.1 M LV 1-12 octets */
+ RP_DestinationAddress_dl rP_DestinationAddress,
+ /* cl. 8.2.5.2 M LV 1 */
+ RP_UserData rP_UserData /* cl. 8.2.5.3 M LV <= 233 octets */
+ }
+
+ type record RP_DATA_ul_Type {
+ /* 24.011 cl. 7.3.1.2
+ Direction: ue -> n */
+ Bit5 spare5,
+ /* cl. 8.2.2 M V 5 bits */
+ RP_MessageTypeIndicator_Type rP_MessageTypeIndicator,
+ /* cl. 8.2.2 M V 3 bits */
+ RP_MessageReference_Type rP_MessageReference,
+ /* cl. 8.2.3 M LV 1 */
+ RP_OriginatorAddress_ul rP_OriginatorAddress,
+ /* cl. 8.2.5.1 M LV 1 */
+ RP_DestinationAddress_ul rP_DestinationAddress,
+ /* cl. 8.2.5.2 M LV 1 */
+ RP_UserData rP_UserData /* cl. 8.2.5.3 M LV <= 233 octets */
+ }
+
+ type record RP_SMMA_Type {
+ /* 24.011 cl. 7.3.2
+ Direction: ue -> n */
+ Bit5 spare5,
+ /* cl. 8.2.2 M V 5 bits */
+ RP_MessageTypeIndicator_Type rP_MessageTypeIndicator,
+ /* cl. 8.2.2 M V 3 bits */
+ RP_MessageReference_Type rP_MessageReference /* cl. 8.2.3 M LV 1 */
+ }
+
+ type record RP_ACK_Type {
+ /* 24.011 cl. 7.3.3
+ Direction: ue <-> n */
+ Bit5 spare5,
+ /* cl. 8.2.2 M V 5 bits */
+ RP_MessageTypeIndicator_Type rP_MessageTypeIndicator,
+ /* cl. 8.2.2 M V 3 bits */
+ RP_MessageReference_Type rP_MessageReference,
+ /* cl. 8.2.3 M LV 1 */
+ RP_UserData rP_UserData optional /* cl. 8.2.5.3 O TLV <= 234 octets */
+ }
+
+ type record RP_ERROR_Type {
+ /* 24.011 cl. 7.3.4
+ Direction: ue <-> n */
+ Bit5 spare5,
+ /* cl. 8.2.2 M V 5 bits */
+ RP_MessageTypeIndicator_Type rP_MessageTypeIndicator,
+ /* cl. 8.2.2 M V 3 bits */
+ RP_MessageReference_Type rP_MessageReference,
+ /* cl. 8.2.3 M LV 1 */
+ RP_Cause rP_Cause,
+ /* cl. 8.2.5.4 M LV 2-3 */
+ RP_UserData rP_UserData optional /* cl. 8.2.5.3 O TLV <= 234 octets */
+ }
+
+ type union RP_PDU_Type {
+ RP_DATA_dl_Type RP_DATA_dl,
+ RP_DATA_ul_Type RP_DATA_ul,
+ RP_SMMA_Type RP_SMMA,
+ RP_ACK_Type RP_ACK,
+ RP_ERROR_Type RP_ERROR
+ }
+
+ /* End SM-RP PDU Declarations */
+ /* SM-TP Type Declarations */
+ type record TP_Address_Type {
+ /* 23.040 cl. 9.1.2.5 */
+ Oct1 iel,
+ /* min value 2 and max value is 11 */
+ TypeOfNumberingPlan typeOfNumberingPlan,
+ octetstring digits length(0 .. 10) optional
+ }
+
+ type Bit2 TP_MessageTypeIndicator_Type;
+ /* 23.040 cl. 9.2.3.1 */
+ type Oct1 TP_MessageReference_Type;
+ /* 23.040 cl. 9.2.3.6 */
+ type Oct1 TP_UserDataLength_Type;
+ /* 23.040 cl. 9.2.3.16 */
+ type record TP_ProtocolIdentifier_Type {
+ /* 23.040 cl. 9.2.3.9 */
+ Bit2 pidType,
+ /* */
+ Bit1 interworking,
+ /* */
+ Bit5 pidValue /* */
+ }
+
+ type record TP_DataCodingScheme_Type {
+ /* 23.040 cl. 9.2.3.10 + 23.040 cl. 4 */
+ Bit4 codingGroup,
+ /* */
+ Bit4 codeValue /* */
+ }
+
+ type hexstring TP_ServiceCentreTimeStamp_Type length(14);
+ /* 23.040 cl. 9.2.3.11 */
+ type Oct1 TP_ValidityPeriodRelative_Type;
+ /* 23.040 cl. 9.2.3.12.1 */
+ type hexstring TP_ValidityPeriodAbsolute_Type length(14);
+ /* 23.040 cl. 9.2.3.12.2 */
+ type record TP_ValidityPeriodEnhanced_Type {
+ /* 23.040 cl. 9.2.3.12.3 */
+ Bit1 extBit,
+ /* */
+ Bit1 singleShot,
+ /* */
+ Bit3 spare3,
+ /* */
+ Bit3 validityPeriodFormat,
+ /* */
+ Oct6 validityPeriod /* */
+ }
+
+ type union TP_ValidityPeriod_Type {
+ /* 23.040 cl. 9.2.3.3 */
+ TP_ValidityPeriodRelative_Type TP_ValidityPeriodRelative,
+ /* Relative format */
+ TP_ValidityPeriodAbsolute_Type TP_ValidityPeriodAbsolute,
+ /* Absolute format */
+ TP_ValidityPeriodEnhanced_Type TP_ValidityPeriodEnhanced /* Enhanced format */
+ }
+
+ type record TP_Status_Type {
+ /* 23.040 cl. 9.2.3.15 */
+ Bit1 reserved,
+ /* */
+ Bit7 status /* */
+ }
+
+ type Bit8 TP_Command_Type;
+ /* 23.040 cl. 9.2.3.19 */
+ type record TP_ParameterIndicator_Type {
+ /* 23.040 cl. 9.2.3.27 */
+ Bit1 extBit1,
+ /* */
+ Bit4 spare4,
+ /* */
+ Bit1 tP_UDL,
+ /* */
+ Bit1 tP_DCS,
+ /* */
+ Bit1 tP_PID /* */
+ }
+
+ /* End SM-TP Type Declarations */
+ /* SM-TP PDU Declarations */
+ type record SMS_DELIVER_Type {
+ /* 23.040 cl. 9.2.2.1
+ Direction: n -> ue */
+ Bit1 tP_ReplyPath,
+ /* 23.040 cl. 9.2.3.17 */
+ Bit1 tP_UserDataHeaderIndicator,
+ /* 23.040 cl. 9.2.3.23 */
+ Bit1 tP_StatusReportIndication,
+ /* 23.040 cl. 9.2.3.4 */
+ Bit2 spare2,
+ /* */
+ Bit1 tP_MoreMessagesToSend,
+ /* 23.040 cl. 9.2.3.2 */
+ TP_MessageTypeIndicator_Type tP_MessageTypeIndicator,
+ /* 23.040 cl. 9.2.3.1 */
+ TP_Address_Type tP_OriginatingAddress,
+ /* 23.040 cl. 9.1.2.5 */
+ TP_ProtocolIdentifier_Type tP_ProtocolIdentifier,
+ /* 23.040 cl. 9.2.3.9 */
+ TP_DataCodingScheme_Type tP_DataCodingScheme_Type,
+ /* 23.040 cl. 9.2.3.10 */
+ TP_ServiceCentreTimeStamp_Type tP_ServiceCentreTimeStamp,
+ /* 23.040 cl. 9.2.3.11 */
+ TP_UserDataLength_Type tP_UserDataLength,
+ /* 23.040 cl. 9.2.3.16, derived from SUBMIT */
+ octetstring tP_UserData length(0 .. 140) optional /* 23.040 cl. 9.2.3.24, derived from SUBMIT */
+ }
+
+ type record SMS_DELIVER_REPORT_Type {
+ /* 23.040 cl. 9.2.2.1a
+ Direction: ue -> n */
+ Bit1 spare1,
+ /* */
+ Bit1 tP_UserDataHeaderIndicator,
+ /* 23.040 cl. 9.2.3.23 */
+ Bit4 spare4,
+ /* */
+ TP_MessageTypeIndicator_Type tP_MessageTypeIndicator,
+ /* 23.040 cl. 9.2.3.1 */
+ Oct1 tP_FailureCause optional,
+ /* 23.040 cl. 9.2.3.22, provided if RP_ERROR, not if RP_ACK */
+ TP_ParameterIndicator_Type tP_ParameterIndicator,
+ /* 23.040 cl. 9.2.3.27 */
+ TP_ProtocolIdentifier_Type tP_ProtocolIdentifier optional,
+ /* 23.040 cl. 9.2.3.9 */
+ TP_DataCodingScheme_Type tP_DataCodingScheme_Type optional,
+ /* 23.040 cl. 9.2.3.10 */
+ TP_UserDataLength_Type tP_UserDataLength optional,
+ /* 23.040 cl. 9.2.3.16 */
+ octetstring tP_UserData length(0 .. 159) optional /* 23.040 cl. 9.2.3.24 */
+ }
+
+ type record SMS_SUBMIT_Type {
+ /* 23.040 cl. 9.2.2.2
+ Direction: ue -> n */
+ Bit1 tP_ReplyPath,
+ /* 23.040 cl. 9.2.3.17 */
+ Bit1 tP_UserDataHeaderIndicator,
+ /* 23.040 cl. 9.2.3.23 */
+ Bit1 tP_StatusReportRequest,
+ /* 23.040 cl. 9.2.3.5 */
+ Bit2 tP_ValidityPeriodFormat,
+ /* 23.040 cl. 9.2.3.3 */
+ Bit1 tP_RejectDuplicates,
+ /* 23.040 cl. 9.2.3.25 */
+ TP_MessageTypeIndicator_Type tP_MessageTypeIndicator,
+ /* 23.040 cl. 9.2.3.1 */
+ TP_MessageReference_Type tP_MessageReference,
+ /* 23.040 cl. 9.2.3.6 */
+ TP_Address_Type tP_DestinationAddress,
+ /* 23.040 cl. 9.1.2.5 */
+ TP_ProtocolIdentifier_Type tP_ProtocolIdentifier,
+ /* 23.040 cl. 9.2.3.9 */
+ TP_DataCodingScheme_Type tP_DataCodingScheme_Type,
+ /* 23.040 cl. 9.2.3.10 */
+ // one of the subsequent ValidityPeriod solutions has be removed
+ TP_ValidityPeriod_Type tP_ValidityPeriod optional,
+ /* 23.040 cl. 9.2.3.12 */
+ // TP_ValidityPeriodRelative_Type tP_ValidityPeriodRelative optional, /* 23.040 cl. 9.2.3.12.1 */
+ // TP_ValidityPeriodAbsolute_Type tP_ValidityPeriodAbsolute optional, /* 23.040 cl. 9.2.3.12.2 */
+ // TP_ValidityPeriodEnhanced_Type tP_ValidityPeriodEnhanced optional, /* 23.040 cl. 9.2.3.12.3 */
+ TP_UserDataLength_Type tP_UserDataLength,
+ /* 23.040 cl. 9.2.3.16 */
+ octetstring tP_UserData length(0 .. 140) optional /* 23.040 cl. 9.2.3.24 */
+ }
+ type record SMS_SUBMIT_REPORT_Type {
+ /* 23.040 cl. 9.2.2.2a
+ Direction: n -> ue */
+ Bit1 spare1,
+ /* */
+ Bit1 tP_UserDataHeaderIndicator,
+ /* 23.040 cl. 9.2.3.23 */
+ Bit4 spare4,
+ /* */
+ TP_MessageTypeIndicator_Type tP_MessageTypeIndicator,
+ /* 23.040 cl. 9.2.3.1 */
+ Oct1 tP_FailureCause optional,
+ /* 23.040 cl. 9.2.3.22, provided if RP_ERROR, not if RP_ACK */
+ TP_ParameterIndicator_Type tP_ParameterIndicator,
+ /* 23.040 cl. 9.2.3.27 */
+ TP_ServiceCentreTimeStamp_Type tP_ServiceCentreTimeStamp,
+ /* 23.040 cl. 9.2.3.11 */
+ TP_ProtocolIdentifier_Type tP_ProtocolIdentifier optional,
+ /* 23.040 cl. 9.2.3.9 */
+ TP_DataCodingScheme_Type tP_DataCodingScheme_Type optional,
+ /* 23.040 cl. 9.2.3.10 */
+ TP_UserDataLength_Type tP_UserDataLength optional,
+ /* 23.040 cl. 9.2.3.16 */
+ octetstring tP_UserData length(0 .. 152) optional /* 23.040 cl. 9.2.3.24 */
+ }
+
+ type record SMS_STATUS_REPORT_Type {
+ /* 23.040 cl. 9.2.2.3
+ Direction: n -> ue */
+ Bit1 spare1,
+ /* */
+ Bit1 tP_UserDataHeaderIndicator,
+ /* 23.040 cl. 9.2.3.23 */
+ Bit1 tP_StatusReportQualifier,
+ /* 23.040 cl. 9.2.3.26 */
+ Bit2 spare2,
+ /* */
+ Bit1 tP_MoreMessagesToSend,
+ /* 23.040 cl. 9.2.3.2 */
+ TP_MessageTypeIndicator_Type tP_MessageTypeIndicator,
+ /* 23.040 cl. 9.2.3.1 */
+ TP_MessageReference_Type tP_MessageReference,
+ /* 23.040 cl. 9.2.3.6 */
+ TP_Address_Type tP_RecipientAddress,
+ /* 23.040 cl. 9.1.2.5 */
+ TP_ServiceCentreTimeStamp_Type tP_ServiceCentreTimeStamp,
+ /* 23.040 cl. 9.2.3.11 */
+ TP_ServiceCentreTimeStamp_Type tP_DischargeTime,
+ /* 23.040 cl. 9.2.3.12 */
+ TP_Status_Type tP_Status,
+ /* 23.040 cl. 9.2.3.15 */
+ TP_ParameterIndicator_Type tP_ParameterIndicator optional,
+ /* 23.040 cl. 9.2.3.27 */
+ TP_ProtocolIdentifier_Type tP_ProtocolIdentifier optional,
+ /* 23.040 cl. 9.2.3.9 */
+ TP_DataCodingScheme_Type tP_DataCodingScheme_Type optional,
+ /* 23.040 cl. 9.2.3.10 */
+ TP_UserDataLength_Type tP_UserDataLength optional,
+ /* 23.040 cl. 9.2.3.16 */
+ octetstring tP_UserData length(0 .. 143) optional /* 23.040 cl. 9.2.3.24 */
+ }
+
+ type record SMS_COMMAND_Type {
+ /* 23.040 cl. 9.2.2.4
+ Direction: ue -> n */
+ Bit1 spare1,
+ /* */
+ Bit1 tP_UserDataHeaderIndicator,
+ /* 23.040 cl. 9.2.3.23 */
+ Bit1 tP_StatRptReq,
+ /* Table 8.4/3GPP TS 24.011 */
+ Bit3 spare3,
+ /* */
+ TP_MessageTypeIndicator_Type tP_MessageTypeIndicator,
+ /* 23.040 cl. 9.2.3.1 */
+ TP_MessageReference_Type tP_MessageReference,
+ /* 23.040 cl. 9.2.3.6 */
+ TP_ProtocolIdentifier_Type tP_ProtocolIdentifier,
+ /* 23.040 cl. 9.2.3.9 */
+ TP_Command_Type tP_CommandType,
+ /* 23.040 cl. 9.2.3.19 */
+ TP_MessageReference_Type tP_MessageNumber,
+ /* 23.040 cl. 9.2.3.18 */
+ TP_Address_Type tP_DestinationAddress,
+ /* 23.040 cl. 9.1.2.5 */
+ TP_UserDataLength_Type tP_CommandDataLength,
+ /* 23.040 cl. 9.2.3.20 (number of octets) */
+ octetstring tP_CommandData length(0 .. 156) optional /* 23.040 cl. 9.2.3.21 */
+ }
+
+ type union TP_PDU_Type {
+ SMS_DELIVER_Type SMS_DELIVER,
+ SMS_DELIVER_REPORT_Type SMS_DELIVER_REPORT,
+ SMS_SUBMIT_Type SMS_SUBMIT,
+ SMS_SUBMIT_REPORT_Type SMS_SUBMIT_REPORT,
+ SMS_STATUS_REPORT_Type SMS_STATUS_REPORT,
+ SMS_COMMAND_Type SMS_COMMAND
+ }
+
+
+
+ /* End SM-TP PDU Declarations */
+ }
+ with {
+ encode "SMS Types";
+ } // group SMS_Declarations
+} // End of module LibSip_SMSTypesAndValues
Index: v3/ttcn/LibSip_Steps.ttcn
===================================================================
--- v3/ttcn/LibSip_Steps.ttcn (nonexistent)
+++ v3/ttcn/LibSip_Steps.ttcn (revision 634)
@@ -0,0 +1,4902 @@
+/**
+ * @author STF 346, STF366, STF368, STF369, STF450, STF471
+ * @version $Id$
+ * @desc This module provides the functions, altsteps and external functions used
+ * for SIP-IMS tests.
+ * This module is part of LibSipV3.
+*/
+module LibSip_Steps {
+ // LibCommon
+ import from LibCommon_Sync all;
+ import from LibCommon_VerdictControl all;
+ // LibSip
+ import from LibSip_SIPTypesAndValues all;
+ import from LibSip_SDPTypes all;
+ import from LibSip_Templates all;
+ import from LibSip_Interface all;
+ import from LibSip_PIXITS all;
+ import from LibSip_XMLTypes all;
+
+ group externalfunctions {
+
+ /**
+ * @desc External function to return random charstring
+ */
+ external function fx_rndStr(
+ ) return charstring;
+
+ /**
+ * @desc External function to return the equivalent string in lower case
+ */
+ external function fx_putInLowercase(
+ charstring p_string
+ ) return charstring;
+
+ /**
+ * @desc External function to get IP address.
+ */
+ external function fx_getIpAddr(
+ charstring p_host_name
+ ) return charstring;
+
+ /**
+ * @desc External function to generate a digest response.
+ * @reference RFC 2617 HTTP Authentication: Basic and Digest Access Authentication, and RFC 1321 The MD5 Message-Digest Algorithm
+ * @see RFC 2617, chapter 5 Sample implementation, for example usage, as the signature of calculateDigestResponse is according to the example given in the RFC.
+ */
+ external function fx_calculateDigestResponse(
+ charstring p_nonce,
+ charstring p_cnonce,
+ charstring p_user,
+ charstring p_realm,
+ charstring p_passwd,
+ charstring p_alg,
+ charstring p_nonceCount,
+ charstring p_method,
+ charstring p_qop,
+ charstring p_URI,
+ charstring p_HEntity
+ ) return charstring;
+
+ }
+
+ group ParameterOperations {
+
+ /**
+ * @desc function to generate a 32 bits random number as a charstring for tag field (used as e.g.: tag in from-header field, or branch parameter in via header)
+ * @return random value with at least 32 bits of randomness
+ */
+ function f_getRndTag(
+ ) return charstring {
+ var charstring v_tag_value;
+ // tag_value is initialized with a random value with at least 32 bits of randomness
+ // 4294967296 is a 32 bits integer
+ v_tag_value := fx_rndStr() & fx_rndStr();
+ return (v_tag_value);
+ }
+
+ /**
+ * @desc Function to prepare credentials for request that has an empty entity body such as a REGISTER message.
+ * @param p_userprofile to get important parameters
+ * @param p_algorithm Algorthm to be used. Default: omit
+ * @return Credentials field
+ */
+ function f_calculatecCredentials_empty(
+ in SipUserProfile p_userprofile,
+ in boolean p_algorithm := false
+ ) return Credentials {
+ var Credentials v_result;
+
+
+ // RFC 2617 3.2.2 username:
+ // The name of user in the specified realm.
+ var charstring v_username := p_userprofile.privUsername;
+ var charstring v_realm := p_userprofile.registrarDomain;
+ var charstring v_uri := c_sipScheme & ":" & p_userprofile.registrarDomain;
+ var CommaParam_List v_digestResponse := {};
+ // Construct credentials for an Authorization field of a request.
+ v_digestResponse := f_addParameter(v_digestResponse, {
+ id := "username",
+ paramValue := { quotedString := v_username }
+ });
+ v_digestResponse := f_addParameter(v_digestResponse, {
+ id := "realm",
+ paramValue := { quotedString := v_realm }
+ });
+ v_digestResponse := f_addParameter(v_digestResponse, {
+ id := "uri",
+ paramValue := { quotedString := v_uri }
+ });
+ v_digestResponse := f_addParameter(v_digestResponse, {
+ id := "nonce",
+ paramValue := { quotedString := "" }
+ }); // already enclosed to " characters
+ v_digestResponse := f_addParameter(v_digestResponse, {
+ id := "response",
+ paramValue := { quotedString := "" }
+ }); // already enclosed to " characters
+
+ if (p_algorithm) {
+ v_digestResponse := f_addParameter(v_digestResponse, {
+ id := "algorithm",
+ paramValue := { tokenOrHost := PX_AUTH_ALGORITHM }
+ }); // already enclosed to " characters
+ }
+ v_result := {digestResponse := v_digestResponse};
+
+ return v_result;
+ }
+
+
+ /**
+ * @desc Function to calculate credentials for request that has an empty entity body such as a REGISTER message.
+ * @param p_userprofile to get important parameters
+ * @param p_method (can be "REGISTER", "INVITE",....)
+ * @param p_challenge parameter from 4xx response
+ * @return Credentials field
+ * @verdict
+ */
+ function f_calculatecCredentials(
+ in SipUserProfile p_userprofile,
+ in charstring p_method,
+ in CommaParam_List p_challenge
+ ) return Credentials {
+ var Credentials v_result;
+ var charstring v_nonce := "";
+ var charstring v_cnonce := int2str(float2int(int2float(13172657659 - 1317266) * rnd()) + 1317265);
+
+ // RFC 2617 3.2.2 username:
+ // The name of user in the specified realm.
+ var charstring v_username := p_userprofile.privUsername;
+ var charstring v_realm;
+
+ // RFC 2617 3.2.2.2 passwd:
+ // A known shared secret, the password of user of the specified
+ // username.
+ var charstring v_passwd := p_userprofile.passwd;
+ var charstring v_algorithm;
+
+ // a new pseudo-random cnonce value is used every time
+ // that assumes it is only used once
+ const charstring cl_nonceCount := "00000001";
+ var charstring v_qop := p_userprofile.qop;
+ var charstring v_uri := c_sipScheme & ":" & p_userprofile.registrarDomain;
+
+ // MD5 hash of empty entity body.
+ const charstring cl_hEntity := "d41d8cd98f00b204e9800998ecf8427e";
+ var charstring v_response;
+ var charstring v_opaque;
+ var CommaParam_List v_digestResponse := {};
+
+
+ // extract nonce, realm, algorithm, and opaque from challenge
+ v_nonce := f_extractParamValueFromChallenge(p_challenge, "nonce");
+ v_realm := f_extractParamValueFromChallenge(p_challenge, "realm");
+ v_algorithm := f_extractParamValueFromChallenge(p_challenge, "algorithm");
+ v_opaque := f_extractParamValueFromChallenge(p_challenge, "opaque");
+
+ // calculate a digest response for the Authorize header
+ v_response := fx_calculateDigestResponse(v_nonce, v_cnonce, v_username, v_realm, v_passwd, v_algorithm, cl_nonceCount, p_method, v_qop, v_uri, cl_hEntity);
+
+ // Construct credentials for an Authorization field of a request.
+ v_digestResponse := f_addParameter(v_digestResponse, {
+ id := "username",
+ paramValue := { quotedString := v_username }
+ });
+ v_digestResponse := f_addParameter(v_digestResponse, {
+ id := "realm",
+ paramValue := { quotedString := v_realm }
+ });
+ v_digestResponse := f_addParameter(v_digestResponse, {
+ id := "nonce",
+ paramValue := { quotedString := v_nonce }
+ });
+ v_digestResponse := f_addParameter(v_digestResponse, {
+ id := "uri",
+ paramValue := { quotedString := v_uri }
+ });
+ v_digestResponse := f_addParameter(v_digestResponse, {
+ id := "response",
+ paramValue := { quotedString := v_response }
+ });
+ v_digestResponse := f_addParameter(v_digestResponse, {
+ id := "algorithm",
+ paramValue := { tokenOrHost := "md5" }
+ }); // algorithm is not enclosed to " characters
+ v_digestResponse := f_addParameter(v_digestResponse, {
+ id := "cnonce",
+ paramValue := { quotedString := v_cnonce }
+ });
+ v_digestResponse := f_addParameter(v_digestResponse, {
+ id := "qop",
+ paramValue := { tokenOrHost := v_qop }
+ }); // qop
+ v_digestResponse := f_addParameter(v_digestResponse, {
+ id := "nc",
+ paramValue := { tokenOrHost := cl_nonceCount }
+ }); // nonceCount
+ if (v_opaque != "") {
+ v_digestResponse := f_addParameter(v_digestResponse, {
+ id := "opaque",
+ paramValue := { quotedString := v_opaque }
+ }); // already enclosed to " characters
+ }
+ v_result := {digestResponse := v_digestResponse};
+
+ return v_result;
+ }
+
+ /**
+ * @desc Function to calculate credentials for request that has an empty entity body such as a REGISTER message. NO RESPONSE value to cause an error!
+ * @param p_userprofile to get important parameters
+ * @param p_method (can be "REGISTER", "INVITE",....)
+ * @param p_challenge parameter from 4xx response
+ * @return Credentials field
+ * @verdict
+ */
+ function f_calculatecCredentials_wo_response(
+ in SipUserProfile p_userprofile,
+ in charstring p_method,
+ in CommaParam_List p_challenge
+ ) return Credentials {
+ var Credentials v_result;
+ var charstring v_nonce := "";
+ var charstring v_cnonce := int2str(float2int(int2float(13172657659 - 1317266) * rnd()) + 1317265);
+
+ // RFC 2617 3.2.2 username:
+ // The name of user in the specified realm.
+ var charstring v_username := p_userprofile.privUsername;
+ var charstring v_realm;
+
+ // RFC 2617 3.2.2.2 passwd:
+ // A known shared secret, the password of user of the specified
+ // username.
+ var charstring v_passwd := p_userprofile.passwd;
+ var charstring v_algorithm;
+
+
+ // a new pseudo-random cnonce value is used every time
+ // that assumes it is only used once
+ const charstring cl_nonceCount := "00000001";
+ var charstring v_qop := p_userprofile.qop;
+ var charstring v_uri := c_sipScheme & ":" & p_userprofile.registrarDomain;
+
+ // MD5 hash of empty entity body.
+ const charstring cl_hEntity := "d41d8cd98f00b204e9800998ecf8427e";
+ var charstring v_response;
+ var charstring v_opaque;
+ var CommaParam_List v_digestResponse := {};
+
+ // extract nonce, realm, algorithm, and opaque from challenge
+ v_nonce := f_extractParamValueFromChallenge(p_challenge, "nonce");
+ v_realm := f_extractParamValueFromChallenge(p_challenge, "realm");
+ v_algorithm := f_extractParamValueFromChallenge(p_challenge, "algorithm");
+ v_opaque := f_extractParamValueFromChallenge(p_challenge, "opaque");
+
+ // calculate a digest response for the Authorize header
+ v_response := fx_calculateDigestResponse(v_nonce, v_cnonce, v_username, v_realm, v_passwd, v_algorithm, cl_nonceCount, p_method, v_qop, v_uri, cl_hEntity);
+
+ v_digestResponse := f_addParameter(v_digestResponse, {
+ id := "username",
+ paramValue := { quotedString := v_username }
+ });
+ v_digestResponse := f_addParameter(v_digestResponse, {
+ id := "realm",
+ paramValue := { quotedString := v_realm }
+ });
+ v_digestResponse := f_addParameter(v_digestResponse, {
+ id := "nonce",
+ paramValue := { quotedString := v_nonce }
+ });
+ v_digestResponse := f_addParameter(v_digestResponse, {
+ id := "uri",
+ paramValue := { quotedString := v_uri }
+ });
+ v_digestResponse := f_addParameter(v_digestResponse, {
+ id := "algorithm",
+ paramValue := { tokenOrHost := "md5" }
+ }); // algorithm is not enclosed to " characters
+ v_digestResponse := f_addParameter(v_digestResponse, {
+ id := "cnonce",
+ paramValue := { quotedString := v_cnonce }
+ });
+ v_digestResponse := f_addParameter(v_digestResponse, {
+ id := "qop",
+ paramValue := { tokenOrHost := v_qop }
+ }); // qop
+ v_digestResponse := f_addParameter(v_digestResponse, {
+ id := "nc",
+ paramValue := { tokenOrHost := cl_nonceCount }
+ }); // nonceCount
+ if (v_opaque == "") {
+ v_digestResponse := f_addParameter(v_digestResponse, {
+ id := "opaque",
+ paramValue := { quotedString := v_opaque }
+ }); // already enclosed to " characters
+ }
+ v_result := {digestResponse := v_digestResponse};
+
+ return v_result;
+ }
+
+ /**
+ * @desc Function to calculate credentials for response 401 - WWW-Authorization
+ * @param p_qop of the peer UE (alternatively )
+ * @param p_authorization parameter from 1st REGISTER request
+ * @return Credentials field
+ * @verdict
+ */
+ function f_calculatecChallenge_forWWWAuthorizationBody(
+ in charstring p_qop,
+ in Authorization p_authorization
+ ) return Challenge {
+ var CommaParam_List v_challenge;
+
+ if (ischosen(p_authorization.body[0].digestResponse)) {
+ v_challenge := p_authorization.body[0].digestResponse;
+ }
+ else {
+ v_challenge := p_authorization.body[0].otherResponse.authParams;
+ }
+
+ return (f_calculatecChallenge_forWWWAuthorization(p_qop, v_challenge));
+ }
+
+ /**
+ * @desc Function to calculate credentials for response 401 - WWW-Authorization
+ * @param p_qop of the peer UE (alternatively )
+ * @param p_challenge parameter from 1st REGISTER request
+ * @return Credentials field
+ * @verdict
+ */
+ function f_calculatecChallenge_forWWWAuthorization(
+ in charstring p_qop,
+ in CommaParam_List p_challenge
+ ) return Challenge {
+ var Challenge v_result;
+
+ var charstring v_realm;
+
+ var charstring v_qop := p_qop;
+
+ v_realm := f_extractParamValueFromChallenge(p_challenge, "realm");
+
+ // Construct credentials for an Authorization field of a request.
+ v_result := {
+ digestCln := {
+ {
+ id := "realm",
+ paramValue := { quotedString := v_realm }
+ },
+ {
+ id := "nonce",
+ paramValue := { quotedString := "0edff6c521cc3f407f2d9e01cf6ed82b" }
+ },
+ {
+ id := "algorithm",
+ paramValue := { tokenOrHost := PX_AUTH_ALGORITHM }
+ }, // algorithm is not enclosed with " characters
+ {
+ id := "ck",
+ paramValue := { quotedString := "00112233445566778899aabbccddeeff" }
+ },
+ {
+ id := "ik",
+ paramValue := { quotedString := "ffeeddccbbaa99887766554433221100" }
+ }, // already enclosed to " characters
+ {
+ /**
+ * This directive is optional, but is made so only for backward compatibility with RFC 2069
+ * it SHOULD be used by all implementations compliant with this version of the Digest scheme
+ */
+ id := "qop",
+ paramValue := { tokenOrHost := v_qop }
+ } // qop
+ }
+ };
+
+ return v_result;
+ }
+
+ /**
+ * @desc Function to calculate credentials for request that has an empty entity body such as a REGISTER message and at the end put different private name
+ * @param p_userprofile to get important parameters
+ * @param p_method (can be "REGISTER", "INVITE",....)
+ * @param p_challenge parameter from 4xx response
+ * @return Credentials field
+ * @verdict
+ */
+ function f_calculatecCredentialsAndChangeUserName(
+ in SipUserProfile p_userprofile,
+ in charstring p_method,
+ in CommaParam_List p_challenge
+ ) return Credentials {
+ var Credentials v_result;
+ var charstring v_nonce := "";
+ var charstring v_cnonce := int2str(float2int(int2float(13172657659 - 1317266) * rnd()) + 1317265);
+
+ // RFC 2617 3.2.2 username:
+ // The name of user in the specified realm.
+ var charstring v_username := p_userprofile.privUsername;
+ var charstring v_realm;
+
+ // RFC 2617 3.2.2.2 passwd:
+ // A known shared secret, the password of user of the specified
+ // username.
+ var charstring v_passwd := p_userprofile.passwd;
+ var charstring v_algorithm;
+
+
+ // a new pseudo-random cnonce value is used every time
+ // that assumes it is only used once
+ const charstring cl_nonceCount := "00000001";
+ var charstring v_qop := p_userprofile.qop;
+ var charstring v_uri := c_sipScheme & ":" & p_userprofile.registrarDomain;
+
+
+ // MD5 hash of empty entity body.
+ const charstring cl_hEntity := "d41d8cd98f00b204e9800998ecf8427e";
+ var charstring v_response;
+ var charstring v_opaque;
+ var CommaParam_List v_digestResponse := {};
+
+
+ // extract nonce, realm, algorithm, and opaque from challenge
+ v_nonce := f_extractParamValueFromChallenge(p_challenge, "nonce");
+ v_realm := f_extractParamValueFromChallenge(p_challenge, "realm");
+ v_algorithm := f_extractParamValueFromChallenge(p_challenge, "algorithm");
+ v_opaque := f_extractParamValueFromChallenge(p_challenge, "opaque");
+
+ // calculate a digest response for the Authorize header
+ v_response := fx_calculateDigestResponse(v_nonce, v_cnonce, v_username, v_realm, v_passwd, v_algorithm, cl_nonceCount, p_method, v_qop, v_uri, cl_hEntity);
+
+ // Construct credentials for an Authorization field of a request.
+ v_digestResponse := f_addParameter(v_digestResponse, {
+ id := "username",
+ paramValue := { quotedString := "DifferentToPrivateUser" }
+ });
+ v_digestResponse := f_addParameter(v_digestResponse, {
+ id := "realm",
+ paramValue := { quotedString := v_realm }
+ });
+ v_digestResponse := f_addParameter(v_digestResponse, {
+ id := "nonce",
+ paramValue := { quotedString := v_nonce }
+ });
+ v_digestResponse := f_addParameter(v_digestResponse, {
+ id := "uri",
+ paramValue := { quotedString := v_uri }
+ });
+ v_digestResponse := f_addParameter(v_digestResponse, {
+ id := "response",
+ paramValue := { quotedString := v_response }
+ });
+ v_digestResponse := f_addParameter(v_digestResponse, {
+ id := "algorithm",
+ paramValue := { tokenOrHost := "md5" }
+ }); // algorithm is not enclosed to " characters
+ v_digestResponse := f_addParameter(v_digestResponse, {
+ id := "cnonce",
+ paramValue := { quotedString := v_cnonce }
+ });
+ v_digestResponse := f_addParameter(v_digestResponse, {
+ id := "qop",
+ paramValue := { tokenOrHost := v_qop }
+ }); // qop
+ v_digestResponse := f_addParameter(v_digestResponse, {
+ id := "nc",
+ paramValue := { tokenOrHost := cl_nonceCount }
+ });
+ if (v_opaque != "") {
+ v_digestResponse := f_addParameter(v_digestResponse, {
+ id := "opaque",
+ paramValue := { quotedString := "" }
+ }); // already enclosed to " characters
+ }
+ v_result := {digestResponse := v_digestResponse};
+
+ return v_result;
+ }
+
+
+ /**
+ * @desc Function to check if param related to id from CommanParam_List exist containing challenge.
+ * @param p_challenge parameter from 4xx response
+ * @param p_id name of parameter("nonce", "realm", "ck", "ik"...)
+ * @return parameter p_id value
+ */
+ function f_checkParamValueFromChallengeIfPresent(
+ in CommaParam_List p_challenge,
+ in charstring p_id
+ ) return boolean {
+ var boolean v_result := false;
+ var integer v_len := lengthof(p_challenge);
+ var charstring v_id := fx_putInLowercase(p_id);
+ var integer i;
+
+ for (i := 0; i < v_len; i := i + 1) {
+ if (fx_putInLowercase(p_challenge[i].id) == v_id) {
+ v_result := true;
+ }
+ }
+
+ return v_result;
+ }
+
+ /**
+ * @desc Function to check if tag is present in SemicolonParam_List
+ * @param p_param_l SemicolonParam_List
+ * @return boolean true if tag is present
+ */
+ function f_checkTagPresent(
+ SemicolonParam_List p_param_l
+ ) runs on SipComponent
+ return boolean {
+ var integer v_numberOfParams;
+ var integer i := 0;
+
+ v_numberOfParams := lengthof(p_param_l);
+ while (i < v_numberOfParams) {
+ if (fx_putInLowercase(p_param_l[i].id) == c_tagId) {
+ return (true);
+ }
+ i := i + 1;
+ }
+ return (false);
+ }
+
+ /**
+ * @desc Function to remove a parameter from SemicolonParam_List
+ * @param p_param_l SemicolonParam_List
+ * @return SemicolonParam_List new parameter list
+ */
+ function f_removeParameter(
+ SemicolonParam_List p_param_l,
+ charstring p_id
+ ) runs on SipComponent
+ return SemicolonParam_List {
+ var integer v_numberOfParams;
+ var integer i := 0;
+ var integer j := 0;
+ var SemicolonParam_List v_newParamList;
+
+ v_numberOfParams := lengthof(p_param_l);
+ while (i < v_numberOfParams) {
+ if (not fx_putInLowercase(p_param_l[i].id) == p_id) {
+ v_newParamList[j] := p_param_l[i];
+ j := j + 1;
+ }
+ i := i + 1;
+ }
+ return v_newParamList;
+ }
+
+ /**
+ * @desc Function to add a parameter to SemicolonParam_List
+ * @param p_param_l SemicolonParam_List
+ * @return SemicolonParam_List new parameter list
+ */
+ function f_addParameter(
+ SemicolonParam_List p_param_l,
+ GenericParam p_genparam
+ )
+ return SemicolonParam_List {
+ var SemicolonParam_List v_newParamList := p_param_l;
+ var integer v_numberOfParams := lengthof(p_param_l);
+ v_newParamList[v_numberOfParams] := p_genparam;
+ return v_newParamList;
+ }
+
+ /**
+ * @desc Function to extract paramValue related to id from CommanParam_List containing challenge.
+ * @param p_challenge parameter from 4xx response
+ * @param p_id name of parameter("nonce", "realm",...)
+ * @return parameter p_id value
+ */
+ function f_extractParamValueFromChallenge(
+ in CommaParam_List p_challenge,
+ in charstring p_id
+ ) return charstring {
+ var charstring v_result := "";
+ var integer v_len := lengthof(p_challenge);
+ var charstring v_id := fx_putInLowercase(p_id);
+ var integer i;
+ var charstring v_tmpchar;
+
+ for (i := 0; i < v_len; i := i + 1) {
+ if (fx_putInLowercase(p_challenge[i].id) == v_id) {
+ if (isvalue(p_challenge[i].paramValue)) {
+ if(ischosen(p_challenge[i].paramValue.quotedString)) {
+ v_result := valueof(p_challenge[i].paramValue.quotedString);
+ } else {
+ v_result := valueof(p_challenge[i].paramValue.tokenOrHost);
+ }
+ }
+ }
+ }
+
+ if (v_result == "") {
+ if (match(p_id, "algorithm")) {
+ v_result := "MD5";
+ }
+ else if (match(p_id, "opaque")) {
+ v_result := "";
+ }
+ else {
+ v_tmpchar := "Cannot acquire value from credentials.";
+ log("*** " & __SCOPE__ &": INFO: Cannot acquire value from credentials ***");
+ setverdict(inconc);
+ stop;
+ }
+ }
+
+ return v_result;
+ }
+
+ /**
+ * @desc Return the updated component variable of via header
+ * @return component variable of via header
+ */
+ function f_updateViaHeaderAS(
+ in Via p_via
+ ) runs on SipComponent
+ return Via {
+ var Via v_via;
+ var ViaBody_List v_viaBody_List := p_via.viaBody;
+ var integer v_size_via := lengthof(v_viaBody_List);
+ var integer v_size_via_updated := v_size_via + 1;
+ var ViaBody_List v_viaBody_List_updated;
+ var integer i;
+ vc_branch := c_branchCookie & f_getRndTag();
+ v_viaBody_List_updated[0] := valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile));
+ // p_viaBody_List_updated[0 ] := vc_request.msgHeader.route.routeBody[0 ] ;
+ for (i := 1; i < v_size_via_updated; i := i + 1) {
+ v_viaBody_List_updated[i] := v_viaBody_List[i - 1];
+ }
+ v_via.fieldName := p_via.fieldName;
+ v_via.viaBody := v_viaBody_List_updated;
+ return (v_via);
+ }
+
+ /**
+ * @desc Return the updated component variable of route header
+ * @return component variable of route header
+ */
+ function f_updateRouteHeaderAS(
+ in Route p_route
+ ) runs on SipComponent
+ return Route {
+ var Route v_route;
+ var RouteBody_List v_routeBody_List := p_route.routeBody;
+ var integer v_size_route := lengthof(v_routeBody_List);
+ var integer v_size_route_updated := v_size_route - 1;
+ var RouteBody_List v_routeBody_List_updated;
+ var integer i;
+
+ for (i := 0; i < v_size_route_updated; i := i + 1) {
+ v_routeBody_List_updated[i] := v_routeBody_List[i + 1];
+ }
+ v_route.fieldName := p_route.fieldName;
+ v_route.routeBody := v_routeBody_List_updated;
+ return (v_route);
+ }
+
+ /**
+ * @desc Return the updated component variable of record route header
+ * @return component variable of record route header
+ */
+ function f_updateRecordRouteHeaderAS(
+ in template(value) RecordRoute p_recordRoute
+ ) runs on SipComponent
+ return RecordRoute {
+ var
+ RecordRoute
+ v_recordRoute :=
+ valueof(
+ m_recordRoute_currIpAddr_params(
+ vc_userprofile,
+ {
+ {
+ "lr",
+ omit
+ }
+ }
+ )
+ );
+ var integer v_size_recordRoute := 0;
+ var integer i;
+
+ if (isvalue(p_recordRoute)) {
+ v_size_recordRoute := lengthof(valueof(p_recordRoute).routeBody);
+ }
+ for (i := 1; i < v_size_recordRoute + 1; i := i + 1) {
+ v_recordRoute.routeBody[i] := valueof(p_recordRoute).routeBody[i - 1];
+ }
+
+ return (v_recordRoute);
+ }
+
+
+
+ } // end group ParameterOperations
+
+ group FieldOperations {
+
+ /**
+ * @desc function adds "Tag"-parameter in "To"-headerfield
+ * @param p_to To header field that should get a Tag parameter
+ */
+ function f_addTagInTo(
+ inout To p_to
+ ) runs on SipComponent {
+ f_addParameterTagIfNotPresent(c_tagId, { tokenOrHost := f_getRndTag() }, p_to);
+ }
+
+ /**
+ * @desc addition of a single parameter in the via header field
+ * @param p_parameter_name name of parameter to be added
+ * @param p_parameter_value value of parameter to be added
+ * @param p_viaBody the via parameter to be extended
+ * @verdict
+ */
+ function f_addParameterIfNotPresent(
+ in charstring p_parameter_name,
+ in GenValue p_parameter_value,
+ inout ViaBody p_viaBody
+ ) {
+ if (isvalue(p_viaBody.viaParams)) {
+ return;
+ }
+ p_viaBody.viaParams := {
+ {
+ p_parameter_name,
+ p_parameter_value
+ }
+ };
+ }
+
+ /**
+ * @desc function to addd a parameter to the "To" header field (if there is not any parameter)
+ * @param p_parameter_name name of the parameter to be added
+ * @param p_parameter_value value of the paramter to be added
+ * @param p_to "To" header field to be extended
+ * @verdict
+ */
+ function f_addParameterTagIfNotPresent(
+ in charstring p_parameter_name,
+ in GenValue p_parameter_value,
+ inout To p_to
+ ) {
+ if (isvalue(p_to.toParams)) {
+ return;
+ }
+ p_to.toParams := {
+ {
+ p_parameter_name,
+ p_parameter_value
+ }
+ };
+ }
+
+ /**
+ * @desc function compares the IP address of two hosts
+ * @param p_host1 hostname
+ * @param p_host2 hostname
+ * @return boolean value that is true if the IP addresses are identical
+ * @verdict
+ */
+ function f_equivalentHostAddr(
+ in charstring p_host1,
+ in charstring p_host2
+ ) return boolean {
+ // A DNS server may be used
+ return (fx_getIpAddr(p_host1) == fx_getIpAddr(p_host2));
+ }
+
+
+ /**
+ * @desc function checks if Require contains Precondition
+ * @param p_message (request or response) SIP message to be analysed
+ * @return true if p_id parameter exist
+ */
+ function f_checkRequirePrecondition(
+ in Request p_message
+ ) {
+ var boolean v_precondition_found;
+ var integer i;
+ if (isvalue(p_message.msgHeader.require)) {
+ v_precondition_found := false;
+ for (i := 0; i < lengthof(p_message.msgHeader.require.optionsTags); i := i + 1) {
+ if (match(p_message.msgHeader.require.optionsTags[i], c_tagPrecond)) {
+ v_precondition_found := true;
+ }
+ }
+ if (not (v_precondition_found)) {
+ setverdict(fail);
+ log("*** " & __SCOPE__ & ": FAIL: precondition not found in Require options list! ***");
+ }
+ }
+ else {
+ setverdict(fail);
+ log("*** " & __SCOPE__ & ": FAIL: Require options is not present! ***");
+ }
+ }
+
+ /**
+ * @desc function checks if P-Charging-Vector contains a particular parameter
+ * @param p_message (request or response) SIP message to be analysed
+ * @param p_id name of parameter
+ * @return true if p_id parameter exist
+ */
+ function f_checkPChargingVectorHeaderParamId(
+ in Request p_message,
+ charstring p_id
+ ) return boolean {
+ var integer i;
+
+ if (isvalue(p_message.msgHeader.pChargingVector)) {
+ for (i := 0; i < lengthof(p_message.msgHeader.pChargingVector.chargeParams); i := i + 1) {
+ if (p_message.msgHeader.pChargingVector.chargeParams[i].id == p_id) {
+ return (true);
+ }
+ }
+ }
+ return (false);
+ }
+
+ /**
+ * @desc function checks if P-Charging-Vector contains a particular parameter
+ * @param p_message (request or response) SIP message to be analysed
+ * @param p_id name of parameter
+ * @return true if p_id parameter exist
+ */
+ function f_checkPChargingVectorHeaderParamIdResponse(
+ in Response p_message,
+ charstring p_id
+ ) return boolean {
+ var integer i;
+
+ if (isvalue(p_message.msgHeader.pChargingVector)) {
+ for (i := 0; i < lengthof(p_message.msgHeader.pChargingVector.chargeParams); i := i + 1) {
+ if (p_message.msgHeader.pChargingVector.chargeParams[i].id == p_id) {
+ return true;
+ }
+ }
+ }
+ return (false);
+ }
+
+ /**
+ * @desc function returns the Host/Port of a given Contact header field
+ * @param p_contact contact header field to be analysed
+ * @return Host/Port record from the contact header field
+ */
+ function f_getContactUri(
+ in ContactAddress p_contact
+ ) runs on SipComponent
+ return SipUrl {
+ var SipUrl v_SipUrl;
+
+ if (ischosen(p_contact.addressField.nameAddr)) {
+ v_SipUrl := p_contact.addressField.nameAddr.addrSpec;
+ }
+ else {
+ v_SipUrl := p_contact.addressField.addrSpecUnion;
+ }
+
+ return (v_SipUrl);
+ } // end f_getContactUri
+
+ /**
+ * @desc function returns the Host/Port of a given Contact header field
+ * @param p_contact contact header field to be analysed
+ * @return Host/Port record from the contact header field
+ */
+ function f_getContactAddr(
+ in ContactAddress p_contact
+ ) runs on SipComponent
+ return HostPort {
+ var HostPort v_locAddr;
+ var SipUrl v_SipUrl;
+
+ if (ischosen(p_contact.addressField.nameAddr)) {
+ v_SipUrl := p_contact.addressField.nameAddr.addrSpec;
+ }
+ else {
+ v_SipUrl := p_contact.addressField.addrSpecUnion;
+ }
+
+ v_locAddr.host := v_SipUrl.components.sip.hostPort.host;
+
+ if (isvalue(v_SipUrl.components.sip.hostPort.portField)) {
+ v_locAddr.portField := v_SipUrl.components.sip.hostPort.portField;
+ }
+ else {
+ v_locAddr.portField := c_defaultSipPort;
+ }
+
+ return (v_locAddr);
+ } // end f_getContactAddr
+
+ /**
+ * @desc function checks if History-Info-Header of the p_message contains a particular URI
+ * @param p_message (request or response) SIP message to be analysed
+ * @param p_URI name of parameter
+ * @return true if p_URI parameter exist
+ */
+ function f_checkHeaderInfoURI(
+ in Response p_message,
+ SipUrl p_URI
+ ) return boolean {
+ var integer i;
+
+ if (isvalue(p_message.msgHeader.historyInfo)) {
+ for (i := 0; i < lengthof(p_message.msgHeader.historyInfo.historyInfoList); i := i + 1) {
+ if (p_message.msgHeader.historyInfo.historyInfoList[i].nameAddr.addrSpec == p_URI) {
+ return (true);
+ }
+ }
+ }
+ return (false);
+ }
+
+ /**
+ * @desc function returns the Userinfo from a given To header field
+ * @param p_to To header field to be analysed
+ * @return Userinfo from the To header field as a charstring
+ */
+ function f_getUserfromTo(
+ in To p_to
+ ) runs on SipComponent
+ return charstring {
+ var SipUrl v_SipUrl;
+
+ if (ischosen(p_to.addressField.nameAddr)) {
+ v_SipUrl := p_to.addressField.nameAddr.addrSpec;
+ }
+ else {
+ v_SipUrl := p_to.addressField.addrSpecUnion;
+ }
+
+ return (v_SipUrl.components.sip.userInfo.userOrTelephoneSubscriber);
+ } // end f_getUserfromTo
+
+ /**
+ * @desc function to generate a 32 bits random number as a charstring for tag field
+ * @param p_cSeq_s CSeq parameter used to modify the tag field value
+ * @return tag value
+ */
+ function f_getRndCallId(
+ ) return charstring {
+ var charstring v_tag_value := fx_rndStr() & fx_rndStr();
+ // v_tag_value is initialized with a random value with at least 32 bits of randomness
+ // 4294967296 is a 32 bits integer
+ // v_tag_value := int2str(float2int(4294967296.0*rnd()) + loc_CSeq_s.seqNumber );
+ return (v_tag_value);
+ }
+
+ /**
+ * @desc function give access to the top element of the Path header field.
+ * @param p_Request SIP message to be analysed
+ * @return NameAddr (e.g. <sip:p.home.com>) or omit
+ */
+ function f_getPathHeaderTop(
+ inout Request p_Request
+ ) return template(omit) NameAddr {
+ if (isvalue(p_Request.msgHeader.path)) {
+ if (lengthof(p_Request.msgHeader.path.pathValues) > 0) {
+ return (p_Request.msgHeader.path.pathValues[0].nameAddr);
+ }
+ }
+ return (omit);
+ }
+
+ /**
+ * @desc function updates first element of a Via headerfield list
+ * @param p_viaBody_List address list of a Via header field
+ * @param p_source_address address to be inserted in the top element
+ */
+ function f_getViaReplyAddr(
+ inout ViaBody_List p_viaBody_List,
+ inout Address4SIP p_source_address
+ ) runs on SipComponent {
+ var ViaBody v_viaBody;
+ // The address to send message shall be updated after getting information
+ // in the Via header fied and according to 18.2.2
+ v_viaBody := p_viaBody_List[0];
+
+ // received parameter has to be addded to the via hader field
+ // Be careful it could be an Host name and not an IP Address
+ // One of the reasons this error can occur is if no DNS server is available.
+ // As a workaround, it is possible to adapt the configuration on the local machine the test
+ // suite is running on (e.g. under Windows the following file could be configured:
+ // C:\WINDOWS\system32\drivers\etc\hosts).
+ // Check if host address can be rosolved
+ if (not f_equivalentHostAddr(valueof(v_viaBody.sentBy.host), valueof(p_source_address.host))) {
+ f_addParameterIfNotPresent(c_receivedId, { tokenOrHost := valueof(p_source_address.host) }, v_viaBody);
+ }
+ if (isvalue(v_viaBody.sentBy.portField)) {
+ p_source_address.portField := valueof(v_viaBody.sentBy.portField);
+ }
+ else {
+ p_source_address.portField := c_defaultSipPort;
+ }
+ }
+
+ /**
+ * @desc functions give access to an element of the Route header field (record).
+ * @param p_message (request) SIP message to be analysed
+ * @param p_index index of Route record element to be retrieved
+ * @return HostPort value of the Route element or omit
+ */
+ function f_getRouteHeaderElementAddressFromRequest(
+ in Request p_message,
+ in integer p_index
+ ) return HostPort {
+ if (isvalue(p_message.msgHeader.route)) {
+ if (lengthof(p_message.msgHeader.route.routeBody) > p_index) {
+ return (p_message.msgHeader.route.routeBody[p_index].nameAddr.addrSpec.components.sip.hostPort);
+ }
+ }
+ setverdict(fail);
+ return (c_hostport_dummy);
+ }
+
+ /**
+ * @desc functions give access to an element of the Record-Route header field (record).
+ * @param p_message (request) SIP message to be analysed
+ * @param p_index index of recordRoute record element to be retrieved
+ * @return HostPort value of the Record-Route element or omit
+ */
+ function f_getRecordRouteHeaderElementAddressFromRequest(
+ in Request p_message,
+ in integer p_index
+ ) return HostPort {
+ if (isvalue(p_message.msgHeader.recordRoute)) {
+ if (lengthof(p_message.msgHeader.recordRoute.routeBody) > p_index) {
+ return (p_message.msgHeader.recordRoute.routeBody[p_index].nameAddr.addrSpec.components.sip.hostPort);
+ }
+ }
+ setverdict(fail);
+ return (c_hostport_dummy);
+ }
+
+ /**
+ * @desc functions give access to an element of the Record-Route header field (record).
+ * @param p_message (response) SIP message to be analysed
+ * @param p_index index of recordRoute record element to be retrieved
+ * @return HostPort value of the Record-Route element or omit
+ */
+ function f_getRecordRouteHeaderElementAddressFromResponse(
+ in Response p_message,
+ in integer p_index
+ ) return HostPort {
+ if (isvalue(p_message.msgHeader.recordRoute)) {
+ if (lengthof(p_message.msgHeader.recordRoute.routeBody) > p_index) {
+ return (p_message.msgHeader.recordRoute.routeBody[p_index].nameAddr.addrSpec.components.sip.hostPort);
+ }
+ }
+ setverdict(fail);
+ return (c_hostport_dummy);
+ }
+
+ /**
+ * @desc functions give access to an element of the Via header field (record).
+ * @param p_message (request) SIP message to be analysed
+ * @param p_index index of via record element to be retrieved
+ * @return HostPort value of the Via element or omit
+ */
+ function f_getViaHeaderElementHostPort(
+ in Request p_message,
+ in integer p_index
+ ) return HostPort {
+
+ if (lengthof(p_message.msgHeader.via.viaBody) > p_index) {
+ return (p_message.msgHeader.via.viaBody[p_index].sentBy);
+ }
+ setverdict(fail);
+ return (c_hostport_dummy);
+ }
+
+ /**
+ * @desc functions give access to an element of the Via header field (record).
+ * @param p_message (response) SIP message to be analysed
+ * @param p_index index of via record element to be retrieved
+ * @return HostPort value of the Via element or omit
+ */
+ function f_getViaHeaderElementHostPortResponse(
+ in Response p_message,
+ in integer p_index
+ ) return HostPort {
+
+ if (lengthof(p_message.msgHeader.via.viaBody) > p_index) {
+ return (p_message.msgHeader.via.viaBody[p_index].sentBy);
+ }
+ setverdict(fail);
+ return (c_hostport_dummy);
+ }
+
+ /**
+ * @desc function checks indicators if topology hiding (TH) has been applied: - second element in via-header record has tokenized-by parameter
+ * @param p_Request SIP message to be analysed
+ * @return boolean value (true indicate TH, false otherwise)
+ */
+ function f_topologyHiding(
+ inout Request p_request
+ ) runs on SipComponent
+ return boolean {
+ var GenericParam v_viaParameter;
+
+ if (lengthof(p_request.msgHeader.via.viaBody) <2 ) {
+ return (false);
+ }
+ v_viaParameter := p_request.msgHeader.via.viaBody[1].viaParams[0];
+ // second element
+ if (not v_viaParameter.id == "tokenized-by") {
+ return (false);
+ }
+ return (true);
+ }
+
+ /**
+ * @desc function checks indicators if topology hiding (TH) has been applied: - any element in via-header record has tokenized-by parameter
+ * @param Response SIP message to be analysed
+ * @return boolean value (true indicate TH, false otherwise)
+ */
+ function f_topologyHidingResponse(
+ inout Response p_response
+ ) runs on SipComponent
+ return boolean {
+ var GenericParam v_viaParameter;
+ var integer i;
+
+ for (i := 0; i < lengthof(p_response.msgHeader.via.viaBody); i := i + 1) {
+
+ v_viaParameter := p_response.msgHeader.via.viaBody[i].viaParams[0]; // first parameter
+ if (not v_viaParameter.id == "tokenized-by") {
+ return (false);
+ }
+ }
+ return (true);
+ }
+
+
+
+ group SetHeaders {
+
+
+ /**
+ * @desc function for setting of component variables related to message header fields (message type independent: CSeq, contact, via), function uses information from userprofile
+ * @param p_cSeq_s CSeq parameter
+ * @param p_method method name for cSeq header field
+ */
+ function f_setHeadersGeneral(
+ inout CSeq p_cSeq_s,
+ in charstring p_method
+ ) runs on SipComponent {
+ p_cSeq_s.fieldName := CSEQ_E;
+ p_cSeq_s.seqNumber := p_cSeq_s.seqNumber + 1;
+ p_cSeq_s.method := p_method;
+ vc_cSeq := p_cSeq_s;
+
+ vc_contact := valueof(m_Contact(m_SipUrl_contactIpaddr(vc_userprofile)));
+ vc_branch := c_branchCookie & f_getRndTag();
+ vc_via := {
+ fieldName := VIA_E,
+ viaBody := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))}
+ };
+ } // end function f_setHeadersGeneral
+
+
+
+ /**
+ * @desc function for setting of component variables related to message header fields (message type independent: CSeq, contact, via), function uses information from userprofile
+ * @param p_cSeq_s CSeq parameter
+ * @param p_method method name for cSeq header field
+ */
+ function f_setHeadersACK(
+ ) runs on SipComponent {
+ // vc_requestUri.hostPort := vc_reqHostPort;
+ if (vc_response.statusLine.statusCode >= 200 and vc_response.statusLine.statusCode <= 299)
+ // ref. RFC3261 8.1.1.7 Via
+ {
+ vc_branch := c_branchCookie & f_getRndTag();
+ }
+ vc_via := {
+ fieldName := VIA_E,
+ viaBody := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))}
+ };
+ } // end function f_setHeadersGeneral
+
+ /**
+ * @desc setting of general and basic Bye header fields in additon to the addresses (To, From, ReqUri)
+ * @param p_cSeq_s
+ */
+ function f_setHeadersBYE(
+ inout CSeq p_cSeq_s
+ ) runs on SipComponent {
+ f_setHeadersGeneral(p_cSeq_s, "BYE"); // cseq, contact, branch, via
+ // vc_callId := { fieldName:=CALL_ID_E, callid:=f_getRndCallId(p_cSeq_s) & c_AT & vc_userprofile.currIpaddr };
+ f_addTagInTo(vc_to);
+
+ vc_cancel_To := vc_to;
+ vc_caller_To := vc_to;
+
+ vc_caller_From := vc_from;
+
+ vc_reqHostPort := vc_requestUri.components.sip.hostPort;
+ } // end function f_setHeadersBYE
+
+ /**
+ * @desc setting of general and basic CANCEL header fields
+ * @param p_cSeq_s
+ */
+ function f_setHeadersCANCEL(
+ inout CSeq p_cSeq_s
+ ) runs on SipComponent {
+
+ p_cSeq_s.method := "CANCEL";
+ // vc_branch := c_branchCookie & f_getRndTag(); // STF 406: CANCEL and ACK should have the same branch as the INVITE
+ vc_via := {
+ fieldName := VIA_E,
+ viaBody := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))}
+ };
+ } // end function f_setHeadersCANCEL
+
+ /**
+ * @desc function sets header field for the next outgoing REGISTER message
+ * @param p_cSeq_s CSeq parameter to be applied
+ * @param p_emergency Set to true in case of emergency
+ */
+ function f_setHeaders_REGISTER(
+ inout CSeq p_cSeq_s,
+ boolean p_emergency := false
+ ) runs on SipComponent {
+ var SemicolonParam_List v_params := {};
+
+ f_setHeadersGeneral(p_cSeq_s, "REGISTER"); // cseq, contact, branch, via
+ vc_requestUri := {
+ scheme := c_sipScheme,
+ components := {
+ sip := {
+ userInfo := omit,
+ hostPort := {
+ host := vc_userprofile.registrarDomain,
+ portField := omit
+ }
+ }
+ },
+ urlParameters := omit,
+ headers := omit
+ };
+
+ vc_reqHostPort := vc_requestUri.components.sip.hostPort;
+
+ vc_callId := {
+ fieldName := CALL_ID_E,
+ callid := f_getRndCallId() & c_AT & vc_userprofile.currIpaddr
+ };
+ vc_callIdReg := vc_callId; // remember callId for de-registration
+ vc_to := valueof(m_To(m_SipUrl_currDomain(vc_userprofile)));
+ vc_cancel_To := vc_to;
+ v_params := f_addParameter(v_params,
+ {
+ id := c_tagId,
+ paramValue := {
+ tokenOrHost := f_getRndTag()
+ }
+ });
+ vc_from := {
+ fieldName := FROM_E,
+ addressField := vc_to.addressField,
+ fromParams := v_params
+ };
+
+ if (not vc_firstREGISTER_sent) {
+ if (p_emergency) {
+ v_params := {
+ {
+ "sos",
+ omit
+ }
+ };
+ vc_contact.contactBody.contactAddresses[0].addressField.addrSpecUnion.urlParameters := v_params;
+ }
+ else {
+ v_params := {
+ {
+ id := c_expiresId,
+ paramValue := {
+ tokenOrHost := c_shortRegistration
+ }
+ }
+ };
+ vc_contact.contactBody.contactAddresses[0].contactParams := v_params;
+ }
+ }
+
+ vc_firstREGISTER_sent := true; // f_setHeaders_Register is called in deREGISTER function
+ vc_authorization := {
+ fieldName := AUTHORIZATION_E,
+ body := {f_calculatecCredentials_empty(vc_userprofile)}
+ };
+
+ vc_via_REG := vc_via;
+ } // end function setHeaders_REGISTER
+
+ /**
+ * @desc function sets via, cseq and authorization header for the next outgoing (protected) REGISTER
+ * @verdict
+ */
+ function f_setHeaders_2ndREGISTER(
+ inout CSeq p_cSeq_s
+ ) runs on SipComponent {
+ var CommaParam_List v_challenge;
+
+ // Increment CSeq sequence number
+ p_cSeq_s.seqNumber := p_cSeq_s.seqNumber + 1;
+ vc_cSeq := p_cSeq_s;
+
+ vc_requestUri := {
+ scheme := c_sipScheme,
+ components := {
+ sip := {
+ userInfo := omit,
+ hostPort := {
+ host := vc_userprofile.registrarDomain,
+ portField := omit
+ }
+ }
+ },
+ urlParameters := omit,
+ headers := omit
+ };
+
+ // new branch tag due to different branch tag in new REGISTER method
+ vc_branch := c_branchCookie & f_getRndTag();
+
+ vc_via_REG := {
+ fieldName := VIA_E,
+ viaBody := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))}
+ };
+
+ // Extract challenge and calculate credentials for a response.
+ v_challenge := vc_response.msgHeader.wwwAuthenticate.challenge.digestCln;
+
+
+ // Prepair right answer
+ vc_authorization := {
+ fieldName := AUTHORIZATION_E,
+ body := {f_calculatecCredentials(vc_userprofile, "REGISTER", v_challenge)}
+ };
+ } // end function f_setHeaders_2ndREGISTER
+
+ /**
+ * @desc function sets via, cseq and authorization header for the next outgoing (protected) REGISTER NO response in Authorization header to cause an error
+ * @verdict
+ */
+ function f_setHeaders_2ndREGISTER_wo_response(
+ ) runs on SipComponent {
+ var CommaParam_List v_challenge;
+
+ vc_branch := c_branchCookie & f_getRndTag();
+
+ vc_via_REG := {
+ fieldName := VIA_E,
+ viaBody := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))}
+ };
+
+ if (ischosen(vc_response.msgHeader.wwwAuthenticate.challenge.otherChallenge))
+ // Extract challenge and calculate credentials for a response.
+ {
+ v_challenge := vc_response.msgHeader.wwwAuthenticate.challenge.otherChallenge.authParams;
+ }
+ else {
+ v_challenge := vc_response.msgHeader.wwwAuthenticate.challenge.digestCln;
+ }
+
+ // Increment CSeq sequence number
+ vc_cSeq.seqNumber := vc_cSeq.seqNumber + 1;
+
+ // Prepair right answer
+ vc_authorization := {
+ fieldName := AUTHORIZATION_E,
+ body := {f_calculatecCredentials_wo_response(vc_userprofile, "REGISTER", v_challenge)}
+ };
+ } // end function f_setHeaders_2ndREGISTER_wo_response
+
+ /**
+ * @desc function sets via, cseq and authorization header with different private name for the next outgoing (protected) REGISTER
+ * @verdict
+ */
+ function f_setHeaders_2ndREGISTER_authorizationWithDifferentUserName(
+ ) runs on SipComponent {
+ var CommaParam_List v_challenge;
+
+ vc_branch := c_branchCookie & f_getRndTag();
+
+ vc_requestUri := {
+ scheme := c_sipScheme,
+ components := {
+ sip := {
+ userInfo := omit,
+ hostPort := {
+ host := vc_userprofile.registrarDomain,
+ portField := omit
+ }
+ }
+ },
+ urlParameters := omit,
+ headers := omit
+ };
+
+ vc_via_REG := {
+ fieldName := VIA_E,
+ viaBody := {valueof(m_ViaBody_currIpaddr(vc_branch, vc_userprofile))}
+ };
+
+ // Extract challenge and calculate credentials for a response.
+ v_challenge := vc_response.msgHeader.wwwAuthenticate.challenge.otherChallenge.authParams;
+
+ // Increment CSeq sequence number
+ vc_cSeq.seqNumber := vc_cSeq.seqNumber + 1;
+
+ // Prepair right answer
+ vc_authorization := {
+ fieldName := AUTHORIZATION_E,
+ body := {f_calculatecCredentialsAndChangeUserName(vc_userprofile, "REGISTER", v_challenge)}
+ };
+ } // end function f_setHeaders_2ndREGISTER_authorizationWithDifferentUserName
+
+
+ /**
+ * @desc function sets header fields for the next outgoing REGISTER (de-registration)
+ * @param p_cSeq_s cSeq to be used
+ * @verdict
+ */
+ function f_setHeaders_deREGISTER(
+ inout CSeq p_cSeq_s
+ ) runs on SipComponent {
+ var SemicolonParam_List v_params := {};
+
+ f_setHeadersGeneral(p_cSeq_s, "REGISTER"); // cseq, contact, branch, via
+ // reset authorization header to not use nonce from registration (otherwise we have to increase nc)
+ vc_authorization := {
+ fieldName := AUTHORIZATION_E,
+ body := {f_calculatecCredentials_empty(vc_userprofile)}
+ };
+ vc_requestUri := {
+ scheme := c_sipScheme,
+ components := {
+ sip := {
+ userInfo := omit,
+ hostPort := {
+ host := vc_userprofile.registrarDomain,
+ portField := omit
+ }
+ }
+ },
+ urlParameters := omit,
+ headers := omit
+ };
+ vc_to := valueof(m_To(m_SipUrl_currDomain(vc_userprofile)));
+ v_params := f_addParameter(v_params,
+ {
+ id := c_tagId,
+ paramValue := {
+ tokenOrHost := f_getRndTag()
+ }
+ });
+ vc_from := {
+ fieldName := FROM_E,
+ addressField := vc_to.addressField,
+ fromParams := v_params
+ };
+
+ vc_contact := {
+ fieldName := CONTACT_E,
+ contactBody := {wildcard := "*"}
+ };
+ } // end function f_setHeaders_deREGISTER
+
+
+ /**
+ * @desc setting of general and basic Invite header fields in additon to the addresses (To, From, ReqUri)
+ * @param p_cSeq_s
+ */
+ function f_setHeadersINVITE(
+ inout CSeq p_cSeq_s
+ ) runs on SipComponent {
+ f_setHeadersGeneral(p_cSeq_s, "INVITE"); // cseq, contact, branch, via
+ vc_callId := {
+ fieldName := CALL_ID_E,
+ callid := f_getRndCallId() & c_AT & vc_userprofile.currIpaddr
+ };
+
+ vc_cancel_To := vc_to;
+ vc_caller_To := vc_to;
+
+ vc_caller_From := vc_from;
+
+ if (ischosen(vc_requestUri.components.sip)) {
+ // sip/sips call
+ vc_reqHostPort := vc_requestUri.components.sip.hostPort;
+ }
+ else if (ischosen(vc_requestUri.components.urn)) {
+ // Emergency call
+ vc_reqUrnUri := vc_requestUri.components.urn;
+ }
+ else {
+ log("*** " & __SCOPE__ &": INFO:f_setHeadersINVITE: unsupported field: ", vc_requestUri," ***");
+ setverdict(fail);
+ }
+ }
+
+ /**
+ * @desc setting of general and basic Update header fields in additon to the addresses (To, From, ReqUri)
+ * @param p_cSeq_s
+ */
+ function f_setHeadersUPDATE(
+ inout CSeq p_cSeq_s
+ ) runs on SipComponent {
+ f_setHeadersGeneral(p_cSeq_s, "UPDATE"); // cseq, contact, branch, via
+ vc_callId := {
+ fieldName := CALL_ID_E,
+ callid := f_getRndCallId() & c_AT & vc_userprofile.currIpaddr
+ };
+
+ vc_cancel_To := vc_to;
+ vc_caller_To := vc_to;
+
+ vc_caller_From := vc_from;
+
+ vc_reqHostPort := vc_requestUri.components.sip.hostPort;
+ } // end function f_setHeadersUPDATE
+
+ /**
+ * @desc setting of general and basic Message header fields in additon to the addresses (To, From, ReqUri)
+ * @param p_cSeq_s
+ */
+ function f_setHeadersMESSAGE(
+ inout CSeq p_cSeq_s
+ ) runs on SipComponent {
+ f_setHeadersGeneral(p_cSeq_s, "MESSAGE"); // cseq, contact, branch, via
+ vc_callId := {
+ fieldName := CALL_ID_E,
+ callid := f_getRndCallId() & c_AT & vc_userprofile.currIpaddr
+ };
+
+ vc_cancel_To := vc_to;
+ vc_caller_To := vc_to;
+
+ vc_caller_From := vc_from;
+
+ vc_reqHostPort := vc_requestUri.components.sip.hostPort;
+ } // end function f_setHeadersMESSAGE
+
+ /**
+ * @desc setting of general and basic Notify header fields in additon to the addresses (To, From, ReqUri)
+ * @param p_cSeq_s
+ */
+ function f_setHeadersNOTIFY(
+ inout CSeq p_cSeq_s
+ ) runs on SipComponent {
+ f_setHeadersGeneral(p_cSeq_s, "NOTIFY"); // cseq, contact, branch, via
+ vc_cancel_To := vc_to;
+ vc_caller_To := vc_to;
+ vc_caller_From := vc_from;
+
+ vc_reqHostPort := vc_requestUri.components.sip.hostPort;
+ } // end function f_setHeadersNOTIFY
+
+ /**
+ * @desc setting of general and basic Publish header fields in additon to the addresses (To, From, ReqUri)
+ * @param p_cSeq_s
+ */
+ function f_setHeadersPUBLISH(
+ inout CSeq p_cSeq_s
+ ) runs on SipComponent {
+ f_setHeadersGeneral(p_cSeq_s, "PUBLISH"); // cseq, contact, branch, via
+ // after SUBSCRIBE message callid shall be same
+ // vc_callId := { fieldName:=CALL_ID_E, callid:=f_getRndCallId(p_cSeq_s) & c_AT & vc_userprofile.currIpaddr };
+ vc_cancel_To := vc_to;
+ vc_caller_To := vc_to;
+
+ vc_caller_From := vc_from;
+
+ vc_reqHostPort := vc_requestUri.components.sip.hostPort;
+ } // end function f_setHeadersPUBLISH
+
+ /**
+ * @desc function sets header field for the next outgoing SUBSCRIBE message
+ * @param p_cSeq_s CSeq parameter to be applied
+ */
+ function f_setHeaders_SUBSCRIBE(
+ inout CSeq p_cSeq_s
+ ) runs on SipComponent {
+ var SemicolonParam_List v_params := {};
+
+ f_setHeadersGeneral(p_cSeq_s, "SUBSCRIBE"); // cseq, contact, branch, via
+ vc_requestUri := valueof(m_SipUrl_currDomain(vc_userprofile));
+
+ vc_reqHostPort := vc_requestUri.components.sip.hostPort;
+
+ vc_callId := {
+ fieldName := CALL_ID_E,
+ callid := f_getRndCallId() & c_AT & vc_userprofile.currIpaddr
+ };
+
+ // store callId from Subscribe message
+ vc_callIdSub := vc_callId;
+
+ vc_to := valueof(m_To(m_SipUrl_currDomain(vc_userprofile)));
+ vc_cancel_To := vc_to;
+ v_params := f_addParameter(v_params,
+ {
+ id := c_tagId,
+ paramValue := {
+ tokenOrHost := f_getRndTag()
+ }
+ });
+ vc_from := {
+ fieldName := FROM_E,
+ addressField := vc_to.addressField,
+ fromParams := v_params
+ };
+ } // end function setHeaders_SUBSCRIBE
+
+ /**
+ * @desc setting of general and basic Subscribe header fields in additon to the addresses (To, From, ReqUri)
+ * @param p_cSeq_s
+ */
+ function f_setHeadersSUBSCRIBE(
+ inout CSeq p_cSeq_s
+ ) runs on SipComponent {
+ f_setHeadersGeneral(p_cSeq_s, "SUBSCRIBE"); // cseq, contact, branch, via
+ vc_callId := {
+ fieldName := CALL_ID_E,
+ callid := f_getRndCallId() & c_AT & vc_userprofile.currIpaddr
+ };
+
+ vc_cancel_To := vc_to;
+ vc_caller_To := vc_to;
+
+ vc_caller_From := vc_from;
+
+ vc_reqHostPort := vc_requestUri.components.sip.hostPort;
+ } // end function f_setHeadersMESSAGE
+
+ /**
+ * @desc setting of general and basic REFER header fields in additon to the addresses (To, From, ReqUri)
+ * @param p_cSeq_s
+ */
+ function f_setHeadersREFER(
+ inout CSeq p_cSeq_s
+ ) runs on SipComponent {
+ f_setHeadersGeneral(p_cSeq_s, "REFER"); // cseq, contact, branch, via
+ // vc_callId := { fieldName:=CALL_ID_E, callid:=f_getRndCallId(p_cSeq_s) & c_AT & vc_userprofile.currIpaddr };
+ vc_cancel_To := vc_to;
+ vc_caller_To := vc_to;
+
+ vc_caller_From := vc_from;
+
+ vc_reqHostPort := vc_requestUri.components.sip.hostPort;
+ } // end function f_setHeadersREFER
+
+ /**
+ * @desc This function reads all necessary headers from the received REGISTER message and generate the tag for the answer
+ * @param p_Request REGISTER that has been received
+ */
+ function f_setHeadersOnReceiptOfREGISTER(
+ Request p_Request
+ ) runs on SipComponent {
+
+ f_setHeadersOnReceiptOfRequest(p_Request);
+
+ vc_callId := p_Request.msgHeader.callId;
+ vc_caller_From := vc_from;
+ f_addTagInTo(vc_to);
+ vc_caller_To := vc_to;
+ vc_requestUri := p_Request.requestLine.requestUri;
+
+ vc_cancel_To := p_Request.msgHeader.toField;
+
+ if (isvalue(p_Request.msgHeader.contact) and (not ischosen(p_Request.msgHeader.contact.contactBody.wildcard))) {
+ vc_reqHostPort := f_getContactAddr(p_Request.msgHeader.contact.contactBody.contactAddresses[0]);
+ }
+
+ // update callee information and pick up tag if the call need to be canceled
+ vc_callee_To := {
+ fieldName := TO_E,
+ addressField := vc_caller_From.addressField,
+ toParams := vc_caller_From.fromParams
+ };
+
+ vc_callee_From := {
+ fieldName := FROM_E,
+ addressField := vc_caller_To.addressField,
+ fromParams := vc_caller_To.toParams
+ };
+
+ if (isvalue(p_Request.msgHeader.authorization)) {
+ vc_authorization := valueof(p_Request.msgHeader.authorization);
+ }
+ } // end f_setHeadersOnReceiptOfREGISTER
+
+ /**
+ * @desc This function reads all necessary headers from the received SUBSCRIBE message and generate the tag for the answer
+ * @param p_Request SUBSCRIBE that has been received
+ */
+ function f_setHeadersOnReceiptOfSUBSCRIBE(
+ Request p_Request
+ ) runs on SipComponent {
+
+ f_setHeadersOnReceiptOfRequest(p_Request);
+
+ vc_callId := p_Request.msgHeader.callId;
+ vc_caller_From := vc_from;
+ f_addTagInTo(vc_to);
+ vc_caller_To := vc_to;
+ vc_requestUri := p_Request.requestLine.requestUri;
+
+ vc_cancel_To := p_Request.msgHeader.toField;
+
+ if (isvalue(p_Request.msgHeader.contact)) {
+ vc_reqHostPort := f_getContactAddr(p_Request.msgHeader.contact.contactBody.contactAddresses[0]);
+ }
+
+ // update callee information and pick up tag if the call need to be canceled
+ vc_callee_To := {
+ fieldName := TO_E,
+ addressField := vc_caller_From.addressField,
+ toParams := vc_caller_From.fromParams
+ };
+
+ vc_callee_From := {
+ fieldName := FROM_E,
+ addressField := vc_caller_To.addressField,
+ fromParams := vc_caller_To.toParams
+ };
+ } // end f_setHeadersOnReceiptOfSUBSCRIBE
+
+ function f_setHeadersOnReceiptOfREFER(
+ Request p_Request
+ ) runs on SipComponent {
+
+ f_setHeadersOnReceiptOfRequest(p_Request);
+
+ vc_requestUri := p_Request.requestLine.requestUri;
+ vc_cancel_To := p_Request.msgHeader.toField;
+
+ if (isvalue(p_Request.msgHeader.contact)) {
+ vc_reqHostPort := f_getContactAddr(p_Request.msgHeader.contact.contactBody.contactAddresses[0]);
+ vc_requestUri := f_getContactUri(p_Request.msgHeader.contact.contactBody.contactAddresses[0]);
+ }
+
+ // update callee information and pick up tag if the call need to be canceled
+ vc_callee_To := {
+ fieldName := TO_E,
+ addressField := vc_caller_From.addressField,
+ toParams := vc_caller_From.fromParams
+ };
+
+ vc_callee_From := {
+ fieldName := FROM_E,
+ addressField := vc_caller_To.addressField,
+ fromParams := vc_caller_To.toParams
+ };
+ } // end f_setHeadersOnReceiptOfREFER
+
+ /**
+ * @desc function reads all necessary headers from the received INVITE message and generate the tag for the answer
+ * @param p_Request received INVITE message
+ * @verdict
+ */
+ function f_setHeadersOnReceiptOfINVITE(
+ Request p_Request
+ ) runs on SipComponent {
+ var integer i, j;
+ var integer v_length;
+
+ f_setHeadersOnReceiptOfRequest(p_Request);
+
+ vc_callId := p_Request.msgHeader.callId;
+
+ vc_requestUri2 := p_Request.requestLine.requestUri;
+
+ vc_cancel_To := p_Request.msgHeader.toField;
+ f_addTagInTo(vc_to);
+ vc_caller_From := vc_from;
+ vc_caller_To := vc_to;
+
+ if (isvalue(p_Request.msgHeader.contact)) {
+ vc_reqHostPort := f_getContactAddr(p_Request.msgHeader.contact.contactBody.contactAddresses[0]);
+ vc_requestUri := f_getContactUri(p_Request.msgHeader.contact.contactBody.contactAddresses[0]);
+ }
+
+ // update callee information and pick up tag if the call need to be canceled
+ vc_callee_To := {
+ fieldName := TO_E,
+ addressField := vc_caller_From.addressField,
+ toParams := vc_caller_From.fromParams
+ };
+
+ vc_callee_From := {
+ fieldName := FROM_E,
+ addressField := vc_caller_To.addressField,
+ fromParams := vc_caller_To.toParams
+ };
+
+ if (isvalue(p_Request.msgHeader.privacy)) {
+ vc_privacy := p_Request.msgHeader.privacy;
+ }
+
+ if (isvalue(p_Request.messageBody)) {
+ // cleaning of attributes before assignment
+ if (isvalue(vc_sdp_remote.media_list)) {
+ v_length := lengthof(vc_sdp_remote.media_list);
+ for (i := 0; i < v_length; i := i + 1) {
+ if (isvalue(vc_sdp_remote.media_list[i].attributes)) {
+ vc_sdp_remote.media_list[i].attributes := omit;
+ }
+ }
+ }
+
+ // save SDP if present
+ if (ischosen(p_Request.messageBody.sdpMessageBody)) {
+ vc_sdp_remote := p_Request.messageBody.sdpMessageBody;
+ vc_sdp_remote_is_valid := true;
+ f_prepare_SDP_answer();
+ }
+
+ // save XML if present
+ if (ischosen(p_Request.messageBody.xmlBody)) {
+ vc_xml_remote := p_Request.messageBody.xmlBody;
+ }
+
+ if (ischosen(p_Request.messageBody.mimeMessageBody)) {
+
+ for (j := 0; j < lengthof(p_Request.messageBody.mimeMessageBody.mimeEncapsulatedList); j := j + 1) {
+ if (match(p_Request.messageBody.mimeMessageBody.mimeEncapsulatedList[j].content_type, c_sdpApplication)) {
+ vc_sdp_remote := p_Request.messageBody.mimeMessageBody.mimeEncapsulatedList[j].mime_encapsulated_part.sdpMessageBody;
+ vc_sdp_remote_is_valid := true;
+ f_prepare_SDP_answer();
+ }
+ if (match(p_Request.messageBody.mimeMessageBody.mimeEncapsulatedList[j].content_type, c_xmlApplication)) {
+ vc_xml_remote := p_Request.messageBody.mimeMessageBody.mimeEncapsulatedList[j].mime_encapsulated_part.xmlBody;
+ }
+ }
+ }
+ }
+
+ if (isvalue(p_Request.msgHeader.supported.optionsTags)) {
+ for (i := lengthof(p_Request.msgHeader.supported.optionsTags); i > 0; i := i - 1) {
+ if (p_Request.msgHeader.supported.optionsTags[i - 1] == "100rel") {
+ vc_supported_100rel := true;
+ }
+ if (p_Request.msgHeader.supported.optionsTags[i - 1] == "precondition") {
+ vc_supported_precondition := true;
+ }
+ }
+ }
+ } // end f_setHeadersOnReceiptOfINVITE
+
+ /**
+ * @desc function reads header field of a received BYE message
+ * @param p_Request received BYE
+ */
+ function f_setHeadersOnReceiptOfBYE(
+ Request p_BYE_Request
+ ) runs on SipComponent {
+
+ f_setHeadersOnReceiptOfRequest(p_BYE_Request);
+ vc_callId := p_BYE_Request.msgHeader.callId;
+ } // end f_setHeadersOnReceiptOfBYE
+
+ /**
+ * @desc function reads header field from an incoming Request message
+ * @param p_Request received Request message
+ */
+ function f_setHeadersOnReceiptOfRequest(
+ Request p_Request
+ ) runs on SipComponent {
+ vc_request := p_Request;
+ vc_callId := p_Request.msgHeader.callId;
+ vc_cSeq := valueof(p_Request.msgHeader.cSeq); // CSeq is mandatory
+ vc_iut_CSeq := p_Request.msgHeader.cSeq;
+ vc_from := p_Request.msgHeader.fromField;
+ vc_caller_From := p_Request.msgHeader.fromField;
+ vc_to := p_Request.msgHeader.toField;
+ vc_caller_To := p_Request.msgHeader.toField;
+ vc_via := p_Request.msgHeader.via;
+ // update sent_label according to received via header field
+ f_getViaReplyAddr(vc_via.viaBody, vc_sent_label);
+
+ // Catch route
+ vc_boo_recordRoute := false;
+
+ // add tag field into To header if tag is not present
+ if (not (isvalue(p_Request.msgHeader.toField.toParams))) {
+ vc_to.toParams := {
+ {
+ id := c_tagId,
+ paramValue := {
+ tokenOrHost := f_getRndTag()
+ }
+ }
+ };
+ vc_caller_To := vc_to;
+ }
+ if (isvalue(p_Request.msgHeader.recordRoute)) {
+ vc_boo_recordRoute := true;
+ vc_recordRoute := p_Request.msgHeader.recordRoute;
+ }
+ } // end f_setHeadersOnReceiptOfRequest
+
+ /**
+ * @desc functions reads header fields from an incoming Response message
+ * @param p_cSeq
+ * @param p_response received response message
+ * @verdict
+ */
+ function f_setHeadersOnReceiptOfResponse(
+ Response p_response
+ ) runs on SipComponent {
+ var integer i, j, v_nbroute;
+ var template(omit) Contact v_contact;
+ // only for local purpose
+ vc_response := p_response;
+ // vc_cSeq := p_cSeq; //must not save global c_seq because it can overwrite temporary cSeq
+ vc_to := p_response.msgHeader.toField;
+ vc_from := p_response.msgHeader.fromField;
+ vc_caller_To := vc_to;
+ vc_caller_From := vc_from;
+
+ if (isvalue(p_response.msgHeader.contact)) {
+ v_contact := p_response.msgHeader.contact;
+ if (ischosen(v_contact.contactBody.contactAddresses)) {
+ vc_reqHostPort := f_getContactAddr(valueof(v_contact.contactBody.contactAddresses[0]));
+ vc_requestUri := f_getContactUri(valueof(v_contact.contactBody.contactAddresses[0]));
+ }
+ }
+ else {
+ if (ischosen(vc_to.addressField.addrSpecUnion.components.sip)) {
+ // sip/sips call
+ vc_reqHostPort := vc_to.addressField.addrSpecUnion.components.sip.hostPort;
+ }
+ else if (ischosen(vc_to.addressField.addrSpecUnion.components.urn)) {
+ // Emergency call
+ vc_reqUrnUri := vc_to.addressField.addrSpecUnion.components.urn;
+ }
+ else {
+ log("*** f_setHeadersOnReceiptOfResponse: INFO: unsupported field: ", vc_to, " ***");
+ setverdict(fail);
+ }
+ vc_requestUri := vc_to.addressField.addrSpecUnion;
+ }
+
+ vc_callee_To := {
+ fieldName := TO_E,
+ addressField := vc_caller_From.addressField,
+ toParams := vc_caller_From.fromParams
+ };
+
+ vc_callee_From := {
+ fieldName := FROM_E,
+ addressField := vc_caller_To.addressField,
+ fromParams := vc_caller_To.toParams
+ };
+
+ vc_via := p_response.msgHeader.via;
+
+ // Route Management
+ if (isvalue(p_response.msgHeader.recordRoute)) {
+ vc_recordRoute := p_response.msgHeader.recordRoute;
+ v_nbroute := lengthof(vc_recordRoute.routeBody);
+ // copy and reverse the order of the routes in route header
+ for (i := 0; i <= (v_nbroute - 1); i := i + 1) {
+ j := v_nbroute - 1 - i;
+ vc_route.routeBody[j] := vc_recordRoute.routeBody[i];
+ }
+ vc_route.fieldName := ROUTE_E;
+ vc_boo_recordRoute := true;
+ vc_boo_route := true;
+ }
+ else {
+ vc_boo_recordRoute := false;
+ vc_boo_route := false;
+ }
+
+
+ // extentions due to new fields in PRACK and UPDATE messages
+ if (isvalue(p_response.msgHeader.rSeq)) {
+ vc_rAck := {
+ fieldName := RACK_E,
+ responseNum := valueof(p_response.msgHeader.rSeq).responseNum,
+ seqNumber := valueof(p_response.msgHeader.cSeq).seqNumber,
+ method := valueof(p_response.msgHeader.cSeq).method
+ };
+ }
+
+ // extentions due to new HistoryInfo fields 180 or 200OK messages
+ if (isvalue(p_response.msgHeader.historyInfo)) {
+ vc_historyInfoList := valueof(p_response.msgHeader.historyInfo).historyInfoList;
+ vc_history_is_valid := true;
+ }
+ else {
+ vc_history_is_valid := false;
+ }
+
+ // sdpMessageBody answer
+ if (isvalue(p_response.messageBody)) {
+ if (ischosen(p_response.messageBody.sdpMessageBody)) {
+ vc_sdp_remote := p_response.messageBody.sdpMessageBody;
+ vc_sdp_remote_is_valid := true;
+ }
+
+ if (ischosen(p_response.messageBody.xmlBody)) {
+ vc_xml_remote := p_response.messageBody.xmlBody;
+ }
+
+ if (ischosen(p_response.messageBody.mimeMessageBody)) {
+
+ for (j := 0; j < lengthof(p_response.messageBody.mimeMessageBody.mimeEncapsulatedList); j := j + 1) {
+ if (match(p_response.messageBody.mimeMessageBody.mimeEncapsulatedList[j].content_type, c_sdpApplication)) {
+ vc_sdp_remote := p_response.messageBody.mimeMessageBody.mimeEncapsulatedList[j].mime_encapsulated_part.sdpMessageBody;
+ }
+ if (match(p_response.messageBody.mimeMessageBody.mimeEncapsulatedList[j].content_type, c_xmlApplication)) {
+ vc_xml_remote := p_response.messageBody.mimeMessageBody.mimeEncapsulatedList[j].mime_encapsulated_part.xmlBody;
+ }
+ }
+ }
+ }
+ } // end function f_setHeadersOnReceiptOfResponse
+
+ /**
+ * @desc functions reads ServiceRoute header field from an incoming 200 Response message in registration
+ * @param p_cSeq
+ * @param p_response received response message
+ */
+ function f_getServiceRouteMapIntoRouteInRegistration(
+ Response p_response
+ ) runs on SipComponent {
+ var integer i, j, v_nbroute;
+ var template(omit) ServiceRoute v_serviceRoute;
+
+ // Route Management
+ if (isvalue(p_response.msgHeader.serviceRoute)) {
+ v_serviceRoute := p_response.msgHeader.serviceRoute;
+ v_nbroute := lengthof(v_serviceRoute.routeBody);
+ // copy and reverse the order of the routes in route header
+ for (i := 0; i <= (v_nbroute - 1); i := i + 1) {
+ j := v_nbroute - 1 - i;
+ vc_route.routeBody[j] := v_serviceRoute.routeBody[i];
+ }
+ vc_route.fieldName := ROUTE_E;
+ vc_route_REG := vc_route;
+ vc_boo_route := true;
+ }
+ } // end function f_getServiceRouteMapIntoRouteInRegistration
+
+ /**
+ * @desc functions reads Route header field from an incoming Request message and generate RecordRoute
+ * @param p_cSeq
+ * @param p_request received request message
+ */
+ function f_getRouteMapIntoRecordRoute(
+ Request p_request
+ ) runs on SipComponent {
+ var integer i, j, v_nbroute;
+ var template(omit) Route v_route;
+
+ // Route Management
+ if (isvalue(p_request.msgHeader.route)) {
+ v_route := p_request.msgHeader.route;
+ v_nbroute := lengthof(v_route.routeBody);
+ // copy and reverse the order of the routes in route header
+ for (i := 0; i <= (v_nbroute - 1); i := i + 1) {
+ j := v_nbroute - 1 - i;
+ vc_recordRoute.routeBody[j] := v_route.routeBody[i];
+ }
+ vc_recordRoute.fieldName := RECORD_ROUTE_E;
+
+ vc_boo_recordRoute := true;
+ }
+ } // end function f_getRouteMapIntoRecordRoute
+
+
+ } // end group SetHeaders
+
+
+
+ } // end group FieldOperations
+
+ group SDPOperations {
+
+ /**
+ * @desc check if message body include SDP attribute (2nd parameter) for any media
+ */
+ function f_check_attribute(
+ in SDP_Message p_sdp,
+ in template SDP_attribute p_attribute
+ ) runs on SipComponent
+ return boolean {
+ var integer i, j;
+
+ if (isvalue(p_sdp.media_list)) {
+ for (j := 0; j < lengthof(p_sdp.media_list); j := j + 1) {
+ if (isvalue(p_sdp.media_list[j].attributes)) {
+ for (i := 0; i < lengthof(p_sdp.media_list[j].attributes); i := i + 1) {
+ if (match(p_sdp.media_list[j].attributes[i], p_attribute)) {
+ return (true);
+ }
+ }
+ }
+ }
+ }
+ if (isvalue(p_sdp.attributes)) {
+ for (j := 0; j < lengthof(p_sdp.attributes); j := j + 1) {
+ if (match(p_sdp.attributes[j], p_attribute)) {
+ return (true);
+ }
+ }
+ }
+
+ return (false);
+ }
+
+ /**
+ * @desc check if message body include SDP (session level) attribute (2nd parameter) for any media
+ */
+ function f_check_session_attribute(
+ in SDP_Message p_sdp,
+ in template SDP_attribute p_attribute
+ ) runs on SipComponent
+ return boolean {
+ var integer j;
+
+ if (isvalue(p_sdp.attributes)) {
+ for (j := 0; j < lengthof(p_sdp.attributes); j := j + 1) {
+ if (match(p_sdp.attributes[j], p_attribute)) {
+ return (true);
+ }
+ }
+ }
+
+ return (false);
+ }
+
+ /**
+ * @desc identify an SDP direction attribute (session or first media attribute) in a SDP message and return its answer value
+ * @param p_sdp the SDP message that has been received
+ * @param p_attribute incoming SDP attribute that need to be used for the SDP direction (answer)
+ * @return the new attribute (to be send out) derived from the incoming SDP value
+ * @verdict
+ */
+ function f_get_attribute_answer(
+ in SDP_Message p_sdp,
+ in template SDP_attribute p_attribute
+ ) runs on SipComponent
+ return SDP_attribute {
+ var integer i, j;
+ var template SDP_attribute v_attribute := p_attribute;
+
+ // check if the selected attribute is included in the SDP offer (session attributes)
+ if (isvalue(p_sdp.attributes)) {
+ for (j := 0; j < lengthof(p_sdp.attributes); j := j + 1) {
+ if (match(p_sdp.attributes[j], p_attribute)) {
+ v_attribute := p_sdp.attributes[j];
+ }
+ }
+ }
+ else
+ // check if the selected attribute is included in the SDP offer (any of the media attributes)
+ {
+ if (isvalue(p_sdp.media_list)) {
+ for (j := 0; j < lengthof(p_sdp.media_list); j := j + 1) {
+ if (isvalue(p_sdp.media_list[j].attributes)) {
+ for (i := 0; i < lengthof(p_sdp.media_list[j].attributes); i := i + 1) {
+ if (match(p_sdp.media_list[j].attributes[i], p_attribute)) {
+ v_attribute := p_sdp.media_list[j].attributes[i];
+ }
+ }
+ }
+ }
+ }
+ }
+
+ select (valueof(v_attribute)) {
+ case (mw_attribute_sendonly) {
+ return (valueof(m_attribute_recvonly));
+ }
+ case (mw_attribute_sendrecv) {
+ return (valueof(m_attribute_sendrecv));
+ } // MRO
+ case (mw_attribute_inactive) {
+ return (valueof(m_attribute_inactive));
+ } // MRO
+ case (mw_attribute_recvonly) {
+ return (valueof(m_attribute_sendonly));
+ } // MRO
+ }
+ return (valueof(m_attribute_sendrecv)); // the default return value in case of missing attribute offer
+ }
+
+ /**
+ * @desc check if message body include SDP bandwidth (2nd parameter) either for the session or a media description
+ */
+ function f_check_bandwidth(
+ in SDP_Message p_loc_sdp,
+ in template SDP_bandwidth p_loc_bandw
+ ) runs on SipComponent
+ return boolean {
+ var integer i, j;
+ if (isvalue(p_loc_sdp.bandwidth)) {
+ for (j := 0; j < lengthof(p_loc_sdp.bandwidth); j := j + 1) {
+ if (match(p_loc_sdp.bandwidth[j], p_loc_bandw)) {
+ return (true);
+ }
+ }
+ }
+ if (isvalue(p_loc_sdp.media_list)) {
+ for (j := 0; j < lengthof(p_loc_sdp.media_list); j := j + 1) {
+ if (isvalue(p_loc_sdp.media_list[j].bandwidth)) {
+ for (i := 0; i < lengthof(p_loc_sdp.media_list[j].bandwidth); i := i + 1) {
+ if (match(p_loc_sdp.media_list[j].bandwidth[i], p_loc_bandw)) {
+ return (true);
+ }
+ }
+ }
+ }
+ }
+
+ return (false);
+ }
+
+ /**
+ * @desc check if message body include SDP media (2nd parameter)
+ */
+ function f_check_media(
+ in SDP_Message p_loc_sdp,
+ in template(present) SDP_media_desc p_loc_media
+ ) runs on SipComponent
+ return boolean {
+ var integer j;
+ if (isvalue(p_loc_sdp.media_list)) {
+ for (j := 0; j < lengthof(p_loc_sdp.media_list); j := j + 1) {
+ if (match(p_loc_sdp.media_list[j].media_field.transport, p_loc_media.media_field.transport) and match(p_loc_sdp.media_list[j].media_field.fmts, p_loc_media.media_field.fmts)) {
+ return (true);
+ }
+ }
+ }
+ return (false);
+ }
+
+ /**
+ * @desc check if message body include precondition mechanism (a=des and a=curr) retrun true, else false
+ * @param loc_sdp SDP message
+ */
+ function f_check_precondition(
+ in SDP_Message p_loc_sdp
+ ) runs on SipComponent
+ return boolean {
+ if (f_check_attribute(p_loc_sdp, mw_attribute_des) or f_check_attribute(p_loc_sdp, mw_attribute_curr)) {
+ return (true);
+ }
+
+ return (false);
+ }
+
+
+ /**
+ * @desc check if message body include SDP media direction return true, else false
+ */
+ function f_check_media_direction(
+ in SDP_Message p_loc_sdp
+ ) runs on SipComponent
+ return boolean {
+
+ if (f_check_attribute(p_loc_sdp, mw_attribute_sendonly) or f_check_attribute(p_loc_sdp, mw_attribute_recvonly) or f_check_attribute(p_loc_sdp, mw_attribute_sendrecv) or f_check_attribute(p_loc_sdp, mw_attribute_inactive)) {
+ return (true);
+ }
+
+ return (false);
+ }
+
+ /**
+ * @desc copy media/attribute lines from remote to local SDP variable
+ */
+ function f_check_SDP(
+ integer p_loc_sdp,
+ integer p_loc_codec
+ ) runs on SipComponent
+ return boolean {
+ var SDP_media_desc v_media := f_prepare_media(p_loc_sdp, p_loc_codec);
+ if (vc_sdp_remote.media_list[0].media_field.media != v_media.media_field.media) {
+ return false;
+ }
+ if (vc_sdp_remote.media_list[0].media_field.transport != v_media.media_field.transport) {
+ return false;
+ }
+ if (vc_sdp_remote.media_list[0].media_field.fmts != v_media.media_field.fmts) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * @desc replace the first curr media attribute with the given value.
+ * @param p_sdp SDP message to modify
+ * @param p_curr new curr attribute
+ */
+ function f_replace_curr_attribute(
+ inout SDP_Message p_sdp,
+ in SDP_attribute_curr p_curr
+ ) {
+ var integer i;
+ var integer v_mn;
+ if (isvalue(p_sdp.media_list)) {
+ v_mn := lengthof(p_sdp.media_list[0].attributes);
+ for (i := 0; i < v_mn; i := i + 1) {
+ if (ischosen(p_sdp.media_list[0].attributes[i].curr)) {
+ p_sdp.media_list[0].attributes[i].curr := p_curr;
+ i := v_mn;
+ }
+ }
+ }
+ }
+
+ /**
+ * @desc append new media attribute to the first media description.
+ * @param p_sdp SDP message to modify
+ * @param p_att SDP attribute to appand
+ */
+ function f_append_media_attribute(
+ inout SDP_Message p_sdp,
+ in SDP_attribute p_att
+ ) {
+ var integer v_mn;
+ if (isvalue(p_sdp.media_list)) {
+ v_mn := lengthof(p_sdp.media_list[0].attributes);
+ p_sdp.media_list[0].attributes[v_mn] := p_att;
+ }
+ }
+
+
+ /**
+ * @desc append new media to the existing media list in SDP
+ */
+ function f_append_media(
+ inout SDP_Message p_loc_SDP,
+ template(value) SDP_media_desc p_loc_media
+ ) {
+ var integer v_mn := lengthof(p_loc_SDP.media_list);
+ p_loc_SDP.media_list[v_mn] := valueof(p_loc_media);
+ }
+
+ /**
+ * @desc repare media/attribute lines
+ */
+ function f_prepare_media(
+ integer p_loc_sdp,
+ integer p_loc_codec
+ ) runs on SipComponent
+ return SDP_media_desc {
+ var SDP_attribute_rtpmap_codec v_codecs[32] := {
+ {"PCMU", "8000", omit}, {"GSM", "8000", omit}, {"G723", "8000", omit}, {"DVI4", "8000", omit},
+ {"DVI4", "16000", omit}, {"LPC", "8000", omit}, {"PCMA", "8000", omit}, {"G722", "8000", omit},
+ {"L16", "44100", "2"}, {"L16", "44100", omit}, {"QCELP", "8000", omit}, {"CN","8000", omit},
+ {"MPA", "90000", omit}, {"G728", "8000", omit}, {"DVI4", "11025", omit}, {"DVI4", "22050", omit},
+ {"G729", "8000", omit}, {"G726-40", "8000", omit}, {"G726-32", "8000", omit}, {"G726-24", "8000", omit},
+ {"G726-16", "8000", omit}, {"G726D", "8000", omit}, {"G726E", "8000", omit}, {"GSM-EFR", "8000", omit},
+ {"CelB", "90000", omit}, {"JPEG", "90000", omit}, {"Nv", "90000", omit}, {"H261", "90000", omit},
+ {"MPV", "90000", omit}, {"MP2T" ,"90000", omit}, {"H263", "90000", omit}, {"H263-1998", "90000", omit}};
+ var SDP_media_desc v_media := {
+ media_field := {
+ media := "audio",
+ ports := {
+ port_number := 10000,
+ num_of_ports := omit
+ },
+ transport := "RTP/AVP",
+ fmts := {"0"}
+ }, // m=audio
+ // 8500
+ // RTP/AVP
+ // 0
+ information := omit,
+ connections := omit,
+ bandwidth := omit,
+ key := omit,
+ attributes := omit
+ };
+
+ if (32 < p_loc_codec or p_loc_codec < 1) {
+ log("*** " & __SCOPE__ & ": INFO: Unexpected SDP variant ***");
+ setverdict(inconc);
+ return (v_media);
+ }
+
+ if (p_loc_sdp == 1) {
+ }
+ else if (p_loc_sdp == 2) {
+ v_media.media_field.fmts := {PX_SIP_SDP_DYN}; // { "98", "0" };
+ v_media.attributes := {
+ {
+ rtpmap := {
+ payload_type := PX_SIP_SDP_DYN,
+ codec := v_codecs[p_loc_codec - 1]
+ }
+ }
+ };
+ }
+ else if (p_loc_sdp == 3) {
+ v_media.media_field.fmts := {"8"};
+ }
+ else if (p_loc_sdp == 4) {
+ v_media.media_field.fmts := {"99", "8"};
+ v_media.attributes := {
+ {
+ rtpmap := {
+ payload_type := "99",
+ codec := v_codecs[p_loc_codec - 1]
+ }
+ }
+ };
+ }
+ else if (p_loc_sdp == 5) {
+ v_media.media_field.media := "image";
+ v_media.media_field.transport := "udptl";
+ v_media.media_field.fmts := {"t38"};
+ }
+ else if (p_loc_sdp == 6) {
+ v_media.media_field.media := "image";
+ v_media.media_field.transport := "tcptl";
+ v_media.media_field.fmts := {"t38"};
+ }
+ else {
+ log("*** " & __SCOPE__ & ": INFO: Unexpected SDP variant ***");
+ setverdict(inconc);
+ }
+
+ return (v_media);
+ }
+
+ /**
+ * @desc repare media/attribute lines
+ */
+ function f_prepare_SDP(
+ integer p_loc_sdp,
+ integer p_loc_codec
+ ) runs on SipComponent {
+
+ vc_sdp_local.media_list := {f_prepare_media(p_loc_sdp, p_loc_codec)};
+ }
+
+ /**
+ * @desc function that copy media/attribute lines from remote to local SDP variable
+ */
+ function f_prepare_SDP_answer(
+ ) runs on SipComponent {
+ var integer v_mn, v_cn := 0, i, j, k := 0;
+ var charstring v_PT;
+ var SDP_attribute_rtpmap_codec v_rtpmap := { "", "", omit};
+ var SDP_attribute_list v_mediaAttributes := {};
+ // increase session version
+ vc_sdp_local.origin.session_version := int2str(str2int(vc_sdp_remote.origin.session_version) + 1);
+ // if more than one codec, select the firs one
+ v_mn := lengthof(vc_sdp_remote.media_list);
+ for (i := 0; i < v_mn; i := i + 1) {
+ // for every single media
+ if (isvalue(vc_sdp_remote.media_list[i].attributes)) {
+ v_cn := lengthof(vc_sdp_remote.media_list[i].attributes);
+ }
+ if (lengthof(vc_sdp_remote.media_list[i].media_field.fmts) > 0) {
+ // select the first one
+ v_PT := vc_sdp_remote.media_list[i].media_field.fmts[0];
+ vc_sdp_local.media_list[i].media_field.fmts := {v_PT};
+ for (j := 0; j < v_cn; j := j + 1) {
+ if (ischosen(vc_sdp_remote.media_list[i].attributes[j].rtpmap)) {
+ if (v_PT == vc_sdp_remote.media_list[i].attributes[j].rtpmap.payload_type) {
+ v_rtpmap := vc_sdp_remote.media_list[i].attributes[j].rtpmap.codec;
+ v_mediaAttributes[k] := {rtpmap := {v_PT, v_rtpmap}};
+ k := k + 1;
+ } // else line is not copied
+ }
+ else {
+ // simple copy of attribute
+ v_mediaAttributes[k] := vc_sdp_remote.media_list[i].attributes[j];
+ k := k + 1;
+ }
+ }
+ vc_sdp_local.media_list[i].attributes := v_mediaAttributes;
+
+ if (isvalue(vc_sdp_local.media_list[i].attributes)) {
+ v_cn := lengthof(vc_sdp_local.media_list[i].attributes);
+ for (j := 0; j < v_cn; j := j + 1) {
+ // simplified handling of status attributes (copy/keep status from peer):
+ // a) copy/keep SDP_attribute_curr (invert tags if applicable)
+ if (ischosen(vc_sdp_local.media_list[i].attributes[j].curr)) {
+ // invert local/remote status tags
+ if (vc_sdp_local.media_list[i].attributes[j].curr.statusType == "local") {
+ vc_sdp_local.media_list[i].attributes[j].curr.statusType := "remote";
+ }
+ if (vc_sdp_local.media_list[i].attributes[j].curr.statusType == "remote") {
+ vc_sdp_local.media_list[i].attributes[j].curr.statusType := "local";
+ }
+ // invert send/recv direction tags
+ if (vc_sdp_local.media_list[i].attributes[j].curr.direction == "send") {
+ vc_sdp_local.media_list[i].attributes[j].curr.direction := "recv";
+ }
+ if (vc_sdp_local.media_list[i].attributes[j].curr.direction == "recv") {
+ vc_sdp_local.media_list[i].attributes[j].curr.direction := "send";
+ }
+ }
+ else
+ if (
+ // b) copy/keep SDP_attribute_des (keep strength, invert tags if applicable)
+ ischosen(vc_sdp_local.media_list[i].attributes[j].des)
+ ) {
+ // invert local/remote status tags
+ if (vc_sdp_local.media_list[i].attributes[j].des.statusType == "local") {
+ vc_sdp_local.media_list[i].attributes[j].des.statusType := "remote";
+ }
+ if (vc_sdp_local.media_list[i].attributes[j].des.statusType == "remote") {
+ vc_sdp_local.media_list[i].attributes[j].des.statusType := "local";
+ }
+ // invert send/recv direction tags
+ if (vc_sdp_local.media_list[i].attributes[j].des.direction == "send") {
+ vc_sdp_local.media_list[i].attributes[j].des.direction := "recv";
+ }
+ if (vc_sdp_local.media_list[i].attributes[j].des.direction == "recv") {
+ vc_sdp_local.media_list[i].attributes[j].des.direction := "send";
+ }
+ }
+ else
+ if (
+ // c) simplification: assume no SDP_attribute_conf
+ ischosen(vc_sdp_local.media_list[i].attributes[j].conf)
+ ) {
+ // handle SDP_attribute_conf
+ }
+ }
+ }
+ }
+ }
+ // add handling of prenegotiation, change ports if required etc.
+ // if prenegotiation...
+ }
+
+ /**
+ * @desc reject SDP offer by setting media ports to 0
+ */
+ function f_reject_SDP_offer(
+ ) runs on SipComponent {
+ var integer mn, i;
+ f_copy_SDP(); // TO BE DONE with more details!
+ // increase session version
+ vc_sdp_local.origin.session_version := int2str(str2int(vc_sdp_local.origin.session_version) + 1);
+ // if more than one codec, select the firs one
+ mn := lengthof(vc_sdp_local.media_list);
+ for (i := 0; i < mn; i := i + 1) {
+ vc_sdp_local.media_list[i].media_field.ports := {0, omit};
+ vc_sdp_local.media_list[i].attributes := omit; // {};
+ }
+ }
+
+ /**
+ * @desc copies SDP message elements from remote to local component variable: - bandwidth - session version (will be incremented) - media list modify the direction attribute of an SDP media list entry within an SDP message (vc_sdp_local)
+ * @param p_medianum list position number of the media (if value 0 identifies first media list element)
+ * @param p_direction the new direction attribute to be included in the media entry
+ * @verdict
+ */
+ function f_SIP_modMediaDirection(
+ integer p_medianum,
+ template(value) SDP_attribute p_direction
+ ) runs on SipComponent {
+ var boolean v_set_direction;
+
+ // flag indicates if direction attribute has been modified
+ var integer v_mn := 0;
+
+ // length of media list (number of entries)
+ var integer v_cn := 0;
+
+ // number of attributes of a media entry
+ var integer i, j, k := 0;
+ var SDP_attribute_list v_mediaAttributes := {};
+ // collect the media attributes (to be assigned at end of function)
+ f_copy_SDP(); // copy SDP session bandwidth and media list from remote to local component variable
+ // increment session version
+ vc_sdp_local.origin.session_version := int2str(str2int(vc_sdp_local.origin.session_version) + 1);
+
+ // if more than one codec, select the first one
+ v_mn := lengthof(vc_sdp_local.media_list);
+
+ if (p_medianum == 0)
+ // specific media requested
+ {
+ p_medianum := 1; // start checking from first media
+ }
+ if (p_medianum > 0)
+ // specific media requested
+ {
+ if (not (p_medianum > v_mn)) {
+ v_mn := p_medianum;
+ }
+ }
+
+ // handling of media list elements
+ for (i := 0; i < v_mn; i := i + 1) {
+ v_cn := 0; // initialize the number of attributes of the media list entry
+ if (isvalue(vc_sdp_local.media_list))
+ // media_list is optional
+ {
+ // log("vc_sdp_local.media_list[i ] ",vc_sdp_local.media_list[i ] );
+ if (isvalue(vc_sdp_local.media_list[i].attributes)) {
+ v_cn := lengthof(vc_sdp_local.media_list[i].attributes);
+ }
+
+ v_set_direction := false;
+
+ // if (lengthof(vc_sdp_local.media_list[i ] .media_field.fmts)>1)
+ // select the first one
+ for (j := 0; j < v_cn; j := j + 1) {
+ if (ischosen(vc_sdp_local.media_list[i].attributes[j].recvonly) or ischosen(vc_sdp_local.media_list[i].attributes[j].sendonly) or ischosen(vc_sdp_local.media_list[i].attributes[j].inactive) or ischosen(vc_sdp_local.media_list[i].attributes[j].sendrecv)) {
+ v_mediaAttributes[k] := valueof(p_direction);
+ v_set_direction := true;
+ }
+ else
+ // non-direction attributes will be copied
+ {
+ v_mediaAttributes[k] := vc_sdp_local.media_list[i].attributes[j];
+ }
+ k := k + 1;
+ }
+
+ if (not v_set_direction) {
+ v_mediaAttributes[k] := valueof(p_direction);
+ }
+ vc_sdp_local.media_list[i].attributes := v_mediaAttributes;
+ // }
+ }
+ }
+ // add handling of prenegotiation, change ports if required etc.
+ // if prenegotiation...
+ }
+
+ /**
+ * @desc modify session and media attributes direction
+ */
+ function f_SIP_modSessionDirection(
+ template(value) SDP_attribute p_direction
+ ) runs on SipComponent {
+ var boolean v_set_direction := false;
+ var integer v_mn := 0, i := 0;
+
+ if (isvalue(vc_sdp_local.attributes)) {
+ v_mn := lengthof(vc_sdp_local.attributes);
+
+ for (i := 0; i < v_mn; i := i + 1) {
+ // for every single attribute (that is not omit)
+ if (ischosen(vc_sdp_local.attributes[i].recvonly) or ischosen(vc_sdp_local.attributes[i].sendonly) or ischosen(vc_sdp_local.attributes[i].inactive) or ischosen(vc_sdp_local.attributes[i].sendrecv)) {
+ vc_sdp_local.attributes[i] := valueof(p_direction);
+ v_set_direction := true;
+ }
+ }
+ if (not v_set_direction)
+ // if not sent before
+ {
+ vc_sdp_local.attributes[v_mn] := valueof(p_direction);
+ }
+ }
+ else {
+ vc_sdp_local.attributes[0] := valueof(p_direction);
+ }
+ }
+
+ /**
+ * @desc check (from remote) and set (local) the session/media attribute lines on directions
+ * @param p_direction_in incoming SDP attribute that need to be checked
+ * @param p_direction_out SDP attribute that should be included in the SDP answer (to be returned to peer)
+ * @return
+ * @verdict
+ */
+ function f_SIP_checksetSDPreqDirection(
+ template(value) SDP_attribute p_direction_in,
+ template(value) SDP_attribute p_direction_out
+ ) runs on SipComponent {
+ var template(value) SDP_attribute v_direction_out := p_direction_out;
+ // check incoming SDP attribute
+ if (not (isvalue(vc_request.messageBody) and (f_check_attribute(vc_request.messageBody.sdpMessageBody, p_direction_in)))) {
+ if (match(valueof(p_direction_in), mw_attribute_sendrecv) and not (f_check_attribute(vc_request.messageBody.sdpMessageBody, mw_attribute_sendrecv) or f_check_attribute(vc_request.messageBody.sdpMessageBody, mw_attribute_sendonly) or f_check_attribute(vc_request.messageBody.sdpMessageBody, mw_attribute_recvonly) or f_check_attribute(vc_request.messageBody.sdpMessageBody, mw_attribute_inactive))) {
+ log("*** " &__SCOPE__& ": INFO: no direction attributes with expectation: ", p_direction_in, " ***");
+ }
+ else {
+ setverdict(fail);
+ }
+ }
+ else {
+ setverdict(pass);
+ log("*** " &__SCOPE__& ": INFO: attribute found in message body ***");
+ }
+ if (match(omit, p_direction_out))
+ // not isvalue(v_direction_out))//MRO
+ {
+ v_direction_out := f_get_attribute_answer(vc_request.messageBody.sdpMessageBody, p_direction_in);
+ }
+ f_SIP_modMediaDirection(1, v_direction_out); // handling of attribute in media description
+ f_SIP_modSessionDirection(v_direction_out); // handling of attribute in session
+ }
+
+ /*
+ *
+ * @desc check (from remote) and set (local) the session/media attribute lines on directions
+ * @param p_direction_in incoming SDP attribute that need to be checked
+ * @param p_direction_out SDP attribute that should be included in the SDP answer (to be returned to peer)
+ * @return
+ * @verdict
+ */
+ function f_SIP_checkResponsesetSDPreqDirection(
+ template(value) SDP_attribute p_direction_in,
+ template(value) SDP_attribute p_direction_out
+ ) runs on SipComponent {
+ var template(value) SDP_attribute v_direction_out := p_direction_out;
+ // check incoming SDP attribute
+ if (not (isvalue(vc_response.messageBody) and (f_check_attribute(vc_response.messageBody.sdpMessageBody, p_direction_in)))) {
+ if (match(valueof(p_direction_in), mw_attribute_sendrecv) and not (f_check_attribute(vc_response.messageBody.sdpMessageBody, mw_attribute_sendrecv) or f_check_attribute(vc_response.messageBody.sdpMessageBody, mw_attribute_sendonly) or f_check_attribute(vc_response.messageBody.sdpMessageBody, mw_attribute_recvonly) or f_check_attribute(vc_response.messageBody.sdpMessageBody, mw_attribute_inactive))) {
+ log("*** " &__SCOPE__& ": INFO: no direction attributes with expectation: ", p_direction_in, " ***");
+ }
+ else {
+ setverdict(fail);
+ }
+ }
+ else {
+ setverdict(pass);
+ log("*** " &__SCOPE__& ": INFO: attribute found in message body ***");
+ }
+ if (match(omit, p_direction_out))
+ // not isvalue(v_direction_out))//MRO
+ {
+ v_direction_out := f_get_attribute_answer(vc_response.messageBody.sdpMessageBody, p_direction_in);
+ }
+ f_SIP_modMediaDirection(1, v_direction_out); // handling of attribute in media description
+ f_SIP_modSessionDirection(v_direction_out); // handling of attribute in session
+ }
+
+ /*
+ *
+ * @desc check (from remote) and set (local) the session attribute lines on directions
+ * @param p_direction_in incoming SDP attribute that need to be checked
+ * @param p_direction_out SDP attribute that should be included in the SDP answer (to be returned to peer)
+ * @return
+ * @verdict
+ */
+ function f_SIP_checksetSDPreqDirectionSession(
+ template(value) SDP_attribute p_direction_in,
+ template(value) SDP_attribute p_direction_out
+ ) runs on SipComponent {
+ var template(value) SDP_attribute v_direction_out := p_direction_out;
+ // check incoming SDP attribute
+ if (not (isvalue(vc_request.messageBody) and (f_check_session_attribute(vc_request.messageBody.sdpMessageBody, p_direction_in)))) {
+ if (match(valueof(p_direction_in), mw_attribute_sendrecv) and not (f_check_session_attribute(vc_request.messageBody.sdpMessageBody, mw_attribute_sendrecv) or f_check_session_attribute(vc_request.messageBody.sdpMessageBody, mw_attribute_sendonly) or f_check_session_attribute(vc_request.messageBody.sdpMessageBody, mw_attribute_recvonly) or f_check_session_attribute(vc_request.messageBody.sdpMessageBody, mw_attribute_inactive))) {
+ log("*** " &__SCOPE__& ": INFO: no direction attributes with expectation: ", p_direction_in, " ***");
+ }
+ else {
+ setverdict(fail);
+ }
+ }
+ if (match(omit, p_direction_out))
+ // not isvalue(v_direction_out))//MRO
+ {
+ v_direction_out := f_get_attribute_answer(vc_request.messageBody.sdpMessageBody, p_direction_in);
+ }
+ f_SIP_modSessionDirection(v_direction_out); // handling of attribute in session
+ }
+
+ /*
+ *
+ * @desc check (from remote) and set (local) the session attribute lines on directions
+ * @param p_direction_in incoming SDP attribute that need to be checked
+ * @param p_direction_out SDP attribute that should be included in the SDP answer (to be returned to peer)
+ * @return
+ * @verdict
+ */
+ function f_SIP_checkResponsesetSDPreqDirectionSession(
+ template(value) SDP_attribute p_direction_in,
+ template(value) SDP_attribute p_direction_out
+ ) runs on SipComponent {
+ var template(value) SDP_attribute v_direction_out := p_direction_out;
+ // check incoming SDP attribute
+ if (not (isvalue(vc_response.messageBody) and (f_check_session_attribute(vc_response.messageBody.sdpMessageBody, p_direction_in)))) {
+ if (match(valueof(p_direction_in), mw_attribute_sendrecv) and not (f_check_session_attribute(vc_response.messageBody.sdpMessageBody, mw_attribute_sendrecv) or f_check_session_attribute(vc_response.messageBody.sdpMessageBody, mw_attribute_sendonly) or f_check_session_attribute(vc_response.messageBody.sdpMessageBody, mw_attribute_recvonly) or f_check_session_attribute(vc_response.messageBody.sdpMessageBody, mw_attribute_inactive))) {
+ log("*** " &__SCOPE__& ": INFO: no direction attributes with expectation: ", p_direction_in, " ***");
+ }
+ else {
+ setverdict(fail);
+ }
+ }
+ if (match(omit, p_direction_out))
+ // not isvalue(v_direction_out))//MRO
+ {
+ v_direction_out := f_get_attribute_answer(vc_response.messageBody.sdpMessageBody, p_direction_in);
+ }
+ f_SIP_modSessionDirection(v_direction_out); // handling of attribute in session
+ }
+
+
+ /*
+ *
+ * @desc check (from remote) and set (local)the session/media attribute lines on directions
+ * @param p_direction_in attribute to be check
+ * @param p_direction_out attrubyte to be
+ * @return
+ * @verdict
+ */
+ function f_SIP_checkSDPrespDirection(
+ template SDP_attribute p_direction_in
+ ) runs on SipComponent {
+ // check incoming SDP attribute
+ if (not (isvalue(vc_response.messageBody) and f_check_attribute(vc_response.messageBody.sdpMessageBody, p_direction_in))) {
+ setverdict(fail);
+ }
+ }
+
+ /**
+ * @desc check media/attribute lines from remote
+ */
+ function f_SIP_checkMediaDirection(
+ integer p_medianum,
+ template SDP_attribute p_direction
+ ) runs on SipComponent
+ return boolean {
+ var integer v_mn, v_cn := 0, i, j;
+ var boolean v_result := false;
+ // increase session version
+ vc_sdp_remote.origin.session_version := int2str(str2int(vc_sdp_remote.origin.session_version) + 1);
+ // if more than one codec, select the firs one
+ v_mn := lengthof(vc_sdp_remote.media_list);
+ if (p_medianum == 0)
+ // specific media requested
+ {
+ p_medianum := 1; // start checking from first media
+ }
+ if (p_medianum > 0)
+ // specific media requested
+ {
+ if (p_medianum > v_mn) {
+ return false;
+ }
+ else {
+ v_mn := p_medianum;
+ }
+ }
+ for (i := p_medianum - 1; i < v_mn; i := i + 1) {
+ // for every single media
+ if (isvalue(vc_sdp_remote.media_list[i].attributes)) {
+ v_cn := lengthof(vc_sdp_remote.media_list[i].attributes);
+ }
+ if (lengthof(vc_sdp_remote.media_list[i].attributes) > 0) {
+ // select the first one
+ for (j := 0; j < lengthof(vc_sdp_remote.media_list[i].attributes); j := j + 1) {
+ if (ischosen(vc_sdp_remote.media_list[i].attributes[j].recvonly) or ischosen(vc_sdp_remote.media_list[i].attributes[j].sendonly) or ischosen(vc_sdp_remote.media_list[i].attributes[j].inactive) or ischosen(vc_sdp_remote.media_list[i].attributes[j].sendrecv)) {
+ if (match(vc_sdp_remote.media_list[i].attributes[j], p_direction)) {
+ v_result := true;
+ }
+ else {
+ return false;
+ }
+ }
+ }
+ }
+ }
+ return v_result;
+ }
+
+ /**
+ * @desc copy media/attribute lines from remote to local SDP variable
+ */
+ function f_copy_SDP(
+ ) runs on SipComponent {
+ if (isvalue(vc_sdp_remote.connection)) {
+ vc_sdp_local.connection := vc_sdp_remote.connection;
+ }
+ else {
+ vc_sdp_local.connection := omit;
+ }
+
+ vc_sdp_local.origin := vc_sdp_remote.origin;
+ vc_sdp_local.session_name := vc_sdp_remote.session_name;
+
+ if (isvalue(vc_sdp_remote.bandwidth)) {
+ vc_sdp_local.bandwidth := vc_sdp_remote.bandwidth;
+ }
+ else {
+ vc_sdp_local.bandwidth := {};
+ }
+
+ if (isvalue(vc_sdp_remote.media_list)) {
+ // // cleaning of media before assignment
+ // if (isvalue(vc_sdp_local.media_list))
+ // {
+ // for (var integer i:=0; i<lengthof(vc_sdp_local.media_list); i:=i+1)
+ // {
+ // vc_sdp_local.media_list[i ] := omit ;
+ // }
+ // };
+ vc_sdp_local.media_list := vc_sdp_remote.media_list;
+ }
+ }
+
+
+ } // end group SDPOperations
+
+ group AwaitingMessage {
+
+ /**
+ * @desc Function for time delay
+ */
+ function f_awaitingDelayTimer(
+ float p_delay
+ ) runs on SipComponent {
+ tc_tDelay.start(p_delay);
+ alt {
+ [] tc_tDelay.timeout {
+ setverdict(pass);
+ }
+ }
+ } // end f_awaitingDelayTimer
+
+ /**
+ * @desc Function waiting for any MSG -request/response
+ */
+ function f_awaitingAnyPassOnTimeout(
+ ) runs on SipComponent {
+ tc_wait.start(PX_SIP_TWAIT);
+ alt {
+ [] SIPP.receive
+ {
+ tc_wait.stop;
+ vc_boo_response := true;
+ vc_boo_request := true;
+ // setverdict(pass)
+ }
+ [] tc_wait.timeout {
+ vc_boo_response := false;
+ vc_boo_request := false;
+ // setverdict (pass)
+ }
+ }
+ } // end f_awaitingResponsePassOnTimeout
+
+ /**
+ * @desc Function waiting for no MSG -request/response
+ */
+ function f_awaitingNonePassOnTimeout(
+ ) runs on SipComponent {
+ tc_wait.start(PX_SIP_TWAIT);
+ alt {
+ [] tc_wait.timeout {
+ setverdict(pass);
+ }
+ }
+ } // end f_awaitingNonePassOnTimeout
+
+ /**
+ * @desc function awaits REGISTER
+ * @param p_register expected REGISTER request
+ */
+ function f_awaitingREGISTER(
+ in template(present) REGISTER_Request p_register := ?
+ ) runs on SipComponent {
+ var Request v_request;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt {
+ [] SIPP.receive(p_register) -> value v_request sender vc_sent_label {
+ tc_wait.stop;
+ f_setHeadersOnReceiptOfREGISTER(v_request);
+ }
+ [] tc_wait.timeout {
+ setverdict(fail);
+ f_componentStop();
+ }
+ }
+ }
+
+ /**
+ * @desc function awaits SUBSCRIBE
+ * @param p_register expected SUBSCRIBE request
+ */
+ function f_awaitingSUBSCRIBE(
+ in template(present) SUBSCRIBE_Request p_subscribe := ?
+ ) runs on SipComponent {
+ var Request v_request;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt {
+ [] SIPP.receive(p_subscribe) -> value v_request sender vc_sent_label {
+ tc_wait.stop;
+ f_setHeadersOnReceiptOfSUBSCRIBE(v_request);
+ }
+ [] SIPP.receive(mw_SUBSCRIBE_Request_Base) -> value v_request sender vc_sent_label {
+ tc_wait.stop;
+ setverdict(fail);
+ f_setHeadersOnReceiptOfSUBSCRIBE(v_request);
+ // f_send200OK();
+ }
+ }
+ }
+
+ /**
+ * @desc function awaits REGISTER and sends a 200 OK response
+ * @param p_reply flag used to avoid the 200OK response sending
+ */
+ function f_awaitingREGISTER_sendReply(
+ in template(present) REGISTER_Request p_register := ?,
+ in boolean p_reply
+ ) runs on SipComponent {
+ var Request v_request;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt {
+ [] SIPP.receive(p_register) -> value v_request sender vc_sent_label {
+ tc_wait.stop;
+ vc_request := v_request;
+ f_setHeadersOnReceiptOfREGISTER(v_request);
+ // Answer to the Request
+ if (p_reply) {
+ f_send200OK();
+ }
+ }
+ [] tc_wait.timeout {
+ setverdict(fail);
+ f_componentStop();
+ }
+ }
+ }
+
+
+ /**
+ * @desc Function waiting for a 200 OK response
+ * @param p_cSeq_s current cSeq expectation
+ */
+ function f_awaitingOkResponse(
+ inout CSeq p_cSeq_s
+ ) runs on SipComponent {
+
+ tc_resp.start;
+ alt {
+ [] SIPP.receive(mw_Response_Base(c_statusLine200, vc_callId, p_cSeq_s)) -> value vc_response {
+ tc_resp.stop;
+ f_setHeadersOnReceiptOfResponse(vc_response);
+ setverdict(pass);
+ }
+ }
+ } // end awaitingOkResponse
+
+ /**
+ * @desc Function waiting for a response
+ * @param p_Response expected response message
+ */
+ function f_awaitingResponse(
+ in template(present) Response p_Response := ?
+ ) runs on SipComponent {
+ tc_resp.start;
+ a_awaitingResponse(p_Response);
+ } // end f_awaitingResponse
+
+ altstep a_awaitingResponse(
+ in template(present) Response p_Response := ?
+ ) runs on SipComponent {
+ [] SIPP.receive(p_Response) -> value vc_response {
+ tc_resp.stop;
+ f_setHeadersOnReceiptOfResponse(vc_response);
+ // setverdict(pass)
+ }
+ } // end f_awaitingResponse
+
+ /**
+ * @desc Function waiting for a response, repeat if 100 Trying is received
+ * @param p_Response expected response message
+ */
+ function f_awaitingResponseIgnore100Trying(
+ in template(present) Response p_Response := ?
+ ) runs on SipComponent {
+ tc_resp.start;
+ alt {
+ [] SIPP.receive(p_Response) -> value vc_response {
+ tc_resp.stop;
+ f_setHeadersOnReceiptOfResponse(vc_response);
+ // setverdict(pass)
+ }
+ [] SIPP.receive(mw_Response_Base(c_statusLine100, vc_callId, vc_cSeq)) -> value vc_response {
+ repeat;
+ }
+ }
+ } // end f_awaitingResponseIgnore100Trying
+
+ /**
+ * @desc Function waiting for a response and send ACK on FailureResponses 4xx,5xx,6xx
+ * @param p_Response expected response message
+ */
+ function f_awaitingResponseSendACK(
+ in template(present) Response p_Response := ?
+ ) runs on SipComponent {
+ tc_resp.start;
+ alt {
+ [] SIPP.receive(p_Response) -> value vc_response {
+ tc_resp.stop;
+ f_setHeadersOnReceiptOfResponse(vc_response);
+ LibSip_Steps.f_setHeadersACK();
+ f_SendACK(m_ACK_Request_Base(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_to, vc_via));
+ setverdict(pass);
+ }
+ }
+ } // end f_awaitingResponse
+
+ /**
+ * @desc Function waiting for a response
+ * @param p_Response expected response message
+ */
+ function f_awaitingResponsePassOnTimeout(
+ in template(present) Response p_Response := ?
+ ) runs on SipComponent {
+ tc_resp.start;
+ alt {
+ [] SIPP.receive(p_Response) -> value vc_response {
+ tc_resp.stop;
+ f_setHeadersOnReceiptOfResponse(vc_response);
+ vc_boo_response := true;
+ // setverdict(pass)
+ }
+ [] tc_resp.timeout {
+ vc_boo_response := false;
+ // setverdict (pass)
+ }
+ }
+ } // end f_awaitingResponsePassOnTimeout
+
+ /**
+ * @desc Function waiting for a 200 OK response
+ * @param p_cSeq_s current cSeq expectation
+ */
+ function f_awaitingOkResponseAndNOTIFY_sendReply(
+ inout CSeq p_cSeq_s,
+ in template(present) NOTIFY_Request p_MSG := ?
+ ) runs on SipComponent {
+
+ var boolean v_received_OK := false;
+ var boolean v_received_NOTIFY := false;
+ var NOTIFY_Request v_MSG;
+ tc_resp.start;
+ tc_wait.start(PX_SIP_TWAIT);
+
+ alt {
+ [] SIPP.receive(mw_Response_Base(c_statusLine200, vc_callId, p_cSeq_s)) -> value vc_response {
+ tc_resp.stop;
+ vc_subscribed := true;
+ f_setHeadersOnReceiptOfResponse(vc_response);
+ v_received_OK := true;
+ setverdict(pass);
+ if (not (v_received_NOTIFY)) {
+ repeat;
+ }
+ }
+ [] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label {
+ tc_wait.stop;
+ f_getRouteMapIntoRecordRoute(v_MSG);
+ f_setHeadersOnReceiptOfRequest(v_MSG);
+ // Answer to the NOTIFY
+ f_send200OK();
+ v_received_NOTIFY := true;
+ if (not (v_received_OK)) {
+ repeat;
+ }
+ }
+ }
+ } // end f_awaitingOkResponseAndNOTIFY_sendReply
+
+ /**
+ * @desc await INFO request reply with 200 OK
+ */
+ function f_awaitingINFO_sendReply(
+ in template(value) INFO_Request p_info
+ ) runs on SipComponent {
+ var INFO_Request v_request;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt {
+ [] SIPP.receive(p_info) -> value v_request sender vc_sent_label {
+ tc_wait.stop;
+ f_setHeadersOnReceiptOfRequest(v_request);
+ // Answer to the INFO
+ f_send200OK();
+ }
+ }
+ } // end of f_awaitingINFO_sendReply
+
+ /**
+ * @desc function awaiting for an incoming INVITE
+ * @param p_request expected message
+ */
+ function f_awaitingINVITE(
+ template(present) INVITE_Request p_request := ?
+ ) runs on SipComponent {
+ var INVITE_Request v_INVITE_Request;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt {
+ [] SIPP.receive(p_request) -> value v_INVITE_Request sender vc_sent_label {
+ tc_wait.stop;
+ vc_ignore_invite := true;
+ vc_first_recv := true; // communication has started
+ f_setHeadersOnReceiptOfINVITE(v_INVITE_Request);
+ SIPP.send(m_Response_Base(c_statusLine100, vc_callId, vc_cSeq, vc_from, vc_to, vc_via)) to vc_sent_label;
+ }
+ [vc_interface_isc] SIPP.receive(mw_INVITE_Request_Base) -> value v_INVITE_Request sender vc_sent_label {
+ tc_wait.stop;
+ setverdict(fail);
+ f_setHeadersOnReceiptOfINVITE(v_INVITE_Request);
+ SIPP.send(m_Response_Base(c_statusLine100, vc_callId, vc_cSeq, vc_from, vc_to, vc_via)) to vc_sent_label;
+ // clear session - send 486 and await ACK
+ f_sendResponse(m_Response_Base(c_statusLine486, vc_callId, vc_cSeq, vc_caller_From, vc_caller_To, vc_via));
+ f_awaitingACK(mw_ACK_Request_Base(?));
+ // await 486 which go towards and send ACK
+ f_awaitingResponse(mw_Response_Base(c_statusLine486, ?, ?));
+ f_SendACK(m_ACK_Request_Base(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_to, vc_via));
+ syncPort.send(m_syncClientStop);
+ stop;
+ }
+ }
+ } // end f_awaitingINVITE
+
+ /**
+ * @desc function awaiting for an incoming INVITE
+ * @param p_request expected message
+ */
+ function f_awaitingINVITE_No100Response(
+ template(present) INVITE_Request p_request := ?
+ ) runs on SipComponent {
+ var INVITE_Request v_INVITE_Request;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt {
+ [] SIPP.receive(p_request) -> value v_INVITE_Request sender vc_sent_label {
+ tc_wait.stop;
+ vc_ignore_invite := true;
+ vc_first_recv := true; // communication has started
+ f_setHeadersOnReceiptOfINVITE(v_INVITE_Request);
+ // SIPP.send(m_Response_Base(c_statusLine100, vc_callId, vc_cSeq, vc_from, vc_to, vc_via)) to vc_sent_label;
+ }
+ }
+ } // end f_awaitingInviteRequest
+
+ /**
+ * @desc function awaiting for an incoming INVITE
+ * @param p_request expected message
+ */
+ function f_awaitingINVITE_PassOnTimeout(
+ template(present) INVITE_Request p_request := ?
+ ) runs on SipComponent {
+ var INVITE_Request v_INVITE_Request;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt {
+ [] SIPP.receive(p_request) -> value v_INVITE_Request sender vc_sent_label {
+ tc_wait.stop;
+ vc_ignore_invite := true;
+ vc_first_recv := true; // communication has started
+ vc_boo_request := true;
+ f_setHeadersOnReceiptOfINVITE(v_INVITE_Request);
+ SIPP.send(m_Response_Base(c_statusLine100, vc_callId, vc_cSeq, vc_from, vc_to, vc_via)) to vc_sent_label;
+ }
+ [] tc_wait.timeout {
+ vc_boo_request := false;
+ }
+ }
+ } // end f_awaitingInviteRequest
+
+ /**
+ * @desc function awaiting ACK request
+ */
+ function f_awaitingACK(
+ in template(present) ACK_Request p_ACK := ?
+ ) runs on SipComponent {
+ f_awaitingACK_setHeaders(p_ACK, false);
+ } // end f_awaitingACK
+
+ /**
+ * @desc function awaiting ACK request
+ */
+ function f_awaitingACK_setHeaders(
+ in template(present) ACK_Request p_ACK := ?,
+ in boolean p_setHeaders
+ ) runs on SipComponent {
+ var Request v_ACK_Request;
+ tc_ack.start;
+
+ alt {
+ [] SIPP.receive(p_ACK) -> value v_ACK_Request {
+ tc_ack.stop;
+ if (p_setHeaders) {
+ f_setHeadersOnReceiptOfRequest(v_ACK_Request);
+ }
+ }
+ }
+ } // end f_awaitingACK_setHeaders
+
+ /**
+ * @desc function awaiting BYE and sending 200OK response
+ * @param p_BYE expected BYE
+ */
+ function f_awaitingBYE(
+ in template(present) BYE_Request p_BYE := ?
+ ) runs on SipComponent {
+ var BYE_Request v_BYE_Request;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt {
+ [] SIPP.receive(p_BYE) -> value v_BYE_Request sender vc_sent_label {
+ tc_wait.stop;
+ vc_ignore_bye := true;
+ f_setHeadersOnReceiptOfBYE(v_BYE_Request);
+ // f_send200OK();
+ }
+ }
+ } // end f_awaitingBYE
+
+ /**
+ * @desc function awaiting BYE and sending 200OK response
+ * @param p_BYE expected BYE
+ */
+ function f_awaitingBYE_sendReply(
+ in template(present) BYE_Request p_BYE := ?
+ ) runs on SipComponent {
+ var BYE_Request v_BYE_Request;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt {
+ [] SIPP.receive(p_BYE) -> value v_BYE_Request sender vc_sent_label {
+ tc_wait.stop;
+ vc_ignore_bye := true;
+ f_setHeadersOnReceiptOfBYE(v_BYE_Request);
+ f_send200OK();
+ }
+ }
+ } // end f_awaitingBYE_sendReply
+
+ /**
+ * @desc function awaiting BYE and sending 200OK response
+ * @param p_BYE expected BYE
+ */
+ function f_awaitingBYE_sendReply_PassOnTimeout(
+ in template(present) BYE_Request p_BYE := ?
+ ) runs on SipComponent {
+ var BYE_Request v_BYE_Request;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt {
+ [] SIPP.receive(p_BYE) -> value v_BYE_Request sender vc_sent_label {
+ tc_wait.stop;
+ vc_ignore_bye := true;
+ vc_boo_request := true;
+ f_setHeadersOnReceiptOfBYE(v_BYE_Request);
+ f_send200OK();
+ }
+ [] tc_wait.timeout {
+ vc_boo_request := false;
+ }
+ }
+ } // end f_awaitingBYE_sendReply_PassOnTimeout
+
+ /**
+ * @desc function awaiting CANCEL
+ * @param p_CANCEL expected CANCEL
+ */
+ function f_awaitingCANCEL(
+ in template(present) CANCEL_Request p_CANCEL := ?
+ ) runs on SipComponent {
+ var CANCEL_Request v_MSG;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt {
+ [] SIPP.receive(p_CANCEL) -> value v_MSG sender vc_sent_label {
+ tc_wait.stop;
+ f_setHeadersOnReceiptOfRequest(v_MSG);
+ }
+ }
+ } // end f_awaitingCANCEL
+ /**
+ * @desc await MESSAGE request
+ */
+ function f_awaitingMESSAGE(
+ in template(present) MESSAGE_Request p_MSG := ?
+ ) runs on SipComponent {
+ var MESSAGE_Request v_MSG;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt {
+ [] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label {
+ tc_wait.stop;
+ f_setHeadersOnReceiptOfRequest(v_MSG);
+ }
+ [] SIPP.receive(mw_MESSAGE_Request_Base) -> value v_MSG sender vc_sent_label {
+ tc_wait.stop;
+ f_setHeadersOnReceiptOfRequest(v_MSG);
+ log("*** " &__SCOPE__& ": INFO: Received MESSAGE not as expected! ***");
+ setverdict(fail);
+ }
+ }
+ } // end of f_awaitingMESSAGE
+
+ /**
+ * @desc await MESSAGE request reply with 200 OK
+ */
+ function f_awaitingMESSAGE_sendReply(
+ ) runs on SipComponent {
+ var MESSAGE_Request v_MSG;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt {
+ [] SIPP.receive(mw_MESSAGE_Request_Base) -> value v_MSG sender vc_sent_label {
+ tc_wait.stop;
+ f_setHeadersOnReceiptOfRequest(v_MSG);
+ // Answer to the MESSAGE
+ f_send200OK();
+ }
+ }
+ } // end of f_awaitingMESSAGE_sendReply
+
+ /**
+ * @desc await MESSAGE request
+ */
+ function f_awaitingMESSAGE_sendReply_PassOnTimeout(
+ in template(present) MESSAGE_Request p_MSG := ?
+ ) runs on SipComponent {
+ var MESSAGE_Request v_MSG;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt {
+ [] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label {
+ tc_wait.stop;
+ f_setHeadersOnReceiptOfRequest(v_MSG);
+ // Answer to the MESSAGE
+ // f_send200OK();
+ vc_boo_request := true;
+ f_send200OK();
+ // setverdict (pass);
+ }
+ [] tc_wait.timeout {
+ vc_boo_request := false;
+ // setverdict (pass);
+ }
+ }
+ } // end of f_awaitingMESSAGE_PassOnTimeout
+
+ /**
+ * @desc await NOTIFY request
+ */
+ function f_awaitingNOTIFY(
+ in template(present) NOTIFY_Request p_MSG := ?
+ ) runs on SipComponent {
+ var NOTIFY_Request v_MSG;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt {
+ [] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label {
+ tc_wait.stop;
+ f_getRouteMapIntoRecordRoute(v_MSG);
+ f_setHeadersOnReceiptOfRequest(v_MSG);
+ }
+ }
+ } // end of f_awaitingNOTIFY
+
+ /**
+ * @desc await NOTIFY request reply with 200 OK
+ */
+ function f_awaitingNOTIFY_sendReply(
+ in template(present) NOTIFY_Request p_MSG := ?
+ ) runs on SipComponent {
+ var NOTIFY_Request v_MSG;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt {
+ [] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label {
+ tc_wait.stop;
+ f_getRouteMapIntoRecordRoute(v_MSG);
+ f_setHeadersOnReceiptOfRequest(v_MSG);
+ // Answer to the NOTIFY
+ f_send200OK();
+ }
+ }
+ } // end of f_awaitingNOTIFY_sendReply
+
+ function f_awaitingNOTIFY_sendReply_postamble(
+ in template(present) NOTIFY_Request p_MSG := ?
+ ) runs on SipComponent {
+ var NOTIFY_Request v_MSG;
+
+ tc_wait.start(5.0);
+ alt {
+ [] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label {
+ tc_wait.stop;
+ f_getRouteMapIntoRecordRoute(v_MSG);
+ f_setHeadersOnReceiptOfRequest(v_MSG);
+ // Answer to the NOTIFY
+ f_send200OK();
+ }
+ [] tc_wait.timeout {
+ // do nothing as receiving the Notify in de-registration is not part of the test body
+ }
+ }
+ } // end of f_awaitingNOTIFY_sendReply_postamble
+
+ /**
+ * @desc await PRACK request reply with 200 OK
+ */
+ function f_awaitingPRACK_sendReply(
+ in template(present) PRACK_Request p_MSG := ?
+ ) runs on SipComponent {
+ var PRACK_Request v_MSG;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt {
+ [] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label {
+ tc_wait.stop;
+ f_setHeadersOnReceiptOfRequest(v_MSG);
+ // Answer to the PRACK
+ if (isvalue(vc_request.messageBody) and ischosen(vc_request.messageBody.sdpMessageBody)) {
+ f_sendResponse(m_Response_mbody(c_statusLine200, vc_callId, vc_cSeq, vc_caller_From, vc_caller_To, vc_via, omit, f_recordroute(), m_MBody_SDP(vc_sdp_local)));
+ }
+ else {
+ f_sendResponse(m_Response_ext(c_statusLine200, vc_callId, vc_cSeq, vc_caller_From, vc_caller_To, vc_via, omit, f_recordroute()));
+ }
+ }
+ }
+ } // end of f_awaitingPRACK_sendReply
+
+ function f_awaitingPRACK(
+ in template(present) PRACK_Request p_MSG := ?
+ ) runs on SipComponent {
+ var PRACK_Request v_MSG;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt {
+ [] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label {
+ tc_wait.stop;
+ f_setHeadersOnReceiptOfRequest(v_MSG);
+ }
+ }
+ } // end of f_awaitingPRACK
+
+ /**
+ * @desc await PUBLISH request reply with 200 OK
+ */
+ function f_awaitingPUBLISH_sendReply(
+ in template(present) PUBLISH_Request p_MSG := ?
+ ) runs on SipComponent {
+ var PUBLISH_Request v_MSG;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt {
+ [] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label {
+ tc_wait.stop;
+ f_setHeadersOnReceiptOfRequest(v_MSG);
+ // Answer to the PUBLISH
+ f_send200OK();
+ }
+ }
+ } // end of f_awaitingPUBLISH_sendReply
+
+ /**
+ * @desc await UPDATE request
+ */
+ function f_awaitingUPDATE(
+ in template(present) UPDATE_Request p_MSG := ?
+ ) runs on SipComponent {
+ var UPDATE_Request v_MSG;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt {
+ [] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label {
+ tc_wait.stop;
+ f_setHeadersOnReceiptOfRequest(v_MSG);
+ }
+ }
+ } // end of f_awaitingUPDATE
+
+ /**
+ * @desc await UPDATE request reply with 200 OK
+ */
+ function f_awaitingUPDATE_sendReply(
+ in template(present) UPDATE_Request p_MSG := ?
+ ) runs on SipComponent {
+ var UPDATE_Request v_MSG;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt {
+ [] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label {
+ tc_wait.stop;
+ f_setHeadersOnReceiptOfRequest(v_MSG);
+ // Answer to the UPDATE
+ if (isvalue(vc_request.messageBody) and ischosen(vc_request.messageBody.sdpMessageBody)) {
+ f_sendResponse(m_Response_mbody(c_statusLine200, vc_callId, vc_cSeq, vc_caller_From, vc_caller_To, vc_via, omit, f_recordroute(), m_MBody_SDP(vc_sdp_local)));
+ }
+ else {
+ f_sendResponse(m_Response_ext(c_statusLine200, vc_callId, vc_cSeq, vc_caller_From, vc_caller_To, vc_via, omit, f_recordroute()));
+ }
+ }
+ }
+ } // end of f_awaitingUPDATE_sendReply
+
+
+ /**
+ * @desc await REFER request
+ */
+ function f_awaitingREFER(
+ in template(present) REFER_Request p_MSG := ?
+ ) runs on SipComponent {
+ var REFER_Request v_MSG;
+
+ tc_wait.start(PX_SIP_TWAIT);
+ alt {
+ [] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label {
+ tc_wait.stop;
+ f_setHeadersOnReceiptOfREFER(v_MSG);
+ }
+ }
+ } // end of f_awaitingUPDATE
+
+
+
+ } // end AwaitingMessage
+
+ group SendMessage {
+
+ /**
+ * @desc send ACK message, update the route and recordRoute header fields depending on boolean flags
+ * @param p_request template of the message to be sent
+ */
+ function f_SendACK(
+ template(value) ACK_Request p_request
+ ) runs on SipComponent {
+ // p_request.msgHeader.route := f_route(); // update the route header field depending on vc_boo_route
+ // n/a p_request.msgHeader.recordRoute := f_recordroute(); // update the route header field depending on vc_boo_route
+ SIPP.send(p_request) to vc_sent_label;
+ }
+
+ /**
+ * @desc send BYE message, update the route and recordRoute header fields depending on boolean flags
+ * @param p_request template of the message to be sent
+ */
+ function f_SendBYE(
+ template(value) BYE_Request p_request
+ ) runs on SipComponent {
+ SIPP.send(p_request) to vc_sent_label;
+ }
+
+ /**
+ * @desc send CANCEL message
+ * @param p_request template of the message to be sent
+ */
+ function f_SendCANCEL(
+ template(value) CANCEL_Request p_request
+ ) runs on SipComponent {
+ SIPP.send(p_request) to vc_sent_label;
+ }
+
+ /**
+ * @desc send INFO message
+ * @param p_request template of the message to be sent
+ */
+ function f_SendINFO(
+ template(value) INFO_Request p_request
+ ) runs on SipComponent {
+ f_setHeadersGeneral(vc_cSeq, "INFO"); // cseq, contact, branch, via
+ SIPP.send(p_request) to vc_sent_label;
+ }
+
+ /**
+ * @desc send INVITE message
+ * @param p_request template of the message to be sent
+ */
+ function f_SendINVITE(
+ template(value) INVITE_Request p_request
+ ) runs on SipComponent {
+ vc_requestFor407 := valueof(p_request);
+ SIPP.send(p_request) to vc_sent_label;
+ vc_request := vc_requestFor407;
+ if (PX_SIP_INVITE_AUTHENTICATION_ENABLED) {
+ a_altstep_401or407();
+ }
+ }
+
+ /**
+ * @desc send PRACK message
+ * @param p_request template of the message to be sent
+ */
+ function f_SendPRACK(
+ ) runs on SipComponent {
+ var integer responseNum := 1;
+ var PRACK_Request prackReq;
+ if (isvalue(vc_response.msgHeader.rSeq) and
+ isvalue(vc_response.msgHeader.rSeq.responseNum)){
+ responseNum := vc_response.msgHeader.rSeq.responseNum;
+ }
+ vc_rAck := valueof(m_RAck(vc_response.msgHeader.rSeq.responseNum, vc_cSeq.seqNumber, vc_cSeq.method));
+ f_setHeadersGeneral(vc_cSeq, "PRACK"); // cseq, contact, branch, via
+ prackReq := m_PRACK_Request_Base(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_to, vc_via, vc_rAck);
+ if (isvalue(vc_response.msgHeader.recordRoute)){
+ prackReq.msgHeader.route := f_route();
+ }
+ SIPP.send(prackReq) to vc_sent_label;
+ }
+
+ /**
+ * @desc send PUBLISH message
+ * @param p_request template of the message to be sent
+ */
+ function f_SendPUBLISH(
+ template(value) PUBLISH_Request p_request
+ ) runs on SipComponent {
+ SIPP.send(p_request) to vc_sent_label;
+ }
+
+ /**
+ * @desc send REGISTER message
+ * @param p_request template of the message to be sent
+ */
+ function f_SendREGISTER(
+ template(value) REGISTER_Request p_request
+ ) runs on SipComponent {
+ SIPP.send(p_request) to vc_sent_label;
+ }
+
+ /**
+ * @desc send SUBSCRIBE message
+ * @param p_request template of the message to be sent
+ */
+ function f_SendSUBSCRIBE(
+ template(value) SUBSCRIBE_Request p_request
+ ) runs on SipComponent {
+ SIPP.send(p_request) to vc_sent_label;
+ }
+
+ /**
+ * @desc send UPDATE message
+ * @param p_request template of the message to be sent
+ */
+ function f_SendUPDATE(
+ template(value) UPDATE_Request p_request
+ ) runs on SipComponent {
+ f_setHeadersGeneral(vc_cSeq, "UPDATE"); // cseq, contact, branch, via
+ p_request.msgHeader.cSeq := vc_cSeq;
+ p_request.msgHeader.contact := vc_contact;
+ p_request.msgHeader.via := vc_via;
+ vc_requestFor407 := valueof(p_request);
+ SIPP.send(p_request) to vc_sent_label;
+ if (PX_SIP_INVITE_AUTHENTICATION_ENABLED) {
+ a_altstep_401or407();
+ }
+ }
+
+ /**
+ * @desc function send MESSAGE message
+ * @param p_request template of the message to be sent
+ */
+ function f_SendMESSAGE(
+ template(value) MESSAGE_Request p_request
+ ) runs on SipComponent {
+ SIPP.send(p_request) to vc_sent_label;
+ }
+
+ /**
+ * @desc function send NOTIFY message
+ * @param p_request template of the notify to be sent
+ */
+ function f_SendNOTIFY(
+ template(value) NOTIFY_Request p_request
+ ) runs on SipComponent {
+ SIPP.send(p_request) to vc_sent_label;
+ }
+
+ /**
+ * @desc send REFER message
+ * @param p_request template of the message to be sent
+ */
+ function f_SendREFER(
+ template(value) REFER_Request p_request
+ ) runs on SipComponent {
+ SIPP.send(p_request) to vc_sent_label;
+ }
+
+ /**
+ * @desc send 200 OK
+ */
+ function f_send200OK(
+ ) runs on SipComponent {
+ f_sendResponse(m_Response_Base(c_statusLine200, vc_callId, vc_cSeq, vc_caller_From, vc_caller_To, vc_via));
+ }
+
+ /**
+ * @desc send response
+ * @param p_request template of the message to be sent
+ */
+ function f_sendResponse(
+ template(value) Response p_response
+ ) runs on SipComponent {
+ p_response.msgHeader.route := f_route(); // update the route header field depending on vc_boo_route
+ p_response.msgHeader.recordRoute := f_recordroute(); // update the route header field depending on vc_boo_route
+ SIPP.send(p_response) to vc_sent_label;
+ }
+
+
+
+ } // end SendMessage
+
+ group GlobalSteps {
+ /**
+ * @desc component initialization
+ * @param p_cSeq_s cSeq value to be assigned to the component variable
+ */
+ function f_init_component(
+ inout CSeq p_cSeq_s
+ ) runs on SipComponent {
+ // Variables
+ vc_cSeq := p_cSeq_s;
+
+ // Defaults
+ vc_def_catchSyncStop := activate(a_Sip_catchSyncStop());
+ vc_default := activate(a_clearRegistration());
+ }
+
+ /**
+ * @desc component termination
+ */
+ function f_terminate_component(
+ ) runs on SipComponent {
+ log("*** " &__SCOPE__& ": INFO: component terminated - forced! ***");
+ deactivate;
+ stop;
+ }
+
+ /**
+ * @desc component termination
+ */
+ function f_componentStop(
+ ) runs on SipComponent {
+ syncPort.send(m_syncClientStop);
+ SIPP.clear;
+ stop;
+ }
+
+ /**
+ * @desc function waits for particular time that allows the SUT to return to idle state
+ */
+ function f_awaitSUTidle(
+ ) runs on SipComponent {
+ vc_ignore4xx := true; // allow 4xx in default
+ tc_noAct.start;
+ alt {
+ [] tc_noAct.timeout {
+ }
+ }
+ }
+
+ /**
+ * @desc function waits for particular time before next expected message
+ */
+ function f_wait(
+ float p_time
+ ) runs on SipComponent {
+ tc_noAct.start(p_time);
+ alt {
+ [] tc_noAct.timeout {
+ }
+ }
+ }
+
+ /**
+ * @desc function cause termination of a PTC
+ * @param p_syncPoint dummy parameter (copied from the common lib)
+ */
+ function f_check2Null(
+ in charstring p_syncPoint
+ ) runs on SipComponent {
+ // != pass does not work, because in case of "none" execution shall continue
+ if (getverdict == inconc or getverdict == fail) {
+ log("*** f_check2Null: INFO: Verdict evaluated to fail or inconc. Stopping test execution now ***");
+ f_selfOrClientSyncAndVerdict(p_syncPoint, e_error);
+ } // end if
+ }
+
+ /*
+ *
+ * @desc original copied from older LibCommon_VerdictControl
+ */
+ function f_getVerdict(
+ ) return FncRetCode {
+ var FncRetCode v_ret := e_error;
+ if (getverdict == pass or getverdict == none) {
+ v_ret := e_success;
+ }
+ return v_ret;
+ }
+
+
+
+ } // end group GlobalSteps
+
+ group Registration {
+
+ /**
+ * @desc registration and authentication with MD5
+ * @param p_cSeq_s cseq parameter
+ * @param p_register register template
+ * @param p_auth flag indicating if authentication is needed
+ * @param p_emergency Set to true in case of emergency call
+ */
+ function f_Registration(
+ inout CSeq p_cSeq_s,
+ out template(value) REGISTER_Request p_register,
+ in boolean p_auth,
+ in boolean p_emergency := false
+ ) runs on SipComponent {
+ if (PX_SIP_REGISTRATION) {
+ f_setHeaders_REGISTER(p_cSeq_s, p_emergency);
+ p_register := m_REGISTER_Request_Base(vc_requestUri, vc_callId, p_cSeq_s, vc_from, vc_to, vc_via_REG, vc_contact, vc_authorization);
+ f_SendREGISTER(p_register); // LibSip
+ // awaiting of 401 and sending 2nd REGISTER and awaiting 200 OK REGISTER
+ if (p_auth) {
+ // receiving 401 Unauthorized response.
+ // and Re-send REGISTER request with Authorization header
+ tc_resp.start;
+ alt {
+ [] SIPP.receive(mw_Response_Base(c_statusLine401, vc_callId, p_cSeq_s)) -> value vc_response {
+ tc_resp.stop;
+ f_setHeadersOnReceiptOfResponse(vc_response);
+ // set headers via, cseq and authorization
+ f_setHeaders_2ndREGISTER(p_cSeq_s);
+ p_register := m_REGISTER_Request_Base(vc_requestUri, vc_callId, p_cSeq_s, vc_from, vc_to, vc_via_REG, vc_contact, vc_authorization);
+ // Re-send protected REGISTER
+ f_SendREGISTER(p_register); // LibSip
+ // awaiting 200 OK REGISTER
+ f_awaitingOkResponse(p_cSeq_s);
+ f_getServiceRouteMapIntoRouteInRegistration(vc_response);
+ }
+ [] SIPP.receive(mw_Response_Base(c_statusLine200, vc_callId, p_cSeq_s)) -> value vc_response {
+ tc_resp.stop;
+ f_setHeadersOnReceiptOfResponse(vc_response);
+ f_getServiceRouteMapIntoRouteInRegistration(vc_response);
+ log("*** " &__SCOPE__& ": INFO: Authorization was not requested as expected ***");
+ }
+ }
+ }
+ else {
+ f_awaitingOkResponse(p_cSeq_s);
+ f_getServiceRouteMapIntoRouteInRegistration(vc_response);
+ }
+ }
+ } // end function f_Registration
+
+ /**
+ * @desc registration and authentication with MD5
+ * @param p_cSeq_s cseq parameter
+ * @param p_register register template
+ * @param p_auth flag indicating if authentication is needed
+ */
+ function f_Registration_withTemplate(
+ inout CSeq p_cSeq_s,
+ inout template(value) REGISTER_Request p_register,
+ in boolean p_auth
+ ) runs on SipComponent {
+ if (PX_SIP_REGISTRATION) {
+ if(not isbound(p_register)){
+ f_setHeaders_REGISTER(p_cSeq_s);
+ p_register := m_REGISTER_Request_Base(vc_requestUri, vc_callId, p_cSeq_s, vc_from, vc_to, vc_via_REG, vc_contact, vc_authorization);
+ }
+ f_SendREGISTER(p_register); // LibSip
+ // awaiting of 401 and sending 2nd REGISTER and awaiting 200 OK REGISTER
+ if (p_auth) {
+ // receiving 401 Unauthorized response.
+ // and Re-send REGISTER request with Authorization header
+ tc_resp.start;
+ alt {
+ [] SIPP.receive(mw_Response_Base(c_statusLine401, vc_callId, p_cSeq_s)) -> value vc_response {
+ tc_resp.stop;
+ f_setHeadersOnReceiptOfResponse(vc_response);
+ // set headers via, cseq and authorization
+ f_setHeaders_2ndREGISTER(p_cSeq_s);
+ // p_register := m_REGISTER_Request_Base(vc_requestUri, vc_callId, p_cSeq_s, vc_from, vc_to, vc_via_REG, vc_contact,
+ // vc_authorization);
+ // Re-send protected REGISTER
+ p_register.requestLine.requestUri := vc_requestUri;
+ p_register.msgHeader.cSeq := vc_cSeq;
+ p_register.msgHeader.via := vc_via_REG;
+ p_register.msgHeader.authorization := vc_authorization;
+ f_SendREGISTER(p_register); // LibSip
+ // awaiting 200 OK REGISTER
+ f_awaitingOkResponse(p_cSeq_s);
+ f_getServiceRouteMapIntoRouteInRegistration(vc_response);
+ }
+ [] SIPP.receive(mw_Response_Base(c_statusLine200, vc_callId, p_cSeq_s)) -> value vc_response {
+ tc_resp.stop;
+ f_setHeadersOnReceiptOfResponse(vc_response);
+ f_getServiceRouteMapIntoRouteInRegistration(vc_response);
+ log("*** " &__SCOPE__& ": INFO: Authorization was not requested as expected ***");
+ }
+ }
+ }
+ else {
+ f_awaitingOkResponse(p_cSeq_s);
+ f_getServiceRouteMapIntoRouteInRegistration(vc_response);
+ }
+ }
+ } // end function f_Registration_withTemplate
+
+
+ /**
+ * @desc remove registration
+ * @param p_cSeq_s cseq parameter
+ */
+ function f_RemoveRegistration(
+ inout CSeq p_cSeq
+ ) runs on SipComponent {
+ var template(value) REGISTER_Request v_request;
+ var boolean v_receivedNotify := false;
+
+ //
+ if (vc_DeregDone) {
+ f_componentStop();
+ }
+ else {
+ vc_DeregDone := true;
+ }
+
+ if (PX_SIP_REGISTRATION) {
+ f_setHeaders_deREGISTER(p_cSeq);
+ v_request := m_REGISTER_Request_expires(vc_requestUri, vc_callIdReg, p_cSeq, vc_from, vc_to, vc_via_REG, vc_contact, vc_authorization, "0");
+
+ f_SendREGISTER(v_request);
+ if (PX_SIP_REGISTER_AUTHENTICATION_ENABLED) {
+ // receiving 401 Unauthorized response.
+ // and Re-send REGISTER request with Authorization header
+ tc_resp.start;
+ alt {
+ [] SIPP.receive(mw_Response_Base(c_statusLine401, vc_callIdReg, p_cSeq)) -> value vc_response {
+ tc_resp.stop;
+ f_setHeadersOnReceiptOfResponse(vc_response);
+ // set headers via, cseq and authorization
+ f_setHeaders_2ndREGISTER(p_cSeq);
+ v_request := m_REGISTER_Request_expires(vc_requestUri, vc_callIdReg, p_cSeq, vc_from, vc_to, vc_via_REG, vc_contact, vc_authorization, "0");
+ // v_request.msgHeader.route := f_route();
+ // Re-send protected REGISTER
+ f_SendREGISTER(v_request); // LibSip
+ // awaiting 200 OK REGISTER
+ f_awaitingResponse(mw_Response_Base(c_statusLine200, vc_callIdReg, p_cSeq));
+ }
+ [] SIPP.receive(mw_Response_Base(c_statusLine200, vc_callIdReg, p_cSeq)) -> value vc_response {
+ tc_resp.stop;
+ f_setHeadersOnReceiptOfResponse(vc_response);
+ // log ("Authorization was not requested as expected");
+ }
+ [] a_awaitNotify(mw_NOTIFY_Request_Base(vc_callIdSub), v_receivedNotify) {
+ }
+ }
+ }
+ else {
+ tc_resp.start;
+ alt {
+ [] a_awaitingResponse(mw_Response_Base(c_statusLine200, vc_callIdReg, p_cSeq)) {
+ }
+ [] a_awaitNotify(mw_NOTIFY_Request_Base(vc_callIdSub), v_receivedNotify) {
+ }
+ }
+ }
+
+ // await NOTIFY and send reply 200 OK
+ if (vc_subscribed and v_receivedNotify == false) {
+ f_awaitingNOTIFY_sendReply_postamble(mw_NOTIFY_Request_Base(vc_callIdReg));
+ }
+ }
+ } // end f_RemoveRegistration
+
+ /**
+ * @desc remove registration without authorization
+ * @param p_cSeq_s cseq parameter
+ */
+ function f_RemoveRegistration_wo_authorization(
+ inout CSeq p_cSeq
+ ) runs on SipComponent {
+ if (PX_SIP_REGISTRATION) {
+ f_setHeaders_deREGISTER(p_cSeq);
+ f_SendREGISTER(m_REGISTER_Request_expires(vc_requestUri, vc_callIdReg, p_cSeq, vc_from, vc_to, vc_via, vc_contact, vc_authorization, "0"));
+ f_awaitingResponse(mw_Response_Base(c_statusLine200, vc_callIdReg, p_cSeq));
+ }
+ } // end f_RemoveRegistration_wo_authorization
+
+
+
+ } // end group Registration
+
+ group Subscription {
+
+ /**
+ * @desc UE send subscrbe, await on 200 OK, await notify and send 200 OK
+ * @param p_cSeq_s cseq parameter
+ * @param p_subscribe subscribe template
+ */
+ function f_Subscription(
+ inout CSeq p_cSeq_s,
+ template(value) SUBSCRIBE_Request p_subscribe
+ ) runs on SipComponent {
+ // send SUBSCRIBE
+ f_SendSUBSCRIBE(p_subscribe);
+ // awaiting 200 OK SUBSCRIBE
+ // await NOTIFY and send reply 200 OK
+ f_awaitingOkResponseAndNOTIFY_sendReply(p_cSeq_s, mw_NOTIFY_Request_Base(vc_callId));
+ } // end function f_Subscription
+
+ /**
+ * @desc UE send subscrbe, await on 200 OK, await notify and send 200 OK
+ * @param p_cSeq_s cseq parameter
+ * @param p_subscribe subscribe template
+ * @param p_notify notify template
+ */
+ function f_SubscriptionWithNotification(
+ inout CSeq p_cSeq_s,
+ template(value) SUBSCRIBE_Request p_subscribe,
+ template(present) NOTIFY_Request p_notify := ?
+ ) runs on SipComponent {
+ f_setHeaders_SUBSCRIBE(p_cSeq_s);
+ // send SUBSCRIBE
+ f_SendSUBSCRIBE(p_subscribe);
+ // awaiting 200 OK SUBSCRIBE
+ // await NOTIFY and send reply 200 OK
+ f_awaitingOkResponseAndNOTIFY_sendReply(p_cSeq_s, p_notify);
+ } // end function f_SubscriptionWithNotification
+
+ /**
+ * @desc UE await subscrbe, send on 200 OK; possibility to handle also other SUBSCRIBE methods where event is different than reg
+ * @param p_cSeq_s cseq parameter
+ * @param p_subscribe subscribe template
+ */
+ function f_awaitingSubscription(
+ template(present) SUBSCRIBE_Request p_subscribe := ?
+ ) runs on SipComponent {
+ var Request v_request;
+
+ tc_wait.start(2.0); // awaiting of all SUBSCRIBES
+ alt {
+ [] SIPP.receive(p_subscribe) -> value v_request sender vc_sent_label {
+ f_setHeadersOnReceiptOfSUBSCRIBE(v_request);
+ f_send200OK();
+ repeat;
+ }
+ [] SIPP.receive(mw_SUBSCRIBE_Request_Base) -> value v_request sender vc_sent_label {
+ f_setHeadersOnReceiptOfSUBSCRIBE(v_request);
+ f_send200OK();
+ repeat;
+ }
+ [] tc_wait.timeout {
+ setverdict(pass);
+ }
+ }
+ } // end function f_awaitingSubscription
+
+
+
+ } // end group Subscription
+
+ group Preambles {
+
+ /**
+ * @desc Set variables and default initialization for user profile
+ * @param p_userprofile user profile of call
+ * @param p_cSeq_s cseq parameter
+ */
+ function f_SIP_preamble_woREG(
+ inout CSeq p_cSeq_s
+ ) runs on SipComponent {
+ // varables and altsteps
+ f_init_component(p_cSeq_s);
+
+ // Preamble
+ //NOTE STF471: removed f_init_userprofile(p_userprofile); // assignment of PIXIT values to component variable
+ vc_sdp_local := valueof(m_SDP_bandwidth(m_media_dynPT(PX_SIP_SDP_DYN, PX_SIP_SDP_ENCODING, PX_SIP_SDP_CLOCKRATE, omit), vc_userprofile));
+ }
+
+ /**
+ * @desc Set variables and default initialization for user profile and handle registration and authentication with MD5
+ * @param p_userprofile user profile of call
+ * @param p_cSeq_s cseq parameter
+ * @param p_register register template
+ */
+ function f_SIP_preamble_withREG(
+ inout CSeq p_cSeq_s,
+ template(value) REGISTER_Request p_register
+ ) runs on SipComponent {
+ // preamble
+ f_SIP_preamble_woREG(p_cSeq_s);
+
+ // Registration, Awaiting
+ f_Registration(p_cSeq_s, p_register, PX_SIP_REGISTER_AUTHENTICATION_ENABLED);
+ }
+
+
+
+ } // end group Preambles
+
+ group Postambles {
+
+ /**
+ * @desc function send BYE and awaits reponse
+ * @param p_CallId parameter for outgoing BYE
+ * @param p_cSeq parameter for outgoing BYE
+ * @param p_from parameter for outgoing BYE
+ * @param p_to parameter for outgoing BYE
+ * @param p_reqHostPort parameter for outgoing BYE
+ * @param p_byeCause parameter for Release cause to be used
+ * in BYE and in Failure messages, former PX_SIP_BYE_CAUSE
+ */
+ function f_terminateCall(
+ SipUrl p_requestUri,
+ CallId p_CallId,
+ inout CSeq p_cSeq,
+ From p_from,
+ template(value) To p_to,
+ integer p_byeCause
+ ) runs on SipComponent {
+ // Sending of a BYE request to release the call and expect a final response
+ f_SendBYE(m_BYE_Request_cause(p_requestUri, p_CallId, p_cSeq, p_from, p_to, vc_via, p_byeCause));
+
+ tc_resp.start;
+ alt {
+ [] SIPP.receive(mw_Response_Base(mw_statusLine1xx, p_CallId, p_cSeq)) {
+ repeat;
+ }
+ [] SIPP.receive(mw_Response_Base(mw_statusLineFinal, p_CallId, p_cSeq)) {
+ tc_resp.stop;
+ }
+ }
+ } // end function f_terminateCall
+
+ function f_cancelCall(
+ template(value) CANCEL_Request p_request
+ ) runs on SipComponent {
+ // This function is called to bring back the IUT in idle condition
+ // in case of errors or unexpected behaviour.
+ // Sending of a CANCEL request with the same Cseq
+ f_setHeadersCANCEL(vc_cSeq);
+ f_SendCANCEL(p_request);
+ tc_resp.start;
+ alt {
+ [] SIPP.receive(mw_Response_Base(c_statusLine200, vc_callId, vc_cSeq)) {
+ tc_resp.stop;
+ }
+ }
+ }
+
+ function f_cancelCall_await487(
+ template(value) CANCEL_Request p_request
+ ) runs on SipComponent {
+ // This function is called to bring back the IUT in idle condition
+ // in case of errors or unexpected behaviour.
+ // Sending of a CANCEL request with the same Cseq
+ f_cancelCall(p_request);
+ // set method on INVITE
+ vc_cSeq.method := "INVITE";
+
+ // await on 487 response and send ACK
+ f_awaitingResponse(mw_Response_Base(c_statusLine487, vc_callId, vc_cSeq));
+ f_SendACK(m_ACK_Request_Base(vc_requestUri, vc_callId, vc_cSeq, vc_from, vc_to, vc_via));
+ }
+
+ function f_awaitCancelCall_send487(
+ template(present) CANCEL_Request p_request := ?
+ ) runs on SipComponent {
+ f_awaitingCANCEL(p_request);
+ f_sendResponse(m_Response_Base(c_statusLine200, vc_callId, vc_cSeq, vc_caller_From, vc_caller_To, vc_via));
+
+ // set method on INVITE
+ vc_cSeq.method := "INVITE";
+
+ // send 487 response and await ACK
+ f_sendResponse(m_Response_Base(c_statusLine487, vc_callId, vc_cSeq, vc_caller_From, vc_caller_To, vc_via));
+ // await ACK
+ f_awaitingACK(mw_ACK_Request_Base(vc_callId));
+ }
+
+ altstep a_receiveCANCELorNothing(
+ in template(present) CANCEL_Request p_CANCEL := ?
+ ) runs on SipComponent {
+ var CANCEL_Request v_MSG;
+ [] SIPP.receive(p_CANCEL) -> value v_MSG sender vc_sent_label {
+ f_setHeadersOnReceiptOfRequest(v_MSG);
+ // Answer to the CANCEL
+ f_send200OK();
+ }
+ }
+
+ altstep a_awaitNotify(
+ in template(present) NOTIFY_Request p_MSG := ?,
+ inout boolean p_receivedNotify
+ ) runs on SipComponent {
+ var NOTIFY_Request v_MSG;
+ [vc_subscribed] SIPP.receive(p_MSG) -> value v_MSG sender vc_sent_label {
+ p_r