libzypp
17.14.0
Main Page
Related Pages
Modules
Namespaces
Classes
Files
File List
File Members
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
145
namespace
callback
146
{
147
149
struct
ReportBase
150
{
151
typedef
callback::UserData
UserData
;
152
typedef
UserData::ContentType
ContentType
;
153
155
virtual
void
report
(
const
UserData
& userData_r =
UserData
() )
156
{}
157
158
virtual
~ReportBase
()
159
{}
160
};
161
163
template
<
class
TReport>
164
struct
DistributeReport
;
165
167
template
<
class
TReport>
168
struct
ReceiveReport
:
public
TReport
169
{
170
typedef
TReport
ReportType
;
171
typedef
ReceiveReport<TReport>
Receiver
;
172
typedef
DistributeReport<TReport>
Distributor
;
173
174
virtual
~ReceiveReport
()
175
{
disconnect
(); }
176
177
ReceiveReport
*
whoIsConnected
()
const
178
{
return
Distributor::instance
().
getReceiver
(); }
179
180
bool
connected
()
const
181
{
return
whoIsConnected
() ==
this
; }
182
183
void
connect
()
184
{
Distributor::instance
().
setReceiver
( *
this
); }
185
186
void
disconnect
()
187
{
Distributor::instance
().
unsetReceiver
( *
this
); }
188
189
virtual
void
reportbegin
()
190
{}
191
virtual
void
reportend
()
192
{}
193
};
194
196
template
<
class
TReport>
197
struct
DistributeReport
198
{
199
public
:
200
typedef
TReport
ReportType
;
201
typedef
ReceiveReport<TReport>
Receiver
;
202
typedef
DistributeReport<TReport>
Distributor
;
203
204
static
DistributeReport
&
instance
()
205
{
206
static
DistributeReport
_self;
207
return
_self;
208
}
209
210
Receiver
*
getReceiver
()
const
211
{
return
_receiver
== &
_noReceiver
? 0 :
_receiver
; }
212
213
void
setReceiver
(
Receiver
& rec_r )
214
{
_receiver
= &rec_r; }
215
216
void
unsetReceiver
(
Receiver
& rec_r )
217
{
if
(
_receiver
== &rec_r )
noReceiver
(); }
218
219
void
noReceiver
()
220
{
_receiver
= &
_noReceiver
; }
221
222
public
:
223
Receiver
*
operator->
()
224
{
return
_receiver
; }
225
226
private
:
227
DistributeReport
()
228
:
_receiver
( &
_noReceiver
)
229
{}
230
Receiver
_noReceiver
;
231
Receiver
*
_receiver
;
232
};
233
235
template
<
class
TReport>
236
struct
SendReport
:
private
zypp::base::NonCopyable
237
{
238
typedef
TReport
ReportType
;
239
typedef
ReceiveReport<TReport>
Receiver
;
240
typedef
DistributeReport<TReport>
Distributor
;
241
242
SendReport
()
243
{
Distributor::instance
()->reportbegin(); }
244
245
~SendReport
()
246
{
Distributor::instance
()->reportend(); }
247
248
static
Receiver
*
whoIsConnected
()
249
{
return
Distributor::instance
().
getReceiver
(); }
250
251
static
bool
connected
()
252
{
return
whoIsConnected
(); }
253
254
Distributor
&
operator->
()
255
{
return
Distributor::instance
(); }
256
};
257
283
template
<
class
TReport>
284
struct
TempConnect
285
{
286
typedef
TReport
ReportType
;
287
typedef
ReceiveReport<TReport>
Receiver
;
288
typedef
DistributeReport<TReport>
Distributor
;
289
290
TempConnect
()
291
:
_oldRec
(
Distributor
::instance().getReceiver() )
292
{
293
Distributor::instance
().
noReceiver
();
294
}
295
296
TempConnect
(
Receiver
& rec_r )
297
:
_oldRec
(
Distributor
::instance().getReceiver() )
298
{
299
rec_r.connect();
300
}
301
302
~TempConnect
()
303
{
304
if
(
_oldRec
)
305
Distributor::instance
().
setReceiver
( *
_oldRec
);
306
else
307
Distributor::instance
().
noReceiver
();
308
}
309
private
:
310
Receiver
*
_oldRec
;
311
};
312
314
}
// namespace callback
317
}
// namespace zypp
319
#endif // ZYPP_CALLBACK_H
zypp
Callback.h
Generated by
1.8.2