]>
git.ipfire.org Git - thirdparty/squid.git/blob - src/adaptation/Initiate.cc
2 * DEBUG: section 93 ICAP (RFC 3507) Client
7 #include "adaptation/Initiator.h"
8 #include "adaptation/Initiate.h"
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
, Initiator
*anInitiator
):
33 AsyncJob(aTypeName
), theInitiator(anInitiator
)
38 Adaptation::Initiate::~Initiate()
40 // TODO: we cannot assert(!theInitiator) because that fails if a child
41 // constructor fails. AsyncJob should have wasStarted flag so that we
42 // can assert(!(wasStarted && theInitiator)).
46 void Adaptation::Initiate::swanSong()
48 debugs(93, 5, HERE
<< "swan sings" << status());
51 debugs(93, 3, HERE
<< "fatal failure; sending abort notification");
52 tellQueryAborted(true); // final by default
55 debugs(93, 5, HERE
<< "swan sang" << status());
58 void Adaptation::Initiate::clearInitiator()
64 void Adaptation::Initiate::sendAnswer(HttpMsg
*msg
)
67 if (theInitiator
.isThere()) {
68 CallJob(93, 5, __FILE__
, __LINE__
, "Initiator::noteAdaptAnswer",
69 AnswerDialer(theInitiator
.ptr(), &Initiator::noteAdaptationAnswer
, msg
));
75 void Adaptation::Initiate::tellQueryAborted(bool final
)
77 if (theInitiator
.isThere()) {
78 CallJobHere1(93, 5, theInitiator
.ptr(),
79 Initiator::noteAdaptationQueryAbort
, final
);
84 const char *Adaptation::Initiate::status() const
86 return AsyncJob::status(); // for now
92 Adaptation::InitiatorHolder::InitiatorHolder(Initiator
*anInitiator
):
96 cbdata
= cbdataReference(anInitiator
->toCbdata());
101 Adaptation::InitiatorHolder::InitiatorHolder(const InitiatorHolder
&anInitiator
):
104 if (anInitiator
!= NULL
&& cbdataReferenceValid(anInitiator
.cbdata
)) {
105 cbdata
= cbdataReference(anInitiator
.cbdata
);
106 prime
= anInitiator
.prime
;
110 Adaptation::InitiatorHolder::~InitiatorHolder()
115 void Adaptation::InitiatorHolder::clear()
119 cbdataReferenceDone(cbdata
);
123 Adaptation::Initiator
*Adaptation::InitiatorHolder::ptr()
130 Adaptation::InitiatorHolder::isThere()
132 return prime
&& cbdataReferenceValid(cbdata
);
135 // should not be used
136 Adaptation::InitiatorHolder
&
137 Adaptation::InitiatorHolder::operator =(const InitiatorHolder
&anInitiator
)