1 /*
2 grive: an GPL program to sync a local directory with Google Drive
3 Copyright (C) 2012 Wan Wai Ho
4
5 This program is free software; you can redistribute it and/or
6 modify it under the terms of the GNU General Public License
7 as published by the Free Software Foundation version 2
8 of the License.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 */
19
20
21 #include "SignalHandler.hh"
22 #include <string>
23 #include <stdexcept>
24 #include <signal.h>
25 #include <iostream>
26 #include <sstream>
27
28 namespace gr {
29
SignalError(const std::string & message)30 SignalError::SignalError( const std::string& message ) :
31 std::runtime_error( message )
32 {
33 }
34
~SignalError()35 SignalError::~SignalError() throw ()
36 {
37
38 }
39
SignalHandler()40 SignalHandler::SignalHandler()
41 {
42
43 }
44
SignalHandler(const SignalHandler & right)45 SignalHandler::SignalHandler( const SignalHandler& right )
46 {
47
48 }
49
operator ==(const SignalHandler & right)50 SignalHandler& SignalHandler::operator ==( const SignalHandler& right )
51 {
52 return (*this);
53 }
54
~SignalHandler()55 SignalHandler::~SignalHandler()
56 {
57
58 }
59
GetInstance()60 SignalHandler& SignalHandler::GetInstance()
61 {
62 static SignalHandler _instance;
63 return _instance;
64 }
65
UnregisterSignal(unsigned int signumber)66 void SignalHandler::UnregisterSignal( unsigned int signumber )
67 {
68 m_signals[signumber] = 0 ;
69
70 // Restore the old signal
71 signal( ( int ) signumber, m_signalsOld[signumber] );
72 }
73
RegisterSignal(unsigned int signumber,Callback callback)74 void SignalHandler::RegisterSignal( unsigned int signumber, Callback callback )
75 {
76 signals_t::const_iterator anIterator ;
77 for (anIterator = m_signals.begin(); anIterator != m_signals.end(); ++anIterator)
78 {
79 if (anIterator->first == signumber)
80 {
81 if (anIterator->second != 0)
82 {
83 std::ostringstream oss;
84 oss << "Signal " << signumber << " already has a callback!";
85 throw SignalError( oss.str() ); ;
86 }
87 }
88 }
89
90 m_signals[signumber] = callback ;
91
92 if ( ( m_signalsOld[signumber] = signal( ( int ) signumber, m_signals[signumber] ) ) == SIG_ERR ) {
93 throw SignalError( " Error while registering the signal! " ) ;
94 }
95 }
96
97 }
98
99
100
101