/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 |