smalltalk
/
osmo-st-all
Archived
1
0
Fork 0

callagent: Add some transaction code...

This commit is contained in:
Holger Hans Peter Freyther 2011-06-13 19:16:09 +02:00
parent 75722e9f84
commit df11de6c31
2 changed files with 59 additions and 13 deletions

View File

@ -123,12 +123,12 @@ SIPTransport subclass: SIPUdpTransport [
]
]
Object subclass: SIPUserAgent [
| transport name last_cseq transactions |
Object subclass: SIPUserAgentBase [
| transport name last_cseq |
<category: 'SIP-Callagent'>
<comment: 'I am a user agent'>
<comment: 'I am a user agent base'>
SIPUserAgent class >> createOn: aTransport [
SIPUserAgentBase class >> createOn: aTransport [
<category: 'factory'>
^ self new
instVarNamed: #last_cseq put: 0;
@ -136,13 +136,13 @@ Object subclass: SIPUserAgent [
yourself
]
SIPUserAgent class >> branchStart [
SIPUserAgentBase class >> branchStart [
<category: 'ids'>
"magic marker..."
^ 'z9hG4bK'
]
SIPUserAgent class >> generateBranch [
SIPUserAgentBase class >> generateBranch [
| data |
data := '%1,%2' % {DateTime now asUTC asSeconds. Random between: 0 and: 99999}.
^ SIPBase64 encode: data.
@ -179,20 +179,62 @@ Object subclass: SIPUserAgent [
transport handler: self.
]
transportData: aTransport data: aData [
self notYetImplemented
]
queueData: aDatagram [
transport queueData: aDatagram.
]
]
SIPUserAgentBase subclass: SIPUserAgent [
| transactions retransmit sem |
<category: 'SIP-Callagent'>
<comment: 'I am a user agent base'>
transactions [
<category: 'private'>
^ transactions ifNil: [transactions := OrderedCollection new]
]
addTransaction: aTransaction [
self transactions add: aTransaction
checkTimeout [
<category: 'transactions'>
sem critical: [
self transactions do: [:trans |
[trans checkTimeout] on: Error do: [:e |
e logException: 'Exception on timeout: %1' % {e tag}
area: #sip.
].
]
]
]
queueData: aDatagram [
transport queueData: aDatagram.
addTransaction: aTransaction [
<category: 'transactions'>
sem critical: [
self transactions add: aTransaction]
]
start [
<category: 'process'>
sem := Semaphore forMutualExclusion.
retransmit := [
[
(Delay forMilliseconds: 500) wait.
self checkTimeout.
] repeat
] fork.
]
transportData: aTransport data: aData [
| req data |
[
data := aData data copyFrom: 1 to: aData size.
data printNl.
req := SIPParser parse: data asString.
req inspect.
'123' printNl.
] on: Error do: [:e |
e logException: 'Parsing error %1' % {e tag} area: #sip.
]
]
]

View File

@ -72,6 +72,10 @@ Object subclass: SIPTransaction [
port: dialog destPort.
useragent queueData: datagram.
]
checkTimeout [
'Check timeout' printNl.
]
]
SIPTransaction subclass: SIPInviteTransaction [