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

Diff of /smsdaemon/main.cpp

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

revision 26 by torben, Mon Jun 9 18:15:53 2008 UTC revision 168 by torben, Tue Dec 9 21:44:15 2008 UTC
# Line 1  Line 1 
 #include <iostream>  
1  #include <string>  #include <string>
2    #include <stdlib.h>
3    
 #include <cctype>  
 #include <sstream>  
4  #include "daemon.h"  #include "daemon.h"
5  #include "common.h"  #include "Common.h"
6    #include "Logger.h"
7    
8  #include "GsmModem.h"  #include "ModemTransceiver.h"
9  #include "SerialPort.h"  #include "DebugTransceiver.h"
10    #include "SmsToolTransceiver.h"
11  #include "Plugin.h"  
12  #include "kbhit.h"  #include "serialport/SerialPort.h"
13    #include "SmsDaemon.h"
14  #include "util.h"  #include "ConfigFile.h"
15    
16  using namespace std;  using namespace std;
 using namespace Util;  
17    
18    
19  void create_log_message(SMS& sms,bool hasPlugin)  bool sms_exit(int exitcode)
20  {  {
21          ostringstream os;      if (Common::instance()->isDaemon)
22          os << "Recieved sms from " << sms.sender << " ; command=" << GetSmsCommand(sms);          daemonCleanup();
         if (!hasPlugin)  
                 os << " -- PLUGIN NOT FOUND";  
23    
24          Common::instance()->logMessage(os.str());          exit(exitcode);
25  }  }
26    
27    SerialPort* port = 0;
28    ISmsTransceiver* transceiver = 0;
29    
30  void main_loop(GsmModem& modem)  void openModemPort()
31  {  {
32          Common* cmn = Common::instance();          Common* cmn = Common::instance();
33          volatile bool& mainContinue = cmn->mainContinue;          ConfigFile* config = cmn->GetConfigfile();
   
         PluginManager& manager = cmn->pluginManager;  
34    
35          mainContinue = true;          port = new SerialPort ( config->GetValue("gsmmodem","serialport") );
36            try
         while (mainContinue)  
37          {          {
38                  vector<SMS> sms = modem.ReadSms();                  port->Open( SerialPort::BAUD_9600,
39                                       SerialPort::CHAR_SIZE_8,
40                  for (unsigned int i=0; i<sms.size(); ++i)                                     SerialPort::PARITY_NONE,
41                  {                                     SerialPort::STOP_BITS_1,
42                          string cmd = GetSmsCommand(sms[i]);                                     SerialPort::FLOW_CONTROL_HARD );
43                                    }
44                          cmd = Util::str_tolower(cmd);          catch(std::exception &e)
45            {
46                          Plugin* pl = manager.GetPlugin(cmd);                  Logger::logMessage( string("PortOpen Exception: ") + e.what() );
47                    sms_exit(1);
48                          create_log_message(sms[i], pl != 0);          }
   
                         if (pl)  
                         {  
                                 pl->Execute(modem, sms[i]);  
                         }  
                         else  
                         {  
                                 modem.SendSms(sms[i].sender, "Unknown command!");  
                         }  
   
                         modem.DeleteSms(sms[i].sms_index);  
                 }  
   
                 if (sms.size() == 0)  
                         Util::Sleep(10);  
49    
50                  if (cmn->isDebug && kbhit())          transceiver = new ModemTransceiver(*port);
                         break;  
51    
52            try
53            {
54                    ((ModemTransceiver*)transceiver)->Init();
55            }
56            catch (std::exception& e)
57            {
58                    Logger::logMessage( string("ModemTransceiver Exception: ") + e.what() );
59                    sms_exit(2);
60          }          }
61  }  }
62    void closeModemPort()
63    {
64            port->Close();
65            delete port;
66            delete transceiver;
67    }
68    
69  int main(int argc, char* argv[])  int main(int argc, char* argv[])
70  {  {
# Line 80  int main(int argc, char* argv[]) Line 72  int main(int argc, char* argv[])
72    
73          //Set default values          //Set default values
74    
75          cmn->setLogfile( "/var/log/smsdaemon.log");          Logger::setLogfile( "/var/log/smsdaemon.log");
76          cmn->pidfile = "/var/run/smsdaemon.pid";          cmn->pidfile = "/var/run/smsdaemon.pid";
77          cmn->spooldir = "/var/spool/smsdaemon";          cmn->spooldir = "/var/spool/smsdaemon";
78    
         cmn->uid = 500;  
         cmn->gid = 500;  
79    
80          cmn->loadConfig(argc,argv);          cmn->loadConfig(argc,argv);
81            cmn->daemonStart = time(0);
82    
83            ConfigFile* config = cmn->GetConfigfile();
84                    
85          /////////////////////          bool res = config->Open( cmn->configFilePath ) ;
86            if (!res) {
87                    Logger::logMessage(string("Could not open config file:") + cmn->configFilePath);
88                    return 1;
89            }
90                    
         //Write a delimiter line in the logfile to seperate sessions  
91    
92          if (Common::instance()->isDaemon)          /////////////////////
93                  daemonize();          string transconf = config->GetValue("smsdaemon", "transceiver");
94            
95    
96          cmn->logMessage("--------------------------------");          if (transconf == "internal")
97            {
98                    openModemPort();
99                    closeModemPort();
100            }
101            else if ( transconf == "debug" || transconf == "smstools")
102            {
103                    //do nothing
104            }
105            else
106            {
107                    Logger::logMessage( string("Invalid transceiver setting: ")+transconf);
108                    exit(1);
109            }
110    
         cmn->pluginManager.LoadPlugins();  
111                    
112    
113          SerialPort port("/dev/ttyS1" );          if (Common::instance()->isDaemon)
114          port.Open( SerialPort::BAUD_9600 );          {
115          GsmModem modem(port);                  lookup_uid_values();
116                    daemonize();
117                    cmn->daemonized = true;
118            }
119    
120    
121            if (transconf == "internal")
122            {
123                    openModemPort();
124            }
125            else if (transconf =="smstools")
126            {
127                    transceiver = new SmsToolTransceiver();
128            }
129            else if (transconf == "debug")
130            {
131                    transceiver = new DebugTransceiver();
132            }
133    
134          //////////////////////////////////          //////////////////////////////////
135    
136          Common::instance()->logMessage("SMS daemon started");          SmsDaemon daemon(*transceiver);
137    
138            daemon.Start();
139            //returns here when main-loop exits
140    
141          modem.DeleteAllSms();      if (cmn->isDaemon)
142            daemonCleanup();
143    
144          main_loop(modem);          if (transconf == "builtin")
145            {
146                    closeModemPort();
147            }
148    
149            return 0;
150  }  }
151    

Legend:
Removed from v.26  
changed lines
  Added in v.168

  ViewVC Help
Powered by ViewVC 1.1.20