smalltalk
/
osmo-st-gsm
Archived
1
0
Fork 0
This repository has been archived on 2022-02-17. You can view files and clone it, but cannot push or open issues or pull requests.
osmo-st-gsm/GSM48.st

2129 lines
61 KiB
Smalltalk
Raw Normal View History

2010-12-14 02:03:20 +00:00
"
(C) 2010-2011 by Holger Hans Peter Freyther
2010-12-14 02:03:20 +00:00
All Rights Reserved
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
"
"Messages for GSM04.08"
"""
IEs for GSM48MSG
"""
IEBase subclass: GSM48IE [
<category: 'OsmoGSM'>
<comment: 'I am a Information Element for GSM48'>
GSM48IE class >> ieMask [
"Some IEs encode the IE and the value into one. Return the mask to be used
to determine the IE and see if it is matching."
^ 16rFF
]
]
GSM48IE subclass: GSM48SimpleTag [
| value |
<category: 'OsmoGSM'>
<comment: 'I am a simple Tag. Some TAGs even share the value in there'>
GSM48SimpleTag class >> ieMask [ ^ 16rF0 ]
GSM48SimpleTag class >> initWithData: aData [
^ self new
value: aData;
yourself
]
GSM48SimpleTag class >> length: aStream [
^ 0
]
value: aValue [
| inv |
inv := 255 - self class ieMask.
value := (aValue bitAnd: inv)
]
value [
^ value ifNil: [ 0 ]
]
writeOn: aMsg [
| combined |
combined := self class elementId bitOr: value.
aMsg putByte: combined.
]
writeOnDirect: aMsg [
self shouldNotImplement
]
]
GSM48IE subclass: GSM48DataHolder [
| data |
<category: 'OsmoGSM'>
<comment: 'A simple wrapper for the lazy ones'>
GSM48DataHolder class >> createDefault [
| size data |
size := self validSizes first.
data := ByteArray new: size.
^ self new data: data; yourself.
]
GSM48DataHolder class >> validSizes [
"Include only the actual payload, no additional size for T or L"
^ 1 to: 180
]
GSM48DataHolder class >> length: aStream [
^ aStream peek + 1.
]
GSM48DataHolder class >> initWithData: aData [
^ self new
data: aData;
yourself.
]
GSM48DataHolder class >> parseFrom: aStream [
| len |
len := aStream next.
^ self initWithData: (aStream next: len)
]
data: aData [
| size |
"Add the size for the length header"
(self class validSizes includes: aData size)
ifFalse: [
^ self error: 'The data is not of a valid size: %1 "%2"' % {aData size. self class validSizes}.
].
data := aData.
]
data [ ^ data ]
writeOn: aMsg [
aMsg putByte: self class elementId.
aMsg putByte: data size.
aMsg putByteArray: data.
]
writeOnDirect: aMsg [
aMsg putByte: data size.
aMsg putByteArray: data.
]
]
GSM48IE subclass: GSM48SimpleData [
| data |
<category: 'OsmoGSM'>
<comment: 'I am the base for some simple data encapsulated'>
GSM48SimpleData class >> initWithData: aData [
^ self new
data: aData;
yourself.
]
GSM48SimpleData class >> length: aStream [
^ self length
]
GSM48SimpleData class >> defaultValue [
^ ByteArray new: self length
]
GSM48SimpleData class >> createDefault [
^ self new
data: self defaultValue;
yourself
]
GSM48SimpleData class >> parseFrom: aStream [
| dat |
dat := aStream next: self length.
^ self new
data: dat;
yourself
]
data [
^ data
]
data: aData [
aData size = self class length
ifFalse: [
Error signal: 'DATA needs to be ', self class length asString, ' long.',
'But it was ', aData size asString, ' long.'.
].
data := aData.
]
writeOnDirect: aMsg [
aMsg putByteArray: data.
]
writeOn: aMsg [
"Write a TV"
aMsg putByte: self class elementId.
self writeOnDirect: aMsg
]
]
GSM48SimpleData subclass: GSM48KeySeqLuType [
| val |
<category: 'OsmoGSM'>
<comment: 'This byte is shared for two things'>
GSM48KeySeqLuType class >> createDefault [
<category: 'creation'>
^ (self new)
val: 16r70;
yourself
]
GSM48KeySeqLuType class >> length [
2010-11-23 22:37:27 +00:00
"We always need a byte"
^ 1
]
val [
^ self data at: 1
2010-11-23 22:37:27 +00:00
]
val: aVal [
<category: 'creation'>
self data: (ByteArray with: aVal).
]
]
GSM48IE subclass: GSM48Lai [
| lai lac |
<category: 'OsmoGSM'>
GSM48Lai class >> createDefault [
<category: 'creation'>
^ (self new)
lai: (LAI initWith: 0 mnc: 0);
lac: 0;
yourself
]
GSM48Lai class >> length: aByteArray [
^ 5
]
GSM48Lai class >> parseFrom: aStream [
"TODO: as nextUShort to the ReadStream..."
^ (self new)
lai: (LAI parseFrom: aStream);
lac: ((aStream next: 2) asByteArray ushortAt: 1) swap16;
yourself
]
mcc: aMcc [ <category: 'creation'> lai mcc: aMcc ]
mnc: aMnc [ <category: 'creation'> lai mnc: aMnc ]
lai: aLai [ <category: 'creation'> lai := aLai ]
lac: aLac [ <category: 'creation'> lac := aLac ]
mcc [ ^ lai mcc ]
mnc [ ^ lai mnc ]
lac [ ^ lac ]
writeOnDirect: aMsg [
<category: 'creation'>
lai writeOn: aMsg.
2010-11-17 21:43:43 +00:00
aMsg putLen16: lac.
]
]
GSM48IE subclass: GSM48Classmark1 [
| cm1 |
<category: 'OsmoGSM'>
GSM48Classmark1 class >> createDefault [
<category: 'creation'>
^ (self new)
cm1: 16r33;
yourself
]
GSM48Classmark1 class >> length: aByteArray [
^ 1
]
GSM48Classmark1 class >> parseFrom: aStream [
^ (self new)
cm1: aStream next;
yourself
]
cm1: aCm [ <category: 'creation'> cm1 := aCm ]
cm1 [ ^ cm1 ]
writeOnDirect: aMsg [
<category: 'creation'>
aMsg putByte: cm1.
]
]
GSM48DataHolder subclass: GSM48Classmark2 [
"TODO: This is broken... it needs to be a simple data holder"
<category: 'OsmoGSM'>
<comment: 'I am CM2 of 10.5.1.6'>
GSM48Classmark2 class >> createDefault [
^ self new
data: self defaultValue;
yourself
]
GSM48Classmark2 class >> defaultValue [
^ ByteArray with: 16r33 with: 16r19 with: 16rA2.
]
GSM48Classmark2 class >> validSizes [ ^ 3 to: 3 ]
]
GSM48IE subclass: GSM48MIdentity [
| imsi tmsi |
<category: 'OsmoGSM'>
GSM48MIdentity class >> miIMSI [ <category: 'spec'> ^ 16r1 ]
GSM48MIdentity class >> miIMEI [ <category: 'spec'> ^ 16r2 ]
GSM48MIdentity class >> miIMEISV [ <category: 'spec'> ^ 16r3 ]
GSM48MIdentity class >> miTMSI [ <category: 'sepc'> ^ 16r4 ]
GSM48MIdentity class >> elementId [ ^ 23 ]
GSM48MIdentity class >> createDefault [
<category: 'creation'>
^ (self new)
imsi: '000000000000';
yourself
]
GSM48MIdentity class >> length: aStream [
^ aStream peek + 1
]
GSM48MIdentity class >> parseFrom: aStream [
| len head type |
len := aStream next.
head := aStream next.
type := head bitAnd: 16r7.
type = self miIMSI
ifTrue: [
| odd digits |
digits := OrderedCollection new.
odd := (head bitShift: -3) bitAnd: 16r1.
digits add: ((head bitShift: -4) bitAnd: 16rF).
3 to: (1 + len) do: [:each | | val |
val := aStream next.
digits add: (val bitAnd: 16rF).
digits add: ((val bitShift: -4) bitAnd: 16rF).
].
"The last was just a dummy value"
odd = 1 ifFalse: [
digits removeLast.
].
^ (self new) imsi: (BCD decode: digits) asString; yourself
].
self notYetImplemented.
]
imsi: aImsi [ <category: 'creation'> imsi := aImsi. ]
imsi [ ^ imsi ]
writeOnDirect: aMsg [
<category: 'creation'>
imsi ifNotNil: [
^ self storeImsiDirect: aMsg.
].
self notYetImplemented
]
storeImsiDirect: aMsg [
| odd len head encoded bcds |
2010-11-19 18:10:38 +00:00
<category: 'private'>
odd := imsi size odd.
"Calculate the length. We can fit two digits into one byte"
len := odd
ifTrue: [ (imsi size + 1) / 2 ]
ifFalse: [ (imsi size / 2) + 1 ].
aMsg putByte: len.
"Create the first data"
head := ((imsi at: 1) digitValue) bitShift: 4.
odd ifTrue: [
head := head bitOr: (1 bitShift: 3).
].
head := head bitOr: self class miIMSI.
aMsg putByte: head.
"Encode everything from 2..n into a ByteArray of len - 1"
bcds := OrderedCollection new.
2 to: imsi size do: [:pos |
bcds add: (imsi at: pos) digitValue.
].
odd ifFalse: [
bcds add: 16r0F.
].
"now fold the bcds into and encoded array"
encoded := OrderedCollection new.
1 to: bcds size by: 2 do: [:pos |
| lower upper |
lower := bcds at: pos.
upper := bcds at: pos + 1.
encoded add: ((upper bitShift: 4) bitOr: lower).
].
aMsg putByteArray: encoded asByteArray.
]
]
GSM48SimpleData subclass: GSM48RejectCause [
<category: 'OsmoGSM'>
GSM48RejectCause class >> createDefault [
<category: 'creation'>
^ self new
cause: 11;
yourself.
]
GSM48RejectCause class >> length [
^ 1
]
cause [
^ self data at: 1
]
cause: aCause [
self data: (ByteArray with: aCause).
]
]
GSM48SimpleData subclass: GSM48AuthRand [
<category: 'OsmoGSM'>
<comment: 'I represent the 10.5.3.1 Authentication parameter RAND'>
GSM48AuthRand class >> length [ ^ 16 ]
]
GSM48SimpleData subclass: GSM48AuthSRES [
<category: 'OsmoGSM'>
<comment: 'I represent the 10.5.3.2 Auth. parameter SRES'>
GSM48AuthSRES class >> length [ ^ 4 ]
]
GSM48SimpleTag subclass: GSM48FollowOn [
<category: 'OsmoGSM'>
<comment: 'I represent the 10.5.3.7. A simple tag value'>
GSM48FollowOn class >> ieMask [ ^ 16rFF ]
GSM48FollowOn class >> elementId [ ^ 16rA1 ]
]
GSM48SimpleTag subclass: GSM48CTSPermission [
<category: 'OsmoGSM'>
<comment: 'I represent the 10.5.3.7. A simple tag value'>
GSM48CTSPermission class >> ieMask [ ^ 16rFF ]
GSM48CTSPermission class >> elementId [ ^ 16rA2 ]
]
GSM48SimpleData subclass: GSM48IdentityType [
<category: 'OsmoGSM'>
<comment: 'I represent the 10.5.3.4. Identity Type'>
"Ignore the spare values"
GSM48IdentityType class >> typeIMSI [ ^ 1 ]
GSM48IdentityType class >> typeIMEI [ ^ 2 ]
GSM48IdentityType class >> typeIMEISV [ ^ 3 ]
GSM48IdentityType class >> typeTMSI [ ^ 4 ]
GSM48IdentityType class >> defaultValue [
^ ByteArray with: self typeIMSI
]
GSM48IdentityType class >> length [ ^ 1 ]
type: aType [
self data: (ByteArray with: aType)
]
]
GSM48SimpleTag subclass: GSMRepeatInd [
<category: 'OsmoGSM'>
GSMRepeatInd class >> elementId [ ^ 16rD0 ]
]
GSM48SimpleTag subclass: GSMPriorityLevel [
<category: 'OsmoGSM'>
GSMPriorityLevel class >> elementId [ ^ 16r80 ]
]
Object subclass: GSMBitField [
| byte |
<category: 'OsmoGSM'>
<comment: 'I am a 7bit bitfield and provide nice access. I am
commonly used with the GSM fields where the 8th indicate if things
continue or not. I can automatically generate accessors based on
a bit definition class'>
GSMBitField class >> fromByte: aByte [
<category: 'creation'>
^ self new
byte: aByte;
yourself
]
GSMBitField class >> initialize [
<category: 'protected'>
self bitDefinition do: [:each |
self compile: '%1 [ ^ self bitsFrom: (%2 to: %3) ]'
% {each first. each second. each third};
compile: '%1: aVal [ self atBits: (%2 to: %3) put: aVal]'
% {each first. each second. each third}.
]
]
data [
<category: 'access'>
^ byte
]
byte: aByte [
<category: 'private'>
byte := aByte
]
bitsFrom: interval [
| res mask |
<category: 'private'>
"Build the mask"
mask := 0.
interval do: [:each |
mask := mask bitAt: each put: 1].
"And with the value and shift"
res := (byte bitAnd: mask) bitShift: (interval first - 1) negated.
^ res
]
atBits: interval put: aVal [
| shifted |
aVal highBit > interval last ifTrue: [
^ self error: 'Value bigger than interval'.
].
shifted := aVal bitShift: interval first - 1.
interval do: [:each |
byte := byte bitAt: each put: (shifted bitAt: each)].
]
]
GSMBitField subclass: GSMBearerCapOctet3 [
<category: 'OsmoGSM'>
<comment: '10.5.4.5 Octet3'>
GSMBearerCapOctet3 class [
radioChReqReserved [ ^ 2r00 ]
radioChReqFullRateOnly [ ^ 2r01 ]
radioChReqDualHalfPref [ ^ 2r10 ]
radioChReqDualFullPref [ ^ 2r11 ]
radioCodStdGSM [ ^ 2r0 ]
radioCodStdReserved [ ^ 2r1 ]
transferModeCircuit [ ^ 2r0 ]
transferModePacket [ ^ 2r1 ]
transferCapSpeech [ ^ 2r000 ]
transferCapUnrest [ ^ 2r001 ]
transferCap31khzPlmn [ ^ 2r010 ]
transferCapFacsimileGroup3 [ ^ 2r011 ]
transferCapOtherITC [ ^ 2r101 ] "see Octet 5a"
transferCapReserved [ ^ 2r111 ]
bitDefinition [
"Bit definition of Octet3"
^ OrderedCollection new
add: #('informationTransferCapability' 1 3);
add: #('transferMode' 4 4);
add: #('codingStandard' 5 5);
add: #('radioChannelRequirement' 6 7);
yourself
]
]
]
GSMBitField subclass: GSMBearerCapOctet3a [
<category: 'OsmoGSM'>
<comment: '10.5.4.5 Octet3a MS to network'>
GSMBearerCapOctet3a class [
codingForTransferCapability [ ^ 2r0 ]
codingForOtherExtensions [ ^ 2r1 ]
ctmTextTelephonyNotSupported [ ^ 2r0 ]
ctmTextTelephonySupported [ ^ 2r1 ]
speechFullRateVersion1 [ ^ 2r0000 ]
speechFullRateVersion2 [ ^ 2r0010 ]
speechFullRateVersion3 [ ^ 2r0100 ]
speechHalfRateVersion1 [ ^ 2r0001 ]
speechHalfRateVersion3 [ ^ 2r0101 ]
bitDefinition [
^ OrderedCollection new
add: #('speechVersionIndication' 1 4);
add: #('spare' 5 5);
add: #('ctm' 6 6);
add: #('coding' 7 7);
yourself
]
]
]
GSMBearerCapOctet3a subclass: GSMBearerCapOctet3b [
<category: 'OsmoGSM'>
<comment: '10.5.4.5 Octet3b network to MS'>
GSMBearerCapOctet3b class [
bitDefinition [
"There is no CTM in this directtion"
^ OrderedCollection new
add: #('speechVersionIndication' 1 4);
add: #('spare' 5 6);
add: #('coding' 7 7);
yourself
]
]
]
Object subclass: GSMBearerCapDecoderBase [
| octet3 |
<category: 'OsmoGSM'>
<comment: 'I am the base of BearerCapDecoder parsing. My children
can parse the 10.5.4.5 bearer caps.'>
GSMBearerCapDecoderBase class >> parse: aStream [
^ self new
parse: aStream;
checkEndOfStream: aStream;
yourself
]
octet3 [
^ octet3
]
parse: aStream [
<category: 'protected'>
^ self parseOctet3: aStream
]
parseOctet3: aStream [
| byte |
"I return true if there is more for octet3"
<category: 'protected'>
octet3 := nil.
"nothing left to read"
aStream atEnd ifTrue: [
^ false].
octet3 := GSMBearerCapOctet3 fromByte: aStream next.
^ (octet3 data bitAt: 8) = 0.
]
parseOctets: aStream do: aBlock [
<category: 'protected'>
[aStream atEnd] whileFalse: [
| byte |
byte := aStream next.
aBlock value: byte.
"Check if we are at an end here"
(byte bitAt: 8) = 1 ifTrue: [
^ self
]
]
]
checkEndOfStream: aStream [
<category: 'private'>
aStream atEnd ifFalse: [
^ self error: 'Bearercaps not fully consumed.'
].
]
]
GSMBearerCapDecoderBase subclass: GSMBearerCapFromNetwork [
| octet3b |
<category: 'OsmoGSM'>
parse: aStream [
<category: 'private'>
octet3b := nil.
(self parseOctet3: aStream) ifTrue: [
self parseOctets: aStream do: [:each |
self octet3b add: (GSMBearerCapOctet3b fromByte: each)]
].
]
octet3b [
<category: 'accessing'>
^ octet3b ifNil: [octet3b := OrderedCollection new]
]
]
GSMBearerCapDecoderBase subclass: GSMBearerCapFromMS [
| octet3a |
<category: 'OsmoGSM'>
parse: aStream [
<category: 'private'>
octet3a := nil.
(self parseOctet3: aStream) ifTrue:[
self parseOctets: aStream do: [:each |
self octet3a add: (GSMBearerCapOctet3a fromByte: each)].
]
]
octet3a [
<category: 'accessing'>
^ octet3a ifNil: [octet3a := OrderedCollection new]
]
]
GSM48DataHolder subclass: GSMBearerCap [
<category: 'OsmoGSM'>
<comment: '10.5.4.5'>
GSMBearerCap class >> elementId [ ^ 16r04 ]
GSMBearerCap class >> validSizes [ ^ 1 to: 13 ]
"GSM 04.08 Table 10.5.102. Strings depend on other attributes"
]
GSM48DataHolder subclass: GSMFacility [
<category: 'OsmoGSM'>
<comment: '10.5.4.15'>
GSMFacility class >> elementId [ ^ 16r1C ]
GSMFacility class >> validSizes [ ^ 1 to: 254 ]
]
GSM48DataHolder subclass: GSMProgress [
<category: 'OsmoGSM'>
<comment: '10.5.4.21 Progress indicator'>
GSMProgress class >> elementId [ ^ 16r1E ]
GSMProgress class >> validSizes [ ^ 2 to: 2 ]
]
GSM48SimpleData subclass: GSMSignal [
| signal |
<category: 'OsmoGSM'>
GSMSignal class >> elementId [ ^ 16r34 ]
GSMSignal class >> length [ ^ 1 ]
]
Object subclass: GSMNumberingPlan [
<category: 'OsmoGSM'>
<comment: 'I represent table 10.5.1.118'>
GSMNumberingPlan class >> planUnknown [ ^ 0 ]
GSMNumberingPlan class >> planISDN [ ^ 1 ]
GSMNumberingPlan class >> planData [ ^ 3 ]
GSMNumberingPlan class >> planTelex [ ^ 4 ]
GSMNumberingPlan class >> planNational [ ^ 8 ]
GSMNumberingPlan class >> planPrivate [ ^ 9 ]
GSMNumberingPlan class >> planReserved [ ^ 15 ]
]
Object subclass: GSMNumberDigits [
<category: 'OsmoGSM'>
<comment: 'I represent table 10.5.118 continued'>
DigitMap := nil.
ReverseMap := nil.
GSMNumberDigits class >> mapDigit: aBinary [
^ self digitMap at: aBinary asInteger + 1.
]
GSMNumberDigits class >> digitMap: aDigit [
^ self reverseMap at: aDigit.
]
GSMNumberDigits class >> digitMap [
^ DigitMap ifNil: [
DigitMap := Dictionary new.
1 to: 10 do: [:each |
DigitMap at: each put: (each + 48 - 1) asCharacter.
].
DigitMap at: 11 put: $*.
DigitMap at: 12 put: $#.
DigitMap at: 13 put: $a.
DigitMap at: 14 put: $b.
DigitMap at: 15 put: $c.
DigitMap at: 16 put: Character eof.
DigitMap yourself.
].
]
GSMNumberDigits class >> reverseMap [
^ ReverseMap ifNil: [
ReverseMap := Dictionary new.
self digitMap associationsDo: [:each |
ReverseMap at: each value put: (each key - 1).
].
ReverseMap yourself.
].
]
GSMNumberDigits class >> decodeFrom: anArray [
<category: 'decoding'>
^ self decodeFromStream: anArray readStream.
]
GSMNumberDigits class >> decodeFromStream: aStream [
| str |
<category: 'decoding'>
str := OrderedCollection new.
[aStream atEnd] whileFalse: [
| in tmp char |
in := aStream next.
tmp := in bitAnd: 16r0F.
str add: (self mapDigit: tmp).
tmp := (in bitAnd: 16rF0) bitShift: -4.
char := (self mapDigit: tmp).
char = Character eof
ifFalse: [
str add: char.
].
].
^ str asString
]
GSMNumberDigits class >> encodeFrom: aNumber [
| str |
<category: 'encoding'>
str := WriteStream on: (ByteArray new).
self encodeData: aNumber on: str.
^ str contents
]
GSMNumberDigits class >> encodeData: aNumber on: aStr [
| digits |
<category: 'encoding'>
digits := OrderedCollection new.
aNumber do: [:digit |
digits add: (self digitMap: digit).
].
digits size odd
ifTrue: [
digits add: 16rF.
].
"Create the binary structure"
1 to: digits size by: 2 do: [:each |
| low high |
low := digits at: each.
high := digits at: each + 1.
aStr nextPut: (low bitOr: (high bitShift: 4)).
].
]
]
GSM48DataHolder subclass: GSMCalledBCDNumber [
<category: 'OsmoGSM'>
<comment: '10.5.4.7'>
GSMCalledBCDNumber class >> elementId [ ^ 16r5E ]
GSMCalledBCDNumber class >> validSizes [
"For PCS1900 it is 19 in total, in theory up to 43. It
depends on the direction as well"
^ 1 to: 17
]
GSMCalledBCDNumber class >> spec [ ^ '10.5.4.7' ]
GSMCalledBCDNumber class [
typeUnknown [ <category: 'TypeOfNumber'> ^ 2r000 ]
typeInternational [ <category: 'TypeOfNumber'> ^ 2r001 ]
typeNational [ <category: 'TypeOfNumber'> ^ 2r010 ]
typeNetworkSpecific [ <category: 'TypeOfNumber'> ^ 2r011 ]
typeDedicatedAccess [ <category: 'TypeOfNumber'> ^ 2r100 ]
planUnknown [ <category: 'NumberingPlan'> ^ 2r0000 ]
planISDN [ <category: 'NumberingPlan'> ^ 2r0001 ]
planData [ <category: 'NumberingPlan'> ^ 2r0011 ]
planTelex [ <category: 'NumberingPlan'> ^ 2r0100 ]
planNational [ <category: 'NumberingPlan'> ^ 2r1000 ]
planPrivate [ <category: 'NumberingPlan'> ^ 2r1001 ]
]
numberType [
<category: 'extract'>
^ ((data at: 1) bitAnd: 16r70) bitShift: -4.
]
numberPlan [
<category: 'extract'>
^ (data at: 1) bitAnd: 16r0F
]
number [
<category: 'extract'>
^ GSMNumberDigits decodeFromStream: (data readStream skip: 1).
]
encode: aType plan: aPlan nr: aNr [
| str tmp |
<category: 'encode'>
str := WriteStream on: ByteArray new.
tmp := 16r80.
tmp := tmp bitOr: ((aType bitAnd: 16r7) bitShift: 4).
tmp := tmp bitOr: ((aPlan bitAnd: 16rF) bitShift: 0).
str nextPut: tmp.
GSMNumberDigits encodeData: aNr on: str.
self data: str contents.
]
]
GSM48DataHolder subclass: GSMCalledSubBCDNumber [
<category: 'OsmoGSM'>
<comment: '10.5.4.8'>
GSMCalledSubBCDNumber class >> elementId [ ^ 16r6D ]
GSMCalledSubBCDNumber class >> validSizes [ ^ 0 to: 21 ]
]
GSM48DataHolder subclass: GSMCallingBCDNumber [
<category: 'OsmoGSM'>
<comment: '10.5.4.9'>
GSMCallingBCDNumber class >> elementId [ ^ 16r5C ]
GSMCallingBCDNumber class >> validSizes [ ^ 1 to: 12 ]
]
GSM48DataHolder subclass: GSMCallingSubBCDNumber [
<category: 'OsmoGSM'>
<comment: '10.5.4.10'>
GSMCallingSubBCDNumber class >> elementId [ ^ 16r5D ]
GSMCallingSubBCDNumber class >> validSizes [ ^ 0 to: 21 ]
]
GSM48DataHolder subclass: GSMRedirectingBCDNumber [
<category: 'OsmoGSM'>
<comment: '10.5.4.21a'>
GSMRedirectingBCDNumber class >> elementId [ ^ 16r74 ]
GSMRedirectingBCDNumber class >> validSizes [ ^ 1 to: 17 ]
]
GSM48DataHolder subclass: GSMRedirectingSubBCDNumber [
<category: 'OsmoGSM'>
<comment: '10.5.4.21b'>
GSMRedirectingSubBCDNumber class >> elementId [ ^ 16r75 ]
GSMRedirectingSubBCDNumber class >> validSizes [ ^ 1 to: 21 ]
]
GSM48DataHolder subclass: GSMLLCompability [
<category: 'OsmoGSM'>
<comment: '10.5.4.18'>
GSMLLCompability class >> elementId [ ^ 16r7C ]
GSMLLCompability class >> validSizes [ ^ 0 to: 13 ]
]
GSM48DataHolder subclass: GSMHLCompability [
<category: 'OsmoGSM'>
<comment: '10.5.4.16'>
GSMHLCompability class >> elementId [ ^ 16r7D ]
GSMHLCompability class >> validSizes [ ^ 0 to: 3 ]
]
GSM48DataHolder subclass: GSMUserUser [
<category: 'OsmoGSM'>
<comment: '10.5.4.25'>
GSMUserUser class >> elementId [ ^ 16r7E ]
GSMUserUser class >> validSizes [ ^ 1 to: 33 ]
]
GSM48DataHolder subclass: GSMSSVersionInd [
<category: 'OsmoGSM'>
<comment: '10.5.4.24'>
GSMSSVersionInd class >> elementId [ ^ 16r7F ]
GSMSSVersionInd class >> validSizes [ ^ 0 to: 1 ]
]
GSM48SimpleTag subclass: GSMClirSuppression [
<category: 'OsmoGSM'>
GSMClirSuppression class >> elementId [ ^ 16rA1 ]
GSMClirSuppression class >> ieMask [ ^ 16rFF ]
]
GSM48SimpleTag subclass: GSMClirInvocation [
<category: 'OsmoGSM'>
GSMClirInvocation class >> elementId [ ^ 16rA2 ]
GSMClirInvocation class >> ieMask [ ^ 16rFF ]
]
GSM48DataHolder subclass: GSMCCCapabilities [
<category: 'OsmoGSM'>
<comment: '10.5.4.5a'>
GSMCCCapabilities class >> elementId [ ^ 16r15 ]
GSMCCCapabilities class >> validSizes [ ^ 1 to: 2 ]
"TODO: How to handle things that are specified like this but different in
reality? The code should be able to be uses as both validation and real world
parsing code."
GSMCCCapabilities class >> strictlyValidSizes [ ^ 1 to: 1 ]
]
2010-11-30 21:33:10 +00:00
GSM48DataHolder subclass: GSMConnectedNumber [
<category: 'OsmoGSM'>
2010-11-30 21:33:10 +00:00
<comment: '10.5.4.13'>
2010-11-30 21:33:10 +00:00
GSMConnectedNumber class >> elementId [ ^ 16r4C ]
GSMConnectedNumber class >> validSizes [ ^ 1 to: 12 ]
2010-11-30 21:33:10 +00:00
]
GSM48DataHolder subclass: GSMConnectedSubNumber [
<category: 'OsmoGSM'>
2010-11-30 21:33:10 +00:00
<comment: '10.5.4.14'>
2010-11-30 21:33:10 +00:00
GSMConnectedSubNumber class >> elementId [ ^ 16r4D ]
GSMConnectedSubNumber class >> validSizes [ ^ 0 to: 21 ]
2010-11-30 21:33:10 +00:00
]
GSM48DataHolder subclass: GSMAllowedActions [
<category: 'OsmoGSM'>
<comment: '10.5.4.27'>
GSMAllowedActions class >> elementId [ ^ 16r7B ]
GSMAllowedActions class >> validSizes [ ^ 1 to: 1 ]
]
GSM48DataHolder subclass: GSM48Cause [
<category: 'OsmoGSM'>
<comment: '10.5.4.11'>
GSM48Cause class >> elementId [ ^ 16r8 ]
GSM48Cause class >> validSizes [ ^ 2 to: 30 ]
]
GSM48DataHolder subclass: GSMAlertingPattern [
<category: 'OsmoGSM'>
<comment: '10.5.4.26'>
GSMAlertingPattern class >> elementId [ ^ 16r19 ]
GSMAlertingPattern class >> validSizes [ ^ 1 to: 1 ]
]
GSM48SimpleData subclass: GSM48Callstate [
<category: 'OsmoGSM'>
<comment: '10.5.4.6'>
GSM48Callstate class >> length [ <category: 'length'> ^ 1]
]
GSM48DataHolder subclass: GSM48AuxillaryStates [
<category: 'OsmoGSM'>
<comment: '10.5.4.4'>
GSM48AuxillaryStates class >> elementId [ <category: 'id'> ^ 16r24 ]
GSM48AuxillaryStates class >> validSizes [ <category: 'id'> ^ 1 to: 1]
]
GSM48SimpleData subclass: GSMRRCause [
<category: 'OsmoGSM'>
<comment: '10.5.2.31'>
GSMRRCause class >> causeNormalEvent [ <category: 'cause'> ^ 2r00000000 ]
GSMRRCause class >> causeAbnormalRelUnspec [ <category: 'cause'> ^ 2r00000001 ]
GSMRRCause class >> causeAbnormalRelUnacc [ <category: 'cause'> ^ 2r00000010 ]
GSMRRCause class >> causeAbnormalRelTimer [ <category: 'cause'> ^ 2r00000011 ]
GSMRRCause class >> causeAbnormalRelInact [ <category: 'cause'> ^ 2r00000100 ]
GSMRRCause class >> causePreemptiveRelease [ <category: 'cause'> ^ 2r00000101 ]
GSMRRCause class >> causeHandoverImpossible [ <category: 'cause'> ^ 2r00001000 ]
GSMRRCause class >> causeChannelModeUnacc [ <category: 'cause'> ^ 2r00001001 ]
GSMRRCause class >> causeFrequencyNotImpl [ <category: 'cause'> ^ 2r00001010 ]
GSMRRCause class >> causeCallAlreadyCleared [ <category: 'cause'> ^ 2r01000001 ]
GSMRRCause class >> causeSemanticallyIncorr [ <category: 'cause'> ^ 2r01011111 ]
GSMRRCause class >> causeInvalidMandInfo [ <category: 'cause'> ^ 2r01100000 ]
GSMRRCause class >> causeMessageTypeNotExist [ <category: 'cause'> ^ 2r01100001 ]
GSMRRCause class >> causeMessageTypeIncompat [ <category: 'cause'> ^ 2r01100010 ]
GSMRRCause class >> causeConditionalIEError [ <category: 'cause'> ^ 2r01100100 ]
GSMRRCause class >> causeNoCellAllocAvail [ <category: 'cause'> ^ 2r01100101 ]
GSMRRCause class >> causeProtocolErrorUnspec [ <category: 'cause'> ^ 2r01101111 ]
GSMRRCause class >> defaultValue [
<category: 'default'>
^ 0
]
GSMRRCause class >> length [
<category: 'fixed length'>
^ 1
]
]
GSM48SimpleData subclass: GSMStreamIdentifier [
<category: 'OsmoGSM'>
<comment: '10.5.4.28'>
GSMStreamIdentifier class >> elementId [ ^ 16r19 ]
GSMStreamIdentifier class >> length [ ^ 1 ]
]
GSM48DataHolder subclass: GSMSupportedCodecs [
<category: 'OsmoGSM'>
<comment: '10.5.4.32'>
GSMSupportedCodecs class >> elementId [ ^ 16r40 ]
GSMSupportedCodecs class >> validSizes [ ^ 3 to: 254 ]
]
GSM48SimpleTag subclass: GSMRedial [
<category: 'OsmoGSM'>
<comment: '10.5.4.34'>
GSMRedial class >> ieMask [ ^ 16rFF ]
GSMRedial class >> elementId [ ^ 16rA3 ]
]
GSM48SimpleData subclass: GSMNetworkCallControlCap [
<category: 'OsmoGSM'>
<comment: '10.5.4.29'>
GSMNetworkCallControlCap class >> elementId [ ^ 16r2F ]
GSMNetworkCallControlCap class >> length [ ^ 1 ]
]
GSM48SimpleData subclass: GSMCauseNoCLI [
<category: 'OsmoGSM'>
<comment: '10.5.4.30'>
GSMCauseNoCLI class >> elementId [ ^ 16r3A ]
GSMCauseNoCLI class >> length [ ^ 1 ]
]
GSM48DataHolder subclass: GSMBackupBearerCapability [
<category: 'OsmoGSM'>
<comment: '10.5.4.4a'>
GSMBackupBearerCapability class >> elementId [ ^ 16r41 ]
GSMBackupBearerCapability class >> validSizes [ ^ 1 to: 13 ]
]
IEMessage subclass: GSM48MSG [
| seq ti |
<category: 'OsmoGSM'>
<comment: 'GSM48 has helper code for mandatory types'>
GSM48MSG class >> addVariable: aName [
"Check if the variable exists, otherwise add it"
(self instVarNames includes: aName)
ifFalse: [
self addInstVarName: aName.
].
]
GSM48MSG class >> addMandatory: aName with: aClass [
<comment: 'creation'>
self addVariable: aName asSymbol.
self compile: '%1 [ ^ %1 ifNil: [%1 := %2 createDefault.]]' % {aName. aClass}.
self Mandatory add: ({aName asSymbol. #normal} -> aClass).
]
GSM48MSG class >> addTaggedMandatory: aName with: aClass [
<comment: 'creation'>
self addVariable: aName asSymbol.
self compile: '%1 [ ^ %1 ifNil: [%1 := %2 createDefault.]]' % {aName. aClass}.
self Mandatory add: ({aName asSymbol. #tagged} -> aClass).
]
GSM48MSG class >> addOptional: aName with: aClass [
<comment: 'creation'>
aClass = nil
ifTrue: [
self error: 'Class should not be null for ', aName
].
self addVariable: aName asSymbol.
self compile: '%1 [ ^ %1 ]' % {aName}.
self compile: '%1OrDefault [ ^ %1 ifNil: [%1 := %2 createDefault.]]' % {aName. aClass}.
self Optional add: (aName asSymbol -> aClass).
]
GSM48MSG class >> isCompatible: classType msgType: messageType [
| localType |
"Ignore the base classes."
self isGSMBaseclass ifTrue: [^false].
localType := classType bitAnd: 16r0F.
^ (self classType = localType) and: [self messageType = messageType].
]
GSM48MSG class >> decode: aStream [
| classType messageType |
classType := aStream next.
messageType := aStream next bitAnd: 16r3F.
aStream skip: -2.
GSM48MSG allSubclassesDo: [:each |
(each isCompatible: classType msgType: messageType)
ifTrue: [
^ each parseFrom: aStream.
].
].
Exception signal: 'No one handles: ', classType asString,
' and: ', messageType asString.
]
GSM48MSG class >> parseFrom: aStream [
| res dat |
res := self new.
res ti: (aStream next bitShift: -4).
res seq: (aStream next bitShift: -6).
"This is messy. The GSM04.80 spec had the great idea of adding
tagged mandatory items and we need to deal with it here."
self Mandatory do: [:tuple |
| len name type clazz |
name := tuple key first.
type := tuple key second.
clazz := tuple value.
type = #tagged ifTrue: [
aStream next = clazz elementId ifFalse: [
^ self error: 'Mandatory Tagged Element %1 not present.' % {name->clazz}.
].
].
len := clazz length: aStream.
res instVarNamed: name put: (clazz parseFrom: aStream).
].
"We are done here if this class has no optional IEs"
(self respondsTo: #Optional)
ifFalse: [
^ res
].
"Types must appear in order"
self Optional do: [:each |
| tag |
"We have consumed everything"
aStream atEnd ifTrue: [
^ res
].
tag := aStream peek bitAnd: each value ieMask.
tag = each value elementId
ifTrue: [
| len |
len := each value length: aStream.
aStream skip: 1.
"treat the T only tags specially"
len = 0
ifTrue: [
res instVarNamed: each key
put: (each value initWithData: len).
]
ifFalse: [
res instVarNamed: each key
put: (each value parseFrom: aStream).
].
].
].
"TODO: Complain if we have not consumed everything"
aStream atEnd ifFalse: [
self error: 'Every byte should be consumed: "%1"' % {aStream}.
].
^ res
]
writeOn: aMsg [
| type classType |
type := self seq bitShift: 6.
type := type bitOr: self class messageType.
"Write the header. Skip Ind, Sequence are hardcoded"
classType := self ti bitShift: 4.
classType := classType bitOr: self class classType.
aMsg putByte: classType.
aMsg putByte: type.
"Write all Mandatory parts"
self class Mandatory do: [:tuple | | tmp |
tmp := self perform: tuple key first.
tuple key second = #tagged
ifTrue: [tmp writeOn: aMsg.]
ifFalse: [tmp writeOnDirect: aMsg.].
].
(self class respondsTo: #Optional)
ifFalse: [
^ 0
].
self class Optional do: [:each | | tmp |
tmp := self perform: each key.
tmp ifNotNil: [
tmp writeOn: aMsg.
].
].
"TODO: Handle the Conditionals too"
^ 0
]
seq: aSeq [
seq := aSeq.
]
seq [
^ seq ifNil: [ 0 ]
]
ti: aTi [
ti := aTi.
]
ti [
"by default treat it like a spare"
^ 0
]
type [
^ self class messageType
]
]
GSM48MSG subclass: GSM48MMMessage [
<category: 'OsmoGSM'>
<comment: 'Baseclass for mobility managamenet'>
GSM48MMMessage class >> isGSMBaseclass [ <category: 'factory'> ^ self = GSM48MMMessage ]
GSM48MMMessage class >> classType [ ^ 16r5 ]
GSM48MMMessage class >> msgLUAcc [ ^ 16r02 ]
GSM48MMMessage class >> msgLURej [ ^ 16r04 ]
GSM48MMMessage class >> msgLUReq [ ^ 16r08 ]
GSM48MMMessage class >> msgIdRes [ ^ 16r19 ]
GSM48MMMessage class >> msgIdReq [ ^ 16r18 ]
GSM48MMMessage class >> msgAuRej [ ^ 16r11 ]
2010-11-24 20:46:34 +00:00
GSM48MMMessage class >> msgAuReq [ ^ 16r12 ]
GSM48MMMessage class >> msgAuRes [ ^ 16r14 ]
GSM48MMMessage class >> msgCMAccept [ ^ 16r21 ]
GSM48MMMessage class >> msgCMReject [ ^ 16r22 ]
GSM48MMMessage class >> msgCMReq [ ^ 16r24 ]
GSM48MMMessage class >> msgIMSIDetach [ ^ 16r01 ]
]
GSM48MSG subclass: GSM48CCMessage [
<category: 'OsmoGSM'>
<comment: 'Baseclass for call control'>
GSM48CCMessage class >> isGSMBaseclass [ <category: 'factory'> ^ self = GSM48CCMessage ]
GSM48CCMessage class >> classType [ ^ 16r3 ]
2010-11-30 20:05:15 +00:00
GSM48CCMessage class >> msgAlerting [ ^ 16r1 ]
2010-11-30 20:05:15 +00:00
GSM48CCMessage class >> msgProceeding [ ^ 16r2 ]
GSM48CCMessage class >> msgSetup [ ^ 16r5 ]
2010-11-30 21:33:10 +00:00
GSM48CCMessage class >> msgConnect [ ^ 16r7 ]
GSM48CCMessage class >> msgConnectAck [ ^ 16rF ]
GSM48CCMessage class >> msgDisconnect [ ^ 16r25 ]
GSM48CCMessage class >> msgReleaseCompl [ ^ 16r2A ]
2010-12-01 09:31:02 +00:00
GSM48CCMessage class >> msgRelease [ ^ 16r2D ]
GSM48CCMessage class >> msgStatus [ ^ 16r3D ]
ti [
^ ti ifNil: [ 0 ]
]
]
GSM48MSG subclass: GSM48RRMessage [
<category: 'OsmoGSM'>
<comment: 'Baseclass for radio resource handling'>
GSM48RRMessage class >> isGSMBaseclass [ <category: 'factory'> ^ self = GSM48RRMessage ]
GSM48RRMessage class >> classType [ ^ 16r6 ]
GSM48RRMessage class >> msgInitRequest [ <category: 'channel est.'> ^ 2r00111100 ]
GSM48RRMessage class >> msgAddAssignment [ <category: 'channel est.'> ^ 2r00111011 ]
GSM48RRMessage class >> msgImmAssignment [ <category: 'channel est.'> ^ 2r00111111 ]
GSM48RRMessage class >> msgImmAssignmentExt [ <category: 'channel est.'> ^ 2r00111010 ]
GSM48RRMessage class >> msgCipherModeCommand [ <category: 'ciphering'> ^ 2r00110101 ]
GSM48RRMessage class >> msgCipherModeComplete [ <category: 'ciphering'> ^ 2r00110010 ]
GSM48RRMessage class >> msgConfigChangeCommand [ <category: 'config'> ^ 2r00110000 ]
GSM48RRMessage class >> msgConfigChangeAck [ <category: 'config'> ^ 2r00110001 ]
GSM48RRMessage class >> msgConfigChangeReject [ <category: 'config'> ^ 2r00110011 ]
GSM48RRMessage class >> msgAssignmentCommand [ <category: 'handover'> ^ 2r00101110 ]
GSM48RRMessage class >> msgAssignmentComplete [ <category: 'handover'> ^ 2r00101001 ]
GSM48RRMessage class >> msgAssignmentFailure [ <category: 'handover'> ^ 2r00101111 ]
GSM48RRMessage class >> msgHandoverCommand [ <category: 'handover'> ^ 2r00101011 ]
GSM48RRMessage class >> msgHandoverComplete [ <category: 'handover'> ^ 2r00101100 ]
GSM48RRMessage class >> msgHandoverFailure [ <category: 'handover'> ^ 2r00101101 ]
GSM48RRMessage class >> msgCellChangeOrder [ <category: 'misc'> ^ 2r00001000 ]
GSM48RRMessage class >> msgPdchAssignmentCommand [ <category: 'misc'> ^ 2r00100011 ]
GSM48RRMessage class >> msgChannelRelease [ <category: 'release'> ^ 2r00001101 ]
GSM48RRMessage class >> msgPartialRelease [ <category: 'release'> ^ 2r00001010 ]
GSM48RRMessage class >> msgPartialReleaseComplete [ <category: 'release'> ^ 2r00001111 ]
GSM48RRMessage class >> msgPagingRequestType1 [ <category: 'paging'> ^ 2r00100001 ]
GSM48RRMessage class >> msgPagingRequestType2 [ <category: 'paging'> ^ 2r00100010 ]
GSM48RRMessage class >> msgPagingRequestType3 [ <category: 'paging'> ^ 2r00100100 ]
GSM48RRMessage class >> msgPagingResponse [ <category: 'paging'> ^ 2r00100111 ]
GSM48RRMessage class >> msgNotificationNch [ <category: 'paging'> ^ 2r00100000 ]
GSM48RRMessage class >> msgNotificationFacch [ <category: 'paging'> ^ 2r00100101 ]
GSM48RRMessage class >> msgNotificationResponse [ <category: 'paging'> ^ 2r00100110 ]
GSM48RRMessage class >> msgSystemInformation8 [ <category: 'si'> ^ 2r00011000 ]
GSM48RRMessage class >> msgSystemInformation1 [ <category: 'si'> ^ 2r00011001 ]
GSM48RRMessage class >> msgSystemInformation2 [ <category: 'si'> ^ 2r00011010 ]
GSM48RRMessage class >> msgSystemInformation3 [ <category: 'si'> ^ 2r00011011 ]
GSM48RRMessage class >> msgSystemInformation4 [ <category: 'si'> ^ 2r00011100 ]
GSM48RRMessage class >> msgSystemInformation5 [ <category: 'si'> ^ 2r00011101 ]
GSM48RRMessage class >> msgSystemInformation6 [ <category: 'si'> ^ 2r00011110 ]
GSM48RRMessage class >> msgSystemInformation7 [ <category: 'si'> ^ 2r00011111 ]
GSM48RRMessage class >> msgSystemInformation2bis [ <category: 'si'> ^ 2r00000010 ]
GSM48RRMessage class >> msgSystemInformation2ter [ <category: 'si'> ^ 2r00000011 ]
GSM48RRMessage class >> msgSystemInformation5bis [ <category: 'si'> ^ 2r00000101 ]
GSM48RRMessage class >> msgSystemInformation5ter [ <category: 'si'> ^ 2r00000110 ]
GSM48RRMessage class >> msgSystemInformation9 [ <category: 'si'> ^ 2r00000100 ]
GSM48RRMessage class >> msgSystemInformation13 [ <category: 'si'> ^ 2r00000000 ]
GSM48RRMessage class >> msgSystemInformation16 [ <category: 'si'> ^ 2r00111101 ]
GSM48RRMessage class >> msgSystemInformation17 [ <category: 'si'> ^ 2r00111110 ]
GSM48RRMessage class >> msgChannelModeModify [ <category: 'misc'> ^ 2r00010000 ]
GSM48RRMessage class >> msgRRStatus [ <category: 'misc'> ^ 2r00010010 ]
GSM48RRMessage class >> msgChannelModeModifyAck [ <category: 'misc'> ^ 2r00010111 ]
GSM48RRMessage class >> msgFrequencyRedefinition [ <category: 'misc'> ^ 2r00010100 ]
GSM48RRMessage class >> msgMeasurementReport [ <category: 'misc'> ^ 2r00010101 ]
GSM48RRMessage class >> msgClassmarkChange [ <category: 'misc'> ^ 2r00010110 ]
GSM48RRMessage class >> msgClassmarkEnquiry [ <category: 'misc'> ^ 2r00010011 ]
GSM48RRMessage class >> msgExtendedMeasurementReport [ <category: 'misc'> ^ 2r00110110 ]
GSM48RRMessage class >> msgExtendedMeasurementOrder [ <category: 'misc'> ^ 2r00110111 ]
GSM48RRMessage class >> msgGPRSSuspensionRequest [ <category: 'misc'> ^ 2r00110100 ]
GSM48RRMessage class >> msgVGCSUplinkGrant [ <category: 'vgcs'> ^ 2r00001001 ]
GSM48RRMessage class >> msgUplinkRelease [ <category: 'vgcs'> ^ 2r00001110 ]
GSM48RRMessage class >> msgUplinkFree [ <category: 'vgcs'> ^ 2r00001100 ]
GSM48RRMessage class >> msgTalkerIndication [ <category: 'vgcs'> ^ 2r00010001 ]
GSM48RRMessage class >> msgApplicationInformation [ <category: 'app'> ^ 2r00111000 ]
]
2011-03-31 09:21:49 +00:00
GSM48MSG subclass: GSM48SSMessage [
<category: 'OsmoGSM'>
2011-03-31 09:21:49 +00:00
<comment: 'I am here for GSM 04.80 and supplementary services'>
GSM48SSMessage class >> isGSMBaseclass [ <category: 'factory'> ^ self = GSM48SSMessage ]
2011-03-31 09:21:49 +00:00
GSM48SSMessage class >> classType [ ^ 2r1011 ]
GSM48SSMessage class >> msgReleaseCompl [ ^ 2r101010 ]
GSM48SSMessage class >> msgFacility [ ^ 2r111010 ]
GSM48SSMessage class >> msgRegister [ ^ 2r111011 ]
ti [
^ ti ifNil: [ 0 ]
]
]
GSM48MMMessage subclass: GSM48LURequest [
<category: 'OsmoGSM'>
Mandatory := nil.
Optional := nil.
GSM48LURequest class >> messageType [ ^ self msgLUReq ]
GSM48LURequest class >> Mandatory [
^ Mandatory ifNil: [ Mandatory := OrderedCollection new ].
]
GSM48LURequest class >> Optional [
^ Optional ifNil: [ Optional := OrderedCollection new ].
]
GSM48LURequest class >> initialize [
self addMandatory: 'luType' with: GSM48KeySeqLuType.
self addMandatory: 'lai' with: GSM48Lai.
self addMandatory: 'cm1' with: GSM48Classmark1.
self addMandatory: 'mi' with: GSM48MIdentity.
]
]
GSM48MMMessage subclass: GSM48LUAccept [
<category: 'OsmoGSM'>
Mandatory := nil.
Optional := nil.
GSM48LUAccept class >> Mandatory [
^ Mandatory ifNil: [ Mandatory := OrderedCollection new ].
]
GSM48LUAccept class >> Optional [
^ Optional ifNil: [ Optional := OrderedCollection new ].
]
GSM48LUAccept class >> messageType [ ^ self msgLUAcc ]
GSM48LUAccept class >> initialize [
self addMandatory: 'cause' with: GSM48Lai.
self addOptional: 'mi' with: GSM48MIdentity.
self addOptional: 'follow' with: GSM48FollowOn.
self addOptional: 'cts' with: GSM48CTSPermission.
]
]
GSM48MMMessage subclass: GSM48LUReject [
<category: 'OsmoGSM'>
Mandatory := nil.
Optional := nil.
GSM48LUReject class >> messageType [ ^ self msgLURej ]
GSM48LUReject class >> Mandatory [
^ Mandatory ifNil: [ Mandatory := OrderedCollection new ].
]
GSM48LUReject class >> initialize [
self addMandatory: 'cause' with: GSM48RejectCause.
]
]
GSM48MMMessage subclass: GSM48AuthRej [
<category: 'OsmoGSM'>
Mandatory := nil.
Optional := nil.
GSM48AuthRej class >> messageType [ ^ self msgAuRej ]
GSM48AuthRej class >> Mandatory [
^ Mandatory ifNil: [ Mandatory := OrderedCollection new ].
]
]
GSM48MMMessage subclass: GSM48AuthReq [
<category: 'OsmoGSM'>
Mandatory := nil.
Optional := nil.
2010-11-24 20:46:34 +00:00
GSM48AuthReq class >> messageType [ ^ self msgAuReq ]
GSM48AuthReq class >> Mandatory [
^ Mandatory ifNil: [ Mandatory := OrderedCollection new ].
2010-11-24 20:46:34 +00:00
]
GSM48AuthReq class >> initialize [
self addMandatory: 'key' with: GSM48KeySeqLuType.
self addMandatory: 'auth' with: GSM48AuthRand.
2010-11-24 20:46:34 +00:00
]
]
GSM48MMMessage subclass: GSM48AuthResp [
<category: 'OsmoGSM'>
Mandatory := nil.
GSM48AuthResp class >> messageType [ ^ self msgAuRes ]
GSM48AuthResp class >> Mandatory [
^ Mandatory ifNil: [ Mandatory := OrderedCollection new ].
]
GSM48AuthResp class >> initialize [
self addMandatory: 'sres' with: GSM48AuthSRES.
]
]
GSM48MMMessage subclass: GSM48IdentityReq [
<category: 'OsmoGSM'>
Mandatory := nil.
GSM48IdentityReq class >> messageType [ ^ self msgIdReq ]
GSM48IdentityReq class >> Mandatory [
^ Mandatory ifNil: [ Mandatory := OrderedCollection new ].
]
GSM48IdentityReq class >> initialize [
self addMandatory: 'idType' with: GSM48IdentityType.
]
]
GSM48MMMessage subclass: GSM48IdentityResponse [
<category: 'OsmoGSM'>
2010-11-26 23:17:34 +00:00
Mandatory := nil.
GSM48IdentityResponse class >> messageType [ ^ self msgIdRes ]
GSM48IdentityResponse class >> Mandatory [
^ Mandatory ifNil: [ Mandatory := OrderedCollection new ].
2010-11-26 23:17:34 +00:00
]
GSM48IdentityResponse class >> initialize [
self addMandatory: 'mi' with: GSM48MIdentity.
2010-11-26 23:17:34 +00:00
]
]
GSM48MMMessage subclass: GSM48CMServiceReq [
<category: 'OsmoGSM'>
Mandatory := nil.
Optional := nil.
GSM48CMServiceReq class >> messageType [ ^ self msgCMReq ]
GSM48CMServiceReq class >> Mandatory [
^ Mandatory ifNil: [ Mandatory := OrderedCollection new ].
]
GSM48CMServiceReq class >> Optional [
^ Optional ifNil: [ Optional := OrderedCollection new ]
]
GSM48CMServiceReq class >> initialize [
self addMandatory: 'keyAndType' with: GSM48KeySeqLuType.
self addMandatory: 'cm2' with: GSM48Classmark2.
self addMandatory: 'mi' with: GSM48MIdentity.
self addOptional: 'prio' with: GSMPriorityLevel.
]
]
GSM48MMMessage subclass: GSM48CMServiceReject [
<category: 'OsmoGSM'>
Mandatory := nil.
GSM48CMServiceReject class >> messageType [ ^ self msgCMReject ]
GSM48CMServiceReject class >> Mandatory [
^ Mandatory ifNil: [ Mandatory := OrderedCollection new ]
]
GSM48CMServiceReject class >> initialize [
self addMandatory: 'reject' with: GSM48RejectCause.
]
]
GSM48MMMessage subclass: GSM48IMSIDetachInd [
<category: 'OsmoGSM'>
Mandatory := nil.
GSM48IMSIDetachInd class >> messageType [ ^ self msgIMSIDetach ]
GSM48IMSIDetachInd class >> Mandatory [
^ Mandatory ifNil: [ Mandatory := OrderedCollection new ].
]
GSM48IMSIDetachInd class >> initialize [
self addMandatory: 'cm1' with: GSM48Classmark1.
self addMandatory: 'mi' with: GSM48MIdentity.
]
]
GSM48CCMessage subclass: GSM48CCSetup [
<category: 'OsmoGSM'>
Mandatory := nil.
Optional := nil.
GSM48CCSetup class >> messageType [ ^ self msgSetup ]
GSM48CCSetup class >> Mandatory [
^ Mandatory ifNil: [ Mandatory := OrderedCollection new ].
]
GSM48CCSetup class >> Optional [
^ Optional ifNil: [ Optional := OrderedCollection new ]
]
GSM48CCSetup class >> initialize [
self addOptional: 'repeatInd' with: GSMRepeatInd.
self addOptional: 'bearer1' with: GSMBearerCap.
self addOptional: 'bearer2' with: GSMBearerCap.
self addOptional: 'facility' with: GSMFacility.
self addOptional: 'progress' with: GSMProgress.
self addOptional: 'signal' with: GSMSignal.
self addOptional: 'calling' with: GSMCallingBCDNumber.
self addOptional: 'callingSub' with: GSMCallingSubBCDNumber.
self addOptional: 'called' with: GSMCalledBCDNumber.
self addOptional: 'calledSub' with: GSMCalledSubBCDNumber.
self addOptional: 'redirect' with: GSMRedirectingBCDNumber.
self addOptional: 'redirectSub' with: GSMRedirectingSubBCDNumber.
self addOptional: 'LLCInd' with: GSMRepeatInd.
self addOptional: 'llc1' with: GSMLLCompability.
self addOptional: 'llc2' with: GSMLLCompability.
self addOptional: 'HLCInd' with: GSMRepeatInd.
self addOptional: 'hlc1' with: GSMHLCompability.
self addOptional: 'hlc2' with: GSMHLCompability.
self addOptional: 'useruser' with: GSMUserUser.
"For MO call"
self addOptional: 'ssVersion' with: GSMSSVersionInd.
self addOptional: 'clirSuppr' with: GSMClirSuppression.
self addOptional: 'clirInvoc' with: GSMClirInvocation.
self addOptional: 'ccCapabil' with: GSMCCCapabilities.
self addOptional: 'facilityCCBS' with: GSMFacility.
self addOptional: 'facilityReca' with: GSMFacility.
self addOptional: 'streamIdentifier' with: GSMStreamIdentifier.
self addOptional: 'supportedCodecs' with: GSMSupportedCodecs.
self addOptional: 'redial' with: GSMRedial.
"For MT call"
self addOptional: 'prio' with: GSMPriorityLevel.
self addOptional: 'alert' with: GSMAlertingPattern.
self addOptional: 'networkCallControlCaps' with: GSMNetworkCallControlCap.
self addOptional: 'causeNoCLI' with: GSMCauseNoCLI.
self addOptional: 'backupBearerCap' with: GSMBackupBearerCapability.
]
writeOn: aMsg [
"TODO: these are incomplete and wrong"
"Implement the conditionals"
(self bearer1 ~= nil and: [self bearer2 ~= nil])
ifTrue: [
self instVarNamed: #repeatInd put: GSMRepeatInd new.
]
ifFalse: [
self instVarNamed: #repeatInd put: nil.
].
(self llc1 ~= nil and: [self llc2 ~= nil])
ifTrue: [
self instVarNamed: #LLCInd put: GSMRepeatInd new.
]
ifFalse: [
self instVarNamed: #LLCInd put: nil.
].
(self hlc1 ~= nil and: [self hlc2 ~= nil])
ifTrue: [
self instVarNamed: #HLCInd put: GSMRepeatInd new.
]
ifFalse: [
self instVarNamed: #HLCInd put: nil.
].
^ super writeOn: aMsg.
]
]
2010-11-30 20:05:15 +00:00
GSM48CCMessage subclass: GSM48CCProceeding [
<category: 'OsmoGSM'>
2010-11-30 20:05:15 +00:00
Mandatory := nil.
2010-11-30 20:05:15 +00:00
Optional := nil.
GSM48CCProceeding class >> messageType [ ^ self msgProceeding ]
GSM48CCProceeding class >> Mandatory [
^ Mandatory ifNil: [ Mandatory := OrderedCollection new ]
2010-11-30 20:05:15 +00:00
]
GSM48CCProceeding class >> Optional [
^ Optional ifNil: [ Optional := OrderedCollection new ]
]
GSM48CCProceeding class >> initialize [
self addOptional: 'repeatInd' with: GSMRepeatInd.
self addOptional: 'bearer1' with: GSMBearerCap.
self addOptional: 'bearer2' with: GSMBearerCap.
self addOptional: 'facility' with: GSMFacility.
self addOptional: 'progress' with: GSMProgress.
self addOptional: 'priorityGranted' with: GSMPriorityLevel.
self addOptional: 'networkCallControlCaps' with: GSMNetworkCallControlCap.
2010-11-30 20:05:15 +00:00
]
writeOn: aMsg [
(self bearer1 ~= nil and: [self bearer2 ~= nil])
ifTrue: [
self instVarNamed: #repeatInd put: GSMRepeatInd new.
]
ifFalse: [
self instVarNamed: #repeatInd put: nil.
].
^ super writeOn: aMsg.
]
]
GSM48CCMessage subclass: GSM48CCAlerting [
<category: 'OsmoGSM'>
Mandatory := nil.
Optional := nil.
GSM48CCAlerting class >> messageType [ ^ self msgAlerting ]
GSM48CCAlerting class >> Mandatory [
^ Mandatory ifNil: [ Mandatory := OrderedCollection new ]
]
GSM48CCAlerting class >> Optional [
^ Optional ifNil: [ Optional := OrderedCollection new ]
]
GSM48CCAlerting class >> initialize [
self addOptional: 'facility' with: GSMFacility.
self addOptional: 'progress' with: GSMProgress.
self addOptional: 'useruser' with: GSMUserUser.
"mobile station to network"
self addOptional: 'ssVersion' with: GSMSSVersionInd.
]
]
2010-11-30 21:33:10 +00:00
GSM48CCMessage subclass: GSM48CCConnect [
<category: 'OsmoGSM'>
2010-11-30 21:33:10 +00:00
Mandatory := nil.
2010-11-30 21:33:10 +00:00
Optional := nil.
GSM48CCConnect class >> messageType [ ^ self msgConnect ]
GSM48CCConnect class >> Mandatory [
^ Mandatory ifNil: [ Mandatory := OrderedCollection new. ]
2010-11-30 21:33:10 +00:00
]
GSM48CCConnect class >> Optional [
^ Optional ifNil: [ Optional := OrderedCollection new. ]
]
GSM48CCConnect class >> initialize [
self addOptional: 'facility' with: GSMFacility.
self addOptional: 'progress' with: GSMProgress.
self addOptional: 'connected' with: GSMConnectedNumber.
self addOptional: 'connectedSub' with: GSMConnectedSubNumber.
self addOptional: 'useruser' with: GSMUserUser.
self addOptional: 'ssVersion' with: GSMSSVersionInd.
self addOptional: 'streamIdentifier' with: GSMStreamIdentifier.
2010-11-30 21:33:10 +00:00
]
]
GSM48CCMessage subclass: GSM48CCConnectAck [
<category: 'OsmoGSM'>
Optional := nil.
Mandatory := nil.
GSM48CCConnectAck class >> messageType [ ^ self msgConnectAck ]
GSM48CCConnectAck class >> Mandatory [
^ Mandatory ifNil: [ Mandatory := OrderedCollection new. ]
]
GSM48CCConnectAck class >> Optional [
^ Optional ifNil: [ Optional := OrderedCollection new. ]
]
GSM48CCConnectAck class >> initialize [
]
]
GSM48CCMessage subclass: GSM48CCDisconnect [
<category: 'OsmoGSM'>
Optional := nil.
Mandatory := nil.
GSM48CCDisconnect class >> messageType [ ^ self msgDisconnect ]
GSM48CCDisconnect class >> Mandatory [
^ Mandatory ifNil: [ Mandatory := OrderedCollection new. ]
]
GSM48CCDisconnect class >> Optional [
^ Optional ifNil: [ Optional := OrderedCollection new. ]
]
GSM48CCDisconnect class >> initialize [
self addMandatory: 'cause' with: GSM48Cause.
self addOptional: 'facility' with: GSMFacility.
self addOptional: 'progress' with: GSMProgress.
self addOptional: 'useruser' with: GSMUserUser.
self addOptional: 'allowedActions' with: GSMAllowedActions.
"MO addition"
self addOptional: 'ssVersion' with: GSMSSVersionInd.
]
]
2010-12-01 09:31:02 +00:00
GSM48CCMessage subclass: GSM48CCRelease [
<category: 'OsmoGSM'>
2010-12-01 09:31:02 +00:00
Optional := nil.
Mandatory := nil.
2010-12-01 09:31:02 +00:00
GSM48CCRelease class >> messageType [ ^ self msgRelease ]
GSM48CCRelease class >> Mandatory [
^ Mandatory ifNil: [ Mandatory := OrderedCollection new ]
2010-12-01 09:31:02 +00:00
]
GSM48CCRelease class >> Optional [
^ Optional ifNil: [ Optional := OrderedCollection new ]
]
GSM48CCRelease class >> initialize [
self addOptional: 'cause' with: GSM48Cause.
self addOptional: 'secondCause' with: GSM48Cause.
self addOptional: 'facility' with: GSMFacility.
self addOptional: 'useruser' with: GSMUserUser.
self addOptional: 'ssVersion' with: GSMSSVersionInd.
]
]
GSM48CCMessage subclass: GSM48CCReleaseCompl [
<category: 'OsmoGSM'>
Optional := nil.
Mandatory := nil.
GSM48CCReleaseCompl class >> messageType [ ^ self msgReleaseCompl ]
GSM48CCReleaseCompl class >> Mandatory [
^ Mandatory ifNil: [ Mandatory := OrderedCollection new ]
]
GSM48CCReleaseCompl class >> Optional [
^ Optional ifNil: [ Optional := OrderedCollection new ]
]
GSM48CCReleaseCompl class >> initialize [
self addOptional: 'cause' with: GSM48Cause.
self addOptional: 'facility' with: GSMFacility.
self addOptional: 'useruser' with: GSMUserUser.
self addOptional: 'ssVersion' with: GSMSSVersionInd.
]
]
GSM48CCMessage subclass: GSM48CCStatus [
<category: 'OsmoGSM'>
Optional := nil.
Mandatory := nil.
GSM48CCStatus class >> messageType [ ^ self msgStatus ]
GSM48CCStatus class >> Mandatory [
^ Mandatory ifNil: [Mandatory := OrderedCollection new]
]
GSM48CCStatus class >> Optional [
^ Optional ifNil: [Optional := OrderedCollection new]
]
GSM48CCStatus class >> initialize [
self addMandatory: 'cause' with: GSM48Cause.
self addMandatory: 'callState' with: GSM48Callstate.
self addOptional: 'auxStates' with: GSM48AuxillaryStates.
]
]
GSM48RRMessage subclass: GSM48RRAssignmentComplete [
<category: 'OsmoGSM'>
Optional := nil.
Mandatory := nil.
GSM48RRAssignmentComplete class >> messageType [
<category: 'factory'>
^ self msgAssignmentComplete
]
GSM48RRAssignmentComplete class >> Mandatory [
^ Mandatory ifNil: [ Mandatory := OrderedCollection new ]
]
GSM48RRAssignmentComplete class >> Optional [
^ Optional ifNil: [ Optional := OrderedCollection new ]
]
GSM48RRAssignmentComplete class >> initialize [
self addMandatory: 'cause' with: GSMRRCause.
]
]
2011-03-31 09:21:49 +00:00
GSM48SSMessage subclass: GSM48SSFacility [
<category: 'OsmoGSM'>
2011-03-31 09:21:49 +00:00
Optional := nil.
Mandatory := nil.
2011-03-31 09:21:49 +00:00
GSM48SSFacility class >> messageType [ ^ self msgFacility ]
GSM48SSFacility class >> Mandatory [
^ Mandatory ifNil: [ Mandatory := OrderedCollection new ]
2011-03-31 09:21:49 +00:00
]
GSM48SSFacility class >> Optional [
^ Optional ifNil: [ Optional := OrderedCollection new ]
]
GSM48SSFacility class >> initialize [
self addMandatory: 'facility' with: GSMFacility.
2011-03-31 09:21:49 +00:00
]
]
GSM48SSMessage subclass: GSM48SSRegister [
<category: 'OsmoGSM'>
2011-03-31 09:21:49 +00:00
Optional := nil.
Mandatory := nil.
2011-03-31 09:21:49 +00:00
GSM48SSRegister class >> messageType [ ^ self msgRegister ]
GSM48SSRegister class >> Mandatory [
^ Mandatory ifNil: [ Mandatory := OrderedCollection new ]
2011-03-31 09:21:49 +00:00
]
GSM48SSRegister class >> Optional [
^ Optional ifNil: [ Optional := OrderedCollection new ]
]
GSM48SSRegister class >> initialize [
self addTaggedMandatory: 'facility' with: GSMFacility.
2011-03-31 09:21:49 +00:00
"MS to mobile can contain this one"
self addOptional: 'ssVersion' with: GSMSSVersionInd.
]
]
GSM48SSMessage subclass: GSM48SSReleaseComplete [
<category: 'OsmoGSM'>
2011-03-31 09:21:49 +00:00
Optional := nil.
Mandatory := nil.
2011-03-31 09:21:49 +00:00
GSM48SSReleaseComplete class >> messageType [ ^ self msgReleaseCompl ]
GSM48SSReleaseComplete class >> Mandatory [
^ Mandatory ifNil: [ Mandatory := OrderedCollection new ]
2011-03-31 09:21:49 +00:00
]
GSM48SSReleaseComplete class >> Optional [
^ Optional ifNil: [ Optional := OrderedCollection new ]
]
GSM48SSReleaseComplete class >> initialize [
self addOptional: 'cause' with: GSM48Cause.
self addOptional: 'facility' with: GSMFacility.
]
]
Eval [
GSM48LURequest initialize.
GSM48LUReject initialize.
GSM48LUAccept initialize.
GSM48AuthReq initialize.
GSM48AuthResp initialize.
GSM48IdentityReq initialize.
GSM48IdentityResponse initialize.
GSM48CMServiceReq initialize.
GSM48CMServiceReject initialize.
GSM48IMSIDetachInd initialize.
GSM48CCSetup initialize.
2010-11-30 20:05:15 +00:00
GSM48CCProceeding initialize.
GSM48CCAlerting initialize.
2010-11-30 21:33:10 +00:00
GSM48CCConnect initialize.
GSM48CCConnectAck initialize.
GSM48CCDisconnect initialize.
2010-12-01 09:31:02 +00:00
GSM48CCRelease initialize.
GSM48CCReleaseCompl initialize.
GSM48CCStatus initialize.
2011-03-31 09:21:49 +00:00
GSM48RRAssignmentComplete initialize.
2011-03-31 09:21:49 +00:00
GSM48SSFacility initialize.
GSM48SSRegister initialize.
GSM48SSReleaseComplete initialize.
"single parts of the IEs"
GSMBearerCapOctet3 initialize.
GSMBearerCapOctet3a initialize.
GSMBearerCapOctet3b initialize.
]