--- smsdaemon/SmsPdu.cpp 2008/12/08 21:28:40 157 +++ smsdaemon/SmsPdu.cpp 2008/12/18 06:53:29 196 @@ -8,10 +8,15 @@ #include #include -#include +#include #include "Logger.h" -#include "util.h" +#include "Util.h" + +#include "Exceptions.h" +#include +#include +#include using namespace std; @@ -24,7 +29,7 @@ string SwitchChars(string input) { for (unsigned int i=1; i partlist; + typedef std::list::iterator iterator; + + SMS ConcatenateParts(SmsPart& part) + { + SMS sms; + if (part.group == -1) + { + sms.SetMessage(part.message); + sms.SetSender(part.sender); + } + else + { + partlist.push_back(part); + + vector vec; + for (iterator it=partlist.begin(); it!=partlist.end(); ++it) + { + SmsPart& current = *it; + if (current.sender == part.sender && current.group == part.group) + vec.push_back(current); + } + + if (vec.size() == (unsigned)part.count) //we have all parts + { + sort(vec.begin(), vec.end()); + string message; + for (unsigned i=0; i& udh, SmsPart& part) + { + if (udh.size() == 0) + { + Logger::logMessage("ParseUdh(): empty udh"); + return; + } + + if (udh[0] != 0) + { + Logger::logMessage("unknown UDH type"); + return; + } + + if (udh.size() < 5) + { + Logger::logMessage("UDH to short to be multipart"); + return; + } + + part.group = udh[2]; + part.count = udh[3]; + part.id = udh[4]; + } + + + SmsPart ParseSmsPduWorker(std::string pdu_str) + { vector pdu = HexDecodeString(pdu_str); @@ -305,11 +390,23 @@ unsigned char data_len = (*it++); + + SmsPart part; + part.group = -1; + int shift_start = 0; + if (UDHI) { - int udh_len = (*it++); - it += udh_len; //just ignore the User Data Header + int udh_len = (*it++); + + vector udh; + for (int i=0; i user_data; user_data.insert(user_data.end(), it, it+data_len); - + string message = Decode8to7bit(user_data, shift_start).substr(0,data_len); message = Util::str_trim(message); - - SMS result; - result.SetMessage(message); - result.SetSender(sender); - return result; + + part.message = message; + part.sender = sender; + + return part; } }