cleanup up cleanup at session destruction; clarify the meaning of 3 signals (DropRefe...
[ardour.git] / libs / ardour / session_handle.cc
1 /*
2     Copyright (C) 2009 Paul 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 */
19
20 #include "pbd/error.h"
21
22 #include "ardour/session.h"
23 #include "ardour/session_handle.h"
24
25 #include "i18n.h"
26
27 using namespace std;
28 using namespace ARDOUR;
29 using namespace PBD;
30
31 SessionHandlePtr::SessionHandlePtr (Session* s)
32         : _session (s) 
33 {
34         if (_session) {
35                 _session->DropReferences.connect_same_thread (_session_connections, boost::bind (&SessionHandlePtr::session_going_away, this));
36         }
37 }       
38
39 void
40 SessionHandlePtr::set_session (Session* s)
41 {
42         _session_connections.drop_connections ();
43
44         if (_session) {
45                 _session = 0;
46         }
47
48         if (s) {
49                 _session = s;
50                 _session->DropReferences.connect_same_thread (_session_connections, boost::bind (&SessionHandlePtr::session_going_away, this));
51         }
52 }
53
54 void
55 SessionHandlePtr::session_going_away ()
56 {
57         set_session (0);
58 }
59
60 /*-------------------------*/
61
62
63 SessionHandleRef::SessionHandleRef (Session& s)
64         : _session (s) 
65 {
66         _session.DropReferences.connect_same_thread (*this, boost::bind (&SessionHandleRef::session_going_away, this));
67         _session.Destroyed.connect_same_thread (*this, boost::bind (&SessionHandleRef::insanity_check, this));
68 }       
69
70 void
71 SessionHandleRef::session_going_away ()
72 {
73         /* a handleRef is allowed to exist at the time of DropReferences, but not at the time of Destroyed
74          */
75 }
76
77 void
78 SessionHandleRef::insanity_check ()
79 {
80         cerr << string_compose (_("programming error: %1"), "SessionHandleRef exists across sesssion deletion!") << endl;
81 }