not completely tested new structure for VST/FST build
[ardour.git] / libs / pbd / transmitter.cc
1 /*
2     Copyright (C) 1998-99 Paul Barton-Davis 
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18     $Id$
19 */
20
21 #include <cstdlib>
22 #include <signal.h>
23 #include <iostream>
24 #include <string>
25
26 #include <pbd/transmitter.h>
27 #include <pbd/error.h>
28
29 using std::string;
30 using std::ios;
31
32 Transmitter::Transmitter (Channel c)
33 {
34         channel = c;
35         switch (c) {
36         case Error:
37                 send = &error;
38                 break;
39         case Warning:
40                 send = &warning;
41                 break;
42         case Info:
43                 send = &info;
44                 break;
45         case Fatal:
46                 send = &fatal;
47                 break;
48         case Throw:
49                 /* we should never call Transmitter::deliver
50                    for thrown messages (because its overridden in the
51                    class heirarchy). force a segv if we do.
52                 */
53                 send = 0;
54                 break;
55         }
56 }               
57
58 void
59 Transmitter::deliver ()
60
61 {
62         string foo;
63
64         /* NOTE: this is just a default action for a Transmitter or a
65            derived class. Any class can override this to produce some
66            other action when deliver() is called. 
67         */
68
69         *this << '\0';
70
71         /* send the SigC++ signal */
72
73         foo = str();
74         (*send) (channel, foo.c_str());
75
76         /* XXX when or how can we delete this ? */
77         // delete foo;
78
79         /* return to a pristine state */
80
81         clear ();
82         seekp (0, ios::beg);
83         seekg (0, ios::beg);
84
85         /* do the right thing if this should not return */
86         
87         if (does_not_return()) {
88                 sigset_t mask;
89                 
90                 sigemptyset (&mask);
91                 sigsuspend (&mask);
92                 /*NOTREACHED*/
93                 exit (1);
94         } 
95 }
96
97 bool
98 Transmitter::does_not_return ()
99
100 {
101         if (channel == Fatal || channel == Throw) {
102                 return true;
103         } else {
104                 return false;
105         }
106 }
107
108
109 extern "C" {
110   void pbd_c_error (const char *str)
111  
112   {
113         PBD::error << str << endmsg;
114   }
115 }