/[projects]/smsdaemon/SmsPdu.cpp
ViewVC logotype

Diff of /smsdaemon/SmsPdu.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 69 by torben, Fri Jun 13 06:38:43 2008 UTC revision 77 by torben, Fri Jun 13 21:15:00 2008 UTC
# Line 13  Line 13 
13  #include "common.h"  #include "common.h"
14  #include "util.h"  #include "util.h"
15    
 #include <iostream>  
16    
17  using namespace std;  using namespace std;
18    
   
19  namespace SmsPdu  namespace SmsPdu
20  {  {
21    
# Line 36  namespace SmsPdu Line 34  namespace SmsPdu
34    
35          string EncodePhonenr(string input)          string EncodePhonenr(string input)
36          {          {
37                    if ( input.at(0) == '+' )
38                            input.erase(0,1);
39    
40                  if ( (input.length() % 2) == 1)                  if ( (input.length() % 2) == 1)
41                          input.append("F");                          input.append("F");
42                  return SwitchChars(input);                  return SwitchChars(input);
# Line 78  namespace SmsPdu Line 79  namespace SmsPdu
79                  return vec;                  return vec;
80          }          }
81    
82          std::string Decode8to7bit(vector<unsigned char> input)          std::string Decode8to7bit(vector<unsigned char> input, int shift_start)
83          {          {
84                  string result;                  string result;
85    
86                  int shift = 0;                  int shift = shift_start;
87                  for (unsigned int i=0; i<input.size(); ++i)                  for (unsigned int i=0; i<input.size(); ++i)
88                  {                  {
89                          unsigned char current = input.at(i);                          unsigned char current = input.at(i);
# Line 110  namespace SmsPdu Line 111  namespace SmsPdu
111    
112    
113    
114          vector<unsigned char> Encode7to8bit(std::string str)          vector<unsigned char> Encode7to8bit(std::string str, int shift_start)
115          {          {
116                  vector<unsigned char> buf;                  vector<unsigned char> buf;
117    
118                  int shift = 0;                  int shift = shift_start;
119                  for (unsigned int i=0; i<str.size(); ++i)                  for (unsigned int i=0; i<str.size(); ++i)
120                  {                  {
121                          unsigned char current = str.at(i) & 0x7F;                          unsigned char current = str.at(i) & 0x7F;
# Line 178  namespace SmsPdu Line 179  namespace SmsPdu
179                          pdu.push_back(to.length() ); //length of phone nr                          pdu.push_back(to.length() ); //length of phone nr
180                          pdu.push_back(0x81); // type of address (international nr  + ISDN/telephone range) - else try 0x81                          pdu.push_back(0x81); // type of address (international nr  + ISDN/telephone range) - else try 0x81
181    
182                    
183                          string phone = EncodePhonenr(to);                          vector<unsigned char> phone = HexDecodeString( EncodePhonenr(to ));
184                          pdu.insert( pdu.end(), phone.begin(), phone.end());                          pdu.insert( pdu.end(), phone.begin(), phone.end());
185    
186                          pdu.push_back(0x00); // Protocol identifier                          pdu.push_back(0x00); // Protocol identifier
187                          pdu.push_back(0x00); // Data coding scheme                          pdu.push_back(0x00); // Data coding scheme
188    
189                            int shift_start = 0;
190                          string message_part;                          string message_part;
191                          if (multipart)                          if (multipart)
192                          {                          {
# Line 199  namespace SmsPdu Line 201  namespace SmsPdu
201                                  pdu.push_back( part_count );                                  pdu.push_back( part_count );
202                                  pdu.push_back( partnr+1 );                                  pdu.push_back( partnr+1 );
203                                  pdu.push_back( 0x00);                                  pdu.push_back( 0x00);
204                                    //shift_start = 6;
205                          }                          }
206                          else                          else
207                          {                          {
# Line 216  namespace SmsPdu Line 218  namespace SmsPdu
218                                  pdu.push_back( message_part.length() ); //UserDataLength                                  pdu.push_back( message_part.length() ); //UserDataLength
219                          }                          }
220    
221                          vector<unsigned char> userData = Encode7to8bit(message_part);                          vector<unsigned char> userData = Encode7to8bit(message_part, shift_start);
222    
223                          pdu.insert( pdu.end(), userData.begin(), userData.end());                          pdu.insert( pdu.end(), userData.begin(), userData.end());
224    
# Line 284  namespace SmsPdu Line 286  namespace SmsPdu
286                  it += (*it++); // Skip smsc info                  it += (*it++); // Skip smsc info
287    
288                  unsigned char deliver_first_octet = (*it++);                  unsigned char deliver_first_octet = (*it++);
289    
290                    bool UDHI = (deliver_first_octet & 0x40) > 0;
291    
292                  unsigned char sender_len = (*it++);                  unsigned char sender_len = (*it++);
293                  if ( (sender_len % 2) == 1)                  if ( (sender_len % 2) == 1)
294                          sender_len++;                          sender_len++;
# Line 299  namespace SmsPdu Line 304  namespace SmsPdu
304                  result.timestamp = DecodeTimestamp(it, it+7);                  result.timestamp = DecodeTimestamp(it, it+7);
305                  it += 7;                  it += 7;
306    
307    
308                  unsigned char data_len = (*it++);                  unsigned char data_len = (*it++);
309    
310                    int shift_start = 0;
311                    if (UDHI)
312                    {
313                            int udh_len = (*it++);
314                            it += udh_len; //just ignore the User Data Header
315                            data_len -= udh_len;
316    
317                            shift_start = udh_len+1; //make the 8to7bit decode start with the right shift level
318                    }
319    
320    
321                  vector<unsigned char> user_data;                  vector<unsigned char> user_data;
322                  user_data.insert(user_data.end(), it, it+data_len);                  user_data.insert(user_data.end(), it, it+data_len);
323                                    
324                  result.message = Decode8to7bit(user_data);                  result.message = Decode8to7bit(user_data, shift_start).substr(0,data_len);
325                                    
326    
327                  return result;                  return result;

Legend:
Removed from v.69  
changed lines
  Added in v.77

  ViewVC Help
Powered by ViewVC 1.1.20