1
// *************************************************************************
6
// * Purpose: SMS functions
9
// * Author: Peter Hofmann (software@pxh.de)
11
// * Created: 16.5.1999
12
// *************************************************************************
15
#include <gsm_config.h>
17
#include <gsmlib/gsm_nls.h>
18
#include <gsmlib/gsm_sysdep.h>
19
#include <gsmlib/gsm_sms.h>
20
#include <gsmlib/gsm_util.h>
21
#include <gsmlib/gsm_parser.h>
22
#include <gsmlib/gsm_me_ta.h>
27
using namespace gsmlib;
31
static const string dashes =
32
"---------------------------------------------------------------------------";
36
Ref<SMSMessage> SMSMessage::decode(string pdu,
38
GsmAt *at) throw(GsmException)
40
Ref<SMSMessage> result;
43
MessageType messageTypeIndicator = (MessageType)d.get2Bits(); // bits 0..1
45
// TPDUs from SC to ME
46
switch (messageTypeIndicator)
49
result = new SMSDeliverMessage(pdu);
52
case SMS_STATUS_REPORT:
53
result = new SMSStatusReportMessage(pdu);
56
case SMS_SUBMIT_REPORT:
57
// observed with Motorola Timeport 260, the SCtoMEdirection can
58
// be wrong in this case
59
if (at != NULL && at->getMeTa().getCapabilities()._wrongSMSStatusCode)
60
result = new SMSSubmitMessage(pdu);
62
result = new SMSSubmitReportMessage(pdu);
66
throw GsmException(_("unhandled SMS TPDU type"), OtherError);
69
// TPDUs from ME to SC
70
switch (messageTypeIndicator)
73
result = new SMSSubmitMessage(pdu);
76
case SMS_DELIVER_REPORT:
77
result = new SMSDeliverReportMessage(pdu);
81
result = new SMSCommandMessage(pdu);
85
throw GsmException(_("unhandled SMS TPDU type"), OtherError);
91
Ref<SMSMessage> SMSMessage::decode(istream& s) throw(gsmlib::GsmException)
99
return decode(pdu,ScToMe=='S');
102
unsigned char SMSMessage::send(Ref<SMSMessage> &ackPdu)
105
if (_messageTypeIndicator != SMS_SUBMIT &&
106
_messageTypeIndicator != SMS_COMMAND)
107
throw GsmException(_("can only send SMS-SUBMIT and SMS-COMMAND TPDUs"),
111
throw GsmException(_("no device given for sending SMS"), ParameterError);
113
string pdu = encode();
114
Parser p(_at->sendPdu("+CMGS=" +
115
intToStr(pdu.length() / 2 - getSCAddressLen()),
117
unsigned char messageReference = p.parseInt();
119
if (p.parseComma(true))
121
string pdu = p.parseEol();
123
// add missing service centre address if required by ME
124
if (! _at->getMeTa().getCapabilities()._hasSMSSCAprefix)
127
ackPdu = SMSMessage::decode(pdu);
130
ackPdu = SMSMessageRef();
132
return messageReference;
135
unsigned char SMSMessage::send() throw(GsmException)
141
unsigned int SMSMessage::getSCAddressLen()
144
e.setAddress(_serviceCentreAddress, true);
145
return e.getLength();
148
unsigned char SMSMessage::userDataLength() const
150
unsigned int udhl = _userDataHeader.length();
151
if (_dataCodingScheme.getAlphabet() == DCS_DEFAULT_ALPHABET)
152
return _userData.length() + (udhl ? ((1 + udhl) * 8 + 6) / 7 : 0);
154
return _userData.length() + (udhl ? (1 + udhl) : 0);
157
ostream& SMSMessage::operator<<(ostream& s)
159
unsigned char ScToMe;
161
if (dynamic_cast<SMSDeliverMessage*>(this) ||
162
dynamic_cast<SMSStatusReportMessage*>(this) ||
163
dynamic_cast<SMSSubmitReportMessage*>(this))
167
else if (dynamic_cast<SMSSubmitMessage*>(this) ||
168
dynamic_cast<SMSCommandMessage*>(this) ||
169
dynamic_cast<SMSDeliverReportMessage*>(this))
175
throw GsmException(_("unhandled SMS TPDU type"), OtherError);
179
return s << encode();
182
// SMSMessage::SMSMessage(SMSMessage &m)
188
// SMSMessage &SMSMessage::operator=(SMSMessage &m)
192
SMSMessage::~SMSMessage() {}
194
// SMSDeliverMessage members
196
void SMSDeliverMessage::init()
198
_messageTypeIndicator = SMS_DELIVER;
199
_moreMessagesToSend = false;
201
_statusReportIndication = false;
202
_protocolIdentifier = 0;
205
SMSDeliverMessage::SMSDeliverMessage()
210
SMSDeliverMessage::SMSDeliverMessage(string pdu) throw(GsmException)
213
_serviceCentreAddress = d.getAddress(true);
214
_messageTypeIndicator = (MessageType)d.get2Bits(); // bits 0..1
215
assert(_messageTypeIndicator == SMS_DELIVER);
216
_moreMessagesToSend = d.getBit(); // bit 2
219
_statusReportIndication = d.getBit(); // bit 5
220
bool userDataHeaderIndicator = d.getBit(); // bit 6
221
_replyPath = d.getBit(); // bit 7
222
_originatingAddress = d.getAddress();
223
_protocolIdentifier = d.getOctet();
224
_dataCodingScheme = d.getOctet();
225
_serviceCentreTimestamp = d.getTimestamp();
226
unsigned char userDataLength = d.getOctet();
229
if (userDataHeaderIndicator)
231
_userDataHeader.decode(d);
232
if (_dataCodingScheme.getAlphabet() == DCS_DEFAULT_ALPHABET)
233
userDataLength -= ((_userDataHeader.length() + 1) * 8 + 6) / 7;
235
userDataLength -= ((string)_userDataHeader).length() + 1;
238
_userDataHeader = UserDataHeader();
240
if (_dataCodingScheme.getAlphabet() == DCS_DEFAULT_ALPHABET)
241
{ // userDataLength is length in septets
242
_userData = d.getString(userDataLength);
243
_userData = gsmToLatin1(_userData);
246
{ // userDataLength is length in octets
248
(unsigned char*)alloca(sizeof(unsigned char) * userDataLength);
249
d.getOctets(s, userDataLength);
250
_userData.assign((char*)s, (unsigned int)userDataLength);
254
string SMSDeliverMessage::encode()
257
e.setAddress(_serviceCentreAddress, true);
258
e.set2Bits(_messageTypeIndicator); // bits 0..1
259
e.setBit(_moreMessagesToSend); // bit 2
262
e.setBit(_statusReportIndication); // bit 5
263
e.setBit(_userDataHeader.length() != 0); // bit 6
264
e.setBit(_replyPath); // bit 7
265
e.setAddress(_originatingAddress);
266
e.setOctet(_protocolIdentifier);
267
e.setOctet(_dataCodingScheme);
268
e.setTimestamp(_serviceCentreTimestamp);
269
e.setOctet(userDataLength());
271
if (_userDataHeader.length()) _userDataHeader.encode(e);
272
if (_dataCodingScheme.getAlphabet() == DCS_DEFAULT_ALPHABET)
273
e.setString(latin1ToGsm(_userData));
275
e.setOctets((unsigned char*)_userData.data(), _userData.length());
276
return e.getHexString();
279
string SMSDeliverMessage::toString() const
283
<< _("Message type: SMS-DELIVER") << endl
284
<< _("SC address: '") << _serviceCentreAddress._number << "'" << endl
285
<< _("More messages to send: ") << _moreMessagesToSend << endl
286
<< _("Reply path: ") << _replyPath << endl
287
<< _("User data header indicator: ")
288
<< (_userDataHeader.length()!=0) << endl
289
<< _("Status report indication: ") << _statusReportIndication << endl
290
<< _("Originating address: '") << _originatingAddress._number
292
<< _("Protocol identifier: 0x") << hex
293
<< (unsigned int)_protocolIdentifier << dec << endl
294
<< _("Data coding scheme: ") << _dataCodingScheme.toString() << endl
295
<< _("SC timestamp: ") << _serviceCentreTimestamp.toString() << endl
296
<< _("User data length: ") << (int)userDataLength() << endl
297
<< _("User data header: 0x")
298
<< bufToHex((unsigned char*)
299
((string)_userDataHeader).data(),
300
((string)_userDataHeader).length())
302
<< _("User data: '") << _userData << "'" << endl
303
<< dashes << endl << endl
311
Address SMSDeliverMessage::address() const
313
return _originatingAddress;
316
Ref<SMSMessage> SMSDeliverMessage::clone()
318
Ref<SMSMessage> result = new SMSDeliverMessage(*this);
322
// SMSSubmitMessage members
324
void SMSSubmitMessage::init()
326
// set everything to sensible default values
327
_messageTypeIndicator = SMS_SUBMIT;
328
_validityPeriodFormat = TimePeriod::Relative;
329
_validityPeriod._format = TimePeriod::Relative;
330
_validityPeriod._relativeTime = 168; // 2 days
331
_statusReportRequest = false;
333
_rejectDuplicates = true;
334
_messageReference = 0;
335
_protocolIdentifier = 0;
338
SMSSubmitMessage::SMSSubmitMessage()
343
SMSSubmitMessage::SMSSubmitMessage(string pdu) throw(GsmException)
346
_serviceCentreAddress = d.getAddress(true);
347
_messageTypeIndicator = (MessageType)d.get2Bits(); // bits 0..1
348
assert(_messageTypeIndicator == SMS_SUBMIT);
349
_rejectDuplicates = d.getBit(); // bit 2
350
_validityPeriodFormat = (TimePeriod::Format)d.get2Bits(); // bits 3..4
351
_statusReportRequest = d.getBit(); // bit 5
352
bool userDataHeaderIndicator = d.getBit(); // bit 6
353
_replyPath = d.getBit(); // bit 7
354
_messageReference = d.getOctet();
355
_destinationAddress = d.getAddress();
356
_protocolIdentifier = d.getOctet();
357
_dataCodingScheme = d.getOctet();
358
if (_validityPeriodFormat != TimePeriod::NotPresent)
359
_validityPeriod = d.getTimePeriod(_validityPeriodFormat);
360
unsigned char userDataLength = d.getOctet();
363
if (userDataHeaderIndicator)
365
_userDataHeader.decode(d);
366
if (_dataCodingScheme.getAlphabet() == DCS_DEFAULT_ALPHABET)
367
userDataLength -= ((_userDataHeader.length() + 1) * 8 + 6) / 7;
369
userDataLength -= ((string)_userDataHeader).length() + 1;
372
_userDataHeader = UserDataHeader();
374
if (_dataCodingScheme.getAlphabet() == DCS_DEFAULT_ALPHABET)
375
{ // userDataLength is length in septets
376
_userData = d.getString(userDataLength);
377
_userData = gsmToLatin1(_userData);
380
{ // _userDataLength is length in octets
382
(unsigned char*)alloca(sizeof(unsigned char) * userDataLength);
383
d.getOctets(s, userDataLength);
384
_userData.assign((char*)s, userDataLength);
388
SMSSubmitMessage::SMSSubmitMessage(string text, string number)
391
_destinationAddress = Address(number);
395
string SMSSubmitMessage::encode()
398
e.setAddress(_serviceCentreAddress, true);
399
e.set2Bits(_messageTypeIndicator); // bits 0..1
400
e.setBit(_rejectDuplicates); // bit 2
401
e.set2Bits(_validityPeriodFormat); // bits 3..4
402
e.setBit(_statusReportRequest); // bit 5
403
bool userDataHeaderIndicator = _userDataHeader.length() != 0;
404
e.setBit(userDataHeaderIndicator); // bit 6
405
e.setBit(_replyPath); // bit 7
406
e.setOctet(_messageReference);
407
e.setAddress(_destinationAddress);
408
e.setOctet(_protocolIdentifier);
409
e.setOctet(_dataCodingScheme);
410
e.setTimePeriod(_validityPeriod);
411
e.setOctet(userDataLength());
413
if (userDataHeaderIndicator) _userDataHeader.encode(e);
414
if (_dataCodingScheme.getAlphabet() == DCS_DEFAULT_ALPHABET)
415
e.setString(latin1ToGsm(_userData));
417
e.setOctets((unsigned char*)_userData.data(), _userData.length());
418
return e.getHexString();
421
string SMSSubmitMessage::toString() const
425
<< _("Message type: SMS-SUBMIT") << endl
426
<< _("SC address: '") << _serviceCentreAddress._number << "'" << endl
427
<< _("Reject duplicates: ") << _rejectDuplicates << endl
428
<< _("Validity period format: ");
429
switch (_validityPeriodFormat)
431
case TimePeriod::NotPresent:
432
os << _("not present");
434
case TimePeriod::Relative:
437
case TimePeriod::Absolute:
445
<< _("Reply path: ") << _replyPath << endl
446
<< _("User data header indicator: ")
447
<< (_userDataHeader.length()!=0) << endl
448
<< _("Status report request: ") << _statusReportRequest << endl
449
<< _("Message reference: ") << (unsigned int)_messageReference << endl
450
<< _("Destination address: '") << _destinationAddress._number
452
<< _("Protocol identifier: 0x") << hex
453
<< (unsigned int)_protocolIdentifier << dec << endl
454
<< _("Data coding scheme: ") << _dataCodingScheme.toString() << endl
455
<< _("Validity period: ") << _validityPeriod.toString() << endl
456
<< _("User data length: ") << (int)userDataLength() << endl
457
<< _("User data header: 0x") << bufToHex((unsigned char*)
458
((string)_userDataHeader).data(),
459
_userDataHeader.length())
461
<< _("User data: '") << _userData << "'" << endl
462
<< dashes << endl << endl
470
Address SMSSubmitMessage::address() const
472
return _destinationAddress;
475
Ref<SMSMessage> SMSSubmitMessage::clone()
477
Ref<SMSMessage> result = new SMSSubmitMessage(*this);
481
// SMSStatusReportMessage members
483
void SMSStatusReportMessage::init()
485
_messageTypeIndicator = SMS_STATUS_REPORT;
486
_moreMessagesToSend = false;
487
_statusReportQualifier = false;
488
_messageReference = 0;
489
_status = SMS_STATUS_RECEIVED;
492
SMSStatusReportMessage::SMSStatusReportMessage(string pdu) throw(GsmException)
495
_serviceCentreAddress = d.getAddress(true);
496
_messageTypeIndicator = (MessageType)d.get2Bits(); // bits 0..1
497
assert(_messageTypeIndicator == SMS_STATUS_REPORT);
498
_moreMessagesToSend = d.getBit(); // bit 2
501
_statusReportQualifier = d.getBit(); // bit 5
502
_messageReference = d.getOctet();
503
_recipientAddress = d.getAddress();
504
_serviceCentreTimestamp = d.getTimestamp();
505
_dischargeTime = d.getTimestamp();
506
_status = d.getOctet();
509
string SMSStatusReportMessage::encode()
512
e.setAddress(_serviceCentreAddress, true);
513
e.set2Bits(_messageTypeIndicator); // bits 0..1
514
e.setBit(_moreMessagesToSend); // bit 2
517
e.setBit(_statusReportQualifier); // bit 5
518
e.setOctet(_messageReference);
519
e.setAddress(_recipientAddress);
520
e.setTimestamp(_serviceCentreTimestamp);
521
e.setTimestamp(_dischargeTime);
523
return e.getHexString();
526
string SMSStatusReportMessage::toString() const
530
<< _("Message type: SMS-STATUS-REPORT") << endl
531
<< _("SC address: '") << _serviceCentreAddress._number << "'" << endl
532
<< _("More messages to send: ") << _moreMessagesToSend << endl
533
<< _("Status report qualifier: ") << _statusReportQualifier << endl
534
<< _("Message reference: ") << (unsigned int)_messageReference << endl
535
<< _("Recipient address: '") << _recipientAddress._number << "'" << endl
536
<< _("SC timestamp: ") << _serviceCentreTimestamp.toString() << endl
537
<< _("Discharge time: ") << _dischargeTime.toString() << endl
538
<< _("Status: 0x") << hex << (unsigned int)_status << dec
539
<< " '" << getSMSStatusString(_status) << "'" << endl
540
<< dashes << endl << endl
548
Address SMSStatusReportMessage::address() const
550
return _recipientAddress;
553
Ref<SMSMessage> SMSStatusReportMessage::clone()
555
Ref<SMSMessage> result = new SMSStatusReportMessage(*this);
559
// SMSCommandMessage members
561
void SMSCommandMessage::init()
563
_messageTypeIndicator = SMS_COMMAND;
564
_messageReference = 0;
565
_statusReportRequest = true;
566
_protocolIdentifier = 0;
567
_commandType = EnquireSM;
569
_commandDataLength = 0;
572
SMSCommandMessage::SMSCommandMessage(string pdu) throw(GsmException)
575
_serviceCentreAddress = d.getAddress(true);
576
_messageTypeIndicator = (MessageType)d.get2Bits(); // bits 0..1
577
assert(_messageTypeIndicator == SMS_COMMAND);
581
_statusReportRequest = d.getBit(); // bit 5
582
_messageReference = d.getOctet();
583
_protocolIdentifier = d.getOctet();
584
_commandType = d.getOctet();
585
_messageNumber = d.getOctet();
586
_destinationAddress = d.getAddress();
587
_commandDataLength = d.getOctet();
589
(unsigned char*)alloca(sizeof(unsigned char) * _commandDataLength);
590
d.getOctets(s, _commandDataLength);
593
string SMSCommandMessage::encode()
596
e.setAddress(_serviceCentreAddress, true);
597
e.set2Bits(_messageTypeIndicator); // bits 0..1
601
e.setBit(_statusReportRequest); // bit 5
602
e.setOctet(_messageReference);
603
e.setOctet(_protocolIdentifier);
604
e.setOctet(_commandType);
605
e.setOctet(_messageNumber);
606
e.setAddress(_destinationAddress);
607
e.setOctet(_commandData.length());
608
e.setOctets((const unsigned char*)_commandData.data(),
609
(short unsigned int)_commandData.length());
610
return e.getHexString();
613
string SMSCommandMessage::toString() const
617
<< _("Message type: SMS-COMMAND") << endl
618
<< _("SC address: '") << _serviceCentreAddress._number << "'" << endl
619
<< _("Message reference: ") << (unsigned int)_messageReference << endl
620
<< _("Status report request: ") << _statusReportRequest << endl
621
<< _("Protocol identifier: 0x") << hex
622
<< (unsigned int)_protocolIdentifier << dec << endl
623
<< _("Command type: 0x") << hex << (unsigned int)_commandType
625
<< _("Message number: ") << (unsigned int)_messageNumber << endl
626
<< _("Destination address: '") << _destinationAddress._number
628
<< _("Command data length: ") << (unsigned int)_commandDataLength << endl
629
<< _("Command data: '") << _commandData << "'" << endl
630
<< dashes << endl << endl
638
Address SMSCommandMessage::address() const
640
return _destinationAddress;
643
Ref<SMSMessage> SMSCommandMessage::clone()
645
Ref<SMSMessage> result = new SMSCommandMessage(*this);
649
// SMSDeliverReportMessage members
651
void SMSDeliverReportMessage::init()
653
_messageTypeIndicator = SMS_DELIVER_REPORT;
654
_protocolIdentifierPresent = false;
655
_dataCodingSchemePresent = false;
656
_userDataLengthPresent = false;
659
SMSDeliverReportMessage::SMSDeliverReportMessage(string pdu)
663
_serviceCentreAddress = d.getAddress(true);
664
_messageTypeIndicator = (MessageType)d.get2Bits(); // bits 0..1
665
assert(_messageTypeIndicator == SMS_DELIVER_REPORT);
666
d.alignOctet(); // skip to parameter indicator
667
_protocolIdentifierPresent = d.getBit(); // bit 0
668
_dataCodingSchemePresent = d.getBit(); // bit 1
669
_userDataLengthPresent = d.getBit(); // bit 2
670
if (_protocolIdentifierPresent)
671
_protocolIdentifier = d.getOctet();
672
if (_dataCodingSchemePresent)
673
_dataCodingScheme = d.getOctet();
674
if (_userDataLengthPresent)
676
unsigned char userDataLength = d.getOctet();
678
if (_dataCodingScheme.getAlphabet() == DCS_DEFAULT_ALPHABET)
680
_userData = d.getString(userDataLength);
681
_userData = gsmToLatin1(_userData);
684
{ // userDataLength is length in octets
686
(unsigned char*)alloca(sizeof(unsigned char) * userDataLength);
687
d.getOctets(s, userDataLength);
688
_userData.assign((char*)s, userDataLength);
693
string SMSDeliverReportMessage::encode()
696
e.setAddress(_serviceCentreAddress, true);
697
e.set2Bits(_messageTypeIndicator); // bits 0..1
698
e.alignOctet(); // skip to parameter indicator
699
e.setBit(_protocolIdentifierPresent); // bit 0
700
e.setBit(_dataCodingSchemePresent); // bit 1
701
e.setBit(_userDataLengthPresent); // bit 2
702
if (_protocolIdentifierPresent)
703
e.setOctet(_protocolIdentifier);
704
if (_dataCodingSchemePresent)
705
e.setOctet(_dataCodingScheme);
706
if (_userDataLengthPresent)
708
unsigned char userDataLength = _userData.length();
709
e.setOctet(userDataLength);
710
if (_dataCodingScheme.getAlphabet() == DCS_DEFAULT_ALPHABET)
711
e.setString(latin1ToGsm(_userData));
713
e.setOctets((unsigned char*)_userData.data(), userDataLength);
715
return e.getHexString();
718
string SMSDeliverReportMessage::toString() const
722
<< _("Message type: SMS-DELIVER-REPORT") << endl
723
<< _("SC address: '") << _serviceCentreAddress._number << "'" << endl
724
<< _("Protocol identifier present: ") << _protocolIdentifierPresent
726
<< _("Data coding scheme present: ") << _dataCodingSchemePresent << endl
727
<< _("User data length present: ") << _userDataLengthPresent << endl;
728
if (_protocolIdentifierPresent)
729
os << _("Protocol identifier: 0x") << hex
730
<< (unsigned int)_protocolIdentifier
732
if (_dataCodingSchemePresent)
733
os << _("Data coding scheme: ") << _dataCodingScheme.toString() << endl;
734
if (_userDataLengthPresent)
735
os << _("User data length: ") << (int)userDataLength() << endl
736
<< _("User data: '") << _userData << "'" << endl;
737
os << dashes << endl << endl
745
Address SMSDeliverReportMessage::address() const
747
assert(0); // not address, should not be in SMS store
751
Ref<SMSMessage> SMSDeliverReportMessage::clone()
753
Ref<SMSMessage> result = new SMSDeliverReportMessage(*this);
757
// SMSSubmitReportMessage members
759
void SMSSubmitReportMessage::init()
761
_messageTypeIndicator = SMS_SUBMIT_REPORT;
762
_protocolIdentifierPresent = false;
763
_dataCodingSchemePresent = false;
764
_userDataLengthPresent = false;
767
SMSSubmitReportMessage::SMSSubmitReportMessage(string pdu) throw(GsmException)
770
_serviceCentreAddress = d.getAddress(true);
771
_messageTypeIndicator = (MessageType)d.get2Bits(); // bits 0..1
772
assert(_messageTypeIndicator == SMS_SUBMIT_REPORT);
773
_serviceCentreTimestamp = d.getTimestamp();
774
_protocolIdentifierPresent = d.getBit(); // bit 0
775
_dataCodingSchemePresent = d.getBit(); // bit 1
776
_userDataLengthPresent = d.getBit(); // bit 2
777
if (_protocolIdentifierPresent)
778
_protocolIdentifier = d.getOctet();
779
if (_dataCodingSchemePresent)
780
_dataCodingScheme = d.getOctet();
781
if (_userDataLengthPresent)
783
unsigned char userDataLength = d.getOctet();
785
if (_dataCodingScheme.getAlphabet() == DCS_DEFAULT_ALPHABET)
787
_userData = d.getString(userDataLength);
788
_userData = gsmToLatin1(_userData);
791
{ // _userDataLength is length in octets
793
(unsigned char*)alloca(sizeof(unsigned char) * userDataLength);
794
d.getOctets(s, userDataLength);
795
_userData.assign((char*)s, userDataLength);
800
string SMSSubmitReportMessage::encode()
803
e.setAddress(_serviceCentreAddress, true);
804
e.set2Bits(_messageTypeIndicator); // bits 0..1
805
e.setTimestamp(_serviceCentreTimestamp);
806
e.setBit(_protocolIdentifierPresent); // bit 0
807
e.setBit(_dataCodingSchemePresent); // bit 1
808
e.setBit(_userDataLengthPresent); // bit 2
809
if (_protocolIdentifierPresent)
810
e.setOctet(_protocolIdentifier);
811
if (_dataCodingSchemePresent)
812
e.setOctet(_dataCodingScheme);
813
if (_userDataLengthPresent)
815
e.setOctet(userDataLength());
816
if (_dataCodingScheme.getAlphabet() == DCS_DEFAULT_ALPHABET)
817
e.setString(latin1ToGsm(_userData));
819
e.setOctets((unsigned char*)_userData.data(), _userData.length());
821
return e.getHexString();
824
string SMSSubmitReportMessage::toString() const
828
<< _("Message type: SMS-SUBMIT-REPORT") << endl
829
<< _("SC address: '") << _serviceCentreAddress._number << "'" << endl
830
<< _("SC timestamp: ") << _serviceCentreTimestamp.toString() << endl
831
<< _("Protocol identifier present: ") << _protocolIdentifierPresent
833
<< _("Data coding scheme present: ") << _dataCodingSchemePresent << endl
834
<< _("User data length present: ") << _userDataLengthPresent << endl;
835
if (_protocolIdentifierPresent)
836
os << _("Protocol identifier: 0x") << hex
837
<< (unsigned int)_protocolIdentifier
839
if (_dataCodingSchemePresent)
840
os << _("Data coding scheme: ") << _dataCodingScheme.toString() << endl;
841
if (_userDataLengthPresent)
842
os << _("User data length: ") << (int)userDataLength() << endl
843
<< _("User data: '") << _userData << "'" << endl;
844
os << dashes << endl << endl
852
Address SMSSubmitReportMessage::address() const
854
assert(0); // not address, should not be in SMS store
858
Ref<SMSMessage> SMSSubmitReportMessage::clone()
860
Ref<SMSMessage> result = new SMSSubmitReportMessage(*this);