libzypp  14.29.1
Callback.h
Go to the documentation of this file.
1 /*---------------------------------------------------------------------\
2 | ____ _ __ __ ___ |
3 | |__ / \ / / . \ . \ |
4 | / / \ V /| _/ _/ |
5 | / /__ | | | | | | |
6 | /_____||_| |_| |_| |
7 | |
8 \---------------------------------------------------------------------*/
12 #ifndef ZYPP_CALLBACK_H
13 #define ZYPP_CALLBACK_H
14 
15 #include "zypp/base/NonCopyable.h"
16 
18 namespace zypp
19 {
20 
22  namespace HACK {
23  class Callback
24  {
25  };
26  } // namespace HACK
27 
29 
133  namespace callback
134  {
135 
137  struct ReportBase
138  {
139  virtual ~ReportBase()
140  {}
141  };
142 
144  template<class _Report>
146 
148  template<class _Report>
149  struct ReceiveReport : public _Report
150  {
154 
155  virtual ~ReceiveReport()
156  { disconnect(); }
157 
159  { return Distributor::instance().getReceiver(); }
160 
161  bool connected() const
162  { return whoIsConnected() == this; }
163 
164  void connect()
165  { Distributor::instance().setReceiver( *this ); }
166 
167  void disconnect()
168  { Distributor::instance().unsetReceiver( *this ); }
169 
170  virtual void reportbegin()
171  {}
172  virtual void reportend()
173  {}
174  };
175 
177  template<class _Report>
178  struct DistributeReport
179  {
180  public:
184 
186  {
187  static DistributeReport _self;
188  return _self;
189  }
190 
191  Receiver * getReceiver() const
192  { return _receiver == &_noReceiver ? 0 : _receiver; }
193 
194  void setReceiver( Receiver & rec_r )
195  { _receiver = &rec_r; }
196 
197  void unsetReceiver( Receiver & rec_r )
198  { if ( _receiver == &rec_r ) noReceiver(); }
199 
200  void noReceiver()
201  { _receiver = &_noReceiver; }
202 
203  public:
204  Receiver * operator->()
205  { return _receiver; }
206 
207  private:
209  : _receiver( &_noReceiver )
210  {}
211  Receiver _noReceiver;
212  Receiver * _receiver;
213  };
214 
216  template<class _Report>
218  {
222 
224  { Distributor::instance()->reportbegin(); }
225 
227  { Distributor::instance()->reportend(); }
228 
229  static Receiver * whoIsConnected()
230  { return Distributor::instance().getReceiver(); }
231 
232  static bool connected()
233  { return whoIsConnected(); }
234 
235  Distributor & operator->()
236  { return Distributor::instance(); }
237  };
238 
264  template<class _Report>
265  struct TempConnect
266  {
270 
272  : _oldRec( Distributor::instance().getReceiver() )
273  {
275  }
276 
277  TempConnect( Receiver & rec_r )
278  : _oldRec( Distributor::instance().getReceiver() )
279  {
280  rec_r.connect();
281  }
282 
284  {
285  if ( _oldRec )
287  else
289  }
290  private:
291  Receiver * _oldRec;
292  };
293 
295  } // namespace callback
298 } // namespace zypp
300 #endif // ZYPP_CALLBACK_H
virtual void reportend()
Definition: Callback.h:172
virtual void reportbegin()
Definition: Callback.h:170
DistributeReport< _Report > Distributor
Definition: Callback.h:221
ReceiveReport * whoIsConnected() const
Definition: Callback.h:158
Temporarily connect a ReceiveReport then restore the previous one.
Definition: Callback.h:265
ReceiveReport< _Report > Receiver
Definition: Callback.h:220
TempConnect(Receiver &rec_r)
Definition: Callback.h:277
boost::noncopyable NonCopyable
Ensure derived classes cannot be copied.
Definition: NonCopyable.h:26
void setReceiver(Receiver &rec_r)
Definition: Callback.h:194
ReceiveReport< _Report > Receiver
Definition: Callback.h:182
DistributeReport< _Report > Distributor
Definition: Callback.h:269
Receiver * getReceiver() const
Definition: Callback.h:191
static bool connected()
Definition: Callback.h:232
ReceiveReport< _Report > Receiver
Definition: Callback.h:268
void unsetReceiver(Receiver &rec_r)
Definition: Callback.h:197
DistributeReport< _Report > Distributor
Definition: Callback.h:183
Distributor & operator->()
Definition: Callback.h:235
DistributeReport< _Report > Distributor
Definition: Callback.h:153
static Receiver * whoIsConnected()
Definition: Callback.h:229
Easy-to use interface to the ZYPP dependency resolver.
Definition: CodePitfalls.doc:1
static DistributeReport & instance()
Definition: Callback.h:185
ReceiveReport< _Report > Receiver
Definition: Callback.h:152