]>
git.ipfire.org Git - thirdparty/squid.git/blob - src/adaptation/Initiate.cc
2 * DEBUG: section 93 ICAP (RFC 3507) Client
7 #include "adaptation/Service.h"
8 #include "adaptation/Initiator.h"
9 #include "adaptation/Initiate.h"
11 namespace Adaptation
{
13 // AdaptInitiator::noteAdaptionAnswer Dialer locks/unlocks the message in transit
14 // TODO: replace HTTPMSGLOCK with general RefCounting and delete this class
15 class AnswerDialer
: public UnaryMemFunT
<Initiator
, HttpMsg
*>
18 typedef UnaryMemFunT
<Initiator
, HttpMsg
*> Parent
;
20 AnswerDialer(Initiator
*obj
, Parent::Method meth
, HttpMsg
*msg
):
21 Parent(obj
, meth
, msg
) { HTTPMSGLOCK(arg1
); }
22 AnswerDialer(const AnswerDialer
&d
):
23 Parent(d
) { HTTPMSGLOCK(arg1
); }
24 virtual ~AnswerDialer() { HTTPMSGUNLOCK(arg1
); }
27 } // namespace Adaptation
32 Adaptation::Initiate::Initiate(const char *aTypeName
,
33 Initiator
*anInitiator
, ServicePointer aService
):
34 AsyncJob(aTypeName
), theInitiator(anInitiator
), theService(aService
)
36 assert(theService
!= NULL
);
40 Adaptation::Initiate::~Initiate()
42 // TODO: we cannot assert(!theInitiator) because that fails if a child
43 // constructor fails. AsyncJob should have wasStarted flag so that we
44 // can assert(!(wasStarted && theInitiator)).
48 void Adaptation::Initiate::swanSong()
50 debugs(93, 5, HERE
<< "swan sings" << status());
53 debugs(93, 3, HERE
<< "fatal failure; sending abort notification");
54 tellQueryAborted(true); // final by default
57 debugs(93, 5, HERE
<< "swan sang" << status());
60 void Adaptation::Initiate::clearInitiator()
66 void Adaptation::Initiate::sendAnswer(HttpMsg
*msg
)
69 if (theInitiator
.isThere()) {
70 CallJob(93, 5, __FILE__
, __LINE__
, "Initiator::noteAdaptAnswer",
71 AnswerDialer(theInitiator
.ptr(), &Initiator::noteAdaptationAnswer
, msg
));
77 void Adaptation::Initiate::tellQueryAborted(bool final
)
79 if (theInitiator
.isThere()) {
80 CallJobHere1(93, 5, theInitiator
.ptr(),
81 Initiator::noteAdaptationQueryAbort
, final
);
87 Adaptation::Initiate::service()
89 assert(theService
!= NULL
);
93 const char *Adaptation::Initiate::status() const {
94 return AsyncJob::status(); // for now
100 Adaptation::InitiatorHolder::InitiatorHolder(Initiator
*anInitiator
):
104 cbdata
= cbdataReference(anInitiator
->toCbdata());
109 Adaptation::InitiatorHolder::InitiatorHolder(const InitiatorHolder
&anInitiator
):
112 if (anInitiator
!= NULL
&& cbdataReferenceValid(anInitiator
.cbdata
)) {
113 cbdata
= cbdataReference(anInitiator
.cbdata
);
114 prime
= anInitiator
.prime
;
118 Adaptation::InitiatorHolder::~InitiatorHolder()
123 void Adaptation::InitiatorHolder::clear() {
126 cbdataReferenceDone(cbdata
);
130 Adaptation::Initiator
*Adaptation::InitiatorHolder::ptr()
137 Adaptation::InitiatorHolder::isThere() {
138 return prime
&& cbdataReferenceValid(cbdata
);
141 // should not be used
142 Adaptation::InitiatorHolder
&
143 Adaptation::InitiatorHolder::operator =(const InitiatorHolder
&anInitiator
)