libzypp  14.48.5
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 #include "zypp/UserData.h"
17 
19 namespace zypp
20 {
21 
23  namespace HACK {
24  class Callback
25  {
26  };
27  } // namespace HACK
28 
30 
134  namespace callback
135  {
136 
138  struct ReportBase
139  {
141  virtual ~ReportBase()
142  {}
143  };
144 
146  template<class _Report>
148 
150  template<class _Report>
151  struct ReceiveReport : public _Report
152  {
154  typedef typename ReportType::UserData UserData;
157 
158  virtual ~ReceiveReport()
159  { disconnect(); }
160 
162  { return Distributor::instance().getReceiver(); }
163 
164  bool connected() const
165  { return whoIsConnected() == this; }
166 
167  void connect()
168  { Distributor::instance().setReceiver( *this ); }
169 
170  void disconnect()
171  { Distributor::instance().unsetReceiver( *this ); }
172 
173  virtual void reportbegin()
174  {}
175  virtual void reportend()
176  {}
177  };
178 
180  template<class _Report>
181  struct DistributeReport
182  {
183  public:
185  typedef typename ReportType::UserData UserData;
188 
190  {
191  static DistributeReport _self;
192  return _self;
193  }
194 
196  { return _receiver == &_noReceiver ? 0 : _receiver; }
197 
198  void setReceiver( Receiver & rec_r )
199  { _receiver = &rec_r; }
200 
201  void unsetReceiver( Receiver & rec_r )
202  { if ( _receiver == &rec_r ) noReceiver(); }
203 
204  void noReceiver()
205  { _receiver = &_noReceiver; }
206 
207  public:
209  { return _receiver; }
210 
211  private:
213  : _receiver( &_noReceiver )
214  {}
217  };
218 
220  template<class _Report>
222  {
224  typedef typename ReportType::UserData UserData;
227 
229  { Distributor::instance()->reportbegin(); }
230 
232  { Distributor::instance()->reportend(); }
233 
235  { return Distributor::instance().getReceiver(); }
236 
237  static bool connected()
238  { return whoIsConnected(); }
239 
241  { return Distributor::instance(); }
242  };
243 
269  template<class _Report>
270  struct TempConnect
271  {
273  typedef typename ReportType::UserData UserData;
276 
278  : _oldRec( Distributor::instance().getReceiver() )
279  {
281  }
282 
284  : _oldRec( Distributor::instance().getReceiver() )
285  {
286  rec_r.connect();
287  }
288 
290  {
291  if ( _oldRec )
293  else
295  }
296  private:
298  };
299 
301  } // namespace callback
304 } // namespace zypp
306 #endif // ZYPP_CALLBACK_H
virtual void reportend()
Definition: Callback.h:175
virtual void reportbegin()
Definition: Callback.h:173
DistributeReport< _Report > Distributor
Definition: Callback.h:226
ReceiveReport * whoIsConnected() const
Definition: Callback.h:161
Receiver * getReceiver() const
Definition: Callback.h:195
callback::UserData UserData
Definition: Callback.h:140
static DistributeReport & instance()
Definition: Callback.h:189
Temporarily connect a ReceiveReport then restore the previous one.
Definition: Callback.h:270
ReceiveReport< _Report > Receiver
Definition: Callback.h:225
TempConnect(Receiver &rec_r)
Definition: Callback.h:283
void setReceiver(Receiver &rec_r)
Definition: Callback.h:198
boost::noncopyable NonCopyable
Ensure derived classes cannot be copied.
Definition: NonCopyable.h:26
ReceiveReport< _Report > Receiver
Definition: Callback.h:186
DistributeReport< _Report > Distributor
Definition: Callback.h:187
DistributeReport< _Report > Distributor
Definition: Callback.h:275
static bool connected()
Definition: Callback.h:237
void unsetReceiver(Receiver &rec_r)
Definition: Callback.h:201
ReceiveReport< _Report > Receiver
Definition: Callback.h:274
ReportType::UserData UserData
Definition: Callback.h:185
Distributor & operator->()
Definition: Callback.h:240
ReportType::UserData UserData
Definition: Callback.h:224
Typesafe passing of user data via callbacks.
Definition: UserData.h:38
DistributeReport< _Report > Distributor
Definition: Callback.h:156
static Receiver * whoIsConnected()
Definition: Callback.h:234
ReportType::UserData UserData
Definition: Callback.h:154
ReceiveReport< _Report > Receiver
Definition: Callback.h:155
ReportType::UserData UserData
Definition: Callback.h:273