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,const std::shared_ptr<EventManager> & manager)53 LocalSocketBaseContext(napi_env env, const std::shared_ptr<EventManager> &manager) 54 : BaseContext(env, manager) {} 55 [[nodiscard]] virtual int GetSocketFd() const; 56 virtual void SetSocketFd(int sock); 57 [[nodiscard]] int32_t GetErrorCode() const override; 58 [[nodiscard]] std::string GetErrorMessage() const override; 59 60 protected: 61 bool CheckParamsWithOptions(napi_value *params, size_t paramsCount); 62 bool CheckParamsWithoutOptions(napi_value *params, size_t paramsCount); 63 }; 64 65 class LocalSocketBindContext final : public LocalSocketBaseContext { 66 public: LocalSocketBindContext(napi_env env,const std::shared_ptr<EventManager> & manager)67 LocalSocketBindContext(napi_env env, const std::shared_ptr<EventManager> &manager) 68 : LocalSocketBaseContext(env, manager) {} 69 void ParseParams(napi_value *params, size_t paramsCount) override; 70 const std::string &GetSocketPath() const; 71 72 private: 73 std::string socketPath_; 74 }; 75 76 class LocalSocketGetLocalAddressContext final : public LocalSocketBaseContext { 77 public: LocalSocketGetLocalAddressContext(napi_env env,const std::shared_ptr<EventManager> & manager)78 LocalSocketGetLocalAddressContext(napi_env env, const std::shared_ptr<EventManager> &manager) 79 : LocalSocketBaseContext(env, manager) {} 80 void ParseParams(napi_value *params, size_t paramsCount) override; 81 void SetSocketPath(const std::string socketPath); 82 std::string GetSocketPath(); 83 84 private: 85 std::string socketPath_; 86 }; 87 88 class LocalSocketConnectContext final : public LocalSocketBaseContext { 89 public: LocalSocketConnectContext(napi_env env,const std::shared_ptr<EventManager> & manager)90 LocalSocketConnectContext(napi_env env, const std::shared_ptr<EventManager> &manager) 91 : LocalSocketBaseContext(env, manager) {} 92 void ParseParams(napi_value *params, size_t paramsCount) override; 93 const std::string &GetSocketPath() const; 94 int GetTimeoutMs() const; 95 96 private: 97 std::string socketPath_; 98 int timeout_ = 0; 99 }; 100 101 class LocalSocketSendContext final : public LocalSocketBaseContext { 102 public: LocalSocketSendContext(napi_env env,const std::shared_ptr<EventManager> & manager)103 LocalSocketSendContext(napi_env env, const std::shared_ptr<EventManager> &manager) 104 : LocalSocketBaseContext(env, manager) {} 105 void ParseParams(napi_value *params, size_t paramsCount) override; 106 LocalSocketOptions &GetOptionsRef(); 107 108 private: 109 bool GetData(napi_value sendOptions); 110 LocalSocketOptions options_; 111 }; 112 113 class LocalSocketCloseContext final : public LocalSocketBaseContext { 114 public: LocalSocketCloseContext(napi_env env,const std::shared_ptr<EventManager> & manager)115 LocalSocketCloseContext(napi_env env, const std::shared_ptr<EventManager> &manager) 116 : LocalSocketBaseContext(env, manager) {} 117 void ParseParams(napi_value *params, size_t paramsCount) override; 118 }; 119 120 class LocalSocketGetStateContext final : public LocalSocketBaseContext { 121 public: LocalSocketGetStateContext(napi_env env,const std::shared_ptr<EventManager> & manager)122 LocalSocketGetStateContext(napi_env env, const std::shared_ptr<EventManager> &manager) 123 : LocalSocketBaseContext(env, manager) {} 124 void ParseParams(napi_value *params, size_t paramsCount) override; 125 SocketStateBase &GetStateRef(); 126 127 private: 128 SocketStateBase state_; 129 }; 130 131 class LocalSocketGetSocketFdContext final : public LocalSocketBaseContext { 132 public: LocalSocketGetSocketFdContext(napi_env env,const std::shared_ptr<EventManager> & manager)133 LocalSocketGetSocketFdContext(napi_env env, const std::shared_ptr<EventManager> &manager) 134 : LocalSocketBaseContext(env, manager) {} 135 void ParseParams(napi_value *params, size_t paramsCount) override; 136 }; 137 138 class LocalSocketSetExtraOptionsContext final : public LocalSocketBaseContext { 139 public: LocalSocketSetExtraOptionsContext(napi_env env,const std::shared_ptr<EventManager> & manager)140 LocalSocketSetExtraOptionsContext(napi_env env, const std::shared_ptr<EventManager> &manager) 141 : LocalSocketBaseContext(env, manager) {} 142 void ParseParams(napi_value *params, size_t paramsCount) override; 143 LocalExtraOptions &GetOptionsRef(); 144 145 private: 146 LocalExtraOptions options_; 147 }; 148 149 class LocalSocketGetExtraOptionsContext final : public LocalSocketBaseContext { 150 public: LocalSocketGetExtraOptionsContext(napi_env env,const std::shared_ptr<EventManager> & manager)151 LocalSocketGetExtraOptionsContext(napi_env env, const std::shared_ptr<EventManager> &manager) 152 : LocalSocketBaseContext(env, manager) {} 153 void ParseParams(napi_value *params, size_t paramsCount) override; 154 LocalExtraOptions &GetOptionsRef(); 155 156 private: 157 LocalExtraOptions options_; 158 }; 159 } // namespace OHOS::NetStack::Socket 160 #endif /* LOCAL_SOCKET_CONTEXT_H */ 161