<?xml version="1.0" encoding="UTF-8" standalone="no" ?> | |
<n1:Project xmlns:n1="http://www.conformiq.com/EMF/SimpleStatechart" xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> | |
<statemachine name="SIPClient"> | |
<transitions body="userIn:UserInput
[msg.input1=="invite" && msg.input2==dst]
/
Invite();" from="//@statemachine.0/@states.0" to="//@statemachine.0/@states.1"/> | |
<transitions body="netIn:SIPResp[msg.status==180]/
require true;" from="//@statemachine.0/@states.1" to="//@statemachine.0/@states.12"/> | |
<transitions body="netIn:SIPResp
[msg.status==200 &&
 msg.cseq == "INVITE"]
/Ack();
requirement "Acknowledge established call with ACK";" from="//@statemachine.0/@states.12" to="//@statemachine.0/@states.2"/> | |
<transitions body="after(timeoutB)/
requirement "17.1.1.2 INVITE timers/Terminates INVITE cycle after B timeout";
TimeOut();" from="//@statemachine.0/@states.1" to="//@statemachine.0/@states.5"/> | |
<transitions body="userIn:UserInput
[msg.input1=="bye"]/" from="//@statemachine.0/@states.2" to="//@statemachine.0/@states.3"/> | |
<transitions body="netIn:SIPResp
[msg.status==200]/
requirement "Terminating/Wait for OK in response to BYE";" from="//@statemachine.0/@states.3" to="//@statemachine.0/@states.10"/> | |
<transitions body="netIn:SIPReq
[msg.op=="BYE" &&
 msg.param==src]
/SendOK("BYE");
requirement "Terminating/Send OK in response to BYE";" from="//@statemachine.0/@states.2" to="//@statemachine.0/@states.8"/> | |
<transitions body="netIn:SIPResp
[msg.status==486 &&
 msg.cseq == "INVITE"]
