]> git.ipfire.org Git - thirdparty/squid.git/blame - src/adaptation/Initiate.cc
Add source-maintenance.sh to perform automated Maintenance Updates
[thirdparty/squid.git] / src / adaptation / Initiate.cc
CommitLineData
2e4a5466 1/*
b510f3a1 2 * DEBUG: section 93 ICAP (RFC 3507) Client
2e4a5466
AR
3 */
4
5#include "squid.h"
6#include "HttpMsg.h"
2e4a5466
AR
7#include "adaptation/Initiator.h"
8#include "adaptation/Initiate.h"
9
26ac0430
AJ
10namespace Adaptation
11{
2e4a5466
AR
12
13// AdaptInitiator::noteAdaptionAnswer Dialer locks/unlocks the message in transit
14// TODO: replace HTTPMSGLOCK with general RefCounting and delete this class
15class AnswerDialer: public UnaryMemFunT<Initiator, HttpMsg*>
16{
17public:
18 typedef UnaryMemFunT<Initiator, HttpMsg*> Parent;
19
20 AnswerDialer(Initiator *obj, Parent::Method meth, HttpMsg *msg):
26ac0430 21 Parent(obj, meth, msg) { HTTPMSGLOCK(arg1); }
2e4a5466 22 AnswerDialer(const AnswerDialer &d):
26ac0430 23 Parent(d) { HTTPMSGLOCK(arg1); }
2e4a5466
AR
24 virtual ~AnswerDialer() { HTTPMSGUNLOCK(arg1); }
25};
26
27} // namespace Adaptation
28
29
30/* Initiate */
31
a22e6cd3 32Adaptation::Initiate::Initiate(const char *aTypeName, Initiator *anInitiator):
e1381638 33 AsyncJob(aTypeName), theInitiator(anInitiator)
2e4a5466 34{
2e4a5466
AR
35 assert(theInitiator);
36}
37
38Adaptation::Initiate::~Initiate()
39{
b8af5c82
AR
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)).
2e4a5466
AR
43}
44
45// internal cleanup
46void Adaptation::Initiate::swanSong()
47{
48 debugs(93, 5, HERE << "swan sings" << status());
49
50 if (theInitiator) {
51 debugs(93, 3, HERE << "fatal failure; sending abort notification");
52 tellQueryAborted(true); // final by default
53 }
54
55 debugs(93, 5, HERE << "swan sang" << status());
56}
57
58void Adaptation::Initiate::clearInitiator()
59{
60 if (theInitiator)
61 theInitiator.clear();
62}
63
64void Adaptation::Initiate::sendAnswer(HttpMsg *msg)
65{
66 assert(msg);
67 if (theInitiator.isThere()) {
68 CallJob(93, 5, __FILE__, __LINE__, "Initiator::noteAdaptAnswer",
26ac0430
AJ
69 AnswerDialer(theInitiator.ptr(), &Initiator::noteAdaptationAnswer, msg));
70 }
2e4a5466
AR
71 clearInitiator();
72}
73
74
75void Adaptation::Initiate::tellQueryAborted(bool final)
76{
77 if (theInitiator.isThere()) {
78 CallJobHere1(93, 5, theInitiator.ptr(),
26ac0430
AJ
79 Initiator::noteAdaptationQueryAbort, final);
80 }
2e4a5466
AR
81 clearInitiator();
82}
83
26ac0430
AJ
84const char *Adaptation::Initiate::status() const
85{
a0b91cde 86 return AsyncJob::status(); // for now
2e4a5466
AR
87}
88
89
90/* InitiatorHolder */
91
92Adaptation::InitiatorHolder::InitiatorHolder(Initiator *anInitiator):
26ac0430 93 prime(0), cbdata(0)
2e4a5466
AR
94{
95 if (anInitiator) {
96 cbdata = cbdataReference(anInitiator->toCbdata());
97 prime = anInitiator;
98 }
99}
100
101Adaptation::InitiatorHolder::InitiatorHolder(const InitiatorHolder &anInitiator):
26ac0430 102 prime(0), cbdata(0)
2e4a5466
AR
103{
104 if (anInitiator != NULL && cbdataReferenceValid(anInitiator.cbdata)) {
105 cbdata = cbdataReference(anInitiator.cbdata);
106 prime = anInitiator.prime;
107 }
108}
109
110Adaptation::InitiatorHolder::~InitiatorHolder()
111{
112 clear();
113}
114
26ac0430
AJ
115void Adaptation::InitiatorHolder::clear()
116{
2e4a5466
AR
117 if (prime) {
118 prime = NULL;
119 cbdataReferenceDone(cbdata);
120 }
121}
122
123Adaptation::Initiator *Adaptation::InitiatorHolder::ptr()
124{
125 assert(isThere());
126 return prime;
127}
128
129bool
26ac0430
AJ
130Adaptation::InitiatorHolder::isThere()
131{
2e4a5466
AR
132 return prime && cbdataReferenceValid(cbdata);
133}
134
135// should not be used
136Adaptation::InitiatorHolder &
137Adaptation::InitiatorHolder::operator =(const InitiatorHolder &anInitiator)
138{
139 assert(false);
140 return *this;
141}