1c2b37d2cSopenharmony_ci/*
2c2b37d2cSopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3c2b37d2cSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4c2b37d2cSopenharmony_ci * you may not use this file except in compliance with the License.
5c2b37d2cSopenharmony_ci * You may obtain a copy of the License at
6c2b37d2cSopenharmony_ci *
7c2b37d2cSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8c2b37d2cSopenharmony_ci *
9c2b37d2cSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10c2b37d2cSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11c2b37d2cSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12c2b37d2cSopenharmony_ci * See the License for the specific language governing permissions and
13c2b37d2cSopenharmony_ci * limitations under the License.
14c2b37d2cSopenharmony_ci */
15c2b37d2cSopenharmony_ci
16c2b37d2cSopenharmony_ci#ifndef OS_ACCOUNT_SERVICES_ACCOUNTMGR_INCLUDE_ACCOUNT_STATE_MACHINE_H
17c2b37d2cSopenharmony_ci#define OS_ACCOUNT_SERVICES_ACCOUNTMGR_INCLUDE_ACCOUNT_STATE_MACHINE_H
18c2b37d2cSopenharmony_ci
19c2b37d2cSopenharmony_ci#include <iostream>
20c2b37d2cSopenharmony_ci#include <map>
21c2b37d2cSopenharmony_ci#include "account_state_action.h"
22c2b37d2cSopenharmony_ci#include "account_info.h"
23c2b37d2cSopenharmony_ci
24c2b37d2cSopenharmony_cinamespace OHOS {
25c2b37d2cSopenharmony_cinamespace AccountSA {
26c2b37d2cSopenharmony_ci/**
27c2b37d2cSopenharmony_ci * Account state machine
28c2b37d2cSopenharmony_ci */
29c2b37d2cSopenharmony_ciclass AccountStateMachine {
30c2b37d2cSopenharmony_cipublic:
31c2b37d2cSopenharmony_ci
32c2b37d2cSopenharmony_ci    /**
33c2b37d2cSopenharmony_ci     * exception event action, to re-init state machine, and get account state from account server.
34c2b37d2cSopenharmony_ci     */
35c2b37d2cSopenharmony_ci    class ExceptionAction : public AccountStateAction {
36c2b37d2cSopenharmony_ci    public:
37c2b37d2cSopenharmony_ci        /**
38c2b37d2cSopenharmony_ci         * exception event action Constructor.
39c2b37d2cSopenharmony_ci         */
40c2b37d2cSopenharmony_ci        explicit ExceptionAction(int status) : AccountStateAction(status) {}
41c2b37d2cSopenharmony_ci
42c2b37d2cSopenharmony_ci        /**
43c2b37d2cSopenharmony_ci          * exception event action Destructor.
44c2b37d2cSopenharmony_ci          */
45c2b37d2cSopenharmony_ci        ~ExceptionAction() override {}
46c2b37d2cSopenharmony_ci    };
47c2b37d2cSopenharmony_ci
48c2b37d2cSopenharmony_ci    /**
49c2b37d2cSopenharmony_ci     * unbound state action.
50c2b37d2cSopenharmony_ci     */
51c2b37d2cSopenharmony_ci    class UnboundAction : public AccountStateAction {
52c2b37d2cSopenharmony_ci    public:
53c2b37d2cSopenharmony_ci        /**
54c2b37d2cSopenharmony_ci         * unbound state action Constructor.
55c2b37d2cSopenharmony_ci         */
56c2b37d2cSopenharmony_ci        explicit UnboundAction(int status) : AccountStateAction(status) {}
57c2b37d2cSopenharmony_ci
58c2b37d2cSopenharmony_ci        /**
59c2b37d2cSopenharmony_ci          * unbound state action Destructor.
60c2b37d2cSopenharmony_ci          */
61c2b37d2cSopenharmony_ci        ~UnboundAction() override {}
62c2b37d2cSopenharmony_ci    };
63c2b37d2cSopenharmony_ci
64c2b37d2cSopenharmony_ci    /**
65c2b37d2cSopenharmony_ci     * login state action.
66c2b37d2cSopenharmony_ci     */
67c2b37d2cSopenharmony_ci    class LoginAction : public AccountStateAction {
68c2b37d2cSopenharmony_ci    public:
69c2b37d2cSopenharmony_ci        /**
70c2b37d2cSopenharmony_ci         * login state action Constructor.
71c2b37d2cSopenharmony_ci         */
72c2b37d2cSopenharmony_ci        explicit LoginAction(int status) : AccountStateAction(status) {}
73c2b37d2cSopenharmony_ci
74c2b37d2cSopenharmony_ci        /**
75c2b37d2cSopenharmony_ci          * login state action Destructor.
76c2b37d2cSopenharmony_ci          */
77c2b37d2cSopenharmony_ci        ~LoginAction() override {}
78c2b37d2cSopenharmony_ci    };
79c2b37d2cSopenharmony_ci
80c2b37d2cSopenharmony_ci    /**
81c2b37d2cSopenharmony_ci     * logout state action.
82c2b37d2cSopenharmony_ci     */
83c2b37d2cSopenharmony_ci    class LogoutAction : public AccountStateAction {
84c2b37d2cSopenharmony_ci    public:
85c2b37d2cSopenharmony_ci        /**
86c2b37d2cSopenharmony_ci         * logout state action Constructor.
87c2b37d2cSopenharmony_ci         */
88c2b37d2cSopenharmony_ci        explicit LogoutAction(int status) : AccountStateAction(status) {}
89c2b37d2cSopenharmony_ci
90c2b37d2cSopenharmony_ci        /**
91c2b37d2cSopenharmony_ci          * logout state action Destructor.
92c2b37d2cSopenharmony_ci          */
93c2b37d2cSopenharmony_ci        ~LogoutAction() override {}
94c2b37d2cSopenharmony_ci    };
95c2b37d2cSopenharmony_ci
96c2b37d2cSopenharmony_ci    /**
97c2b37d2cSopenharmony_ci     * logoff state action.
98c2b37d2cSopenharmony_ci     */
99c2b37d2cSopenharmony_ci    class LogoffAction : public AccountStateAction {
100c2b37d2cSopenharmony_ci    public:
101c2b37d2cSopenharmony_ci        /**
102c2b37d2cSopenharmony_ci         * logoff state action Constructor.
103c2b37d2cSopenharmony_ci         */
104c2b37d2cSopenharmony_ci        explicit LogoffAction(int status) : AccountStateAction(status) {}
105c2b37d2cSopenharmony_ci
106c2b37d2cSopenharmony_ci        /**
107c2b37d2cSopenharmony_ci          * logoff state action Destructor.
108c2b37d2cSopenharmony_ci          */
109c2b37d2cSopenharmony_ci        ~LogoffAction() override {}
110c2b37d2cSopenharmony_ci    };
111c2b37d2cSopenharmony_ci
112c2b37d2cSopenharmony_ci    /**
113c2b37d2cSopenharmony_ci      * Account state machine Constructor.
114c2b37d2cSopenharmony_ci      */
115c2b37d2cSopenharmony_ci    AccountStateMachine() : currentState_(ACCOUNT_STATE_UNBOUND)
116c2b37d2cSopenharmony_ci    {
117c2b37d2cSopenharmony_ci        OnInitialize();
118c2b37d2cSopenharmony_ci    }
119c2b37d2cSopenharmony_ci
120c2b37d2cSopenharmony_ci    /**
121c2b37d2cSopenharmony_ci      * Account state machine Destructor.
122c2b37d2cSopenharmony_ci      */
123c2b37d2cSopenharmony_ci    ~AccountStateMachine()
124c2b37d2cSopenharmony_ci    {
125c2b37d2cSopenharmony_ci        Clean();
126c2b37d2cSopenharmony_ci    }
127c2b37d2cSopenharmony_ci
128c2b37d2cSopenharmony_ci    /**
129c2b37d2cSopenharmony_ci      * Account state machine initialize.
130c2b37d2cSopenharmony_ci      */
131c2b37d2cSopenharmony_ci    void OnInitialize();
132c2b37d2cSopenharmony_ci
133c2b37d2cSopenharmony_ci    /**
134c2b37d2cSopenharmony_ci      * Account state machine clean.
135c2b37d2cSopenharmony_ci      */
136c2b37d2cSopenharmony_ci    void Clean();
137c2b37d2cSopenharmony_ci
138c2b37d2cSopenharmony_ci    /**
139c2b37d2cSopenharmony_ci     * Get account current state
140c2b37d2cSopenharmony_ci     *
141c2b37d2cSopenharmony_ci     * @return account current state
142c2b37d2cSopenharmony_ci     */
143c2b37d2cSopenharmony_ci    int GetAccountState()
144c2b37d2cSopenharmony_ci    {
145c2b37d2cSopenharmony_ci        return currentState_;
146c2b37d2cSopenharmony_ci    }
147c2b37d2cSopenharmony_ci
148c2b37d2cSopenharmony_ci    /**
149c2b37d2cSopenharmony_ci     * Set account current state
150c2b37d2cSopenharmony_ci     *
151c2b37d2cSopenharmony_ci     * @param current state
152c2b37d2cSopenharmony_ci     */
153c2b37d2cSopenharmony_ci    void SetAccountState(int currentState)
154c2b37d2cSopenharmony_ci    {
155c2b37d2cSopenharmony_ci        currentState_ = currentState;
156c2b37d2cSopenharmony_ci    }
157c2b37d2cSopenharmony_ci
158c2b37d2cSopenharmony_ci    /**
159c2b37d2cSopenharmony_ci     * Process an state change event.
160c2b37d2cSopenharmony_ci     *
161c2b37d2cSopenharmony_ci     * @param evt the event info
162c2b37d2cSopenharmony_ci     * @return true if the processing was completed, otherwise false
163c2b37d2cSopenharmony_ci     */
164c2b37d2cSopenharmony_ci    bool StateChangeProcess(int evt);
165c2b37d2cSopenharmony_ci
166c2b37d2cSopenharmony_ciprivate:
167c2b37d2cSopenharmony_ci     /**
168c2b37d2cSopenharmony_ci      * Account current state.
169c2b37d2cSopenharmony_ci      */
170c2b37d2cSopenharmony_ci    int currentState_;
171c2b37d2cSopenharmony_ci    std::map<int, std::map<int, AccountStateAction *>> stateMachineMap_;
172c2b37d2cSopenharmony_ci};
173c2b37d2cSopenharmony_ci}  // namespace AccountSA
174c2b37d2cSopenharmony_ci}  // namespace OHOS
175c2b37d2cSopenharmony_ci
176c2b37d2cSopenharmony_ci#endif  // OS_ACCOUNT_SERVICES_ACCOUNTMGR_INCLUDE_ACCOUNT_STATE_MACHINE_H
177