~aleteoryx/muditaos

ref: f585c33b7afacce8fa10c33c44bab37e935b68d4 muditaos/module-services/service-desktop/parser/ParserFSM.hpp -rw-r--r-- 1.4 KiB
f585c33b — Lefucjusz [BH-2002] Fix crash when connected with broken USB cable 1 year, 6 months ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once

#include "MessageHandler.hpp"

#include <Timers/TimerHandle.hpp>

#include <json11.hpp>
#include <magic_enum.hpp>
#include <string>

namespace sdesktop::endpoints
{

    enum class State
    {
        NoMsg,
        ReceivedPartialHeader,
        ReceivedPartialPayload,
    };

    class StateMachine
    {
      public:
        explicit StateMachine(sys::Service *OwnerService);
        void processMessage(std::string &&msg);
        [[nodiscard]] auto getCurrentState() const noexcept -> State
        {
            return state;
        };

        void setState(const State newState) noexcept
        {
            state = newState;
        }

        void setMessageHandler(std::unique_ptr<MessageHandler> handler);

      private:
        std::string receivedMsg;
        State state = State::NoMsg;
        std::string payload;
        std::string header;
        unsigned long payloadLength   = 0;
        sys::Service *OwnerServicePtr = nullptr;
        std::unique_ptr<MessageHandler> messageHandler;
        sys::TimerHandle parserTimer;

        void parseHeader();
        void resetParser();
        void restartTimer();
        void parsePartialHeader();
        void parseNewMessage();
        void parsePartialMessage();
        void parsePayload();
    };

} // namespace sdesktop::endpoints