connection.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2006-2008 by Marc Boris Duerner
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * As a special exception, you may use this file as part of a free
10  * software library without restriction. Specifically, if other files
11  * instantiate templates or use macros or inline functions from this
12  * file, or you compile this file and link it with other files to
13  * produce an executable, this file does not by itself cause the
14  * resulting executable to be covered by the GNU General Public
15  * License. This exception does not however invalidate any other
16  * reasons why the executable file might be covered by the GNU Library
17  * General Public License.
18  *
19  * This library is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22  * Lesser General Public License for more details.
23  *
24  * You should have received a copy of the GNU Lesser General Public
25  * License along with this library; if not, write to the Free Software
26  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27  */
28 
29 #ifndef cxxtools_Connection_h
30 #define cxxtools_Connection_h
31 
32 #include <cxxtools/slot.h>
33 #include <cxxtools/refcounted.h>
34 
35 namespace cxxtools {
36 
37  class Connectable;
38 
41  class ConnectionData : public RefCounted {
42  public:
44  : _refs(1)
45  , _valid(false)
46  , _slot(0)
47  , _sender(0)
48  { }
49 
51  : _refs(1)
52  , _valid(true)
53  , _slot(slot)
54  , _sender(&sender)
55  { }
56 
58  { delete _slot; }
59 
60  unsigned ref()
61  { return ++_refs; }
62 
63  unsigned unref()
64  { return --_refs; }
65 
66  unsigned refs() const
67  { return _refs; }
68 
69  bool valid() const
70  { return _valid; }
71 
72  void setValid(bool valid)
73  { _valid = valid; }
74 
76  { return *_sender; }
77 
78  const Connectable& sender() const
79  { return *_sender; }
80 
82  { return *_slot; }
83 
84  const Slot& slot() const
85  { return *_slot; }
86 
87  private:
88  unsigned _refs;
89  bool _valid;
90  Slot* _slot;
91  Connectable* _sender;
92  };
93 
97  class Connection
98  {
99  public:
100  Connection();
101 
103 
105 
106  ~Connection();
107 
108  bool valid() const
109  { return _data->valid(); }
110 
111  const Connectable& sender() const
112  { return _data->sender(); }
113 
114  const Slot& slot() const
115  { return _data->slot(); }
116 
117  bool operator!() const
118  { return this->valid() == false; }
119 
120  void close();
121 
122  Connection& operator=(const Connection& connection);
123 
124  bool operator==(const Connection& connection) const;
125 
126  private:
127  ConnectionData* _data;
128  };
129 
130 } // namespace cxxtools
131 
132 #endif