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

Contents of /smsdaemon/Util.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 183 - (show annotations) (download)
Fri Dec 12 13:57:10 2008 UTC (15 years, 5 months ago) by torben
File size: 8490 byte(s)
make Util.cpp less sensible to editor conversions

1
2 #include <string>
3 #include <sstream>
4 #include <vector>
5 #include <cctype>
6
7 #include <iostream>
8 #include <fstream>
9 #include <iconv.h>
10 #include <stdexcept>
11 #include <time.h>
12 #include <sys/time.h>
13 #include <stdlib.h>
14
15 #include <cstring>
16 #include "Util.h"
17
18 using namespace std;
19
20 namespace Util
21 {
22 const int GN_CHAR_ALPHABET_SIZE = 128;
23 unsigned char gsm_default_alphabet[GN_CHAR_ALPHABET_SIZE] =
24 {
25
26 /* ETSI GSM 03.38, version 6.0.1, section 6.2.1; Default alphabet */
27 /* Characters in hex position 10, [12 to 1a] and 24 are not present on
28 * latin1 charset, so we cannot reproduce on the screen, however they are
29 * greek symbol not present even on my Nokia */
30
31 '@', 0xa3, '$', 0xa5, 0xe8, 0xe9, 0xf9, 0xec,
32 0xf2, 0xc7, '\n', 0xd8, 0xf8, '\r', 0xc5, 0xe5,
33 '?', '_', '?', '?', '?', '?', '?', '?',
34 '?', '?', '?', '?', 0xc6, 0xe6, 0xdf, 0xc9,
35 ' ', '!', '\"', '#', 0xa4, '%', '&', '\'',
36 '(', ')', '*', '+', ',', '-', '.', '/',
37 '0', '1', '2', '3', '4', '5', '6', '7',
38 '8', '9', ':', ';', '<', '=', '>', '?',
39 0xa1, 'A', 'B', 'C', 'D', 'E', 'F', 'G',
40 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
41 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
42 'X', 'Y', 'Z', 0xc4, 0xd6, 0xd1, 0xdc, 0xa7,
43 0xbf, 'a', 'b', 'c', 'd', 'e', 'f', 'g',
44 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
45 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
46 'x', 'y', 'z', 0xe4, 0xf6, 0xf1, 0xfc, 0xe0
47 };
48
49 static unsigned char gsm_reverse_default_alphabet[256];
50 static bool reversed = false;
51
52 static void tbl_setup_reverse()
53 {
54 int i;
55
56 if (reversed) return;
57 memset(gsm_reverse_default_alphabet, 0x3f, 256);
58 for (i = GN_CHAR_ALPHABET_SIZE - 1; i >= 0; i--)
59 gsm_reverse_default_alphabet[ gsm_default_alphabet[i] ] = i;
60 gsm_reverse_default_alphabet['?'] = 0x3f;
61 reversed = true;
62 }
63
64 unsigned char char_def_alphabet_encode(unsigned char value)
65 {
66 tbl_setup_reverse();
67 return gsm_reverse_default_alphabet[value];
68 }
69
70 unsigned char char_def_alphabet_decode(unsigned char value)
71 {
72 if (value < GN_CHAR_ALPHABET_SIZE)
73 {
74 return gsm_default_alphabet[value];
75 }
76 else
77 {
78 return '?';
79 }
80 }
81
82
83 void str_dump(const string& str)
84 {
85 for (unsigned i=0; i<str.length(); ++i)
86 {
87 cout.width(2);
88 cout.fill('0');
89 cout << hex << static_cast<int>(str.at(i)) << " ";
90 }
91 cout.width(1);
92 cout << dec << endl;
93 }
94
95
96
97 string str_replace(string str, string search, string replace)
98 {
99 unsigned int pos = 0;
100
101 while ( (pos = str.find(search,pos)) != string::npos)
102 {
103 str.replace(pos, search.size(), replace);
104 pos += replace.size();
105 }
106 return str;
107 }
108
109 std::string str_replace_char(std::string str, char search, char replace)
110 {
111 unsigned int pos = 0;
112
113 while ( (pos = str.find(search,pos)) != string::npos)
114 {
115 str.replace(pos, 1, 1, replace);
116 }
117 return str;
118 }
119
120 bool my_isspace(char ch)
121 {
122 return (isspace(ch) || ch == 0);
123 }
124
125 string str_trim(string str)
126 {
127 while (str.length() > 0 && my_isspace(str.at(0)))
128 str.erase(0,1);
129 while (str.length() > 0 && my_isspace(str.at(str.length()-1)))
130 str.erase(str.length()-1,1);
131 return str;
132 }
133
134 string str_striptags(string str)
135 {
136 unsigned int pos=0;
137
138 while ( (pos=str.find("<",pos)) != string::npos)
139 {
140 unsigned int endpos = str.find(">",pos);
141 if (endpos == string::npos)
142 break;
143 str.erase(pos, (endpos-pos)+1);
144 }
145
146 return str;
147 }
148
149 vector<string> str_split(string input, string delimiter)
150 {
151 vector<string> retval;
152
153 while ( 1 )
154 {
155 unsigned int endpos = input.find(delimiter);
156
157 string entry = input.substr(0,endpos);
158 retval.push_back( entry );
159
160
161 if (endpos == string::npos)
162 break;
163
164 endpos += delimiter.length();
165 input = input.substr(endpos, input.length() - endpos);
166 }
167
168 return retval;
169 }
170
171 char danish_map[3][2] = { {198,230}, {216,248}, {197,229} }; // aelig, oslash, aring
172
173 unsigned char my_toupper(unsigned char ch)
174 {
175 if (ch == 230)
176 return 198;
177 if (ch == 248)
178 return 216;
179 if (ch == 229)
180 return 197;
181
182 return ::toupper(ch);
183 }
184
185 unsigned char my_tolower(unsigned char ch)
186 {
187 if (ch == 198)
188 return 230;
189 if (ch == 216)
190 return 248;
191 if (ch == 197)
192 return 229;
193
194 return ::tolower(ch);
195 }
196 string str_toupper(string str)
197 {
198 for (unsigned i=0; i<str.length(); ++i)
199 {
200 str.replace(i, 1 ,1, my_toupper(str.at(i)));
201 }
202 return str;
203 }
204
205 string str_tolower(string str)
206 {
207 for (unsigned i=0; i<str.length(); ++i)
208 {
209 str.replace(i, 1 ,1, my_tolower(str.at(i)));
210 }
211 return str;
212 }
213
214
215 string str_formatint(int i)
216 {
217 std::ostringstream os;
218 os << i;
219 return os.str();
220 }
221
222
223 string str_characters(string str)
224 {
225 string rep;
226 rep.append(1,197);
227 str = str_replace(str, "&#197;", rep);
228
229 rep.at(0) = 198;
230 str = str_replace(str, "&#198;", rep);
231
232 rep.at(0) = 216;
233 str = str_replace(str, "&#216;", rep);
234
235
236 rep.at(0) = 229;
237 str = str_replace(str, "&#229;", rep);
238
239 rep.at(0) = 230;
240 str = str_replace(str, "&#230;", rep);
241
242 rep.at(0) = 248;
243 str = str_replace(str, "&#248;", rep);
244
245 return str;
246 }
247
248
249 string str_gsm2latin(string str)
250 {
251 for (unsigned i=0; i<str.size(); i++) {
252 str.at(i) = char_def_alphabet_decode(str.at(i));
253 }
254 return str;
255 }
256
257 string str_latin2gsm(string str)
258 {
259 for (unsigned i=0; i<str.size(); i++) {
260 str.at(i) = char_def_alphabet_encode(str.at(i));
261 }
262 return str;
263 }
264
265 string readUrl(string url, string tempfile)
266 {
267 char buf[128000];
268 string document;
269
270 ostringstream command;
271 command << "wget -O " << tempfile << " --tries=1 --timeout=15 -o /dev/null \"" << url << "\"";
272 int res = my_system( command.str().c_str() );
273
274 if (res<0)
275 {
276 throw( std::runtime_error("Error retrieving document"));
277 }
278
279 if (res>0)
280 {
281 throw std::runtime_error("Command time out or document not found");
282 }
283
284 ifstream in( tempfile.c_str() );
285
286 if (!in)
287 return "";
288
289 while (!in.eof() )
290 {
291 in.getline(buf,128000-1);
292 document += buf;
293 document += "\n";
294 }
295 in.close();
296 unlink(tempfile.c_str());
297
298 return document;
299 }
300
301
302
303 string iconv_wrapper(string _input, string to_format, string from_format)
304 {
305 char* input,*output,*input_ptr, *output_ptr;
306 input = input_ptr = (char*) malloc(_input.size()+1);
307 strcpy(input, _input.c_str());
308
309 output = output_ptr = (char*) malloc(_input.size()*2);
310
311
312
313 unsigned int realinsize,insize,outsize,realsize;
314
315 iconv_t icv = iconv_open(to_format.c_str(), from_format.c_str());
316 if (icv == (iconv_t)-1)
317 {
318 perror(0);
319 return "";
320 }
321
322
323 realsize = outsize = _input.size()*2;
324 realinsize = insize = _input.size();
325
326 iconv(icv,
327 &input_ptr,
328 &insize,
329 &output_ptr,
330 &outsize);
331
332
333 perror(0);
334 /* cout << "len=" << len << endl;
335 cout << "outsize=" << outsize << endl;
336 cout << "realsize=" << realsize << endl;
337 cout << "insize=" << insize << endl;
338 cout << "realinsize=" << realinsize << endl;*/
339 iconv_close(icv);
340
341 string returnstr;
342 for (unsigned int i=0; i<realsize - outsize; i++)
343 {
344 //cout << i << ":" << (unsigned short) output[i] << "|" << (unsigned short) input[i];
345 //cout << " (" << output[i] << ")" << endl;
346 returnstr += output[i];
347 }
348 return returnstr;
349 }
350
351 std::string convertToUnicode(std::string str)
352 {
353 return iconv_wrapper(str, "UTF-8", "ISO8859-1");
354 }
355
356 std::string convertFromUnicode(std::string str)
357 {
358 return iconv_wrapper(str, "ISO8859-1", "UTF-8");
359 }
360
361 int uTimeDiff(const timeval& then, const timeval& now)
362 {
363 return ( (now.tv_sec - then.tv_sec)*1000000) + (now.tv_usec-then.tv_usec);
364 }
365
366 int mTimeDiff(const timeval& then, const timeval& now)
367 {
368 return ( (now.tv_sec - then.tv_sec)*1000) +
369 ((now.tv_usec-then.tv_usec)/1000);
370 }
371
372
373 timeval GetTimeOfDay()
374 {
375 timeval now;
376 gettimeofday(&now,0);
377 return now;
378 }
379
380 int my_system(const char* cmd, std::string* response)
381 {
382 FILE* p;
383 if ((p = popen(cmd,"r")) == NULL)
384 return (-1);
385
386 if (response)
387 {
388 std::string output;
389 char buf[256];
390 while (!feof(p))
391 {
392 int len = fread(buf,1,255, p);
393 buf[len] = 0;
394 output += buf;
395 }
396 *response = output;
397 }
398
399 return (pclose(p));
400 }
401
402 string readfile(string filename)
403 {
404 string str;
405 ifstream in(filename.c_str());
406 if (in)
407 {
408 char buffer[4096];
409 in.read(buffer, 4095);
410 buffer[ in.gcount() ] = 0;
411 str = string(buffer);
412 in.close();
413 }
414 else
415 {
416 string message = "Could not open ";
417 message += filename;
418 throw std::runtime_error(message);
419 }
420 return str;
421 }
422
423
424
425 }

Properties

Name Value
svn:mergeinfo

  ViewVC Help
Powered by ViewVC 1.1.20