119e95205Sopenharmony_ci/*
219e95205Sopenharmony_ci * Copyright (C) 2021-2022 Huawei Device Co., Ltd.
319e95205Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
419e95205Sopenharmony_ci * you may not use this file except in compliance with the License.
519e95205Sopenharmony_ci * You may obtain a copy of the License at
619e95205Sopenharmony_ci *
719e95205Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
819e95205Sopenharmony_ci *
919e95205Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1019e95205Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1119e95205Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1219e95205Sopenharmony_ci * See the License for the specific language governing permissions and
1319e95205Sopenharmony_ci * limitations under the License.
1419e95205Sopenharmony_ci */
1519e95205Sopenharmony_ci
1619e95205Sopenharmony_ci#ifndef CONTEXT_H
1719e95205Sopenharmony_ci#define CONTEXT_H
1819e95205Sopenharmony_ci
1919e95205Sopenharmony_ci#include "base_def.h"
2019e95205Sopenharmony_ci#include "dispatcher.h"
2119e95205Sopenharmony_ci#include "message.h"
2219e95205Sopenharmony_ci
2319e95205Sopenharmony_cinamespace utility {
2419e95205Sopenharmony_ciclass IContextCallback {
2519e95205Sopenharmony_cipublic:
2619e95205Sopenharmony_ci    /**
2719e95205Sopenharmony_ci     * @brief A destructor used to delete the <b>IContextObserver</b> instance.
2819e95205Sopenharmony_ci     *
2919e95205Sopenharmony_ci     * @since 6
3019e95205Sopenharmony_ci     */
3119e95205Sopenharmony_ci    virtual ~IContextCallback() = default;
3219e95205Sopenharmony_ci
3319e95205Sopenharmony_ci    /**
3419e95205Sopenharmony_ci     * @brief Enable complete notify
3519e95205Sopenharmony_ci     *
3619e95205Sopenharmony_ci     * @param name adapter name or profile name.
3719e95205Sopenharmony_ci     * @param ret enable complete successful or failed.
3819e95205Sopenharmony_ci     * @since 6
3919e95205Sopenharmony_ci     */
4019e95205Sopenharmony_ci    virtual void OnEnable(const std::string &name, bool ret) = 0;
4119e95205Sopenharmony_ci
4219e95205Sopenharmony_ci    /**
4319e95205Sopenharmony_ci     * @brief Disable complete notify
4419e95205Sopenharmony_ci     *
4519e95205Sopenharmony_ci     * @param name adapter name or profile name.
4619e95205Sopenharmony_ci     * @param ret disable complete successful or failed.
4719e95205Sopenharmony_ci     * @since 6
4819e95205Sopenharmony_ci     */
4919e95205Sopenharmony_ci    virtual void OnDisable(const std::string &name, bool ret) = 0;
5019e95205Sopenharmony_ci};
5119e95205Sopenharmony_ci
5219e95205Sopenharmony_ciclass Context {
5319e95205Sopenharmony_cipublic:
5419e95205Sopenharmony_ci    /**
5519e95205Sopenharmony_ci     * @brief Construct a new Context object, Usually inherited by profile services,
5619e95205Sopenharmony_ci     *        to Construct it's own thread Context environment.
5719e95205Sopenharmony_ci     *
5819e95205Sopenharmony_ci     * @param name Context name.
5919e95205Sopenharmony_ci     * @param version Context version.
6019e95205Sopenharmony_ci     * @since 6
6119e95205Sopenharmony_ci     */
6219e95205Sopenharmony_ci    Context(const std::string &name, const std::string &version)
6319e95205Sopenharmony_ci        : name_(name), version_(version), dispatcher_(std::make_unique<Dispatcher>(name))
6419e95205Sopenharmony_ci    {}
6519e95205Sopenharmony_ci    virtual ~Context()
6619e95205Sopenharmony_ci    {}
6719e95205Sopenharmony_ci
6819e95205Sopenharmony_ci    /**
6919e95205Sopenharmony_ci     * @brief Enable.
7019e95205Sopenharmony_ci     * @since 6
7119e95205Sopenharmony_ci     */
7219e95205Sopenharmony_ci    virtual void Enable() = 0;
7319e95205Sopenharmony_ci
7419e95205Sopenharmony_ci    /**
7519e95205Sopenharmony_ci     * @brief Disable.
7619e95205Sopenharmony_ci     * @since 6
7719e95205Sopenharmony_ci     */
7819e95205Sopenharmony_ci    virtual void Disable() = 0;
7919e95205Sopenharmony_ci
8019e95205Sopenharmony_ci    /**
8119e95205Sopenharmony_ci     * @brief Post enable.
8219e95205Sopenharmony_ci     * @since 6
8319e95205Sopenharmony_ci     */
8419e95205Sopenharmony_ci    virtual void PostEnable()
8519e95205Sopenharmony_ci    {}
8619e95205Sopenharmony_ci
8719e95205Sopenharmony_ci    /**
8819e95205Sopenharmony_ci     * @brief Enable complete callback notify.
8919e95205Sopenharmony_ci     * @since 6
9019e95205Sopenharmony_ci     */
9119e95205Sopenharmony_ci    virtual void OnEnable(const std::string &name, bool ret)
9219e95205Sopenharmony_ci    {
9319e95205Sopenharmony_ci        if (callback_)
9419e95205Sopenharmony_ci            callback_->OnEnable(name, ret);
9519e95205Sopenharmony_ci    }
9619e95205Sopenharmony_ci
9719e95205Sopenharmony_ci    /**
9819e95205Sopenharmony_ci     * @brief Disable complete callback notify.
9919e95205Sopenharmony_ci     * @since 6
10019e95205Sopenharmony_ci     */
10119e95205Sopenharmony_ci    virtual void OnDisable(const std::string &name, bool ret)
10219e95205Sopenharmony_ci    {
10319e95205Sopenharmony_ci        if (callback_)
10419e95205Sopenharmony_ci            callback_->OnDisable(name, ret);
10519e95205Sopenharmony_ci    }
10619e95205Sopenharmony_ci
10719e95205Sopenharmony_ci    /**
10819e95205Sopenharmony_ci     * @brief register callback function.
10919e95205Sopenharmony_ci     * @param callback callback function.
11019e95205Sopenharmony_ci     * @since 6
11119e95205Sopenharmony_ci     */
11219e95205Sopenharmony_ci    void RegisterCallback(IContextCallback &callback)
11319e95205Sopenharmony_ci    {
11419e95205Sopenharmony_ci        callback_ = &callback;
11519e95205Sopenharmony_ci    }
11619e95205Sopenharmony_ci
11719e95205Sopenharmony_ci    /**
11819e95205Sopenharmony_ci     * @brief Initialize the context
11919e95205Sopenharmony_ci     * @since 6
12019e95205Sopenharmony_ci     */
12119e95205Sopenharmony_ci    void Initialize()
12219e95205Sopenharmony_ci    {
12319e95205Sopenharmony_ci        dispatcher_->Initialize();
12419e95205Sopenharmony_ci        InitializeInternal();
12519e95205Sopenharmony_ci    }
12619e95205Sopenharmony_ci
12719e95205Sopenharmony_ci    /**
12819e95205Sopenharmony_ci     * @brief Uninitialize the context
12919e95205Sopenharmony_ci     * @since 6
13019e95205Sopenharmony_ci     */
13119e95205Sopenharmony_ci    void Uninitialize()
13219e95205Sopenharmony_ci    {
13319e95205Sopenharmony_ci        dispatcher_->Uninitialize();
13419e95205Sopenharmony_ci        UninitializeInternal();
13519e95205Sopenharmony_ci    }
13619e95205Sopenharmony_ci
13719e95205Sopenharmony_ci    /**
13819e95205Sopenharmony_ci     * @brief Get the Context's Dispatcher object
13919e95205Sopenharmony_ci     * @return Dispatcher pointer.
14019e95205Sopenharmony_ci     * @since 6
14119e95205Sopenharmony_ci     */
14219e95205Sopenharmony_ci    Dispatcher *GetDispatcher()
14319e95205Sopenharmony_ci    {
14419e95205Sopenharmony_ci        return dispatcher_.get();
14519e95205Sopenharmony_ci    }
14619e95205Sopenharmony_ci
14719e95205Sopenharmony_ci    /**
14819e95205Sopenharmony_ci     * @brief Get Context's name.
14919e95205Sopenharmony_ci     * @return Context's name.
15019e95205Sopenharmony_ci     * @since 6
15119e95205Sopenharmony_ci     */
15219e95205Sopenharmony_ci    const std::string &Name() const
15319e95205Sopenharmony_ci    {
15419e95205Sopenharmony_ci        return name_;
15519e95205Sopenharmony_ci    }
15619e95205Sopenharmony_ci
15719e95205Sopenharmony_ci    /**
15819e95205Sopenharmony_ci     * @brief Get Context's version.
15919e95205Sopenharmony_ci     * @return Context's version.
16019e95205Sopenharmony_ci     * @since 6
16119e95205Sopenharmony_ci     */
16219e95205Sopenharmony_ci    const std::string &Version() const
16319e95205Sopenharmony_ci    {
16419e95205Sopenharmony_ci        return version_;
16519e95205Sopenharmony_ci    }
16619e95205Sopenharmony_ci
16719e95205Sopenharmony_ciprivate:
16819e95205Sopenharmony_ci    /**
16919e95205Sopenharmony_ci     * @brief Internal initialize function, called by Initialize
17019e95205Sopenharmony_ci     * @since 6
17119e95205Sopenharmony_ci     */
17219e95205Sopenharmony_ci    virtual void InitializeInternal()
17319e95205Sopenharmony_ci    {}
17419e95205Sopenharmony_ci
17519e95205Sopenharmony_ci    /**
17619e95205Sopenharmony_ci     * @brief Internal uninitialize function, called by Uninitialize
17719e95205Sopenharmony_ci     * @since 6
17819e95205Sopenharmony_ci     */
17919e95205Sopenharmony_ci    virtual void UninitializeInternal()
18019e95205Sopenharmony_ci    {}
18119e95205Sopenharmony_ci
18219e95205Sopenharmony_ci    std::string name_ {""};
18319e95205Sopenharmony_ci    std::string version_ {};
18419e95205Sopenharmony_ci    std::unique_ptr<Dispatcher> dispatcher_ {};
18519e95205Sopenharmony_ci    IContextCallback *callback_ = nullptr;
18619e95205Sopenharmony_ci    BT_DISALLOW_COPY_AND_ASSIGN(Context);
18719e95205Sopenharmony_ci};
18819e95205Sopenharmony_ci}  // namespace utility
18919e95205Sopenharmony_ci
19019e95205Sopenharmony_ci#endif  // CONTEXT_H