Parcourir la source

Add wrapper class for POSIX socket

This class wraps functionalities coming from socket header library.

- replaced POSIX function calls in Socket class by wrapper class
Patrick-Christopher Mattulat il y a 2 ans
Parent
commit
9fd5fc7d00

+ 10 - 5
CMakeLists.txt

@@ -179,11 +179,16 @@ set(SOURCE_FILES_IO
         ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/io/StandardOutputWriter.cpp
         ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/io/StorableFile.cpp)
 
-set(SOURCE_FILES_NETWORK
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/network/core/ProtocolFamilyMapper.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/network/core/ProtocolMapper.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/network/socket/Socket.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/network/socket/SocketAddressMapper.cpp)
+if(${CMAKE_CXX_COMPILER_ID} STREQUAL GNU OR
+        ${CMAKE_CXX_COMPILER_ID} STREQUAL Clang OR
+        ${CMAKE_CXX_COMPILER_ID} STREQUAL AppleClang)
+    set(SOURCE_FILES_NETWORK
+            ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/network/core/ProtocolFamilyMapper.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/network/core/ProtocolMapper.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/network/socket/PosixSocket.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/network/socket/Socket.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/network/socket/SocketAddressMapper.cpp)
+endif()
 
 set(SOURCE_FILES_TIME
         ${CMAKE_CURRENT_SOURCE_DIR}/source/ls_std/time/Date.cpp)

+ 28 - 0
include/ls_std/core/interface/IPosixSocket.hpp

@@ -0,0 +1,28 @@
+/*
+ * Author:          Patrick-Christopher Mattulat
+ * Company:         Lynar Studios
+ * E-Mail:          webmaster@lynarstudios.com
+ * Created:         2022-12-09
+ * Changed:         2022-12-09
+ *
+ * */
+
+#ifndef LS_STD_I_POSIX_SOCKET_HPP
+#define LS_STD_I_POSIX_SOCKET_HPP
+
+#include <sys/socket.h>
+
+namespace ls::std::core::interface_type
+{
+  class IPosixSocket
+  {
+    public:
+
+      virtual ~IPosixSocket() = default;
+
+      virtual int connect(int _socketFileDescriptor, const struct sockaddr* _address, socklen_t _addressLength) = 0;
+      virtual int create(int _domain, int _type, int _protocol) = 0; // constructor
+  };
+}
+
+#endif

+ 29 - 0
include/ls_std/network/socket/PosixSocket.hpp

@@ -0,0 +1,29 @@
+/*
+ * Author:          Patrick-Christopher Mattulat
+ * Company:         Lynar Studios
+ * E-Mail:          webmaster@lynarstudios.com
+ * Created:         2022-12-09
+ * Changed:         2022-12-09
+ *
+ * */
+
+#ifndef LS_STD_POSIX_SOCKET_HPP
+#define LS_STD_POSIX_SOCKET_HPP
+
+#include <ls_std/core/interface/IPosixSocket.hpp>
+
+namespace ls::std::network
+{
+  class PosixSocket : public ls::std::core::interface_type::IPosixSocket
+  {
+    public:
+
+      PosixSocket() = default;
+      ~PosixSocket() override = default;
+
+      int connect(int _socketFileDescriptor, const struct sockaddr *_address, socklen_t _addressLength) override;
+      int create(int _domain, int _type, int _protocol) override;
+  };
+}
+
+#endif

+ 7 - 3
include/ls_std/network/socket/Socket.hpp

@@ -12,6 +12,9 @@
 
 #include <ls_std/os/dynamic_goal.hpp>
 #include <ls_std/core/Class.hpp>
+#if defined(unix) || defined(__APPLE__)
+#include "PosixSocket.hpp"
+#endif
 #include "SocketParameter.hpp"
 #include "SocketAddressMapperParameter.hpp"
 
@@ -32,16 +35,17 @@ namespace ls::std::network
       bool initialized{};
       ls::std::network::SocketParameter parameter{};
       #if defined(unix) || defined(__APPLE__)
+      ls::std::network::PosixSocket posixSocket{};
       int unixDescriptor{};
       #endif
 
       #if defined(unix) || defined(__APPLE__)
