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