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

Annotation of /smsdaemon/SmsToolTransceiver.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 180 - (hide annotations) (download)
Fri Dec 12 12:54:27 2008 UTC (15 years, 5 months ago) by torben
File size: 4055 byte(s)
Remove ISmsTransceiver::DeleteSms() - Each transceiver should clean up after itself

Merge SmsHelper into ModemTransceiver, since it is closely connected to the AT command output


1 torben 151 #include "SmsToolTransceiver.h"
2    
3 torben 157 #include "Logger.h"
4 torben 158 #include "Util.h"
5 torben 161 #include "Common.h"
6 torben 168 #include "ConfigFile.h"
7 torben 151
8     #include <stdexcept>
9     #include <iostream>
10     #include <fstream>
11     #include <sstream>
12     #include <iomanip>
13    
14     #include <cstring>
15     #include <errno.h>
16     #include <time.h>
17     #include <stdlib.h>
18     #include <sys/types.h>
19     #include <dirent.h>
20    
21     using namespace std;
22    
23 torben 168 string appendSlash(string& str)
24     {
25     if (str.at(str.length()-1) != '/');
26     str += "/";
27     return str;
28     }
29    
30     SmsToolTransceiver::SmsToolTransceiver()
31     {
32     Common* cmn = Common::instance();
33    
34     try
35     {
36     inboxdir = cmn->GetConfigfile()->GetValue("smstools","inboxdir").StringValue();
37     } catch (...) {
38     Logger::logMessage("Config error> smstools::inboxdir not specified");
39     exit(1);
40     }
41     try
42     {
43     outgoingdir = cmn->GetConfigfile()->GetValue("smstools","outgoingdir").StringValue();
44     } catch (...) {
45     Logger::logMessage("Config error> smstools::outgoingdir not specified");
46     exit(1);
47     }
48    
49     inboxdir = appendSlash(inboxdir);
50     outgoingdir = appendSlash(outgoingdir);
51    
52     }
53    
54    
55 torben 151 void SmsToolTransceiver::SendSms(std::string to, std::string message, bool allowMultipart)
56     {
57     std::string filename = CreateFilename();
58 torben 157 Logger::logMessage( std::string("Sending sms to: ") + to);
59 torben 151
60 torben 168 string tempfile = outgoingdir + filename + ".LOCK";
61 torben 151
62 torben 168 string destfile = outgoingdir + filename;
63 torben 151
64     ofstream out( tempfile.c_str() );
65     if (!out )
66     {
67 torben 157 Logger::logMessage("SmsToolTransceiver:: could not create temp file");
68 torben 151 return;
69     }
70     out << "To: " << to << "\n\n" << message ;
71     out.close();
72 torben 160
73     Common::instance()->smsCounter.outgoing++;
74 torben 151
75     int result = rename(tempfile.c_str(), destfile.c_str());
76    
77     if (result)
78 torben 157 Logger::logMessage( string("SmsToolTransceiver could not spool file: ") + strerror(errno) );
79 torben 151 }
80    
81     std::string SmsToolTransceiver::CreateFilename()
82     {
83     std::stringstream ss;
84     ss << "smsdaemon_";
85     ss << std::setw(8) << std::setfill('0') << std::uppercase << std::hex << time(0) << "_";
86     ss << std::setw(8) << std::setfill('0') << std::uppercase << std::hex << rand();
87     ss << std::setw(8) << std::setfill('0') << std::uppercase << std::hex << rand();
88     return ss.str();
89     }
90    
91     std::vector<SMS> SmsToolTransceiver::ReadSms(bool readAll)
92     {
93     std::vector<SMS> vec;
94 torben 168 DIR* dir = opendir( inboxdir.c_str() );
95 torben 151
96     if (dir != 0)
97     {
98     dirent* entry;
99     while ( (entry = readdir(dir)) != 0)
100     {
101     if (entry->d_name[0] == '.')
102     continue;
103 torben 162 Logger::logMessage( string("SmsTool::ReadSms >") +entry->d_name);
104    
105 torben 151 try
106     {
107 torben 168 SMS sms = ParseFile( inboxdir + entry->d_name);
108 torben 151 vec.push_back(sms);
109     }
110     catch (std::exception& e)
111     {
112 torben 157 Logger::logMessage(e.what());
113 torben 151 }
114    
115     if (!readAll)
116     break;
117     }
118     }
119     else
120     {
121 torben 167 Logger::logMessage( string("SmsToolTransceiver could open inbox dir ") + strerror(errno) );
122 torben 151 }
123 torben 155 closedir(dir);
124 torben 151
125     return vec;
126     }
127    
128    
129     SMS SmsToolTransceiver::ParseFile(std::string path)
130     {
131     SMS sms;
132    
133     string file = Util::readfile(path);
134     int result = ::unlink(path.c_str());
135     if (result)
136     {
137     string message = "SmsTool> unlink ";
138     message += path;
139     message += " failed: ";
140     message += strerror(errno);
141     throw std::runtime_error( message );
142     }
143    
144    
145     unsigned int pos = file.find("\n\n");
146    
147     if (pos != string::npos) {
148     string header = file.substr(0,pos);
149     string body = file.substr(pos+2,1024);
150    
151     sms.SetIndex(path);
152     sms.SetMessage(body);
153    
154     ParseHeaders(header, sms);
155    
156     } else {
157     throw std::runtime_error("SmsTool: invalid incomming file");
158     }
159    
160     return sms;
161     }
162    
163     void SmsToolTransceiver::ParseHeaders(std::string& headerstring, SMS& sms)
164     {
165     std::vector<std::string> headers = Util::str_split(headerstring, "\n");
166    
167     for (unsigned int i=0; i<headers.size(); i++)
168     {
169 torben 162 unsigned int pos = headers[i].find(":");
170     if (pos != string::npos)
171     {
172     string key = Util::str_trim( headers[i].substr(0,pos) );
173     string val = Util::str_trim( headers[i].substr(pos+1) );
174 torben 151
175 torben 162 if (key == "From")
176     sms.SetSender(val);
177 torben 151
178 torben 162 if (key == "Received")
179     sms.SetTimestamp(val);
180     }
181     else
182     {
183     Logger::logMessage(string("SmsTool: Invalid sms file header> ") + headers[i]);
184     }
185 torben 151 }
186    
187     }
188    
189     int SmsToolTransceiver::DeleteAllSms()
190     {
191     return 0;
192     }

  ViewVC Help
Powered by ViewVC 1.1.20