]>
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 assert(!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
);
85 Adaptation::Initiate::service()
87 assert(theService
!= NULL
);
91 const char *Adaptation::Initiate::status() const {
98 Adaptation::InitiatorHolder::InitiatorHolder(Initiator
*anInitiator
):
102 cbdata
= cbdataReference(anInitiator
->toCbdata());
107 Adaptation::InitiatorHolder::InitiatorHolder(const InitiatorHolder
&anInitiator
):
110 if (anInitiator
!= NULL
&& cbdataReferenceValid(anInitiator
.cbdata
)) {
111 cbdata
= cbdataReference(anInitiator
.cbdata
);
112 prime
= anInitiator
.prime
;
116 Adaptation::InitiatorHolder::~InitiatorHolder()
121 void Adaptation::InitiatorHolder::clear() {
124 cbdataReferenceDone(cbdata
);
128 Adaptation::Initiator
*Adaptation::InitiatorHolder::ptr()
135 Adaptation::InitiatorHolder::isThere() {
136 return prime
&& cbdataReferenceValid(cbdata
);
139 // should not be used
140 Adaptation::InitiatorHolder
&
141 Adaptation::InitiatorHolder::operator =(const InitiatorHolder
&anInitiator
)