/Ack();" from="//@statemachine.0/@states.12" to="//@statemachine.0/@states.11"/> | |
<transitions body="netIn:SIPResp
[msg.status==487 &&
msg.cseq=="INVITE"]/
Ack();" from="//@statemachine.0/@states.13" to="//@statemachine.0/@states.9"/> | |
<transitions body="/ setThreadName("SIP UAC");" from="//@statemachine.0/@states.4" to="//@statemachine.0/@states.0"/> | |
<transitions body="netIn:SIPResp
[msg.status==200 &&
msg.cseq=="CANCEL"]/" from="//@statemachine.0/@states.6" to="//@statemachine.0/@states.13"/> | |
<transitions body="after(timeoutF)/
requirement "17.1.2.2 Non-INVITE timers/Terminates BYE cycle after F timeout";
TimeOut();" from="//@statemachine.0/@states.3" to="//@statemachine.0/@states.5"/> | |
<transitions body="userIn:UserInput
[msg.input1=="cancel"]/" from="//@statemachine.0/@states.12" to="//@statemachine.0/@states.6"/> | |
<transitions body="after(timeoutF)/
requirement "17.1.2.2 Non-INVITE timers/Terminates CANCEL cycle after F timeout";
TimeOut();" from="//@statemachine.0/@states.6" to="//@statemachine.0/@states.7"/> | |
<states internal="" name="Init" xsi:type="n1:BasicState"/> | |
<states internal="" name="Calling" xsi:type="n1:BasicState"> | |
<transitions body="after(timeoutA)/
Invite();
timeoutA = timeoutA * 2.0;
requirement "17.1.1.2 INVITE timers/Resends INVITE after A timeout";" from="//@statemachine.0/@states.1/@states.1" to="//@statemachine.0/@states.1/@states.2"/> | |
<transitions body="" from="//@statemachine.0/@states.1/@states.2" to="//@statemachine.0/@states.1/@states.1"/> | |
<transitions body="/timeoutA = T1;" from="//@statemachine.0/@states.1/@states.0" to="//@statemachine.0/@states.1/@states.1"/> | |
<states xsi:type="n1:InitialState"/> | |
<states internal="" name="Wait" xsi:type="n1:BasicState"/> | |
<states xsi:type="n1:Junction"/> | |
</states> | |
<states internal="" name="Ready" xsi:type="n1:BasicState"/> | |
<states internal="" name="Terminating" xsi:type="n1:BasicState"> | |
<transitions body="/Bye();
timeoutE = T1;" from="//@statemachine.0/@states.3/@states.0" to="//@statemachine.0/@states.3/@states.1"/> | |
<transitions body="after(timeoutE)/
Bye();
timeoutE = timeoutE * 2.0;
requirement "17.1.2.2 Non-INVITE timers/Resends BYE after E timeout";" from="//@statemachine.0/@states.3/@states.1" to="//@statemachine.0/@states.3/@states.2"/> | |
<transitions body="" from="//@statemachine.0/@states.3/@states.2" to="//@statemachine.0/@states.3/@states.1"/> | |
<states xsi:type="n1:InitialState"/> | |
<states internal="" name="Wait" xsi:type="n1:BasicState"/> | |
<states xsi:type="n1:Junction"/> | |
</states> | |
<states xsi:type="n1:InitialState"/> | |
<states xsi:type="n1:FinalState"/> | |
<states internal="" name="Canceling" xsi:type="n1:BasicState"> | |
<transitions body="/Cancel();
timeoutE = T1;" from="//@statemachine.0/@states.6/@states.0" to="//@statemachine.0/@states.6/@states.1"/> | |
<transitions body="after(timeoutE)/
Cancel();
timeoutE = timeoutE * 2.0;
requirement "17.1.2.2 Non-INVITE timers/Resends CANCEL after E timeout";" from="//@statemachine.0/@states.6/@states.1" to="//@statemachine.0/@states.6/@states.2"/> | |
<transitions body="" from="//@statemachine.0/@states.6/@states.2" to="//@statemachine.0/@states.6/@states.1"/> | |
<states xsi:type="n1:InitialState"/> | |
<states internal="" name="Wait" xsi:type="n1:BasicState"/> | |
<states xsi:type="n1:Junction"/> | |
</states> | |
<states xsi:type="n1:FinalState"/> | |
<states xsi:type="n1:FinalState"/> | |
<states xsi:type="n1:FinalState"/> | |
<states xsi:type="n1:FinalState"/> | |
<states xsi:type="n1:FinalState"/> | |
<states internal="" name="Ringing" xsi:type="n1:BasicState"/> | |
<states internal="" name="Waiting Response" xsi:type="n1:BasicState"/> | |
</statemachine> | |
<diagrams statemachine="//@statemachine.0"> | |
<items height="50" state="//@statemachine.0/@states.0" width="100" xsi:type="n1:DiagramBasicState"> | |
<location x="-600" y="-300"/> | |
</items> | |
<items height="50" state="//@statemachine.0/@states.1" width="100" xsi:type="n1:DiagramBasicState"> | |
<location x="-600" y="-100"/> | |
</items> | |
<items height="100" state="//@statemachine.0/@states.2" width="200" xsi:type="n1:DiagramBasicState"> | |
<location x="100" y="150"/> | |
</items> | |
<items height="100" state="//@statemachine.0/@states.3" width="150" xsi:type="n1:DiagramBasicState"> | |
<location x="-250" y="250"/> | |
</items> | |
<items autolayout="true" transition="//@statemachine.0/@transitions.0" xsi:type="n1:DiagramTransition"> | |
<bodylocation align="0" valign="0.5" x="-540" y="-175"/> | |
<route x="-550" y="-250"/> | |
<route x="-550" y="-100"/> | |
</items> | |
<items autolayout="true" transition="//@statemachine.0/@transitions.1" xsi:type="n1:DiagramTransition"> | |
<bodylocation align="0.5" valign="1" x="-300" y="-85"/> | |
<route x="-500" y="-75"/> | |
<route x="-100" y="-75"/> | |
</items> | |
<items autolayout="false" transition="//@statemachine.0/@transitions.2" xsi:type="n1:DiagramTransition"> | |
<bodylocation align="0.5" valign="0" x="417.917" y="3.888"/> | |
<route x="0" y="0"/> | |
<route x="200" y="0"/> | |
<route x="200" y="150"/> | |
</items> | |
<items autolayout="true" transition="//@statemachine.0/@transitions.3" xsi:type="n1:DiagramTransition"> | |
<bodylocation align="0" valign="0.5" x="-540" y="113.953"/> | |
<route x="-550" y="-50"/> | |
<route x="-550" y="277.906"/> | |
</items> | |
<items autolayout="true" transition="//@statemachine.0/@transitions.4" xsi:type="n1:DiagramTransition"> | |
<bodylocation align="0.5" constraintBottom="230" constraintRight="80" valign="0" x="-37.5" y="210"/> | |
<route x="100" y="200"/> | |
<route x="-175" y="200"/> | |
<route x="-175" y="250"/> | |
</items> | |
<items autolayout="true" transition="//@statemachine.0/@transitions.5" xsi:type="n1:DiagramTransition"> | |
<bodylocation align="0" valign="0.5" x="-172" y="416"/> | |
<route x="-182" y="350"/> | |
<route x="-182" y="482"/> | |
</items> | |
<items autolayout="true" transition="//@statemachine.0/@transitions.6" xsi:type="n1:DiagramTransition"> | |
<bodylocation align="0" valign="0.5" x="210" y="315"/> | |
<route x="200" y="250"/> | |
<route x="200" y="380"/> | |
</items> | |
<items autolayout="true" transition="//@statemachine.0/@transitions.7" xsi:type="n1:DiagramTransition"> | |
<bodylocation align="0.5" valign="1" x="-215" y="40"/> | |
<route x="-100" y="50"/> | |
<route x="-330" y="50"/> | |
</items> | |
<items autolayout="true" transition="//@statemachine.0/@transitions.8" xsi:type="n1:DiagramTransition"> | |
<bodylocation align="0" valign="0.5" x="685" y="202.5"/> | |
<route x="675" y="150"/> | |
<route x="675" y="255"/> | |
</items> | |
<items state="//@statemachine.0/@states.4" xsi:type="n1:DiagramInitialState"> | |
<location x="-550" y="-350"/> | |
</items> | |
<items autolayout="true" transition="//@statemachine.0/@transitions.9" xsi:type="n1:DiagramTransition"> | |
<bodylocation align="0" valign="0.5" x="-540" y="-315"/> | |
<route x="-550" y="-330"/> | |
<route x="-550" y="-300"/> | |
</items> | |
<items state="//@statemachine.0/@states.5" xsi:type="n1:DiagramFinalState"> | |
<location x="-550" y="297.906"/> | |
</items> | |
<items autolayout="true" transition="//@statemachine.0/@transitions.10" xsi:type="n1:DiagramTransition"> | |
<bodylocation align="0" valign="0.5" x="685" y="25"/> | |
<route x="675" y="-50"/> | |
<route x="675" y="100"/> | |
</items> | |
<items autolayout="false" transition="//@statemachine.0/@transitions.11" xsi:type="n1:DiagramTransition"> | |
<bodylocation align="0.5" valign="1" x="-425.57" y="400.906"/> | |
<route x="-250" y="298.763"/> | |
<route x="-530" y="297.963"/> | |
</items> | |
<items height="100" state="//@statemachine.0/@states.6" width="150" xsi:type="n1:DiagramBasicState"> | |
<location x="600" y="-150"/> | |
</items> | |
<items autolayout="true" transition="//@statemachine.0/@transitions.12" xsi:type="n1:DiagramTransition"> | |
<bodylocation align="0.5" valign="1" x="300" y="-87.5"/> | |
<route x="0" y="-77.5"/> | |
<route x="600" y="-77.5"/> | |
</items> | |
<items state="//@statemachine.0/@states.7" xsi:type="n1:DiagramFinalState"> | |
<location x="675" y="-275.13"/> | |
</items> | |
<items autolayout="false" transition="//@statemachine.0/@transitions.13" xsi:type="n1:DiagramTransition"> | |
<bodylocation align="0" valign="0.5" x="536.844" y="-195.261"/> | |
<route x="675" y="-150"/> | |
<route x="675" y="-255.13"/> | |
</items> | |
<items state="//@statemachine.0/@states.8" xsi:type="n1:DiagramFinalState"> | |
<location x="200" y="400"/> | |
</items> | |
<items state="//@statemachine.0/@states.9" xsi:type="n1:DiagramFinalState"> | |
<location x="675" y="275"/> | |
</items> | |
<items state="//@statemachine.0/@states.10" xsi:type="n1:DiagramFinalState"> | |
<location x="-182" y="502"/> | |
</items> | |
<items state="//@statemachine.0/@states.11" xsi:type="n1:DiagramFinalState"> | |
<location x="-350" y="50"/> | |
</items> | |
<items height="250" state="//@statemachine.0/@states.12" width="100" xsi:type="n1:DiagramBasicState"> | |
<location x="-100" y="-150"/> | |
</items> | |
<items height="50" state="//@statemachine.0/@states.13" width="150" xsi:type="n1:DiagramBasicState"> | |
<location x="600" y="100"/> | |
</items> | |
<items height="120" note="Triggered by user action, send INVITE request. (We are initiating a new call.)" width="161" xsi:type="n1:DiagramNote"> | |
<location x="-838" y="-142"/> | |
</items> | |
<items autolayout="false" item="//@diagrams.0/@items.1" note="//@diagrams.0/@items.28" xsi:type="n1:DiagramNoteConnector"> | |
<route x="-677" y="-75"/> | |
<route x="-600" y="-75"/> | |
</items> | |
<items height="76" note="21.1.2 180 Ringing
waiting for other end to answer" width="174" xsi:type="n1:DiagramNote"> | |
<location x="-100" y="-300"/> | |
</items> | |
<items autolayout="false" item="//@diagrams.0/@items.26" note="//@diagrams.0/@items.30" xsi:type="n1:DiagramNoteConnector"> | |
<route x="-50" y="-224"/> | |
<route x="-50" y="-150"/> | |
</items> | |
<items height="131" note="It is ringing, but we want to cancel (hang-up) before other end answers" width="169" xsi:type="n1:DiagramNote"> | |
<location x="250" y="-321"/> | |
</items> | |
<items autolayout="false" note="//@diagrams.0/@items.32" xsi:type="n1:DiagramNoteConnector"> | |
<route x="327" y="-190"/> | |
<route x="327" y="-80"/> | |
</items> | |
<items height="84" note="Now we can speak with other end" width="143" xsi:type="n1:DiagramNote"> | |
<location x="-35" y="275"/> | |
</items> | |
<items autolayout="false" item="//@diagrams.0/@items.2" note="//@diagrams.0/@items.34" xsi:type="n1:DiagramNoteConnector"> | |
<route x="88" y="275"/> | |
<route x="120" y="250"/> | |
</items> | |
<items height="66" note="21.4.24 486 Busy Here
Callee rejects call" width="179" xsi:type="n1:DiagramNote"> | |
<location x="-494" y="-57"/> | |
</items> | |
<items autolayout="false" item="//@diagrams.0/@items.25" note="//@diagrams.0/@items.36" xsi:type="n1:DiagramNoteConnector"> | |
<route x="-350" y="9"/> | |
<route x="-350" y="30"/> | |
</items> | |
<items height="52" note="2.1.4.25 487 Request Terminated
call is now terminated" width="257" xsi:type="n1:DiagramNote"> | |
<location x="370" y="168"/> | |
</items> | |
<items autolayout="false" note="//@diagrams.0/@items.38" xsi:type="n1:DiagramNoteConnector"> | |
<route x="627" y="200"/> | |
<route x="675" y="202"/> | |
</items> | |
<items height="69" note="Paragraph numbers in comments and requiremnts refer to RFC 3261 SIP: Session Initiation Protocol" width="307" xsi:type="n1:DiagramNote"> | |
<location x="-238" y="-433"/> | |
</items> | |
</diagrams> | |
<diagrams cursorItem="after(timeoutE)/
Bye();
timeoutE = timeoutE * 2.0;
requirement "17.1.2.2 Non-INVITE timers/Resends BYE after E timeout";" cursorOffset="14" selected="//@diagrams.1/@items.4" substate="//@statemachine.0/@states.3"> | |
<items state="//@statemachine.0/@states.3/@states.0" xsi:type="n1:DiagramInitialState"> | |
<location x="-1200" y="-200"/> | |
</items> | |
<items height="100" state="//@statemachine.0/@states.3/@states.1" width="100" xsi:type="n1:DiagramBasicState"> | |
<location x="-1000" y="-250"/> | |
</items> | |
<items autolayout="true" transition="//@statemachine.0/@states.3/@transitions.0" xsi:type="n1:DiagramTransition"> | |
<bodylocation align="0.5" valign="1" x="-1090" y="-210"/> | |
<route x="-1180" y="-200"/> | |
<route x="-1000" y="-200"/> | |
</items> | |
<items state="//@statemachine.0/@states.3/@states.2" xsi:type="n1:DiagramJunction"> | |
<location x="-600" y="-100"/> | |
</items> | |
<items autolayout="true" transition="//@statemachine.0/@states.3/@transitions.1" xsi:type="n1:DiagramTransition"> | |
<bodylocation align="0.5" constraintBottom="-130" constraintLeft="-880" valign="0" x="-750" y="-190"/> | |
<route x="-900" y="-200"/> | |
<route x="-600" y="-200"/> | |
<route x="-600" y="-110"/> | |
</items> | |
<items autolayout="true" transition="//@statemachine.0/@states.3/@transitions.2" xsi:type="n1:DiagramTransition"> | |
<bodylocation align="0.5" constraintRight="-630" constraintTop="-130" valign="1" x="-780" y="-110"/> | |
<route x="-610" y="-100"/> | |
<route x="-950" y="-100"/> | |
<route x="-950" y="-150"/> | |
</items> | |
<items height="150" note="Re-send BYE message after time-out and increase value of timer E according to RFC 3261 17.1.2 Non-INVITE Client Transaction." width="350" xsi:type="n1:DiagramNote"> | |
<location x="-1100" y="-50"/> | |
</items> | |
<items autolayout="false" item="//@diagrams.1/@items.3" note="//@diagrams.1/@items.6" xsi:type="n1:DiagramNoteConnector"> | |
<route x="-750" y="-30"/> | |
<route x="-609.062" y="-95.7711"/> | |
</items> | |
</diagrams> | |
<diagrams cursorItem="after(timeoutA)/
Invite();
timeoutA = timeoutA * 2.0;
requirement "17.1.1.2 INVITE timers/Resends INVITE after A timeout";" cursorOffset="46" selected="//@diagrams.2/@items.3" substate="//@statemachine.0/@states.1"> | |
<items state="//@statemachine.0/@states.1/@states.0" xsi:type="n1:DiagramInitialState"> | |
<location x="-1200" y="-300"/> | |
</items> | |
<items height="100" state="//@statemachine.0/@states.1/@states.1" width="100" xsi:type="n1:DiagramBasicState"> | |
<location x="-1000" y="-350"/> | |
</items> | |
<items state="//@statemachine.0/@states.1/@states.2" xsi:type="n1:DiagramJunction"> | |
<location x="-600" y="-200"/> | |
</items> | |
<items autolayout="true" transition="//@statemachine.0/@states.1/@transitions.0" xsi:type="n1:DiagramTransition"> | |
<bodylocation align="0.5" constraintBottom="-230" constraintLeft="-880" valign="0" x="-750" y="-290"/> | |
<route x="-900" y="-300"/> | |
<route x="-600" y="-300"/> | |
<route x="-600" y="-210"/> | |
</items> | |
<items autolayout="true" transition="//@statemachine.0/@states.1/@transitions.1" xsi:type="n1:DiagramTransition"> | |
<bodylocation align="0.5" constraintRight="-630" constraintTop="-230" valign="1" x="-780" y="-210"/> | |
<route x="-610" y="-200"/> | |
<route x="-950" y="-200"/> | |
<route x="-950" y="-250"/> | |
</items> | |
<items autolayout="true" transition="//@statemachine.0/@states.1/@transitions.2" xsi:type="n1:DiagramTransition"> | |
<bodylocation align="0.5" valign="1" x="-1090" y="-310"/> | |
<route x="-1180" y="-300"/> | |
<route x="-1000" y="-300"/> | |
</items> | |
<items height="150" note="Re-send INVITE message after time-out and increase value of timer A according to RFC 3261 17.1.1 INVITE Client Transaction." width="350" xsi:type="n1:DiagramNote"> | |
<location x="-1100" y="-150"/> | |
</items> | |
<items autolayout="false" item="//@diagrams.2/@items.2" note="//@diagrams.2/@items.6" xsi:type="n1:DiagramNoteConnector"> | |
<route x="-750" y="-130"/> | |
<route x="-609.062" y="-195.771"/> | |
</items> | |
</diagrams> | |
<diagrams substate="//@statemachine.0/@states.6"> | |
<items state="//@statemachine.0/@states.6/@states.0" xsi:type="n1:DiagramInitialState"> | |
<location x="-1300" y="-300"/> | |
</items> | |
<items height="100" state="//@statemachine.0/@states.6/@states.1" width="100" xsi:type="n1:DiagramBasicState"> | |
<location x="-1100" y="-350"/> | |
</items> | |
<items autolayout="true" transition="//@statemachine.0/@states.6/@transitions.0" xsi:type="n1:DiagramTransition"> | |
<bodylocation align="0.5" valign="1" x="-1190" y="-310"/> | |
<route x="-1280" y="-300"/> | |
<route x="-1100" y="-300"/> | |
</items> | |
<items state="//@statemachine.0/@states.6/@states.2" xsi:type="n1:DiagramJunction"> | |
<location x="-700" y="-200"/> | |
</items> | |
<items autolayout="true" transition="//@statemachine.0/@states.6/@transitions.1" xsi:type="n1:DiagramTransition"> | |
<bodylocation align="0.5" constraintBottom="-230" constraintLeft="-980" valign="0" x="-850" y="-290"/> | |
<route x="-1000" y="-300"/> | |
<route x="-700" y="-300"/> | |
<route x="-700" y="-210"/> | |
</items> | |
<items autolayout="true" transition="//@statemachine.0/@states.6/@transitions.2" xsi:type="n1:DiagramTransition"> | |
<bodylocation align="0.5" constraintRight="-730" constraintTop="-230" valign="1" x="-880" y="-210"/> | |
<route x="-710" y="-200"/> | |
<route x="-1050" y="-200"/> | |
<route x="-1050" y="-250"/> | |
</items> | |
<items height="150" note="Re-send CANCEL message after time-out and increase value of timer E according to RFC 3261 17.1.2 Non-INVITE Client Transaction." width="350" xsi:type="n1:DiagramNote"> | |
<location x="-1200" y="-150"/> | |
</items> | |
<items autolayout="false" item="//@diagrams.3/@items.3" note="//@diagrams.3/@items.6" xsi:type="n1:DiagramNoteConnector"> | |
<route x="-850" y="-130"/> | |
<route x="-709.062" y="-195.771"/> | |
</items> | |
</diagrams> | |
</n1:Project> |