1 /* 2 * Copyright (c) 2023-2024 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef LOCAL_SOCKET_CONTEXT_H 17 #define LOCAL_SOCKET_CONTEXT_H 18 19 #include <condition_variable> 20 #include <cstddef> 21 22 #include "base_context.h" 23 #include "local_socket_options.h" 24 #include "napi/native_api.h" 25 #include "nocopyable.h" 26 #include "socket_state_base.h" 27 28 namespace OHOS::NetStack::Socket { 29 struct SocketBaseManager { SocketBaseManagerSocketBaseManager30 explicit SocketBaseManager(int sockfd) : sockfd_(sockfd) {} 31 int sockfd_ = 0; 32 }; 33 34 struct LocalSocketManager : public SocketBaseManager { LocalSocketManagerLocalSocketManager35 explicit LocalSocketManager(int sockfd) : SocketBaseManager(sockfd) {} 36 bool isConnected_ = false; 37 std::atomic_bool isSockClosed; 38 SetSocketCloseStatusLocalSocketManager39 void SetSocketCloseStatus(bool flag) 40 { 41 isSockClosed.store(flag, std::memory_order_relaxed); 42 } GetSocketCloseStatusLocalSocketManager43 bool GetSocketCloseStatus() 44 { 45 return isSockClosed.load(std::memory_order_relaxed); 46 } 47 }__attribute__((packed)); 48 49 class LocalSocketBaseContext : public BaseContext { 50 public: 51 DISALLOW_COPY_AND_MOVE(LocalSocketBaseContext); ~LocalSocketBaseContext()52 virtual ~LocalSocketBaseContext() {} LocalSocketBaseContext(napi_env env,EventManager * manager)53 LocalSocketBaseContext(napi_env env, EventManager *manager) : BaseContext(env, manager) {} 54 [[nodiscard]] virtual int GetSocketFd() const; 55 virtual void SetSocketFd(int sock); 56 [[nodiscard]] int32_t GetErrorCode() const override; 57 [[nodiscard]] std::string GetErrorMessage() const override; 58 59 protected: 60 bool CheckParamsWithOptions(napi_value *params, size_t paramsCount); 61 bool CheckParamsWithoutOptions(napi_value *params, size_t paramsCount); 62 }; 63 64 class LocalSocketBindContext final : public LocalSocketBaseContext { 65 public: LocalSocketBindContext(napi_env env,EventManager * manager)66 LocalSocketBindContext(napi_env env, EventManager *manager) : LocalSocketBaseContext(env, manager) {} 67 void ParseParams(napi_value *params, size_t paramsCount) override; 68 const std::string &GetSocketPath() const; 69 70 private: 71 std::string socketPath_; 72 }; 73 74 class LocalSocketGetLocalAddressContext final : public LocalSocketBaseContext { 75 public: LocalSocketGetLocalAddressContext(napi_env env,EventManager * manager)76 LocalSocketGetLocalAddressContext(napi_env env, EventManager *manager) : LocalSocketBaseContext(env, manager) {} 77 void ParseParams(napi_value *params, size_t paramsCount) override; 78 void SetSocketPath(const std::string socketPath); 79 std::string GetSocketPath(); 80 81 private: 82 std::string socketPath_; 83 }; 84 85 class LocalSocketConnectContext final : public LocalSocketBaseContext { 86 public: LocalSocketConnectContext(napi_env env,EventManager * manager)87 LocalSocketConnectContext(napi_env env, EventManager *manager) : LocalSocketBaseContext(env, manager) {} 88 void ParseParams(napi_value *params, size_t paramsCount) override; 89 const std::string &GetSocketPath() const; 90 int GetTimeoutMs() const; 91 92 private: 93 std::string socketPath_; 94 int timeout_ = 0; 95 }; 96 97 class LocalSocketSendContext final : public LocalSocketBaseContext { 98 public: LocalSocketSendContext(napi_env env,EventManager * manager)99 LocalSocketSendContext(napi_env env, EventManager *manager) : LocalSocketBaseContext(env, manager) {} 100 void ParseParams(napi_value *params, size_t paramsCount) override; 101 LocalSocketOptions &GetOptionsRef(); 102 103 private: 104 bool GetData(napi_value sendOptions); 105 LocalSocketOptions options_; 106 }; 107 108 class LocalSocketCloseContext final : public LocalSocketBaseContext { 109 public: LocalSocketCloseContext(napi_env env,EventManager * manager)110 LocalSocketCloseContext(napi_env env, EventManager *manager) : LocalSocketBaseContext(env, manager) {} 111 void ParseParams(napi_value *params, size_t paramsCount) override; 112 }; 113 114 class LocalSocketGetStateContext final : public LocalSocketBaseContext { 115 public: LocalSocketGetStateContext(napi_env env,EventManager * manager)116 LocalSocketGetStateContext(napi_env env, EventManager *manager) : LocalSocketBaseContext(env, manager) {} 117 void ParseParams(napi_value *params, size_t paramsCount) override; 118 SocketStateBase &GetStateRef(); 119 120 private: 121 SocketStateBase state_; 122 }; 123 124 class LocalSocketGetSocketFdContext final : public LocalSocketBaseContext { 125 public: LocalSocketGetSocketFdContext(napi_env env,EventManager * manager)126 LocalSocketGetSocketFdContext(napi_env env, EventManager *manager) : LocalSocketBaseContext(env, manager) {} 127 void ParseParams(napi_value *params, size_t paramsCount) override; 128 }; 129 130 class LocalSocketSetExtraOptionsContext final : public LocalSocketBaseContext { 131 public: LocalSocketSetExtraOptionsContext(napi_env env,EventManager * manager)132 LocalSocketSetExtraOptionsContext(napi_env env, EventManager *manager) : LocalSocketBaseContext(env, manager) {} 133 void ParseParams(napi_value *params, size_t paramsCount) override; 134 LocalExtraOptions &GetOptionsRef(); 135 136 private: 137 LocalExtraOptions options_; 138 }; 139 140 class LocalSocketGetExtraOptionsContext final : public LocalSocketBaseContext { 141 public: LocalSocketGetExtraOptionsContext(napi_env env,EventManager * manager)142 LocalSocketGetExtraOptionsContext(napi_env env, EventManager *manager) : LocalSocketBaseContext(env, manager) {} 143 void ParseParams(napi_value *params, size_t paramsCount) override; 144 LocalExtraOptions &GetOptionsRef(); 145 146 private: 147 LocalExtraOptions options_; 148 }; 149 } // namespace OHOS::NetStack::Socket 150 #endif /* LOCAL_SOCKET_CONTEXT_H */ 151