diff options
author | Philippe Nunes <philippe.nunes@linux.intel.com> | 2012-06-25 16:38:02 +0200 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2012-06-22 09:20:54 -0500 |
commit | efd9d5524909c659b5f3365ae486de8b71966c2f (patch) | |
tree | 9117c8e4c33546238dc127b8270fa641f70141c3 | |
parent | deda42bb067dae526a1cf63b358014b715091844 (diff) | |
download | phonesim-efd9d5524909c659b5f3365ae486de8b71966c2f.tar.gz |
sms: Extend CBS message formating to use UCS2 scheme
-rw-r--r-- | src/qsmsmessage.cpp | 119 |
1 files changed, 111 insertions, 8 deletions
diff --git a/src/qsmsmessage.cpp b/src/qsmsmessage.cpp index 1e2a317..c2eeb29 100644 --- a/src/qsmsmessage.cpp +++ b/src/qsmsmessage.cpp @@ -20,6 +20,7 @@ #include <stdlib.h> #include <qsmsmessage.h> +#include <qcbsmessage.h> #include "qsmsmessage_p.h" #include <qatutils.h> #include <qgsmcodec.h> @@ -2462,6 +2463,93 @@ QSMSMessage QSMSDeliverMessage::unpack(QTextCodec *codec) return m; } +static void iso639_2_from_language(QCBSMessage::Language lang, char *iso639) +{ + switch (lang) { + case QCBSMessage::German: + iso639[0] = 'd'; + iso639[1] = 'e'; + iso639[2] = '\0'; + break; + case QCBSMessage::English: + iso639[0] = 'e'; + iso639[1] = 'n'; + iso639[2] = '\0'; + break; + case QCBSMessage::Italian: + iso639[0] = 'i'; + iso639[1] = 't'; + iso639[2] = '\0'; + break; + case QCBSMessage::French: + iso639[0] = 'f'; + iso639[1] = 'r'; + iso639[2] = '\0'; + break; + case QCBSMessage::Spanish: + iso639[0] = 'e'; + iso639[1] = 's'; + iso639[2] = '\0'; + break; + case QCBSMessage::Dutch: + iso639[0] = 'n'; + iso639[1] = 'l'; + iso639[2] = '\0'; + break; + case QCBSMessage::Swedish: + iso639[0] = 's'; + iso639[1] = 'v'; + iso639[2] = '\0'; + break; + case QCBSMessage::Danish: + iso639[0] = 'd'; + iso639[1] = 'a'; + iso639[2] = '\0'; + break; + case QCBSMessage::Portuguese: + iso639[0] = 'p'; + iso639[1] = 't'; + iso639[2] = '\0'; + break; + case QCBSMessage::Finnish: + iso639[0] = 'f'; + iso639[1] = 'i'; + iso639[2] = '\0'; + break; + case QCBSMessage::Norwegian: + iso639[0] = 'n'; + iso639[1] = 'o'; + iso639[2] = '\0'; + break; + case QCBSMessage::Greek: + iso639[0] = 'e'; + iso639[1] = 'l'; + iso639[2] = '\0'; + break; + case QCBSMessage::Turkish: + iso639[0] = 't'; + iso639[1] = 'r'; + iso639[2] = '\0'; + break; + case QCBSMessage::Hungarian: + iso639[0] = 'h'; + iso639[1] = 'u'; + iso639[2] = '\0'; + break; + case QCBSMessage::Polish: + iso639[0] = 'p'; + iso639[1] = 'l'; + iso639[2] = '\0'; + break; + default: + iso639[0] = '\0'; + iso639[1] = '\0'; + iso639[2] = '\0'; + break; + } + + return; +} QCBSDeliverMessage::QCBSDeliverMessage() : QPDUMessage() @@ -2518,29 +2606,44 @@ QCBSMessage QCBSDeliverMessage::unpack(QTextCodec *codec) void QCBSDeliverMessage::pack(const QCBSMessage &m, QSMSDataCodingScheme scheme) { + int numPad; + QTextCodec *codec = QAtUtils::codec( "gsm" ); + QByteArray header; + // Clear the pdu before we start. mBuffer = QByteArray(); mPosn = 0; mBits = 0; - scheme = QSMS_DefaultAlphabet; - QByteArray data; mBuffer.append( (char) (((m.messageCode() >> 4) & 0x3F) | (m.scope() << 6)) ); mBuffer.append( (char)(((m.messageCode() & 0xF) << 4) | (m.updateNumber() & 0xF)) ); mBuffer.append( (char)((m.channel() & 0x0000FF00) >> 8) ); mBuffer.append( (char)(m.channel() & 0x000000FF) ); - mBuffer.append( (char)(((scheme & 0x0F)<<4) | (m.language() & 0x0F)) ); - mBuffer.append( (char)((m.numPages() & 0x0F) | ((m.page() & 0x0F) << 4)) ); - QTextCodec *codec = QAtUtils::codec( "gsm" ); - QByteArray header; + if (scheme == QSMS_UCS2Alphabet) + mBuffer.append( 0x11 ); + else + mBuffer.append( (char)(((scheme & 0x0F)<<4) | (m.language() & 0x0F)) ); + + mBuffer.append( (char)((m.numPages() & 0x0F) | ((m.page() & 0x0F) << 4)) ); QString paddedText = m.text(); - int numPad = 93 - getEncodedLength(paddedText, paddedText.length()); + if (scheme == QSMS_UCS2Alphabet) { + char iso639[3]; + unsigned short c; + + iso639_2_from_language(m.language(), iso639); + c = ((iso639[1] & 0x7F)<<7) | (iso639[0] & 0x7F); + mBuffer.append( (char)(c & 0xFF) ); + mBuffer.append( (char)(c >> 8) ); + numPad = 40 - (paddedText.length()); + } + else + numPad = 93 - getEncodedLength(paddedText, paddedText.length()); for (int i = 0; i < numPad; i++) - paddedText.append(QChar(0x0D)); + paddedText.append(QChar(0x0D)); setUserData(paddedText, scheme, codec, header,true); } |