~ubuntu-branches/ubuntu/intrepid/gsmlib/intrepid

« back to all changes in this revision

Viewing changes to gsmlib/gsm_cb.cc

  • Committer: Bazaar Package Importer
  • Author(s): Mikael Hedin
  • Date: 2002-01-24 12:59:07 UTC
  • Revision ID: james.westby@ubuntu.com-20020124125907-b7qkpokx5283jdpu
Tags: upstream-1.8
ImportĀ upstreamĀ versionĀ 1.8

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// *************************************************************************
 
2
// * GSM TA/ME library
 
3
// *
 
4
// * File:    gsm_cb.cc
 
5
// *
 
6
// * Purpose: Cell Broadcast Message Implementation
 
7
// *
 
8
// * Author:  Peter Hofmann (software@pxh.de)
 
9
// *
 
10
// * Created: 4.8.2001
 
11
// *************************************************************************
 
12
 
 
13
#ifdef HAVE_CONFIG_H
 
14
#include <gsm_config.h>
 
15
#endif
 
16
#include <gsm_cb.h>
 
17
#include <gsmlib/gsm_nls.h>
 
18
#include <strstream>
 
19
 
 
20
using namespace std;
 
21
using namespace gsmlib;
 
22
 
 
23
// local constants
 
24
 
 
25
static const string dashes =
 
26
"---------------------------------------------------------------------------";
 
27
 
 
28
// CBDataCodingScheme members
 
29
 
 
30
CBDataCodingScheme::CBDataCodingScheme(unsigned char dcs) : _dcs(dcs)
 
31
{
 
32
  if ((_dcs & 0xf0) <= 0x30)    // bits 7..4 in the range 0000..0011
 
33
    if ((_dcs & 0x30) == 0)
 
34
      _language = (Language)_dcs;
 
35
  else
 
36
    _language = Unknown;
 
37
}
 
38
 
 
39
string CBDataCodingScheme::toString() const
 
40
{
 
41
  string result;
 
42
  if (compressed()) result += _("compressed   ");
 
43
  switch (getLanguage())
 
44
  {
 
45
  case German:
 
46
    result += _("German");
 
47
    break;
 
48
  case English:
 
49
    result += _("English");
 
50
    break;
 
51
  case Italian:
 
52
    result += _("Italian");
 
53
    break;
 
54
  case French:
 
55
    result += _("French");
 
56
    break;
 
57
  case Spanish:
 
58
    result += _("Spanish");
 
59
    break;
 
60
  case Dutch:
 
61
    result += _("Dutch");
 
62
    break;
 
63
  case Swedish:
 
64
    result += _("Swedish");
 
65
    break;
 
66
  case Danish:
 
67
    result += _("Danish");
 
68
    break;
 
69
  case Portuguese:
 
70
    result += _("Portuguese");
 
71
    break;
 
72
  case Finnish:
 
73
    result += _("Finnish");
 
74
    break;
 
75
  case Norwegian:
 
76
    result += _("Norwegian");
 
77
    break;
 
78
  case Greek:
 
79
    result += _("Greek");
 
80
    break;
 
81
  case Turkish:
 
82
    result += _("Turkish");
 
83
    break;
 
84
  }
 
85
  result += "   ";
 
86
  switch (getAlphabet())
 
87
  {
 
88
  case DCS_DEFAULT_ALPHABET:
 
89
    result += _("default alphabet");
 
90
    break;
 
91
  case DCS_EIGHT_BIT_ALPHABET:
 
92
    result += _("8-bit alphabet");
 
93
      break;
 
94
  case DCS_SIXTEEN_BIT_ALPHABET:
 
95
    result += _("16-bit alphabet");
 
96
    break;
 
97
  case DCS_RESERVED_ALPHABET:
 
98
    result += _("reserved alphabet");
 
99
    break;
 
100
  }
 
101
  return result;
 
102
}
 
103
 
 
104
// CBMessage members
 
105
 
 
106
CBMessage::CBMessage(string pdu) throw(GsmException)
 
107
{
 
108
  SMSDecoder d(pdu);
 
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);
 
118
 
 
119
  // the values 82 and 93 come from ETSI GSM 03.41, section 9.3
 
120
  d.markSeptet();
 
121
  if (_dataCodingScheme.getAlphabet() == DCS_DEFAULT_ALPHABET)
 
122
  {
 
123
    _data = d.getString(93);
 
124
    _data = gsmToLatin1(_data);
 
125
  }
 
126
  else
 
127
  {
 
128
    unsigned char *s = 
 
129
      (unsigned char*)alloca(sizeof(unsigned char) * 82);
 
130
    d.getOctets(s, 82);
 
131
    _data.assign((char*)s, (unsigned int)82);
 
132
  }
 
133
}
 
134
 
 
135
string CBMessage::toString() const
 
136
{
 
137
  ostrstream os;
 
138
  os << dashes << endl
 
139
     << _("Message type: CB") << endl
 
140
     << _("Geographical scope: ");
 
141
  switch (_geographicalScope)
 
142
  {
 
143
  case CellWide:
 
144
    os << "Cell wide" << endl;
 
145
    break;
 
146
  case PLMNWide:
 
147
    os << "PLMN wide" << endl;
 
148
    break;
 
149
  case LocationAreaWide:
 
150
    os << "Location area wide" << endl;
 
151
    break;
 
152
  case CellWide2:
 
153
    os << "Cell wide (2)" << endl;
 
154
    break;
 
155
  }
 
156
  // remove trailing \r characters for output
 
157
  string data = _data;
 
158
  string::iterator i;
 
159
  for (i = data.end(); i > data.begin() && *(i - 1) == '\r';
 
160
       --i);
 
161
  data.erase(i, data.end());
 
162
 
 
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;
 
171
  char *ss = os.str();
 
172
  string result(ss);
 
173
  delete[] ss;
 
174
  return result;
 
175
}