utils.h Example FileΒΆ

<@comment>// Copyright (C) 2022 The Qt Company Ltd.</@comment>
<@comment>// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause</@comment>
<@preprocessor>#ifndef UTILS_H</@preprocessor>
<@preprocessor>#define UTILS_H</@preprocessor>

<@preprocessor>#include &quot;types.h&quot;</@preprocessor>

<@preprocessor>#include &lt;QtCore/QFile&gt;</@preprocessor>
<@preprocessor>#include &lt;QtCore/QJsonArray&gt;</@preprocessor>
<@preprocessor>#include &lt;QtCore/QJsonObject&gt;</@preprocessor>
<@preprocessor>#include &lt;QtCore/QList&gt;</@preprocessor>
<@preprocessor>#include &lt;QtCore/QPair&gt;</@preprocessor>
<@preprocessor>#include &lt;QtHttpServer/QtHttpServer&gt;</@preprocessor>

<@preprocessor>#include &lt;optional&gt;</@preprocessor>

<@keyword>static</@keyword> std<@op>::</@op>optional<@op>&lt;</@op><@type>QByteArray</@type><@op>&gt;</@op> readFileToByteArray(<@keyword>const</@keyword> <@type>QString</@type> <@op>&amp;</@op>path)
{
    <@type>QFile</@type> file(path);
    <@keyword>if</@keyword> (<@op>!</@op>file<@op>.</@op>open(<@type>QIODevice</@type><@op>::</@op>ReadOnly <@op>|</@op> <@type>QIODevice</@type><@op>::</@op>Text))
        <@keyword>return</@keyword> std<@op>::</@op>nullopt;

    <@keyword>return</@keyword> file<@op>.</@op>readAll();
}

<@keyword>static</@keyword> std<@op>::</@op>optional<@op>&lt;</@op><@type>QJsonArray</@type><@op>&gt;</@op> byteArrayToJsonArray(<@keyword>const</@keyword> <@type>QByteArray</@type> <@op>&amp;</@op>arr)
{
    <@type>QJsonParseError</@type> err;
    <@keyword>const</@keyword> <@keyword>auto</@keyword> json <@op>=</@op> <@type>QJsonDocument</@type><@op>::</@op>fromJson(arr<@op>,</@op> <@op>&amp;</@op>err);
    <@keyword>if</@keyword> (err<@op>.</@op>error <@op>|</@op><@op>|</@op> <@op>!</@op>json<@op>.</@op>isArray())
        <@keyword>return</@keyword> std<@op>::</@op>nullopt;
    <@keyword>return</@keyword> json<@op>.</@op>array();
}

<@keyword>static</@keyword> std<@op>::</@op>optional<@op>&lt;</@op><@type>QJsonObject</@type><@op>&gt;</@op> byteArrayToJsonObject(<@keyword>const</@keyword> <@type>QByteArray</@type> <@op>&amp;</@op>arr)
{
    <@type>QJsonParseError</@type> err;
    <@keyword>const</@keyword> <@keyword>auto</@keyword> json <@op>=</@op> <@type>QJsonDocument</@type><@op>::</@op>fromJson(arr<@op>,</@op> <@op>&amp;</@op>err);
    <@keyword>if</@keyword> (err<@op>.</@op>error <@op>|</@op><@op>|</@op> <@op>!</@op>json<@op>.</@op>isObject())
        <@keyword>return</@keyword> std<@op>::</@op>nullopt;
    <@keyword>return</@keyword> json<@op>.</@op>object();
}

<@keyword>template</@keyword><@op>&lt;</@op><@keyword>typename</@keyword> T<@op>&gt;</@op>
<@keyword>static</@keyword> IdMap<@op>&lt;</@op>T<@op>&gt;</@op> tryLoadFromFile(<@keyword>const</@keyword> FromJsonFactory<@op>&lt;</@op>T<@op>&gt;</@op> <@op>&amp;</@op>itemFactory<@op>,</@op> <@keyword>const</@keyword> <@type>QString</@type> <@op>&amp;</@op>path)
{
    <@keyword>const</@keyword> <@keyword>auto</@keyword> maybeBytes <@op>=</@op> readFileToByteArray(path);
    <@keyword>if</@keyword> (maybeBytes) {
        <@keyword>const</@keyword> <@keyword>auto</@keyword> maybeArray <@op>=</@op> byteArrayToJsonArray(<@op>*</@op>maybeBytes);
        <@keyword>if</@keyword> (maybeArray) {
            <@keyword>return</@keyword> IdMap<@op>&lt;</@op>T<@op>&gt;</@op>(itemFactory<@op>,</@op> <@op>*</@op>maybeArray);
        } <@keyword>else</@keyword> {
            <@func target="qDebug()">qDebug</@func>() <@op>&lt;</@op><@op>&lt;</@op> <@string>&quot;Content of &quot;</@string> <@op>&lt;</@op><@op>&lt;</@op> path <@op>&lt;</@op><@op>&lt;</@op> <@string>&quot; is not json array.&quot;</@string>;
        }
    } <@keyword>else</@keyword> {
        <@func target="qDebug()">qDebug</@func>() <@op>&lt;</@op><@op>&lt;</@op> <@string>&quot;Reading file &quot;</@string> <@op>&lt;</@op><@op>&lt;</@op> path <@op>&lt;</@op><@op>&lt;</@op> <@string>&quot; failed.&quot;</@string>;
    }
    <@keyword>return</@keyword> IdMap<@op>&lt;</@op>T<@op>&gt;</@op>();
}

<@keyword>static</@keyword> <@type>QByteArray</@type> getValueFromHeader(<@keyword>const</@keyword> <@type>QHttpHeaders</@type> <@op>&amp;</@op>headers<@op>,</@op>
                                     <@type>QByteArrayView</@type> headerName)
{
    <@keyword>return</@keyword> headers<@op>.</@op>value(headerName)<@op>.</@op>toByteArray();
}

<@keyword>static</@keyword> std<@op>::</@op>optional<@op>&lt;</@op><@type>QString</@type><@op>&gt;</@op> getTokenFromRequest(<@keyword>const</@keyword> <@type>QHttpServerRequest</@type> <@op>&amp;</@op>request)
{
    std<@op>::</@op>optional<@op>&lt;</@op><@type>QString</@type><@op>&gt;</@op> token;
    <@keyword>if</@keyword> (<@keyword>auto</@keyword> bytes <@op>=</@op> getValueFromHeader(request<@op>.</@op>headers()<@op>,</@op> <@string>&quot;token&quot;</@string>); <@op>!</@op>bytes<@op>.</@op>isEmpty()) {
        token <@op>=</@op> bytes;
    }
    <@keyword>return</@keyword> token;
}

<@preprocessor>#endif // UTILS_H</@preprocessor>