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

Annotation of /smsdaemon/SmsToolTransceiver.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 196 - (hide annotations) (download)
Thu Dec 18 06:53:29 2008 UTC (15 years, 5 months ago) by torben
File size: 4052 byte(s)
Make pretty

astyle -t -b -N

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

  ViewVC Help
Powered by ViewVC 1.1.20