1
// *************************************************************************
6
// * Purpose: Cell Broadcast Message Implementation
8
// * Author: Peter Hofmann (software@pxh.de)
10
// * Created: 4.8.2001
11
// *************************************************************************
14
#include <gsm_config.h>
17
#include <gsmlib/gsm_nls.h>
21
using namespace gsmlib;
25
static const string dashes =
26
"---------------------------------------------------------------------------";
28
// CBDataCodingScheme members
30
CBDataCodingScheme::CBDataCodingScheme(unsigned char dcs) : _dcs(dcs)
32
if ((_dcs & 0xf0) <= 0x30) // bits 7..4 in the range 0000..0011
33
if ((_dcs & 0x30) == 0)
34
_language = (Language)_dcs;
39
string CBDataCodingScheme::toString() const
42
if (compressed()) result += _("compressed ");
43
switch (getLanguage())
46
result += _("German");
49
result += _("English");
52
result += _("Italian");
55
result += _("French");
58
result += _("Spanish");
64
result += _("Swedish");
67
result += _("Danish");
70
result += _("Portuguese");
73
result += _("Finnish");
76
result += _("Norwegian");
82
result += _("Turkish");
86
switch (getAlphabet())
88
case DCS_DEFAULT_ALPHABET:
89
result += _("default alphabet");
91
case DCS_EIGHT_BIT_ALPHABET:
92
result += _("8-bit alphabet");
94
case DCS_SIXTEEN_BIT_ALPHABET:
95
result += _("16-bit alphabet");
97
case DCS_RESERVED_ALPHABET:
98
result += _("reserved alphabet");
106
CBMessage::CBMessage(string pdu) throw(GsmException)
109
_messageCode = d.getInteger(6) << 4;
110
_geographicalScope = (GeographicalScope)d.get2Bits();
111
_updateNumber = d.getInteger(4);
112
_messageCode |= d.getInteger(4);
113
_messageIdentifier = d.getInteger(8) << 8;
114
_messageIdentifier |= d.getInteger(8);
115
_dataCodingScheme = CBDataCodingScheme(d.getOctet());
116
_totalPageNumber = d.getInteger(4);
117
_currentPageNumber = d.getInteger(4);
119
// the values 82 and 93 come from ETSI GSM 03.41, section 9.3
121
if (_dataCodingScheme.getAlphabet() == DCS_DEFAULT_ALPHABET)
123
_data = d.getString(93);
124
_data = gsmToLatin1(_data);
129
(unsigned char*)alloca(sizeof(unsigned char) * 82);
131
_data.assign((char*)s, (unsigned int)82);
135
string CBMessage::toString() const
139
<< _("Message type: CB") << endl
140
<< _("Geographical scope: ");
141
switch (_geographicalScope)
144
os << "Cell wide" << endl;
147
os << "PLMN wide" << endl;
149
case LocationAreaWide:
150
os << "Location area wide" << endl;
153
os << "Cell wide (2)" << endl;
156
// remove trailing \r characters for output
159
for (i = data.end(); i > data.begin() && *(i - 1) == '\r';
161
data.erase(i, data.end());
163
os << _("Message Code: ") << _messageCode << endl
164
<< _("Update Number: ") << _updateNumber << endl
165
<< _("Message Identifer: ") << _messageIdentifier << endl
166
<< _("Data coding scheme: ") << _dataCodingScheme.toString() << endl
167
<< _("Total page number: ") << _totalPageNumber << endl
168
<< _("Current page number: ") << _currentPageNumber << endl
169
<< _("Data: '") << data << "'" << endl
170
<< dashes << endl << endl << ends;