-      [[nodiscard]] bool _connectUnix() const;
+      [[nodiscard]] bool _connectUnix();
       #endif
       [[nodiscard]] SocketAddressMapperParameter _createSocketAddressMapperParameter() const;
-      [[nodiscard]] static bool _init(const ls::std::network::SocketParameter& _parameter);
+      [[nodiscard]] bool _init(const ls::std::network::SocketParameter& _parameter);
       #if defined(unix) || defined(__APPLE__)
-      [[nodiscard]] static bool _initUnix(const ls::std::network::SocketParameter& _parameter);
+      [[nodiscard]] bool _initUnix(const ls::std::network::SocketParameter& _parameter);
       #endif
   };
 }

+ 21 - 0
source/ls_std/network/socket/PosixSocket.cpp

@@ -0,0 +1,21 @@
+/*
+ * Author:          Patrick-Christopher Mattulat
+ * Company:         Lynar Studios
+ * E-Mail:          webmaster@lynarstudios.com
+ * Created:         2022-12-09
+ * Changed:         2022-12-09
+ *
+ * */
+
+#include <ls_std/network/socket/PosixSocket.hpp>
+#include <sys/socket.h>
+
+int ls::std::network::PosixSocket::connect(int _socketFileDescriptor, const struct sockaddr *_address, socklen_t _addressLength)
+{
+  return ::connect(_socketFileDescriptor, _address, _addressLength);
+}
+
+int ls::std::network::PosixSocket::create(int _domain, int _type, int _protocol)
+{
+  return ::socket(_domain, _type, _protocol);
+}

+ 4 - 7
source/ls_std/network/socket/Socket.cpp

@@ -8,9 +8,6 @@
  * */
 
 #include <ls_std/network/socket/Socket.hpp>
-#if defined(unix) || defined(__APPLE__)
-#include <sys/socket.h>
-#endif
 #include <ls_std/network/core/ProtocolFamilyMapper.hpp>
 #include <ls_std/network/core/ProtocolMapper.hpp>
 #include <ls_std/network/socket/ConvertedSocketAddress.hpp>
@@ -38,10 +35,10 @@ bool ls::std::network::Socket::isInitialized() const
 }
 
 #if defined(unix) || defined(__APPLE__)
-bool ls::std::network::Socket::_connectUnix() const
+bool ls::std::network::Socket::_connectUnix()
 {
   ls::std::network::ConvertedSocketAddress convertedSocketAddress = ls::std::network::SocketAddressMapper::from(ls::std::network::Socket::_createSocketAddressMapperParameter());
-  return ::connect(this->unixDescriptor, reinterpret_cast<const sockaddr *>(&convertedSocketAddress.socketAddressUnix), sizeof(convertedSocketAddress.socketAddressUnix)) == 0;
+  return this->posixSocket.connect(this->unixDescriptor, reinterpret_cast<const sockaddr *>(&convertedSocketAddress.socketAddressUnix), sizeof(convertedSocketAddress.socketAddressUnix)) == 0;
 }
 #endif
 
@@ -57,7 +54,7 @@ ls::std::network::SocketAddressMapperParameter ls::std::network::Socket::_create
 bool ls::std::network::Socket::_init(const ls::std::network::SocketParameter &_parameter)
 {
   #if defined(unix) || defined(__APPLE__)
-  return ls::std::network::Socket::_initUnix(_parameter);
+  return this->_initUnix(_parameter);
   #endif
 }
 
@@ -67,6 +64,6 @@ bool ls::std::network::Socket::_initUnix(const ls::std::network::SocketParameter
   ls::std::network::ConvertedProtocolFamily convertedProtocolFamily = ls::std::network::ProtocolFamilyMapper::from(_parameter.protocolFamilyType);
   ls::std::network::Protocol protocol = ls::std::network::ProtocolMapper::from(_parameter.socketAddress.protocolType);
 
-  return ::socket(convertedProtocolFamily.unixDomain, protocol.unixProtocol, 0);
+  return this->posixSocket.create(convertedProtocolFamily.unixDomain, protocol.unixProtocol, 0);
 }
 #endif