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