11e934351Sopenharmony_ci/*
21e934351Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
31e934351Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
41e934351Sopenharmony_ci * you may not use this file except in compliance with the License.
51e934351Sopenharmony_ci * You may obtain a copy of the License at
61e934351Sopenharmony_ci *
71e934351Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
81e934351Sopenharmony_ci *
91e934351Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
101e934351Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
111e934351Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
121e934351Sopenharmony_ci * See the License for the specific language governing permissions and
131e934351Sopenharmony_ci * limitations under the License.
141e934351Sopenharmony_ci */
151e934351Sopenharmony_ci
161e934351Sopenharmony_ci#ifndef CLIENT_CONTEXT_H
171e934351Sopenharmony_ci#define CLIENT_CONTEXT_H
181e934351Sopenharmony_ci
191e934351Sopenharmony_ci#include <atomic>
201e934351Sopenharmony_ci#include <iostream>
211e934351Sopenharmony_ci#include <map>
221e934351Sopenharmony_ci#include <memory>
231e934351Sopenharmony_ci#include <mutex>
241e934351Sopenharmony_ci#include <queue>
251e934351Sopenharmony_ci#include <signal.h>
261e934351Sopenharmony_ci#include <string.h>
271e934351Sopenharmony_ci#include <string>
281e934351Sopenharmony_ci#include <thread>
291e934351Sopenharmony_ci#include "netstack_log.h"
301e934351Sopenharmony_ci
311e934351Sopenharmony_cinamespace OHOS {
321e934351Sopenharmony_cinamespace NetStack {
331e934351Sopenharmony_cinamespace WebSocketClient {
341e934351Sopenharmony_ci
351e934351Sopenharmony_cistruct SendData {
361e934351Sopenharmony_ci    SendData(char *paraData, size_t paraLength, lws_write_protocol paraProtocol)
371e934351Sopenharmony_ci        : data(paraData), length(paraLength), protocol(paraProtocol)
381e934351Sopenharmony_ci    {
391e934351Sopenharmony_ci    }
401e934351Sopenharmony_ci
411e934351Sopenharmony_ci    SendData() = delete;
421e934351Sopenharmony_ci
431e934351Sopenharmony_ci    ~SendData() = default;
441e934351Sopenharmony_ci
451e934351Sopenharmony_ci    char *data;
461e934351Sopenharmony_ci    size_t length;
471e934351Sopenharmony_ci    lws_write_protocol protocol;
481e934351Sopenharmony_ci};
491e934351Sopenharmony_ci
501e934351Sopenharmony_ciclass ClientContext {
511e934351Sopenharmony_cipublic:
521e934351Sopenharmony_ci    ClientContext() : closeStatus(LWS_CLOSE_STATUS_NOSTATUS), openStatus(0), errorCode(0), closed_(false),
531e934351Sopenharmony_ci                      threadStop_(false), context_(nullptr), clientId(0) {}
541e934351Sopenharmony_ci
551e934351Sopenharmony_ci    bool IsClosed()
561e934351Sopenharmony_ci    {
571e934351Sopenharmony_ci        std::lock_guard<std::mutex> lock(mutex_);
581e934351Sopenharmony_ci        return closed_;
591e934351Sopenharmony_ci    }
601e934351Sopenharmony_ci
611e934351Sopenharmony_ci    bool IsThreadStop()
621e934351Sopenharmony_ci    {
631e934351Sopenharmony_ci        return threadStop_.load();
641e934351Sopenharmony_ci    }
651e934351Sopenharmony_ci
661e934351Sopenharmony_ci    void SetThreadStop(bool threadStop)
671e934351Sopenharmony_ci    {
681e934351Sopenharmony_ci        threadStop_.store(threadStop);
691e934351Sopenharmony_ci    }
701e934351Sopenharmony_ci
711e934351Sopenharmony_ci    void Close(lws_close_status status, const std::string &reason)
721e934351Sopenharmony_ci    {
731e934351Sopenharmony_ci        NETSTACK_LOGD("ClientContext  Close");
741e934351Sopenharmony_ci        std::lock_guard<std::mutex> lock(mutex_);
751e934351Sopenharmony_ci        closeStatus = status;
761e934351Sopenharmony_ci        closeReason = reason;
771e934351Sopenharmony_ci        closed_ = true;
781e934351Sopenharmony_ci    }
791e934351Sopenharmony_ci
801e934351Sopenharmony_ci    void Push(char *data, size_t length, lws_write_protocol protocol)
811e934351Sopenharmony_ci    {
821e934351Sopenharmony_ci        std::lock_guard<std::mutex> lock(mutex_);
831e934351Sopenharmony_ci        dataQueue_.push(SendData(data, length, protocol));
841e934351Sopenharmony_ci    }
851e934351Sopenharmony_ci
861e934351Sopenharmony_ci    SendData Pop()
871e934351Sopenharmony_ci    {
881e934351Sopenharmony_ci        std::lock_guard<std::mutex> lock(mutex_);
891e934351Sopenharmony_ci        if (dataQueue_.empty()) {
901e934351Sopenharmony_ci            return {nullptr, 0, LWS_WRITE_TEXT};
911e934351Sopenharmony_ci        }
921e934351Sopenharmony_ci
931e934351Sopenharmony_ci        SendData data = dataQueue_.front();
941e934351Sopenharmony_ci        dataQueue_.pop();
951e934351Sopenharmony_ci        return data;
961e934351Sopenharmony_ci    }
971e934351Sopenharmony_ci
981e934351Sopenharmony_ci    void SetContext(lws_context *context)
991e934351Sopenharmony_ci    {
1001e934351Sopenharmony_ci        context_ = context;
1011e934351Sopenharmony_ci    }
1021e934351Sopenharmony_ci
1031e934351Sopenharmony_ci    lws_context *GetContext()
1041e934351Sopenharmony_ci    {
1051e934351Sopenharmony_ci        return context_;
1061e934351Sopenharmony_ci    }
1071e934351Sopenharmony_ci
1081e934351Sopenharmony_ci    void SetClientId(int id)
1091e934351Sopenharmony_ci    {
1101e934351Sopenharmony_ci        clientId = id;
1111e934351Sopenharmony_ci    }
1121e934351Sopenharmony_ci
1131e934351Sopenharmony_ci    int GetClientId()
1141e934351Sopenharmony_ci    {
1151e934351Sopenharmony_ci        return clientId;
1161e934351Sopenharmony_ci    }
1171e934351Sopenharmony_ci
1181e934351Sopenharmony_ci    std::map<std::string, std::string> header;
1191e934351Sopenharmony_ci
1201e934351Sopenharmony_ci    lws_close_status closeStatus;
1211e934351Sopenharmony_ci
1221e934351Sopenharmony_ci    std::string closeReason;
1231e934351Sopenharmony_ci
1241e934351Sopenharmony_ci    uint32_t openStatus;
1251e934351Sopenharmony_ci
1261e934351Sopenharmony_ci    uint32_t errorCode;
1271e934351Sopenharmony_ci
1281e934351Sopenharmony_ci    std::string openMessage;
1291e934351Sopenharmony_ci
1301e934351Sopenharmony_ciprivate:
1311e934351Sopenharmony_ci    bool closed_;
1321e934351Sopenharmony_ci
1331e934351Sopenharmony_ci    std::atomic_bool threadStop_;
1341e934351Sopenharmony_ci
1351e934351Sopenharmony_ci    std::mutex mutex_;
1361e934351Sopenharmony_ci
1371e934351Sopenharmony_ci    lws_context *context_;
1381e934351Sopenharmony_ci
1391e934351Sopenharmony_ci    std::queue<SendData> dataQueue_;
1401e934351Sopenharmony_ci
1411e934351Sopenharmony_ci    int clientId;
1421e934351Sopenharmony_ci};
1431e934351Sopenharmony_ci}; // namespace WebSocketClient
1441e934351Sopenharmony_ci} // namespace NetStack
1451e934351Sopenharmony_ci} // namespace OHOS
1461e934351Sopenharmony_ci#endif
147