cutelyst 4.3.0
A C++ Web Framework built on top of Qt, using the simple approach of Catalyst (Perl) framework.
actionchain.cpp
1/*
2 * SPDX-FileCopyrightText: (C) 2015-2022 Daniel Nicoletti <dantti12@gmail.com>
3 * SPDX-License-Identifier: BSD-3-Clause
4 */
5#include "actionchain_p.h"
6#include "context_p.h"
7#include "request_p.h"
8
9using namespace Cutelyst;
10
12 : Action(new ActionChainPrivate, parent)
13{
14 Q_D(ActionChain);
15 d->chain = chain;
16
17 const Action *final = d->chain.last();
18
19 QVariantHash args;
20 args.insert(QStringLiteral("namespace"), final->ns());
21 setupAction(args, nullptr);
22
23 setName(u'_' + final->name());
24 setReverse(final->reverse());
25 setAttributes(final->attributes());
26 setController(final->controller());
27
28 for (Action *action : chain) {
29 // FINAL should not have captures?
30 if (/*action != final && */ action->numberOfCaptures() > 0) {
31 d->captures += action->numberOfCaptures();
32 }
33 }
34}
35
37{
38 Q_D(const ActionChain);
39 return d->chain;
40}
41
42qint8 ActionChain::numberOfCaptures() const noexcept
43{
44 Q_D(const ActionChain);
45 return d->captures;
46}
47
49{
50 Q_D(const ActionChain);
51
52 Request *request = c->request();
53 const QStringList captures = request->captures();
54 const QStringList currentArgs = request->args();
55 const ActionList chain = d->chain;
56
57 int &actionRefCount = c->d_ptr->actionRefCount;
58 int &captured = c->d_ptr->chainedCaptured;
59 int &chainedIx = c->d_ptr->chainedIx;
60
61 for (; chainedIx < chain.size(); ++chainedIx) {
62 if (actionRefCount) {
63 c->d_ptr->pendingAsync.prepend(this);
64 request->setArguments(currentArgs);
65 break;
66 }
67
68 Action *action = chain.at(chainedIx);
69
70 QStringList args;
71 while (args.size() < action->numberOfCaptures() && captured < captures.size()) {
72 args.append(captures.at(captured++));
73 }
74
75 // Final action gets args instead of captures
76 request->setArguments(action != chain.last() ? args : currentArgs);
77 ++actionRefCount;
78 const bool ret = action->dispatch(c);
79 --actionRefCount;
80 if (!ret) {
81 return false;
82 }
83 }
84
85 return true;
86}
87
88#include "moc_actionchain.cpp"
Holds a chain of Cutelyst actions.
Definition actionchain.h:26
ActionChain(const ActionList &chain, QObject *parent=nullptr)
qint8 numberOfCaptures() const noexcept override
ActionList chain() const noexcept
bool doExecute(Context *c) override
This class represents a Cutelyst Action.
Definition action.h:36
void setAttributes(const ParamsMultiMap &attributes)
Definition action.cpp:80
void setupAction(const QVariantHash &args, Application *app)
Definition action.cpp:46
bool dispatch(Context *c)
Definition action.h:89
virtual qint8 numberOfCaptures() const
Definition action.cpp:130
void setController(Controller *controller)
Definition action.cpp:40
void setReverse(const QString &reverse)
Definition component.cpp:51
void setName(const QString &name)
Definition component.cpp:39
The Cutelyst Context.
Definition context.h:42
Request * request
Definition context.h:71
A request.
Definition request.h:42
QStringList captures() const noexcept
Definition request.cpp:161
void setArguments(const QStringList &arguments)
Definition request.cpp:155
The Cutelyst namespace holds all public Cutelyst API.
void append(QList::parameter_type value)
QList::const_reference at(qsizetype i) const const
T & last()
qsizetype size() const const