Compare commits
21 Commits
main
...
NetChannel
Author | SHA1 | Date | |
---|---|---|---|
73f7ec1a8d | |||
135f855309 | |||
159428ea76 | |||
c23cbc275f | |||
fbd8464043 | |||
f52afe9c92 | |||
61fb586f86 | |||
c19c6269aa | |||
0b1a0c9689 | |||
83bb62456a | |||
f1d1a1cbb1 | |||
8bf4f6336f | |||
25e40560b7 | |||
bce48fe121 | |||
2cb01a7c65 | |||
3025b76bec | |||
0cec9789b1 | |||
63eba0d2db | |||
c5b281d73c | |||
8d28f3547c | |||
a7f09382fd |
@ -35,6 +35,8 @@ jobs:
|
|||||||
mv build/Release/EHS_Dyn.dll bin
|
mv build/Release/EHS_Dyn.dll bin
|
||||||
mv build/Release/StrToHash.exe bin
|
mv build/Release/StrToHash.exe bin
|
||||||
mv build/Release/zlib1.dll bin
|
mv build/Release/zlib1.dll bin
|
||||||
|
mv build/Release/libcrypto-3-x64.dll bin
|
||||||
|
mv build/Release/libssl-3-x64.dll bin
|
||||||
mkdir lib
|
mkdir lib
|
||||||
mv build/Release/EHS_Stc.lib lib
|
mv build/Release/EHS_Stc.lib lib
|
||||||
mv build/Release/EHS_Dyn.lib lib
|
mv build/Release/EHS_Dyn.lib lib
|
||||||
@ -65,7 +67,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Installing Dependencies
|
- name: Installing Dependencies
|
||||||
run: |
|
run: |
|
||||||
sudo pacman -S --noconfirm doxygen zip alsa-lib libxcb xcb-util-cursor pipewire
|
sudo pacman -S --noconfirm doxygen ninja zip libxcb xcb-util-cursor pipewire
|
||||||
|
|
||||||
- name: Generating Documentation
|
- name: Generating Documentation
|
||||||
run: |
|
run: |
|
||||||
@ -74,7 +76,7 @@ jobs:
|
|||||||
- name: Building/Compiling/Installing Project
|
- name: Building/Compiling/Installing Project
|
||||||
run: |
|
run: |
|
||||||
cd ${{ gitea.workspace }}
|
cd ${{ gitea.workspace }}
|
||||||
cmake -DCMAKE_BUILD_TYPE=Release -DLINUX_WINDOW_SYSTEM:STRING=XCB .
|
cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DLINUX_WINDOW_SYSTEM:STRING=XCB .
|
||||||
cmake --build . --config Release
|
cmake --build . --config Release
|
||||||
cmake --install .
|
cmake --install .
|
||||||
|
|
||||||
@ -110,7 +112,7 @@ jobs:
|
|||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Installing Dependencies
|
- name: Installing Dependencies
|
||||||
run: sudo apt install -y doxygen zip libasound2-dev libxcb1-dev libxcb-xinput-dev libxcb-cursor-dev libpipewire-0.3-dev
|
run: sudo apt install -y doxygen ninja-build zip libxcb1-dev libxcb-xinput-dev libxcb-cursor-dev libpipewire-0.3-dev
|
||||||
|
|
||||||
- name: Generating Documentation
|
- name: Generating Documentation
|
||||||
run: |
|
run: |
|
||||||
@ -119,7 +121,7 @@ jobs:
|
|||||||
- name: Building/Compiling/Installing Project
|
- name: Building/Compiling/Installing Project
|
||||||
run: |
|
run: |
|
||||||
cd ${{ gitea.workspace }}
|
cd ${{ gitea.workspace }}
|
||||||
cmake -DCMAKE_BUILD_TYPE=Release -DLINUX_WINDOW_SYSTEM:STRING=XCB .
|
cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DLINUX_WINDOW_SYSTEM:STRING=XCB .
|
||||||
cmake --build . --config Release
|
cmake --build . --config Release
|
||||||
cmake --install .
|
cmake --install .
|
||||||
|
|
||||||
|
26
Assembly.def
Normal file
26
Assembly.def
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
LIBRARY EHS_Dyn
|
||||||
|
EXPORTS
|
||||||
|
?GenerateSeed_u64@HRNG@ehs@@SA_KXZ
|
||||||
|
?Generate_u64@HRNG@ehs@@SA_K_K0@Z
|
||||||
|
?Generate_u64@HRNG@ehs@@SA_KXZ
|
||||||
|
?GenerateSeed_s64@HRNG@ehs@@SA_JXZ
|
||||||
|
?Generate_s64@HRNG@ehs@@SA_J_J0@Z
|
||||||
|
?Generate_s64@HRNG@ehs@@SA_JXZ
|
||||||
|
?GenerateSeed_u32@HRNG@ehs@@SAIXZ
|
||||||
|
?Generate_u32@HRNG@ehs@@SAIII@Z
|
||||||
|
?Generate_u32@HRNG@ehs@@SAIXZ
|
||||||
|
?GenerateSeed_s32@HRNG@ehs@@SAHXZ
|
||||||
|
?Generate_s32@HRNG@ehs@@SAHHH@Z
|
||||||
|
?Generate_s32@HRNG@ehs@@SAHXZ
|
||||||
|
?GenerateSeed_u16@HRNG@ehs@@SAIXZ
|
||||||
|
?Generate_u16@HRNG@ehs@@SAGGG@Z
|
||||||
|
?Generate_u16@HRNG@ehs@@SAGXZ
|
||||||
|
?GenerateSeed_s16@HRNG@ehs@@SAFXZ
|
||||||
|
?Generate_s16@HRNG@ehs@@SAFFF@Z
|
||||||
|
?Generate_s16@HRNG@ehs@@SAFXZ
|
||||||
|
?GenerateSeed_u8@HRNG@ehs@@SAEXZ
|
||||||
|
?Generate_u8@HRNG@ehs@@SAEEE@Z
|
||||||
|
?Generate_u8@HRNG@ehs@@SAEXZ
|
||||||
|
?GenerateSeed_s8@HRNG@ehs@@SACXZ
|
||||||
|
?Generate_s8@HRNG@ehs@@SACCC@Z
|
||||||
|
?Generate_s8@HRNG@ehs@@SACXZ
|
@ -1,4 +1,4 @@
|
|||||||
cmake_minimum_required(VERSION 3.25.1)
|
cmake_minimum_required(VERSION 3.30.4)
|
||||||
|
|
||||||
set(IS_OS_WINDOWS FALSE)
|
set(IS_OS_WINDOWS FALSE)
|
||||||
set(IS_OS_LINUX FALSE)
|
set(IS_OS_LINUX FALSE)
|
||||||
@ -11,6 +11,8 @@ set(IS_ARCH_ARM FALSE)
|
|||||||
|
|
||||||
project(EHS CXX C)
|
project(EHS CXX C)
|
||||||
|
|
||||||
|
set(CMAKE_VERBOSE_MAKEFILE ON)
|
||||||
|
|
||||||
if (${CMAKE_HOST_SYSTEM_NAME} STREQUAL "Windows")
|
if (${CMAKE_HOST_SYSTEM_NAME} STREQUAL "Windows")
|
||||||
set(IS_OS_WINDOWS TRUE)
|
set(IS_OS_WINDOWS TRUE)
|
||||||
set(USER_HOME_DIRECTORY "$ENV{USERPROFILE}")
|
set(USER_HOME_DIRECTORY "$ENV{USERPROFILE}")
|
||||||
@ -51,6 +53,7 @@ set(EHS_SOURCES
|
|||||||
src/Color3.cpp include/ehs/Color3.h
|
src/Color3.cpp include/ehs/Color3.h
|
||||||
src/Version.cpp include/ehs/Version.h
|
src/Version.cpp include/ehs/Version.h
|
||||||
src/Base64.cpp include/ehs/Base64.h
|
src/Base64.cpp include/ehs/Base64.h
|
||||||
|
src/SHA256.cpp include/ehs/SHA256.h
|
||||||
src/Data.cpp include/ehs/Data.h
|
src/Data.cpp include/ehs/Data.h
|
||||||
src/Range.cpp include/ehs/Range.h
|
src/Range.cpp include/ehs/Range.h
|
||||||
src/Util.cpp include/ehs/Util.h
|
src/Util.cpp include/ehs/Util.h
|
||||||
@ -97,6 +100,8 @@ set(EHS_SOURCES
|
|||||||
include/ehs/system/OS.h
|
include/ehs/system/OS.h
|
||||||
include/ehs/system/Semaphore.h
|
include/ehs/system/Semaphore.h
|
||||||
include/ehs/system/System.h
|
include/ehs/system/System.h
|
||||||
|
include/ehs/system/AVX2.h
|
||||||
|
include/ehs/system/AVX512.h
|
||||||
|
|
||||||
src/json/Json.cpp include/ehs/json/Json.h
|
src/json/Json.cpp include/ehs/json/Json.h
|
||||||
src/json/JsonBase.cpp include/ehs/json/JsonBase.h
|
src/json/JsonBase.cpp include/ehs/json/JsonBase.h
|
||||||
@ -196,6 +201,8 @@ set(EHS_SOURCES
|
|||||||
src/io/socket/ehc/NetUtils.cpp
|
src/io/socket/ehc/NetUtils.cpp
|
||||||
include/ehs/io/socket/BaseICMP.h src/io/socket/BaseICMP.cpp
|
include/ehs/io/socket/BaseICMP.h src/io/socket/BaseICMP.cpp
|
||||||
include/ehs/io/socket/ICMP.h
|
include/ehs/io/socket/ICMP.h
|
||||||
|
src/io/socket/QueryVar.cpp include/ehs/io/socket/QueryVar.h
|
||||||
|
src/io/socket/HeaderVar.cpp include/ehs/io/socket/HeaderVar.h
|
||||||
)
|
)
|
||||||
|
|
||||||
if (IS_OS_WINDOWS)
|
if (IS_OS_WINDOWS)
|
||||||
@ -215,6 +222,7 @@ if (IS_OS_WINDOWS)
|
|||||||
src/system/CPU_MSVC_AMD64.asm src/HRNG_MSVC.asm src/Math_MSVC_AMD64.asm
|
src/system/CPU_MSVC_AMD64.asm src/HRNG_MSVC.asm src/Math_MSVC_AMD64.asm
|
||||||
src/io/Directory_W32.cpp include/ehs/io/Directory_W32.h
|
src/io/Directory_W32.cpp include/ehs/io/Directory_W32.h
|
||||||
include/ehs/io/socket/ICMP_W32.h src/io/socket/ICMP_W32.cpp
|
include/ehs/io/socket/ICMP_W32.h src/io/socket/ICMP_W32.cpp
|
||||||
|
src/system/AVX2_MSVC_AMD64.asm src/system/AVX512_MSVC_AMD64.asm
|
||||||
)
|
)
|
||||||
|
|
||||||
elseif (IS_OS_LINUX)
|
elseif (IS_OS_LINUX)
|
||||||
@ -236,7 +244,7 @@ elseif (IS_OS_LINUX)
|
|||||||
include/ehs/io/socket/ICMP_LNX.h src/io/socket/ICMP_LNX.cpp
|
include/ehs/io/socket/ICMP_LNX.h src/io/socket/ICMP_LNX.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
#set(LINUX_WINDOW_SYSTEM "Wayland" CACHE STRING "Linux Window System")
|
set(LINUX_WINDOW_SYSTEM "XCB" CACHE STRING "Linux Window System")
|
||||||
|
|
||||||
if (LINUX_WINDOW_SYSTEM STREQUAL "Wayland")
|
if (LINUX_WINDOW_SYSTEM STREQUAL "Wayland")
|
||||||
add_compile_definitions(EHS_WS_WAYLAND)
|
add_compile_definitions(EHS_WS_WAYLAND)
|
||||||
@ -252,17 +260,14 @@ elseif (IS_OS_LINUX)
|
|||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
if (IS_ARCH_AMD64)
|
if (IS_ARCH_AMD64)
|
||||||
list(APPEND EHS_SOURCES src/system/CPU_GCC_AMD64.asm src/HRNG_GCC.asm src/Math_GCC_AMD64.asm)
|
list(APPEND EHS_SOURCES src/system/CPU_GCC_AMD64.asm src/HRNG_GCC.asm src/Math_GCC_AMD64.asm src/system/AVX2_GCC_AMD64.asm src/system/AVX512_GCC_AMD64.asm)
|
||||||
elseif (IS_ARCH_ARM64)
|
elseif (IS_ARCH_ARM64)
|
||||||
list(APPEND EHS_SOURCES src/system/CPU_ARM64.cpp src/HRNG_ARM64.cpp src/Math_GCC_ARM64.s)
|
list(APPEND EHS_SOURCES src/system/CPU_ARM64.cpp src/system/CPU_GCC_AARCH64.s src/HRNG_ARM64.cpp src/Math_GCC_ARM64.s src/system/AVX2_AARCH64.cpp src/system/AVX512_AARCH64.cpp)
|
||||||
endif ()
|
endif ()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
|
|
||||||
#message("${CMAKE_CXX_FLAGS}")
|
|
||||||
|
|
||||||
add_library(EHS_Stc STATIC ${EHS_SOURCES})
|
add_library(EHS_Stc STATIC ${EHS_SOURCES})
|
||||||
add_library(EHS_Dyn SHARED ${EHS_SOURCES})
|
add_library(EHS_Dyn SHARED ${EHS_SOURCES} Assembly.def)
|
||||||
add_executable(StrToHash src/StrToHash.cpp)
|
add_executable(StrToHash src/StrToHash.cpp)
|
||||||
|
|
||||||
target_compile_definitions(EHS_Dyn PRIVATE EHS_LIB_EXPORT)
|
target_compile_definitions(EHS_Dyn PRIVATE EHS_LIB_EXPORT)
|
||||||
@ -323,6 +328,6 @@ elseif (IS_OS_LINUX)
|
|||||||
target_link_libraries(StrToHash xcb xcb-cursor xcb-xfixes xcb-xinput)
|
target_link_libraries(StrToHash xcb xcb-cursor xcb-xfixes xcb-xinput)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
target_link_libraries(EHS_Dyn z asound pipewire-0.3)
|
target_link_libraries(EHS_Dyn z pipewire-0.3)
|
||||||
target_link_libraries(StrToHash z asound EHS_Stc)
|
target_link_libraries(StrToHash z EHS_Stc)
|
||||||
endif ()
|
endif ()
|
@ -38,6 +38,8 @@ This project does not fully follow the C++ standard.
|
|||||||
- Asynchronous Task System
|
- Asynchronous Task System
|
||||||
- URI Parsing
|
- URI Parsing
|
||||||
- USB (WIP)
|
- USB (WIP)
|
||||||
|
- Base64
|
||||||
|
- SHA256
|
||||||
|
|
||||||
### Supported Architectures
|
### Supported Architectures
|
||||||
- AMD64
|
- AMD64
|
||||||
|
@ -8,17 +8,26 @@ namespace ehs
|
|||||||
class EHS_LIB_IO Base64
|
class EHS_LIB_IO Base64
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
static const char ascii[];
|
static constexpr UInt_8 asciiUrl[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
|
||||||
|
static constexpr UInt_8 ascii[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
static Str_8 EncodeURL(const Str_8 &input);
|
||||||
|
|
||||||
static Str_8 Encode(const Str_8 &input);
|
static Str_8 Encode(const Str_8 &input);
|
||||||
|
|
||||||
|
static Str_8 DecodeURL(const Str_8 &input);
|
||||||
|
|
||||||
static Str_8 Decode(const Str_8 &input);
|
static Str_8 Decode(const Str_8 &input);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static char Find(char c);
|
static UInt_8 FindURL(const UInt_8 &c);
|
||||||
|
|
||||||
static bool IsBase64(char c);
|
static UInt_8 Find(const UInt_8 &c);
|
||||||
|
|
||||||
|
static bool IsBase64URL(const UInt_8 &c);
|
||||||
|
|
||||||
|
static bool IsBase64(const UInt_8 &c);
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
namespace ehs
|
namespace ehs
|
||||||
{
|
{
|
||||||
class EHS_LIB_IO HRNG
|
class HRNG
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static UInt_64 GenerateSeed_u64();
|
static UInt_64 GenerateSeed_u64();
|
||||||
|
@ -134,17 +134,17 @@ namespace ehs
|
|||||||
|
|
||||||
#ifndef EHS_LOG_INT
|
#ifndef EHS_LOG_INT
|
||||||
#ifdef EHS_DEBUG
|
#ifdef EHS_DEBUG
|
||||||
#define EHS_LOG_INT(type, code, msg) ehs::Log::Raise({type, {ehs::GetAcronym_8(), EHS_FILE, EHS_FUNC, ehs::Str_8::FromNum((ehs::UInt_32)EHS_LINE)}, code, msg})
|
#define EHS_LOG_INT(type, code, msg) ehs::Log::Raise(ehs::Log(type, {ehs::GetAcronym_8(), EHS_FILE, EHS_FUNC, ehs::Str_8::FromNum((ehs::UInt_32)EHS_LINE)}, code, msg))
|
||||||
#else
|
#else
|
||||||
#define EHS_LOG_INT(type, code, msg) ehs::Log::Raise({type, {ehs::GetAcronym_8(), EHS_FUNC}, code, msg})
|
#define EHS_LOG_INT(type, code, msg) ehs::Log::Raise(ehs::Log(type, {ehs::GetAcronym_8(), EHS_FUNC}, code, msg))
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef EHS_LOG
|
#ifndef EHS_LOG
|
||||||
#ifdef EHS_DEBUG
|
#ifdef EHS_DEBUG
|
||||||
#define EHS_LOG(type, code, msg) ehs::Log::Raise({type, {ehs::GetAppName_8(), EHS_FILE, EHS_FUNC, ehs::Str_8::FromNum((ehs::UInt_32)EHS_LINE)}, code, msg})
|
#define EHS_LOG(type, code, msg) ehs::Log::Raise(ehs::Log(type, {ehs::GetAppName_8(), EHS_FILE, EHS_FUNC, ehs::Str_8::FromNum((ehs::UInt_32)EHS_LINE)}, code, msg))
|
||||||
#else
|
#else
|
||||||
#define EHS_LOG(type, code, msg) ehs::Log::Raise({type, {ehs::GetAppName_8(), EHS_FUNC}, code, msg})
|
#define EHS_LOG(type, code, msg) ehs::Log::Raise(ehs::Log(type, {ehs::GetAppName_8(), EHS_FUNC}, code, msg))
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
59
include/ehs/SHA256.h
Normal file
59
include/ehs/SHA256.h
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "Types.h"
|
||||||
|
|
||||||
|
namespace ehs
|
||||||
|
{
|
||||||
|
class EHS_LIB_IO SHA256
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
static UInt_32 ROTR(UInt_32 x, UInt_32 n);
|
||||||
|
|
||||||
|
static UInt_32 CH(UInt_32 x, UInt_32 y, UInt_32 z);
|
||||||
|
|
||||||
|
static UInt_32 MAJ(UInt_32 x, UInt_32 y, UInt_32 z);
|
||||||
|
|
||||||
|
static UInt_32 EP0(UInt_32 x);
|
||||||
|
|
||||||
|
static UInt_32 EP1(UInt_32 x);
|
||||||
|
|
||||||
|
static UInt_32 SIG0(UInt_32 x);
|
||||||
|
|
||||||
|
static UInt_32 SIG1(UInt_32 x);
|
||||||
|
|
||||||
|
static constexpr UInt_32 k[64] = {
|
||||||
|
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
|
||||||
|
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
|
||||||
|
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
|
||||||
|
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
|
||||||
|
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
|
||||||
|
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
|
||||||
|
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
|
||||||
|
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
|
||||||
|
};
|
||||||
|
|
||||||
|
UInt_32 state[8];
|
||||||
|
UInt_64 bitLen;
|
||||||
|
Byte data[64];
|
||||||
|
UInt_64 dataLen;
|
||||||
|
|
||||||
|
public:
|
||||||
|
SHA256();
|
||||||
|
|
||||||
|
SHA256(SHA256 &&other) noexcept;
|
||||||
|
|
||||||
|
SHA256(const SHA256 &other);
|
||||||
|
|
||||||
|
SHA256 &operator=(SHA256 &&other) noexcept;
|
||||||
|
|
||||||
|
SHA256 &operator=(const SHA256 &other);
|
||||||
|
|
||||||
|
void Update(const Byte *data, UInt_64 len);
|
||||||
|
|
||||||
|
void Final(Byte hash[32]);
|
||||||
|
|
||||||
|
void Hash(const Byte *data, UInt_64 len, Byte hash[32]);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void Transform(const Byte data[64]);
|
||||||
|
};
|
||||||
|
}
|
@ -48,8 +48,11 @@ namespace ehs
|
|||||||
/// @param [in] str The C-style string.
|
/// @param [in] str The C-style string.
|
||||||
/// @param [in] size The size of the given C-style string.
|
/// @param [in] size The size of the given C-style string.
|
||||||
Str(const T* const str, const N size)
|
Str(const T* const str, const N size)
|
||||||
: size((size) ? size : Len(str)), data(nullptr)
|
: size(size), data(nullptr)
|
||||||
{
|
{
|
||||||
|
if (!size)
|
||||||
|
return;
|
||||||
|
|
||||||
data = new T[this->size + 1];
|
data = new T[this->size + 1];
|
||||||
|
|
||||||
Util::Copy(data, str, Size(true));
|
Util::Copy(data, str, Size(true));
|
||||||
@ -914,10 +917,10 @@ namespace ehs
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Splits a string into a Vector with the given separator.
|
/// Splits a string into a Vector with the given separator.
|
||||||
/// @param [in] ide The given string as the separator.
|
/// @param [in] delimeter The given string as the separator.
|
||||||
/// @param [in] max The max amount of times to split the string.
|
/// @param [in] max The max amount of times to split the string.
|
||||||
/// @returns The resulting string object.
|
/// @returns The resulting string object.
|
||||||
Vector<Str<T, N>, N> Split(const Str<T, N>& ide, const N max = 0) const
|
Vector<Str<T, N>, N> Split(const Str<T, N>& delimeter, const N max = 0) const
|
||||||
{
|
{
|
||||||
Vector<Str<T, N>, N> result(0, 5);
|
Vector<Str<T, N>, N> result(0, 5);
|
||||||
|
|
||||||
@ -925,9 +928,9 @@ namespace ehs
|
|||||||
|
|
||||||
for (N i = 0, c = 0; i < size; ++i)
|
for (N i = 0, c = 0; i < size; ++i)
|
||||||
{
|
{
|
||||||
if (data[i] == ide[c])
|
if (data[i] == delimeter[c])
|
||||||
{
|
{
|
||||||
if (++c == ide.Size())
|
if (++c == delimeter.Size())
|
||||||
{
|
{
|
||||||
N r = i - (c - 1) - b;
|
N r = i - (c - 1) - b;
|
||||||
if (!r)
|
if (!r)
|
||||||
@ -955,17 +958,17 @@ namespace ehs
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Removes all instances of the ide.
|
/// Removes all instances of the ide.
|
||||||
/// @param [in] ide The string to look for.
|
/// @param [in] delimeter The string to look for.
|
||||||
/// @returns The resulting string object.
|
/// @returns The resulting string object.
|
||||||
Str<T, N> RemoveAll(const Str<T, N>& ide) const
|
Str<T, N> RemoveAll(const Str<T, N>& delimeter) const
|
||||||
{
|
{
|
||||||
Str<T, N> result(size);
|
Str<T, N> result(size);
|
||||||
|
|
||||||
for (N i = 0, b = 0, c = 0; i < size; ++i)
|
for (N i = 0, b = 0, c = 0; i < size; ++i)
|
||||||
{
|
{
|
||||||
if (data[i] == ide[c])
|
if (data[i] == delimeter[c])
|
||||||
{
|
{
|
||||||
if (++c == ide.Size())
|
if (++c == delimeter.Size())
|
||||||
c = 0;
|
c = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -984,18 +987,18 @@ namespace ehs
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Replaces all instances of ide with the replacer.
|
/// Replaces all instances of ide with the replacer.
|
||||||
/// @param [in] ide The string to look for.
|
/// @param [in] delimeter The string to look for.
|
||||||
/// @param [in] replacer The string placed.
|
/// @param [in] replacer The string placed.
|
||||||
/// @returns The resulting string object.
|
/// @returns The resulting string object.
|
||||||
Str ReplaceAll(const Str& ide, const Str& replacer) const
|
Str ReplaceAll(const Str& delimeter, const Str& replacer) const
|
||||||
{
|
{
|
||||||
Str<T, N> result;
|
Str<T, N> result;
|
||||||
|
|
||||||
for (N i = 0, b = 0; i < size; ++i)
|
for (N i = 0, b = 0; i < size; ++i)
|
||||||
{
|
{
|
||||||
if (data[i] == ide[b])
|
if (data[i] == delimeter[b])
|
||||||
{
|
{
|
||||||
if (++b == ide.Size())
|
if (++b == delimeter.Size())
|
||||||
{
|
{
|
||||||
result.Push(replacer);
|
result.Push(replacer);
|
||||||
b = 0;
|
b = 0;
|
||||||
@ -1011,20 +1014,20 @@ namespace ehs
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Finds the first instance of the given string object.
|
/// Finds the first instance of the given string object.
|
||||||
/// @param [in] ide The string to look for.
|
/// @param [in] delimeter The string to look for.
|
||||||
/// @param [out] index The index of the string found. Can be a nullptr.
|
/// @param [out] index The index of the string found. Can be a nullptr.
|
||||||
/// @param [in] pattern The search pattern for optimization.
|
/// @param [in] pattern The search pattern for optimization.
|
||||||
/// @param [in] result What index to return where the first instance is found.
|
/// @param [in] result What index to return where the first instance is found.
|
||||||
/// @returns The index where the instance was found with the result varying from the result parameter.
|
/// @returns The index where the instance was found with the result varying from the result parameter.
|
||||||
bool Find(const Str<T, N> &ide, N* const index = nullptr, const SearchPattern pattern = SearchPattern::LEFT_RIGHT, const IndexResult result = IndexResult::BEGINNING) const
|
bool Find(const Str<T, N> &delimeter, N* const index = nullptr, const SearchPattern pattern = SearchPattern::LEFT_RIGHT, const IndexResult result = IndexResult::BEGINNING) const
|
||||||
{
|
{
|
||||||
if (pattern == SearchPattern::LEFT_RIGHT)
|
if (pattern == SearchPattern::LEFT_RIGHT)
|
||||||
{
|
{
|
||||||
for (N i = 0, c = 0; i < size; ++i)
|
for (N i = 0, c = 0; i < size; ++i)
|
||||||
{
|
{
|
||||||
if (data[i] == ide[c])
|
if (data[i] == delimeter[c])
|
||||||
{
|
{
|
||||||
if (++c == ide.Size())
|
if (++c == delimeter.Size())
|
||||||
{
|
{
|
||||||
if (result == IndexResult::BEGINNING)
|
if (result == IndexResult::BEGINNING)
|
||||||
{
|
{
|
||||||
@ -1046,16 +1049,16 @@ namespace ehs
|
|||||||
}
|
}
|
||||||
else if (pattern == SearchPattern::RIGHT_LEFT)
|
else if (pattern == SearchPattern::RIGHT_LEFT)
|
||||||
{
|
{
|
||||||
for (N i = size, c = ide.Size(); i > 0; --i)
|
for (N i = size, c = delimeter.Size(); i > 0; --i)
|
||||||
{
|
{
|
||||||
if (data[i - 1] == ide[c - 1])
|
if (data[i - 1] == delimeter[c - 1])
|
||||||
{
|
{
|
||||||
if (--c == 0)
|
if (--c == 0)
|
||||||
{
|
{
|
||||||
if (result == IndexResult::BEGINNING)
|
if (result == IndexResult::BEGINNING)
|
||||||
{
|
{
|
||||||
if (index)
|
if (index)
|
||||||
*index = i - (ide.Size() - 1);
|
*index = i - (delimeter.Size() - 1);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -1075,18 +1078,18 @@ namespace ehs
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Checks if the current string contains the given ide.
|
/// Checks if the current string contains the given ide.
|
||||||
/// @param [in] ide The given ide to check for.
|
/// @param [in] delimeter The given ide to check for.
|
||||||
/// @param [in] pattern The search pattern to use.
|
/// @param [in] pattern The search pattern to use.
|
||||||
/// @returns True if the current string does contain the ide.
|
/// @returns True if the current string does contain the ide.
|
||||||
bool Contains(const Str<T, N>& ide, const SearchPattern pattern = SearchPattern::LEFT_RIGHT) const
|
bool Contains(const Str<T, N>& delimeter, const SearchPattern pattern = SearchPattern::LEFT_RIGHT) const
|
||||||
{
|
{
|
||||||
if (pattern == SearchPattern::LEFT_RIGHT)
|
if (pattern == SearchPattern::LEFT_RIGHT)
|
||||||
{
|
{
|
||||||
for (N i = 0, c = 0; i < size; ++i)
|
for (N i = 0, c = 0; i < size; ++i)
|
||||||
{
|
{
|
||||||
if (data[i] == ide[c])
|
if (data[i] == delimeter[c])
|
||||||
{
|
{
|
||||||
if (++c == ide.Size())
|
if (++c == delimeter.Size())
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -1095,9 +1098,9 @@ namespace ehs
|
|||||||
}
|
}
|
||||||
else if (pattern == SearchPattern::RIGHT_LEFT)
|
else if (pattern == SearchPattern::RIGHT_LEFT)
|
||||||
{
|
{
|
||||||
for (N i = size, c = ide.Size(); i > 0; --i)
|
for (N i = size, c = delimeter.Size(); i > 0; --i)
|
||||||
{
|
{
|
||||||
if (data[i - 1] == ide[c - 1])
|
if (data[i - 1] == delimeter[c - 1])
|
||||||
{
|
{
|
||||||
if (--c == 0)
|
if (--c == 0)
|
||||||
{
|
{
|
||||||
@ -1110,6 +1113,54 @@ namespace ehs
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Vector<Str> ParseArgs() const
|
||||||
|
{
|
||||||
|
Vector<Str> args;
|
||||||
|
T *quoteStart = nullptr;
|
||||||
|
T *spaceStart = nullptr;
|
||||||
|
|
||||||
|
for (T *i = data; i <= data + size; ++i)
|
||||||
|
{
|
||||||
|
if (*i == '\"' && !spaceStart)
|
||||||
|
{
|
||||||
|
if (quoteStart)
|
||||||
|
{
|
||||||
|
args.Push(Str(quoteStart, i - quoteStart));
|
||||||
|
quoteStart = nullptr;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (i + 1 < &data[size - 1])
|
||||||
|
quoteStart = i + 1;
|
||||||
|
else
|
||||||
|
args.Push({});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (*i == ' ' && !quoteStart)
|
||||||
|
{
|
||||||
|
if (spaceStart)
|
||||||
|
{
|
||||||
|
args.Push(Str(spaceStart, i - spaceStart));
|
||||||
|
spaceStart = i + 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (i + 1 < &data[size - 1])
|
||||||
|
spaceStart = i + 1;
|
||||||
|
else
|
||||||
|
args.Push({});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (quoteStart)
|
||||||
|
args.Push(Str(quoteStart, &data[size - 1] - (quoteStart - 1)));
|
||||||
|
else if (spaceStart)
|
||||||
|
args.Push(Str(spaceStart, &data[size - 1] - (spaceStart - 1)));
|
||||||
|
|
||||||
|
return args;
|
||||||
|
}
|
||||||
|
|
||||||
/// Checks if the string represents a number. Must not have any alphabetical characters.
|
/// Checks if the string represents a number. Must not have any alphabetical characters.
|
||||||
/// @returns The result.
|
/// @returns The result.
|
||||||
bool IsNum() const
|
bool IsNum() const
|
||||||
|
@ -392,7 +392,7 @@ namespace ehs
|
|||||||
{
|
{
|
||||||
if (stride)
|
if (stride)
|
||||||
{
|
{
|
||||||
rawSize = (this->size + size()) / stride * stride;
|
rawSize = (this->size + size) / stride * stride;
|
||||||
if ((this->size + size) % stride)
|
if ((this->size + size) % stride)
|
||||||
rawSize += stride;
|
rawSize += stride;
|
||||||
}
|
}
|
||||||
@ -403,7 +403,7 @@ namespace ehs
|
|||||||
|
|
||||||
T* result = new T[rawSize];
|
T* result = new T[rawSize];
|
||||||
|
|
||||||
for (N i = 0; i < size; ++i)
|
for (N i = 0; i < this->size; ++i)
|
||||||
result[i] = std::move(data[i]);
|
result[i] = std::move(data[i]);
|
||||||
|
|
||||||
delete[] data;
|
delete[] data;
|
||||||
|
@ -25,6 +25,7 @@ namespace ehs
|
|||||||
pw_core *core;
|
pw_core *core;
|
||||||
pw_stream *input;
|
pw_stream *input;
|
||||||
pw_stream *output;
|
pw_stream *output;
|
||||||
|
spa_hook paramsHook;
|
||||||
|
|
||||||
static void RegistryEventGlobal(void *data, UInt_32 id, UInt_32 permissions, const char *type, UInt_32 version, const spa_dict *props);
|
static void RegistryEventGlobal(void *data, UInt_32 id, UInt_32 permissions, const char *type, UInt_32 version, const spa_dict *props);
|
||||||
|
|
||||||
|
@ -24,9 +24,9 @@ namespace ehs
|
|||||||
bool connected;
|
bool connected;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static const UInt_16 HTTPS_Port = 443;
|
static constexpr UInt_16 HTTPS_Port = 443;
|
||||||
static const UInt_16 HTTP_Port = 80;
|
static constexpr UInt_16 HTTP_Port = 80;
|
||||||
static const UInt_16 MaxHeaderSize = 8192;
|
static constexpr UInt_16 MaxHeaderSize = 8192;
|
||||||
|
|
||||||
virtual ~BaseTCP() = default;
|
virtual ~BaseTCP() = default;
|
||||||
|
|
||||||
@ -55,7 +55,7 @@ namespace ehs
|
|||||||
/// @param [in] address The ip address to bind to.
|
/// @param [in] address The ip address to bind to.
|
||||||
/// @param [in] port The port to bind to.
|
/// @param [in] port The port to bind to.
|
||||||
/// @note Used for servers.
|
/// @note Used for servers.
|
||||||
virtual void Bind(const Str_8& address, UInt_16 port) = 0;
|
virtual void Bind(Str_8 address, const UInt_16 &port) = 0;
|
||||||
|
|
||||||
/// Listens for new incoming connections.
|
/// Listens for new incoming connections.
|
||||||
/// @note Used for servers.
|
/// @note Used for servers.
|
||||||
@ -63,13 +63,13 @@ namespace ehs
|
|||||||
|
|
||||||
/// Accepts the new incoming connection.
|
/// Accepts the new incoming connection.
|
||||||
/// @note Used for servers.
|
/// @note Used for servers.
|
||||||
virtual BaseTCP* Accept() = 0;
|
virtual BaseTCP *Accept() = 0;
|
||||||
|
|
||||||
/// Connects to a server at the specified address and port.
|
/// Connects to a server at the specified address and port.
|
||||||
/// @param [in] address The ip address to connect to.
|
/// @param [in] address The ip address to connect to.
|
||||||
/// @param [in] port The port to connect to.
|
/// @param [in] port The port to connect to.
|
||||||
/// @note Used for clients.
|
/// @note Used for clients.
|
||||||
virtual void Connect(const Str_8& address, UInt_16 port) = 0;
|
virtual void Connect(Str_8 address, const UInt_16 &port) = 0;
|
||||||
|
|
||||||
/// Sends data to the connected endpoint.
|
/// Sends data to the connected endpoint.
|
||||||
/// @param [in] buffer The data to send to the endpoint.
|
/// @param [in] buffer The data to send to the endpoint.
|
||||||
@ -150,6 +150,8 @@ namespace ehs
|
|||||||
|
|
||||||
virtual bool IsIPv6Only() const = 0;
|
virtual bool IsIPv6Only() const = 0;
|
||||||
|
|
||||||
|
virtual void SetReuse(const bool &enabled) = 0;
|
||||||
|
|
||||||
/// Retrieves whether or not this socket was initialized.
|
/// Retrieves whether or not this socket was initialized.
|
||||||
/// @returns The result.
|
/// @returns The result.
|
||||||
virtual bool IsValid() const = 0;
|
virtual bool IsValid() const = 0;
|
||||||
|
45
include/ehs/io/socket/HeaderVar.h
Normal file
45
include/ehs/io/socket/HeaderVar.h
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "ehs/Str.h"
|
||||||
|
|
||||||
|
namespace ehs
|
||||||
|
{
|
||||||
|
class HeaderVar
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
UInt_64 id;
|
||||||
|
Str_8 name;
|
||||||
|
Str_8 value;
|
||||||
|
|
||||||
|
public:
|
||||||
|
HeaderVar();
|
||||||
|
|
||||||
|
HeaderVar(Str_8 name, Str_8 value);
|
||||||
|
|
||||||
|
HeaderVar(HeaderVar &&other) noexcept;
|
||||||
|
|
||||||
|
HeaderVar(const HeaderVar &other);
|
||||||
|
|
||||||
|
HeaderVar &operator=(HeaderVar &&other) noexcept;
|
||||||
|
|
||||||
|
HeaderVar &operator=(const HeaderVar &other);
|
||||||
|
|
||||||
|
bool operator==(const HeaderVar &other) const;
|
||||||
|
|
||||||
|
bool operator!=(const HeaderVar &other) const;
|
||||||
|
|
||||||
|
bool operator==(const UInt_64 &otherId) const;
|
||||||
|
|
||||||
|
bool operator!=(const UInt_64 &otherId) const;
|
||||||
|
|
||||||
|
UInt_64 GetId() const;
|
||||||
|
|
||||||
|
Str_8 GetName() const;
|
||||||
|
|
||||||
|
Str_8 GetValue() const;
|
||||||
|
|
||||||
|
void SetValue(Str_8 value);
|
||||||
|
|
||||||
|
Str_8 ToStr() const;
|
||||||
|
};
|
||||||
|
}
|
45
include/ehs/io/socket/QueryVar.h
Normal file
45
include/ehs/io/socket/QueryVar.h
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "ehs/Str.h"
|
||||||
|
|
||||||
|
namespace ehs
|
||||||
|
{
|
||||||
|
class QueryVar
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
UInt_64 id;
|
||||||
|
Str_8 name;
|
||||||
|
Str_8 value;
|
||||||
|
|
||||||
|
public:
|
||||||
|
QueryVar();
|
||||||
|
|
||||||
|
QueryVar(Str_8 name, Str_8 value);
|
||||||
|
|
||||||
|
QueryVar(QueryVar &&other) noexcept;
|
||||||
|
|
||||||
|
QueryVar(const QueryVar &other);
|
||||||
|
|
||||||
|
QueryVar &operator=(QueryVar &&other) noexcept;
|
||||||
|
|
||||||
|
QueryVar &operator=(const QueryVar &other);
|
||||||
|
|
||||||
|
bool operator==(const QueryVar &other) const;
|
||||||
|
|
||||||
|
bool operator!=(const QueryVar &other) const;
|
||||||
|
|
||||||
|
bool operator==(const UInt_64 &otherId) const;
|
||||||
|
|
||||||
|
bool operator!=(const UInt_64 &otherId) const;
|
||||||
|
|
||||||
|
UInt_64 GetId() const;
|
||||||
|
|
||||||
|
Str_8 GetName() const;
|
||||||
|
|
||||||
|
Str_8 GetValue() const;
|
||||||
|
|
||||||
|
void SetValue(Str_8 value);
|
||||||
|
|
||||||
|
Str_8 ToStr() const;
|
||||||
|
};
|
||||||
|
}
|
@ -5,6 +5,8 @@
|
|||||||
#include "ehs/Str.h"
|
#include "ehs/Str.h"
|
||||||
#include "ehs/json/Json.h"
|
#include "ehs/json/Json.h"
|
||||||
#include "Socket.h"
|
#include "Socket.h"
|
||||||
|
#include "QueryVar.h"
|
||||||
|
#include "HeaderVar.h"
|
||||||
|
|
||||||
namespace ehs
|
namespace ehs
|
||||||
{
|
{
|
||||||
@ -21,8 +23,8 @@ namespace ehs
|
|||||||
private:
|
private:
|
||||||
Verb verb;
|
Verb verb;
|
||||||
Str_8 rsrc;
|
Str_8 rsrc;
|
||||||
Vector<Str_8> queries;
|
Vector<QueryVar> queries;
|
||||||
Vector<Str_8> header;
|
Vector<HeaderVar> header;
|
||||||
ContentType cType;
|
ContentType cType;
|
||||||
Str_8 body;
|
Str_8 body;
|
||||||
|
|
||||||
@ -33,25 +35,34 @@ namespace ehs
|
|||||||
/// Initializes this request with a given verb and URI resource.
|
/// Initializes this request with a given verb and URI resource.
|
||||||
/// @param [in] verb The type of request to make.
|
/// @param [in] verb The type of request to make.
|
||||||
/// @param [in] rsrc The URI endpoint to make the request at.
|
/// @param [in] rsrc The URI endpoint to make the request at.
|
||||||
Request(const Verb verb, const Str_8& rsrc);
|
Request(const Verb &verb, Str_8 rsrc);
|
||||||
|
|
||||||
/// Initializes this request with the raw request data.
|
/// Initializes this request with the raw request data.
|
||||||
/// @param [in] data The C-style string of the request.
|
/// @param [in] data The C-style string of the request.
|
||||||
/// @param [in] size The size of the given C-style string.
|
/// @param [in] size The size of the given C-style string.
|
||||||
Request(const char* data, const UInt_64 size);
|
Request(const char *data, const UInt_64 &size);
|
||||||
|
|
||||||
/// Initializes this request with the raw request data.
|
/// Initializes this request with the raw request data.
|
||||||
/// @param [in] data The string of the request.
|
/// @param [in] data The string of the request.
|
||||||
Request(const Str_8& data);
|
Request(const Str_8 &data);
|
||||||
|
|
||||||
|
/// Moves members from another object of the same type.
|
||||||
|
/// @param [in] other The object to move from.
|
||||||
|
Request(Request &&other) noexcept;
|
||||||
|
|
||||||
/// Copies members from another object of the same type.
|
/// Copies members from another object of the same type.
|
||||||
/// @param [in] req The object to copy from.
|
/// @param [in] other The object to copy from.
|
||||||
Request(const Request& req) = default;
|
Request(const Request &other);
|
||||||
|
|
||||||
|
/// Moves members from another object of the same type.
|
||||||
|
/// @param [in] other The object to move from.
|
||||||
|
/// @returns The request that has been assigned to.
|
||||||
|
Request& operator=(Request &&other) noexcept;
|
||||||
|
|
||||||
/// Copies members from another object of the same type.
|
/// Copies members from another object of the same type.
|
||||||
/// @param [in] req The object to copy from.
|
/// @param [in] other The object to copy from.
|
||||||
/// @returns The request that has been assigned to.
|
/// @returns The request that has been assigned to.
|
||||||
Request& operator=(const Request& req);
|
Request& operator=(const Request &other);
|
||||||
|
|
||||||
/// Retrieves the verb for the request.
|
/// Retrieves the verb for the request.
|
||||||
/// @returns The result.
|
/// @returns The result.
|
||||||
@ -59,7 +70,7 @@ namespace ehs
|
|||||||
|
|
||||||
/// Sets the content type for the body.
|
/// Sets the content type for the body.
|
||||||
/// @param [in] cType The content type to use.
|
/// @param [in] cType The content type to use.
|
||||||
void SetContentType(const ContentType cType);
|
void SetContentType(const ContentType &cType);
|
||||||
|
|
||||||
/// Retrieves the content type for the body.
|
/// Retrieves the content type for the body.
|
||||||
/// @returns The result.
|
/// @returns The result.
|
||||||
@ -67,75 +78,145 @@ namespace ehs
|
|||||||
|
|
||||||
/// Sets the URI resource.
|
/// Sets the URI resource.
|
||||||
/// @param [in] rsrc The resource.
|
/// @param [in] rsrc The resource.
|
||||||
void SetResource(const Str_8& rsrc);
|
void SetResource(Str_8 rsrc);
|
||||||
|
|
||||||
/// Retrieves the URI resource.
|
/// Retrieves the URI resource.
|
||||||
/// @returns The result.
|
/// @returns The result.
|
||||||
Str_8 GetResource() const;
|
Str_8 GetResource() const;
|
||||||
|
|
||||||
/// Adds a query variable to the URI.
|
/// Checks whether a header variable exists using the id.
|
||||||
/// @param [in] var The variable identifier.
|
/// @param [in] id The variable id to look for.
|
||||||
/// @param [in] value The value of the variable.
|
/// @returns True if the variable exists. False otherwise.
|
||||||
void AddQuery(const Str_8& var, const Str_8& value);
|
bool HasQueryVar(const UInt_64 &id) const;
|
||||||
|
|
||||||
/// Retrieves a query variable from the URI.
|
/// Checks whether a header variable exists using the name.
|
||||||
/// @param [in] var The variable identifier to look for.
|
/// @param [in] name The variable name to look for.
|
||||||
/// @returns The value of the query variable. Empty if it was not found.
|
/// @returns True if the variable exists. False otherwise.
|
||||||
Str_8 GetQuery(const Str_8& var);
|
bool HasQueryVar(const Str_8 &name) const;
|
||||||
|
|
||||||
|
/// Adds a header variable.
|
||||||
|
/// @param [in] var The variable to add to the header.
|
||||||
|
/// @returns False if the given variable name already exists. True otherwise.
|
||||||
|
bool AddQueryVar(QueryVar var);
|
||||||
|
|
||||||
|
/// Removes a header variable using the id.
|
||||||
|
/// @param [in] id The variable id to look for.
|
||||||
|
/// @returns True if the variable was found. False otherwise.
|
||||||
|
bool RemoveQueryVar(const UInt_64 &id);
|
||||||
|
|
||||||
|
/// Removes a header variable using the name.
|
||||||
|
/// @param [in] name The variable name to look for.
|
||||||
|
/// @returns True if the variable was found. False otherwise.
|
||||||
|
bool RemoveQueryVar(const Str_8 &name);
|
||||||
|
|
||||||
|
/// Retrieves a header variable using the id.
|
||||||
|
/// @param [in] id The variable id to look for.
|
||||||
|
/// @returns The variable object if found. Nullptr otherwise.
|
||||||
|
QueryVar *GetQueryVar(const UInt_64 &id) const;
|
||||||
|
|
||||||
|
/// Retrieves a header variable using the name.
|
||||||
|
/// @param [in] name The variable name to look for.
|
||||||
|
/// @returns The variable object if found. Nullptr otherwise.
|
||||||
|
QueryVar *GetQueryVar(const Str_8& name) const;
|
||||||
|
|
||||||
|
/// Retrieves a header variable value using the id.
|
||||||
|
/// @param [in] id The variable id to look for.
|
||||||
|
/// @returns The variable's value if found. Empty otherwise.
|
||||||
|
Str_8 GetQueryValue(const UInt_64 &id) const;
|
||||||
|
|
||||||
|
/// Retrieves a header variable value using the name.
|
||||||
|
/// @param [in] name The variable name to look for.
|
||||||
|
/// @returns The variable's value if found. Empty otherwise.
|
||||||
|
Str_8 GetQueryValue(const Str_8& name) const;
|
||||||
|
|
||||||
/// Retrieves all the query variables from the URI in a vector object.
|
/// Retrieves all the query variables from the URI in a vector object.
|
||||||
/// @returns The result.
|
/// @returns The result.
|
||||||
Vector<Str_8> GetQueries() const;
|
Vector<QueryVar> GetQueries() const;
|
||||||
|
|
||||||
/// A helper method to automatically add the required header variables for basic authentication.
|
/// A helper method to automatically add the required header variables for basic authentication.
|
||||||
/// @param [in] id The username or id.
|
/// @param [in] id The username or id.
|
||||||
/// @param [in] secret The secret given by an API.
|
/// @param [in] secret The secret given by an API.
|
||||||
void BasicAuth(const Str_8& id, const Str_8& secret);
|
void BasicAuth(const Str_8 &id, const Str_8 &secret);
|
||||||
|
|
||||||
/// A helper method to automatically add the required header variables for bearer authentication.
|
/// A helper method to automatically add the required header variables for bearer authentication.
|
||||||
/// @param [in] token The token given by an API.
|
/// @param [in] token The token given by an API.
|
||||||
void BearerAuth(const Str_8& token);
|
void BearerAuth(const Str_8 &token);
|
||||||
|
|
||||||
/// A helper method to automatically add the required header variables for bearer authentication.
|
/// A helper method to automatically add the required header variables for bearer authentication.
|
||||||
/// @param [in] token The token given by an API.
|
/// @param [in] token The token given by an API.
|
||||||
/// @param [in] clientId The client id given by an API.
|
/// @param [in] clientId The client id given by an API.
|
||||||
void BearerAuth(const Str_8& token, const Str_8& clientId);
|
void BearerAuth(const Str_8 &token, const Str_8 &clientId);
|
||||||
|
|
||||||
/// A helper method to automatically add the required header variables for bot authentication.
|
/// A helper method to automatically add the required header variables for bot authentication.
|
||||||
/// @param [in] token The token given by an API.
|
/// @param [in] token The token given by an API.
|
||||||
void BotAuth(const Str_8& token);
|
void BotAuth(const Str_8 &token);
|
||||||
|
|
||||||
|
/// Checks whether a header variable exists using the id.
|
||||||
|
/// @param [in] id The variable id to look for.
|
||||||
|
/// @returns True if the variable exists. False otherwise.
|
||||||
|
bool HasHeaderVar(const UInt_64 &id) const;
|
||||||
|
|
||||||
|
/// Checks whether a header variable exists using the name.
|
||||||
|
/// @param [in] name The variable name to look for.
|
||||||
|
/// @returns True if the variable exists. False otherwise.
|
||||||
|
bool HasHeaderVar(const Str_8 &name) const;
|
||||||
|
|
||||||
/// Adds a header variable.
|
/// Adds a header variable.
|
||||||
/// @param [in] var The variable identifier.
|
/// @param [in] var The variable to add to the header.
|
||||||
/// @param [in] value The value of the variable.
|
/// @returns False if the given variable name already exists. True otherwise.
|
||||||
void AddToHeader(const Str_8& var, const Str_8& value);
|
bool AddHeaderVar(HeaderVar var);
|
||||||
|
|
||||||
/// Retrieves a header variable.
|
/// Removes a header variable using the id.
|
||||||
/// @param [in] var The variable identifier to look for.
|
/// @param [in] id The variable id to look for.
|
||||||
/// @returns The value of the header variable. Empty if it was not found.
|
/// @returns True if the variable was found. False otherwise.
|
||||||
Str_8 GetHeader(const Str_8& var) const;
|
bool RemoveHeaderVar(const UInt_64 &id);
|
||||||
|
|
||||||
|
/// Removes a header variable using the name.
|
||||||
|
/// @param [in] name The variable name to look for.
|
||||||
|
/// @returns True if the variable was found. False otherwise.
|
||||||
|
bool RemoveHeaderVar(const Str_8 &name);
|
||||||
|
|
||||||
|
/// Retrieves a header variable using the id.
|
||||||
|
/// @param [in] id The variable id to look for.
|
||||||
|
/// @returns The variable object if found. Nullptr otherwise.
|
||||||
|
HeaderVar *GetHeaderVar(const UInt_64 &id) const;
|
||||||
|
|
||||||
|
/// Retrieves a header variable using the name.
|
||||||
|
/// @param [in] name The variable name to look for.
|
||||||
|
/// @returns The variable object if found. Nullptr otherwise.
|
||||||
|
HeaderVar *GetHeaderVar(const Str_8& name) const;
|
||||||
|
|
||||||
|
/// Retrieves a header variable value using the id.
|
||||||
|
/// @param [in] id The variable id to look for.
|
||||||
|
/// @returns The variable's value if found. Empty otherwise.
|
||||||
|
Str_8 GetHeaderValue(const UInt_64 &id) const;
|
||||||
|
|
||||||
|
/// Retrieves a header variable value using the name.
|
||||||
|
/// @param [in] name The variable name to look for.
|
||||||
|
/// @returns The variable's value if found. Empty otherwise.
|
||||||
|
Str_8 GetHeaderValue(const Str_8& name) const;
|
||||||
|
|
||||||
/// Retrieves all the header variables in a vector object.
|
/// Retrieves all the header variables in a vector object.
|
||||||
/// @returns The result.
|
/// @returns The result.
|
||||||
Vector<Str_8> GetHeader() const;
|
Vector<HeaderVar> GetHeader() const;
|
||||||
|
|
||||||
/// Adds a body variable.
|
/// Adds a body variable.
|
||||||
/// @param [in] var The variable identifier.
|
/// @param [in] var The variable identifier.
|
||||||
/// @param [in] value The value of the variable.
|
/// @param [in] value The value of the variable.
|
||||||
void AddToBody(const Str_8& var, const Str_8& value);
|
void AddToBody(const Str_8 &var, const Str_8 &value);
|
||||||
|
|
||||||
/// Adds a value to the body.
|
/// Adds a value to the body.
|
||||||
/// @param [in] data The value to add.
|
/// @param [in] data The value to add.
|
||||||
void AddToBody(const Str_8& data);
|
void AddToBody(const Str_8 &data);
|
||||||
|
|
||||||
/// Sets the entire body.
|
/// Sets the entire body.
|
||||||
/// @param [in] body The body to use.
|
/// @param [in] body The body to use.
|
||||||
void SetBody(const Str_8& body);
|
void SetBody(const Str_8 &body);
|
||||||
|
|
||||||
/// Retrieves a body variable.
|
/// Retrieves a body variable.
|
||||||
/// @param [in] var The variable identifier to look for.
|
/// @param [in] var The variable identifier to look for.
|
||||||
/// @returns The value of the body variable. Empty if it was not found.
|
/// @returns The value of the body variable. Empty if it was not found.
|
||||||
Str_8 GetVar(const Str_8& var) const;
|
Str_8 GetVar(const Str_8 &var) const;
|
||||||
|
|
||||||
/// Retrieves the entire body.
|
/// Retrieves the entire body.
|
||||||
/// @returns The result.
|
/// @returns The result.
|
||||||
@ -152,13 +233,13 @@ namespace ehs
|
|||||||
bool IsValid() const;
|
bool IsValid() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static Str_8 VerbToStr(const Verb verb);
|
static Str_8 VerbToStr(const Verb &verb);
|
||||||
|
|
||||||
static Str_8 ContentTypeToStr(const ContentType cType);
|
static Str_8 ContentTypeToStr(const ContentType &cType);
|
||||||
|
|
||||||
static ContentType StrToContentType(const Str_8& value);
|
static ContentType StrToContentType(const Str_8 &value);
|
||||||
|
|
||||||
void ReadData(const Str_8& data);
|
void ReadData(const Str_8 &data);
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
@ -5,6 +5,7 @@
|
|||||||
#include "ehs/Str.h"
|
#include "ehs/Str.h"
|
||||||
#include "ehs/json/Json.h"
|
#include "ehs/json/Json.h"
|
||||||
#include "Socket.h"
|
#include "Socket.h"
|
||||||
|
#include "HeaderVar.h"
|
||||||
|
|
||||||
namespace ehs
|
namespace ehs
|
||||||
{
|
{
|
||||||
@ -14,7 +15,7 @@ namespace ehs
|
|||||||
UInt_32 code;
|
UInt_32 code;
|
||||||
Str_8 server;
|
Str_8 server;
|
||||||
ContentType cType;
|
ContentType cType;
|
||||||
Vector<Str_8> header;
|
Vector<HeaderVar> header;
|
||||||
Str_8 body;
|
Str_8 body;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -24,29 +25,38 @@ namespace ehs
|
|||||||
/// Initializes this response with a given code and server identifier.
|
/// Initializes this response with a given code and server identifier.
|
||||||
/// @param [in] code The code to give.
|
/// @param [in] code The code to give.
|
||||||
/// @param [in] server The server identifier.
|
/// @param [in] server The server identifier.
|
||||||
Response(const UInt_32 code, const Str_8& server);
|
Response(const UInt_32 &code, Str_8 server);
|
||||||
|
|
||||||
/// Initializes this response with the raw response data.
|
/// Initializes this response with the raw response data.
|
||||||
/// @param [in] data The C-style string of the response.
|
/// @param [in] data The C-style string of the response.
|
||||||
/// @param [in] size The size of the given C-style string.
|
/// @param [in] size The size of the given C-style string.
|
||||||
Response(const char* data, const UInt_64 size);
|
Response(const char *data, const UInt_64 &size);
|
||||||
|
|
||||||
/// Initializes this response with the raw response data.
|
/// Initializes this response with the raw response data.
|
||||||
/// @param [in] data The string of the response.
|
/// @param [in] data The string of the response.
|
||||||
Response(const Str_8& data);
|
Response(const Str_8 &data);
|
||||||
|
|
||||||
|
/// Moves members from another object of the same type.
|
||||||
|
/// @param [in] other The object to move from.
|
||||||
|
Response(Response &&other) noexcept;
|
||||||
|
|
||||||
/// Copies members from another object of the same type.
|
/// Copies members from another object of the same type.
|
||||||
/// @param [in] res The object to copy from.
|
/// @param [in] other The object to copy from.
|
||||||
Response(const Response& res) = default;
|
Response(const Response &other);
|
||||||
|
|
||||||
|
/// Moves members from another object of the same type.
|
||||||
|
/// @param [in] other The object to move from.
|
||||||
|
/// @returns The response that has been assigned to.
|
||||||
|
Response &operator=(Response &&other) noexcept;
|
||||||
|
|
||||||
/// Copies members from another object of the same type.
|
/// Copies members from another object of the same type.
|
||||||
/// @param [in] res The object to copy from.
|
/// @param [in] res The object to copy from.
|
||||||
/// @returns The response that has been assigned to.
|
/// @returns The response that has been assigned to.
|
||||||
Response& operator=(const Response& res);
|
Response& operator=(const Response &other);
|
||||||
|
|
||||||
/// Sets the response code to send to the endpoint.
|
/// Sets the response code to send to the endpoint.
|
||||||
/// @param [in] code The code for success, error or info.
|
/// @param [in] code The code for success, error or info.
|
||||||
void SetCode(const UInt_32 code);
|
void SetCode(const UInt_32 &code);
|
||||||
|
|
||||||
/// Retrieves the response code.
|
/// Retrieves the response code.
|
||||||
/// @returns The result.
|
/// @returns The result.
|
||||||
@ -54,7 +64,7 @@ namespace ehs
|
|||||||
|
|
||||||
/// Sets the server identifier.
|
/// Sets the server identifier.
|
||||||
/// @param [in] server The server identifier to use.
|
/// @param [in] server The server identifier to use.
|
||||||
void SetServer(const Str_8& server);
|
void SetServer(Str_8 server);
|
||||||
|
|
||||||
/// Retrieves the server identifier.
|
/// Retrieves the server identifier.
|
||||||
/// @returns The result.
|
/// @returns The result.
|
||||||
@ -62,25 +72,60 @@ namespace ehs
|
|||||||
|
|
||||||
/// Sets the content type for the body.
|
/// Sets the content type for the body.
|
||||||
/// @param [in] cType The content type to use.
|
/// @param [in] cType The content type to use.
|
||||||
void SetContentType(const ContentType cType);
|
void SetContentType(const ContentType &cType);
|
||||||
|
|
||||||
/// Retrieves the content type for the body.
|
/// Retrieves the content type for the body.
|
||||||
/// @returns The result.
|
/// @returns The result.
|
||||||
ContentType GetContentType() const;
|
ContentType GetContentType() const;
|
||||||
|
|
||||||
/// Adds a header variable.
|
/// Checks whether a header variable exists using the id.
|
||||||
/// @param [in] var The variable identifier.
|
/// @param [in] id The variable id to look for.
|
||||||
/// @param [in] value The value of the variable.
|
/// @returns True if the variable exists. False otherwise.
|
||||||
void AddToHeader(const Str_8& var, const Str_8& value);
|
bool HasHeaderVar(const UInt_64 &id) const;
|
||||||
|
|
||||||
/// Retrieves a header variable.
|
/// Checks whether a header variable exists using the name.
|
||||||
/// @param [in] var The variable identifier to look for.
|
/// @param [in] name The variable name to look for.
|
||||||
/// @returns The value of the header variable. Empty if it was not found.
|
/// @returns True if the variable exists. False otherwise.
|
||||||
Str_8 GetHeader(const Str_8& var) const;
|
bool HasHeaderVar(const Str_8 &name) const;
|
||||||
|
|
||||||
|
/// Adds a header variable.
|
||||||
|
/// @param [in] var The variable to add to the header.
|
||||||
|
/// @returns False if the given variable name already exists. True otherwise.
|
||||||
|
bool AddHeaderVar(HeaderVar var);
|
||||||
|
|
||||||
|
/// Removes a header variable using the id.
|
||||||
|
/// @param [in] id The variable id to look for.
|
||||||
|
/// @returns True if the variable was found. False otherwise.
|
||||||
|
bool RemoveHeaderVar(const UInt_64 &id);
|
||||||
|
|
||||||
|
/// Removes a header variable using the name.
|
||||||
|
/// @param [in] name The variable name to look for.
|
||||||
|
/// @returns True if the variable was found. False otherwise.
|
||||||
|
bool RemoveHeaderVar(const Str_8 &name);
|
||||||
|
|
||||||
|
/// Retrieves a header variable using the id.
|
||||||
|
/// @param [in] id The variable id to look for.
|
||||||
|
/// @returns The variable object if found. Nullptr otherwise.
|
||||||
|
HeaderVar *GetHeaderVar(const UInt_64 &id) const;
|
||||||
|
|
||||||
|
/// Retrieves a header variable using the name.
|
||||||
|
/// @param [in] name The variable name to look for.
|
||||||
|
/// @returns The variable object if found. Nullptr otherwise.
|
||||||
|
HeaderVar *GetHeaderVar(const Str_8& name) const;
|
||||||
|
|
||||||
|
/// Retrieves a header variable value using the id.
|
||||||
|
/// @param [in] id The variable id to look for.
|
||||||
|
/// @returns The variable's value if found. Empty otherwise.
|
||||||
|
Str_8 GetHeaderValue(const UInt_64 &id) const;
|
||||||
|
|
||||||
|
/// Retrieves a header variable value using the name.
|
||||||
|
/// @param [in] name The variable name to look for.
|
||||||
|
/// @returns The variable's value if found. Empty otherwise.
|
||||||
|
Str_8 GetHeaderValue(const Str_8& name) const;
|
||||||
|
|
||||||
/// Retrieves all the header variables in a vector object.
|
/// Retrieves all the header variables in a vector object.
|
||||||
/// @returns The result.
|
/// @returns The result.
|
||||||
Vector<Str_8> GetHeader() const;
|
Vector<HeaderVar> GetHeader() const;
|
||||||
|
|
||||||
/// Adds a body variable.
|
/// Adds a body variable.
|
||||||
/// @param [in] var The variable identifier.
|
/// @param [in] var The variable identifier.
|
||||||
@ -115,13 +160,13 @@ namespace ehs
|
|||||||
bool IsValid() const;
|
bool IsValid() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static Str_8 CodeToStr(const UInt_32 code);
|
static Str_8 CodeToStr(const UInt_32 &code);
|
||||||
|
|
||||||
static Str_8 ContentTypeToStr(const ContentType cType);
|
static Str_8 ContentTypeToStr(const ContentType &cType);
|
||||||
|
|
||||||
static ContentType StrToContentType(const Str_8& value);
|
static ContentType StrToContentType(const Str_8 &value);
|
||||||
|
|
||||||
void ReadData(const Str_8& data);
|
void ReadData(const Str_8 &data);
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
@ -1,5 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <openssl/types.h>
|
||||||
|
|
||||||
#include "ehs/EHS.h"
|
#include "ehs/EHS.h"
|
||||||
#include "ehs/Str.h"
|
#include "ehs/Str.h"
|
||||||
#include "TCP.h"
|
#include "TCP.h"
|
||||||
@ -15,15 +17,18 @@ namespace ehs
|
|||||||
class EHS_LIB_IO SSL : public TCP
|
class EHS_LIB_IO SSL : public TCP
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
bool server;
|
||||||
SSL_CTX* ctx;
|
SSL_CTX* ctx;
|
||||||
::SSL* sslHdl;
|
::SSL* sslHdl;
|
||||||
|
X509 *cert;
|
||||||
|
EVP_PKEY* pkey;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
~SSL() override;
|
~SSL() override;
|
||||||
|
|
||||||
SSL();
|
SSL();
|
||||||
|
|
||||||
SSL(const IP type);
|
SSL(const IP &type, const bool &server);
|
||||||
|
|
||||||
SSL(TCP&& tcp) noexcept;
|
SSL(TCP&& tcp) noexcept;
|
||||||
|
|
||||||
@ -37,19 +42,19 @@ namespace ehs
|
|||||||
|
|
||||||
void Release() override;
|
void Release() override;
|
||||||
|
|
||||||
void Bind(const Str_8& address, unsigned short port) override;
|
void Listen() override;
|
||||||
|
|
||||||
SSL* Accept() override;
|
SSL* Accept() override;
|
||||||
|
|
||||||
void Connect(const Str_8& address, const UInt_16 port) override;
|
void Connect(Str_8 address, const UInt_16 &port) override;
|
||||||
|
|
||||||
UInt_64 Send(const Byte* const buffer, const UInt_32 size) override;
|
UInt_64 Send(const Byte* buffer, const UInt_32 size) override;
|
||||||
|
|
||||||
UInt_64 Receive(Byte* const buffer, const UInt_32 size) override;
|
UInt_64 Receive(Byte* buffer, const UInt_32 size) override;
|
||||||
|
|
||||||
void UseCertificate(const Byte* data, const UInt_64 size);
|
void UseCertificate(const Char_8* data, const UInt_32 &size);
|
||||||
|
|
||||||
void UsePrivateKey(const Byte* data, const UInt_64 size);
|
void UsePrivateKey(const Char_8* data, const UInt_32 &size);
|
||||||
|
|
||||||
bool IsValid();
|
bool IsValid();
|
||||||
};
|
};
|
||||||
|
@ -40,7 +40,9 @@ namespace ehs
|
|||||||
APP_XML,
|
APP_XML,
|
||||||
TEXT_PLAIN,
|
TEXT_PLAIN,
|
||||||
TEXT_HTML,
|
TEXT_HTML,
|
||||||
|
TEXT_CSS,
|
||||||
TEXT_XML,
|
TEXT_XML,
|
||||||
|
IMG_X_ICON,
|
||||||
NONE
|
NONE
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -46,7 +46,7 @@ namespace ehs
|
|||||||
/// @param [in] address The local IPv4 or IPv6 address to bind to. Resolves domain names. The given address can be empty, "127.0.0.1", or "localhost" to automatically find the appropriate device.
|
/// @param [in] address The local IPv4 or IPv6 address to bind to. Resolves domain names. The given address can be empty, "127.0.0.1", or "localhost" to automatically find the appropriate device.
|
||||||
/// @param [in] port The port to bind to.
|
/// @param [in] port The port to bind to.
|
||||||
/// @note Requires the port given to be forwarded if this is called.
|
/// @note Requires the port given to be forwarded if this is called.
|
||||||
void Bind(const Str_8& address, UInt_16 port) override;
|
void Bind(Str_8 address, const UInt_16 &port) override;
|
||||||
|
|
||||||
/// Listens for incoming connections. Used for servers or PtP.
|
/// Listens for incoming connections. Used for servers or PtP.
|
||||||
void Listen() override;
|
void Listen() override;
|
||||||
@ -58,7 +58,7 @@ namespace ehs
|
|||||||
/// Connects to a TCP Socket that listens for incoming connections. Used for clients or PtP.
|
/// Connects to a TCP Socket that listens for incoming connections. Used for clients or PtP.
|
||||||
/// @param address The address of the listening TCP socket. Resolves domain names. The given address can be empty, "127.0.0.1", or "localhost" to automatically find the appropriate device.
|
/// @param address The address of the listening TCP socket. Resolves domain names. The given address can be empty, "127.0.0.1", or "localhost" to automatically find the appropriate device.
|
||||||
/// @param port The port of the listening TCP socket.
|
/// @param port The port of the listening TCP socket.
|
||||||
void Connect(const Str_8& address, UInt_16 port) override;
|
void Connect(Str_8 address, const UInt_16 &port) override;
|
||||||
|
|
||||||
/// Sends data in a C-style array with raw functionality. Meaning no internal help outside of native functions besides error checking.
|
/// Sends data in a C-style array with raw functionality. Meaning no internal help outside of native functions besides error checking.
|
||||||
/// @param [in] buffer The C-style array to send.
|
/// @param [in] buffer The C-style array to send.
|
||||||
@ -84,15 +84,17 @@ namespace ehs
|
|||||||
|
|
||||||
bool IsIPv6Only() const override;
|
bool IsIPv6Only() const override;
|
||||||
|
|
||||||
|
void SetReuse(const bool &value) override;
|
||||||
|
|
||||||
bool IsValid() const override;
|
bool IsValid() const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void Bind_v6(const Str_8& address, UInt_16 port);
|
void Bind_v6(const Str_8 &address, const UInt_16 &port) const;
|
||||||
|
|
||||||
void Bind_v4(const Str_8& address, UInt_16 port);
|
void Bind_v4(const Str_8 &address, const UInt_16 &port) const;
|
||||||
|
|
||||||
void Connect_v6(const Str_8& address, UInt_16 port);
|
void Connect_v6(const Str_8 &address, const UInt_16 &port);
|
||||||
|
|
||||||
void Connect_v4(const Str_8& address, UInt_16 port);
|
void Connect_v4(const Str_8 &address, const UInt_16 &port);
|
||||||
};
|
};
|
||||||
}
|
}
|
@ -46,7 +46,7 @@ namespace ehs
|
|||||||
/// @param [in] address The local IPv4 or IPv6 address to bind to. Resolves domain names. The given address can be empty, "127.0.0.1", or "localhost" to automatically find the appropriate device.
|
/// @param [in] address The local IPv4 or IPv6 address to bind to. Resolves domain names. The given address can be empty, "127.0.0.1", or "localhost" to automatically find the appropriate device.
|
||||||
/// @param [in] port The port to bind to.
|
/// @param [in] port The port to bind to.
|
||||||
/// @note Requires the port given to be forwarded if this is called.
|
/// @note Requires the port given to be forwarded if this is called.
|
||||||
void Bind(const Str_8& address, UInt_16 port) override;
|
void Bind(Str_8 address, const UInt_16 &port) override;
|
||||||
|
|
||||||
/// Listens for incoming connections. Used for servers or PtP.
|
/// Listens for incoming connections. Used for servers or PtP.
|
||||||
void Listen() override;
|
void Listen() override;
|
||||||
@ -58,7 +58,7 @@ namespace ehs
|
|||||||
/// Connects to a TCP Socket that listens for incoming connections. Used for clients or PtP.
|
/// Connects to a TCP Socket that listens for incoming connections. Used for clients or PtP.
|
||||||
/// @param address The address of the listening TCP socket. Resolves domain names. The given address can be empty, "127.0.0.1", or "localhost" to automatically find the appropriate device.
|
/// @param address The address of the listening TCP socket. Resolves domain names. The given address can be empty, "127.0.0.1", or "localhost" to automatically find the appropriate device.
|
||||||
/// @param port The port of the listening TCP socket.
|
/// @param port The port of the listening TCP socket.
|
||||||
void Connect(const Str_8& address, UInt_16 port) override;
|
void Connect(Str_8 address, const UInt_16 &port) override;
|
||||||
|
|
||||||
/// Sends data in a C-style array with raw functionality. Meaning no internal help outside of native functions besides error checking.
|
/// Sends data in a C-style array with raw functionality. Meaning no internal help outside of native functions besides error checking.
|
||||||
/// @param [in] buffer The C-style array to send.
|
/// @param [in] buffer The C-style array to send.
|
||||||
@ -84,12 +84,14 @@ namespace ehs
|
|||||||
|
|
||||||
bool IsIPv6Only() const override;
|
bool IsIPv6Only() const override;
|
||||||
|
|
||||||
|
void SetReuse(const bool &value) override;
|
||||||
|
|
||||||
bool IsValid() const override;
|
bool IsValid() const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void Bind_v6(const Str_8& address, UInt_16 port);
|
void Bind_v6(const Str_8& address, const UInt_16 &port);
|
||||||
|
|
||||||
void Bind_v4(const Str_8& address, UInt_16 port);
|
void Bind_v4(const Str_8& address, const UInt_16 &port);
|
||||||
|
|
||||||
void Connect_v6(const Str_8& address, UInt_16 port);
|
void Connect_v6(const Str_8& address, UInt_16 port);
|
||||||
|
|
||||||
|
36
include/ehs/system/AVX2.h
Normal file
36
include/ehs/system/AVX2.h
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "ehs/Types.h"
|
||||||
|
|
||||||
|
namespace ehs
|
||||||
|
{
|
||||||
|
class EHS_LIB_IO AVX2
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// Compares two unaligned 4 element vectors using 64-bit integers.
|
||||||
|
/// @param [in] a First vector.
|
||||||
|
/// @param [in] b Second vector.
|
||||||
|
/// @returns True if all 4 elements are equal. False otherwise.
|
||||||
|
static bool CompareUnaligned(const UInt_64 *a, const UInt_64 *b);
|
||||||
|
|
||||||
|
/// Compares two unaligned 4 element vectors using 64-bit integers.
|
||||||
|
/// @param [in] a First vector.
|
||||||
|
/// @param [in] b Second vector.
|
||||||
|
/// @returns True if all 4 elements are equal. False otherwise.
|
||||||
|
static bool CompareUnaligned(const SInt_64 *a, const SInt_64 *b);
|
||||||
|
|
||||||
|
/// Compares two aligned 4 element vectors using 64-bit integers.
|
||||||
|
/// @param [in] a First vector.
|
||||||
|
/// @param [in] b Second vector.
|
||||||
|
/// @returns True if all 4 elements are equal. False otherwise.
|
||||||
|
/// @note The parameters "a", and "b" must have alignas(32).
|
||||||
|
static bool CompareAligned(const UInt_64 *a, const UInt_64 *b);
|
||||||
|
|
||||||
|
/// Compares two aligned 4 element vectors using 64-bit integers.
|
||||||
|
/// @param [in] a First vector.
|
||||||
|
/// @param [in] b Second vector.
|
||||||
|
/// @returns True if all 4 elements are equal. False otherwise.
|
||||||
|
/// @note The parameters "a", and "b" must have alignas(32).
|
||||||
|
static bool CompareAligned(const SInt_64 *a, const SInt_64 *b);
|
||||||
|
};
|
||||||
|
}
|
36
include/ehs/system/AVX512.h
Normal file
36
include/ehs/system/AVX512.h
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "ehs/Types.h"
|
||||||
|
|
||||||
|
namespace ehs
|
||||||
|
{
|
||||||
|
class EHS_LIB_IO AVX512
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// Compares two unaligned 8 element vectors using 64-bit integers.
|
||||||
|
/// @param [in] a First vector.
|
||||||
|
/// @param [in] b Second vector.
|
||||||
|
/// @returns True if all 8 elements are equal. False otherwise.
|
||||||
|
static bool CompareUnaligned(const UInt_64 *a, const UInt_64 *b);
|
||||||
|
|
||||||
|
/// Compares two unaligned 8 element vectors using 64-bit integers.
|
||||||
|
/// @param [in] a First vector.
|
||||||
|
/// @param [in] b Second vector.
|
||||||
|
/// @returns True if all 8 elements are equal. False otherwise.
|
||||||
|
static bool CompareUnaligned(const SInt_64 *a, const SInt_64 *b);
|
||||||
|
|
||||||
|
/// Compares two aligned 8 element vectors using 64-bit integers.
|
||||||
|
/// @param [in] a First vector.
|
||||||
|
/// @param [in] b Second vector.
|
||||||
|
/// @returns True if all 8 elements are equal. False otherwise.
|
||||||
|
/// @note The parameters "a", and "b" must have alignas(32).
|
||||||
|
static bool CompareAligned(const UInt_64 *a, const UInt_64 *b);
|
||||||
|
|
||||||
|
/// Compares two aligned 8 element vectors using 64-bit integers.
|
||||||
|
/// @param [in] a First vector.
|
||||||
|
/// @param [in] b Second vector.
|
||||||
|
/// @returns True if all 8 elements are equal. False otherwise.
|
||||||
|
/// @note The parameters "a", and "b" must have alignas(32).
|
||||||
|
static bool CompareAligned(const SInt_64 *a, const SInt_64 *b);
|
||||||
|
};
|
||||||
|
}
|
@ -6,7 +6,7 @@
|
|||||||
#define EHS_64_BIT
|
#define EHS_64_BIT
|
||||||
#elif defined(_M_ARM64) || defined(__aarch64__)
|
#elif defined(_M_ARM64) || defined(__aarch64__)
|
||||||
#define EHS_LITTLE_ENDIAN
|
#define EHS_LITTLE_ENDIAN
|
||||||
#define EHS_ARCH_ARM64
|
#define EHS_ARCH_AARCH64
|
||||||
#define EHS_64_BIT
|
#define EHS_64_BIT
|
||||||
#else
|
#else
|
||||||
#error Unsupported architecture.
|
#error Unsupported architecture.
|
||||||
|
@ -8,7 +8,7 @@ namespace ehs
|
|||||||
class EHS_LIB_IO BaseSystem
|
class EHS_LIB_IO BaseSystem
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static void OpenURI(const Str_8& uri);
|
static void OpenURI(Str_8 uri);
|
||||||
|
|
||||||
static Str_8 OpenFileDialog(const Str_8 &dir, const Str_8 &filters);
|
static Str_8 OpenFileDialog(const Str_8 &dir, const Str_8 &filters);
|
||||||
|
|
||||||
|
@ -38,6 +38,70 @@ namespace ehs
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
static const bool hasFPU;
|
||||||
|
static const bool hasVME;
|
||||||
|
static const bool hasDE;
|
||||||
|
static const bool hasPSE;
|
||||||
|
static const bool hasTSC;
|
||||||
|
static const bool hasMSR;
|
||||||
|
static const bool hasPAE;
|
||||||
|
static const bool hasMCE;
|
||||||
|
static const bool hasCX8;
|
||||||
|
static const bool hasAPIC;
|
||||||
|
static const bool hasSEP;
|
||||||
|
static const bool hasMTRR;
|
||||||
|
static const bool hasPGE;
|
||||||
|
static const bool hasMCA;
|
||||||
|
static const bool hasCMOV;
|
||||||
|
static const bool hasPSE_36;
|
||||||
|
static const bool hasPSN;
|
||||||
|
static const bool hasCLFSH;
|
||||||
|
static const bool hasDS;
|
||||||
|
static const bool hasACPI;
|
||||||
|
static const bool hasMMX;
|
||||||
|
static const bool hasFXSR;
|
||||||
|
static const bool hasSSE;
|
||||||
|
static const bool hasSSE2;
|
||||||
|
static const bool hasSS;
|
||||||
|
static const bool hasHTT;
|
||||||
|
static const bool hasTM;
|
||||||
|
static const bool hasIA64;
|
||||||
|
static const bool hasPBE;
|
||||||
|
static const bool hasSSE3;
|
||||||
|
static const bool hasPCLMULQDQ;
|
||||||
|
static const bool hasDTES64;
|
||||||
|
static const bool hasMONITOR;
|
||||||
|
static const bool hasVMX;
|
||||||
|
static const bool hasSMX;
|
||||||
|
static const bool hasEST;
|
||||||
|
static const bool hasTM2;
|
||||||
|
static const bool hasSSSE3;
|
||||||
|
static const bool hasCNXT_ID;
|
||||||
|
static const bool hasSDBG;
|
||||||
|
static const bool hasFMA;
|
||||||
|
static const bool hasCX16;
|
||||||
|
static const bool hasXTPR;
|
||||||
|
static const bool hasPDCM;
|
||||||
|
static const bool hasPCID;
|
||||||
|
static const bool hasDCA;
|
||||||
|
static const bool hasSSE4_1;
|
||||||
|
static const bool hasSSE4_2;
|
||||||
|
static const bool hasX2APIC;
|
||||||
|
static const bool hasMOVBE;
|
||||||
|
static const bool hasPOPCNT;
|
||||||
|
static const bool hasTSC_DEADLINE;
|
||||||
|
static const bool hasAES;
|
||||||
|
static const bool hasXSAVE;
|
||||||
|
static const bool hasOSXSAVE;
|
||||||
|
static const bool hasAVX;
|
||||||
|
static const bool hasF16C;
|
||||||
|
static const bool hasRDRND;
|
||||||
|
static const bool hasHYPERVISOR;
|
||||||
|
static const bool hasAVX2;
|
||||||
|
static const bool hasAVX512F;
|
||||||
|
static const bool hasRDSEED;
|
||||||
|
static const bool hasADX;
|
||||||
|
|
||||||
static Architecture GetArchitecture();
|
static Architecture GetArchitecture();
|
||||||
|
|
||||||
static UInt_8 PointerSize();
|
static UInt_8 PointerSize();
|
||||||
@ -68,153 +132,157 @@ namespace ehs
|
|||||||
|
|
||||||
static UInt_8 GetExtFamilyId();
|
static UInt_8 GetExtFamilyId();
|
||||||
|
|
||||||
static UInt_32 GetFeatureBits_1();
|
/// Retrieves the CPU brand as a null-terminated ASCII string.
|
||||||
|
/// @param[out] input A 48 byte character array representing the brand.
|
||||||
static bool HasFPU();
|
|
||||||
|
|
||||||
static bool HasVME();
|
|
||||||
|
|
||||||
static bool HasDE();
|
|
||||||
|
|
||||||
static bool HasPSE();
|
|
||||||
|
|
||||||
static bool HasTSC();
|
|
||||||
|
|
||||||
static bool HasMSR();
|
|
||||||
|
|
||||||
static bool HasPAE();
|
|
||||||
|
|
||||||
static bool HasMCE();
|
|
||||||
|
|
||||||
static bool HasCX8();
|
|
||||||
|
|
||||||
static bool HasAPIC();
|
|
||||||
|
|
||||||
static bool HasSEP();
|
|
||||||
|
|
||||||
static bool HasMTRR();
|
|
||||||
|
|
||||||
static bool HasPGE();
|
|
||||||
|
|
||||||
static bool HasMCA();
|
|
||||||
|
|
||||||
static bool HasCMOV();
|
|
||||||
|
|
||||||
static bool HasPAT();
|
|
||||||
|
|
||||||
static bool HasPSE_36();
|
|
||||||
|
|
||||||
static bool HasPSN();
|
|
||||||
|
|
||||||
static bool HasCLFSH();
|
|
||||||
|
|
||||||
static bool HasDS();
|
|
||||||
|
|
||||||
static bool HasACPI();
|
|
||||||
|
|
||||||
static bool HasMMX();
|
|
||||||
|
|
||||||
static bool HasFXSR();
|
|
||||||
|
|
||||||
static bool HasSSE();
|
|
||||||
|
|
||||||
static bool HasSSE2();
|
|
||||||
|
|
||||||
static bool HasSS();
|
|
||||||
|
|
||||||
static bool HasHTT();
|
|
||||||
|
|
||||||
static bool HasTM();
|
|
||||||
|
|
||||||
static bool HasIA64();
|
|
||||||
|
|
||||||
static bool HasPBE();
|
|
||||||
|
|
||||||
static UInt_32 GetFeatureBits_2();
|
|
||||||
|
|
||||||
static bool HasSSE3();
|
|
||||||
|
|
||||||
static bool HasPCLMULQDQ();
|
|
||||||
|
|
||||||
static bool HasDTES64();
|
|
||||||
|
|
||||||
static bool HasMONITOR();
|
|
||||||
|
|
||||||
static bool HasDS_CPL();
|
|
||||||
|
|
||||||
static bool HasVMX();
|
|
||||||
|
|
||||||
static bool HasSMX();
|
|
||||||
|
|
||||||
static bool HasEST();
|
|
||||||
|
|
||||||
static bool HasTM2();
|
|
||||||
|
|
||||||
static bool HasSSSE3();
|
|
||||||
|
|
||||||
static bool HasCNXT_ID();
|
|
||||||
|
|
||||||
static bool HasSDBG();
|
|
||||||
|
|
||||||
static bool HasFMA();
|
|
||||||
|
|
||||||
static bool HasCX16();
|
|
||||||
|
|
||||||
static bool HasXTPR();
|
|
||||||
|
|
||||||
static bool HasPDCM();
|
|
||||||
|
|
||||||
static bool HasPCID();
|
|
||||||
|
|
||||||
static bool HasDCA();
|
|
||||||
|
|
||||||
static bool HasSSE4_1();
|
|
||||||
|
|
||||||
static bool HasSSE4_2();
|
|
||||||
|
|
||||||
static bool HasX2APIC();
|
|
||||||
|
|
||||||
static bool HasMOVBE();
|
|
||||||
|
|
||||||
static bool HasPOPCNT();
|
|
||||||
|
|
||||||
static bool HasTSC_DEADLINE();
|
|
||||||
|
|
||||||
static bool HasAES();
|
|
||||||
|
|
||||||
static bool HasXSAVE();
|
|
||||||
|
|
||||||
static bool HasOSXSAVE();
|
|
||||||
|
|
||||||
static bool HasAVX();
|
|
||||||
|
|
||||||
static bool HasF16C();
|
|
||||||
|
|
||||||
static bool HasRDRND();
|
|
||||||
|
|
||||||
static bool HasHYPERVISOR();
|
|
||||||
|
|
||||||
static UInt_32 GetExtFeatureBits_1();
|
|
||||||
|
|
||||||
static bool HasAVX2();
|
|
||||||
|
|
||||||
static bool HasRDSEED();
|
|
||||||
|
|
||||||
static bool HasADX();
|
|
||||||
|
|
||||||
static UInt_32 GetExtFeatureBits_2();
|
|
||||||
|
|
||||||
static UInt_32 GetExtFeatureBits_3();
|
|
||||||
|
|
||||||
/// Retrieves the CPU brand as a null-terminated ASCII string.
|
|
||||||
/// @param[out] input A 48 byte character array representing the brand.
|
|
||||||
static void GetBrand(Char_8* input);
|
static void GetBrand(Char_8* input);
|
||||||
|
|
||||||
static UInt_8 GetCacheLineSize();
|
static UInt_8 GetCacheLineSize();
|
||||||
|
|
||||||
|
static UInt_32 GetFeatureBits_1();
|
||||||
|
|
||||||
|
static UInt_32 GetFeatureBits_2();
|
||||||
|
|
||||||
|
static UInt_32 GetExtFeatureBits_1();
|
||||||
|
|
||||||
|
static UInt_32 GetExtFeatureBits_2();
|
||||||
|
|
||||||
|
static UInt_32 GetExtFeatureBits_3();
|
||||||
|
|
||||||
|
private:
|
||||||
|
static bool RetrieveFPU();
|
||||||
|
|
||||||
|
static bool RetrieveVME();
|
||||||
|
|
||||||
|
static bool RetrieveDE();
|
||||||
|
|
||||||
|
static bool RetrievePSE();
|
||||||
|
|
||||||
|
static bool RetrieveTSC();
|
||||||
|
|
||||||
|
static bool RetrieveMSR();
|
||||||
|
|
||||||
|
static bool RetrievePAE();
|
||||||
|
|
||||||
|
static bool RetrieveMCE();
|
||||||
|
|
||||||
|
static bool RetrieveCX8();
|
||||||
|
|
||||||
|
static bool RetrieveAPIC();
|
||||||
|
|
||||||
|
static bool RetrieveSEP();
|
||||||
|
|
||||||
|
static bool RetrieveMTRR();
|
||||||
|
|
||||||
|
static bool RetrievePGE();
|
||||||
|
|
||||||
|
static bool RetrieveMCA();
|
||||||
|
|
||||||
|
static bool RetrieveCMOV();
|
||||||
|
|
||||||
|
static bool RetrievePAT();
|
||||||
|
|
||||||
|
static bool RetrievePSE_36();
|
||||||
|
|
||||||
|
static bool RetrievePSN();
|
||||||
|
|
||||||
|
static bool RetrieveCLFSH();
|
||||||
|
|
||||||
|
static bool RetrieveDS();
|
||||||
|
|
||||||
|
static bool RetrieveACPI();
|
||||||
|
|
||||||
|
static bool RetrieveMMX();
|
||||||
|
|
||||||
|
static bool RetrieveFXSR();
|
||||||
|
|
||||||
|
static bool RetrieveSSE();
|
||||||
|
|
||||||
|
static bool RetrieveSSE2();
|
||||||
|
|
||||||
|
static bool RetrieveSS();
|
||||||
|
|
||||||
|
static bool RetrieveHTT();
|
||||||
|
|
||||||
|
static bool RetrieveTM();
|
||||||
|
|
||||||
|
static bool RetrieveIA64();
|
||||||
|
|
||||||
|
static bool RetrievePBE();
|
||||||
|
|
||||||
|
static bool RetrieveSSE3();
|
||||||
|
|
||||||
|
static bool RetrievePCLMULQDQ();
|
||||||
|
|
||||||
|
static bool RetrieveDTES64();
|
||||||
|
|
||||||
|
static bool RetrieveMONITOR();
|
||||||
|
|
||||||
|
static bool RetrieveDS_CPL();
|
||||||
|
|
||||||
|
static bool RetrieveVMX();
|
||||||
|
|
||||||
|
static bool RetrieveSMX();
|
||||||
|
|
||||||
|
static bool RetrieveEST();
|
||||||
|
|
||||||
|
static bool RetrieveTM2();
|
||||||
|
|
||||||
|
static bool RetrieveSSSE3();
|
||||||
|
|
||||||
|
static bool RetrieveCNXT_ID();
|
||||||
|
|
||||||
|
static bool RetrieveSDBG();
|
||||||
|
|
||||||
|
static bool RetrieveFMA();
|
||||||
|
|
||||||
|
static bool RetrieveCX16();
|
||||||
|
|
||||||
|
static bool RetrieveXTPR();
|
||||||
|
|
||||||
|
static bool RetrievePDCM();
|
||||||
|
|
||||||
|
static bool RetrievePCID();
|
||||||
|
|
||||||
|
static bool RetrieveDCA();
|
||||||
|
|
||||||
|
static bool RetrieveSSE4_1();
|
||||||
|
|
||||||
|
static bool RetrieveSSE4_2();
|
||||||
|
|
||||||
|
static bool RetrieveX2APIC();
|
||||||
|
|
||||||
|
static bool RetrieveMOVBE();
|
||||||
|
|
||||||
|
static bool RetrievePOPCNT();
|
||||||
|
|
||||||
|
static bool RetrieveTSC_DEADLINE();
|
||||||
|
|
||||||
|
static bool RetrieveAES();
|
||||||
|
|
||||||
|
static bool RetrieveXSAVE();
|
||||||
|
|
||||||
|
static bool RetrieveOSXSAVE();
|
||||||
|
|
||||||
|
static bool RetrieveAVX();
|
||||||
|
|
||||||
|
static bool RetrieveF16C();
|
||||||
|
|
||||||
|
static bool RetrieveRDRND();
|
||||||
|
|
||||||
|
static bool RetrieveHYPERVISOR();
|
||||||
|
|
||||||
|
static bool RetrieveAVX2();
|
||||||
|
|
||||||
|
static bool RetrieveAVX512F();
|
||||||
|
|
||||||
|
static bool RetrieveRDSEED();
|
||||||
|
|
||||||
|
static bool RetrieveADX();
|
||||||
|
|
||||||
//static Str_8 ToStr();
|
//static Str_8 ToStr();
|
||||||
|
|
||||||
private:
|
static UInt_64 RetrieveFreq_AARCH64();
|
||||||
|
|
||||||
static UInt_64 RetrieveTSC_Freq();
|
static UInt_64 RetrieveTSC_Freq();
|
||||||
|
|
||||||
static UInt_64 CalculateTSC_Freq();
|
static UInt_64 CalculateTSC_Freq();
|
||||||
|
@ -8,7 +8,7 @@ namespace ehs
|
|||||||
class EHS_LIB_IO System : public BaseSystem
|
class EHS_LIB_IO System : public BaseSystem
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static void OpenURI(const Str_8& uri);
|
static void OpenURI(Str_8 uri);
|
||||||
|
|
||||||
static Str_8 OpenFileDialog(const Str_8 &dir, const Str_8 &filters);
|
static Str_8 OpenFileDialog(const Str_8 &dir, const Str_8 &filters);
|
||||||
|
|
||||||
|
@ -7,6 +7,6 @@ namespace ehs
|
|||||||
class EHS_LIB_IO System : public BaseSystem
|
class EHS_LIB_IO System : public BaseSystem
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static void OpenURI(const Str_8& uri);
|
static void OpenURI(Str_8 uri);
|
||||||
};
|
};
|
||||||
}
|
}
|
198
src/Base64.cpp
198
src/Base64.cpp
@ -2,7 +2,35 @@
|
|||||||
|
|
||||||
namespace ehs
|
namespace ehs
|
||||||
{
|
{
|
||||||
const char Base64::ascii[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
Str_8 Base64::EncodeURL(const Str_8 &input)
|
||||||
|
{
|
||||||
|
UInt_64 input_length = input.Size();
|
||||||
|
|
||||||
|
// Calculate the output length
|
||||||
|
UInt_64 output_length = (input_length * 4 + 2) / 3;
|
||||||
|
|
||||||
|
// Allocate memory for the output
|
||||||
|
Str_8 result(output_length);
|
||||||
|
|
||||||
|
// Loop through the input and fill the output
|
||||||
|
for (int i = 0, j = 0; i < input_length;) {
|
||||||
|
|
||||||
|
// Take first byte and shift right by 2 bits
|
||||||
|
UInt_32 octet_a = (UInt_8)input[i++];
|
||||||
|
UInt_32 octet_b = i < input_length ? (UInt_8)input[i++] : 0;
|
||||||
|
UInt_32 octet_c = i < input_length ? (UInt_8)input[i++] : 0;
|
||||||
|
|
||||||
|
UInt_32 triple = (octet_a << 16) + (octet_b << 8) + octet_c;
|
||||||
|
|
||||||
|
// Encode the 24-bits into four 6-bits integers
|
||||||
|
result[j++] = asciiUrl[(triple >> 3 * 6) & 0x3F];
|
||||||
|
result[j++] = asciiUrl[(triple >> 2 * 6) & 0x3F];
|
||||||
|
result[j++] = asciiUrl[(triple >> 1 * 6) & 0x3F];
|
||||||
|
result[j++] = asciiUrl[(triple >> 0 * 6) & 0x3F];
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
Str_8 Base64::Encode(const Str_8 &input)
|
Str_8 Base64::Encode(const Str_8 &input)
|
||||||
{
|
{
|
||||||
@ -18,9 +46,9 @@ namespace ehs
|
|||||||
for (int i = 0, j = 0; i < input_length;) {
|
for (int i = 0, j = 0; i < input_length;) {
|
||||||
|
|
||||||
// Take first byte and shift right by 2 bits
|
// Take first byte and shift right by 2 bits
|
||||||
UInt_32 octet_a = i < input_length ? input[i++] : 0;
|
UInt_32 octet_a = i < input_length ? (UInt_8)input[i++] : 0;
|
||||||
UInt_32 octet_b = i < input_length ? input[i++] : 0;
|
UInt_32 octet_b = i < input_length ? (UInt_8)input[i++] : 0;
|
||||||
UInt_32 octet_c = i < input_length ? input[i++] : 0;
|
UInt_32 octet_c = i < input_length ? (UInt_8)input[i++] : 0;
|
||||||
|
|
||||||
UInt_32 triple = (octet_a << 0x10) + (octet_b << 0x08) + octet_c;
|
UInt_32 triple = (octet_a << 0x10) + (octet_b << 0x08) + octet_c;
|
||||||
|
|
||||||
@ -42,63 +70,151 @@ namespace ehs
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
Str_8 Base64::Decode(const Str_8 &input)
|
Str_8 Base64::DecodeURL(const Str_8 &input)
|
||||||
{
|
{
|
||||||
UInt_64 in_len = input.Size();
|
Str_8 result(input.Size() * 3 / 4);
|
||||||
int i = 0;
|
|
||||||
int j = 0;
|
|
||||||
int in_ = 0;
|
|
||||||
char char_array_4[4], char_array_3[3];
|
|
||||||
Str_8 ret;
|
|
||||||
|
|
||||||
while (in_len-- && ( input[in_] != '=') && IsBase64(input[in_]))
|
UInt_64 remaining = input.Size();
|
||||||
|
UInt_64 offsetIn = 0;
|
||||||
|
UInt_64 offsetOut = 0;
|
||||||
|
UInt_8 quartet[4];
|
||||||
|
|
||||||
|
while (remaining)
|
||||||
{
|
{
|
||||||
char_array_4[i++] = input[in_]; in_++;
|
if (remaining >= 4)
|
||||||
|
|
||||||
if (i ==4)
|
|
||||||
{
|
{
|
||||||
for (i = 0; i <4; i++)
|
for (UInt_8 i = 0; i < 4; ++i)
|
||||||
char_array_4[i] = Find(char_array_4[i]);
|
{
|
||||||
|
if (!IsBase64URL(input[offsetIn + i]))
|
||||||
|
return {};
|
||||||
|
|
||||||
char_array_3[0] = ( char_array_4[0] << 2 ) + ((char_array_4[1] & 0x30) >> 4);
|
quartet[i] = FindURL(input[offsetIn + i]);
|
||||||
char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
|
if (quartet[i] == EHS_UINT_8_MAX)
|
||||||
char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; (i < 3); i++)
|
result[offsetOut++] = (Char_8)((((UInt_8*)&quartet)[0] << 2) | (((UInt_8*)&quartet)[1] >> 4));
|
||||||
ret += char_array_3[i];
|
result[offsetOut++] = (Char_8)((((UInt_8*)&quartet)[1] << 4) | (((UInt_8*)&quartet)[2] >> 2));
|
||||||
|
result[offsetOut++] = (Char_8)((((UInt_8*)&quartet)[2] << 6) | ((UInt_8*)&quartet)[3]);
|
||||||
|
|
||||||
i = 0;
|
offsetIn += 4;
|
||||||
|
remaining -= 4;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (UInt_8 i = 0; i < 4; ++i)
|
||||||
|
{
|
||||||
|
if (i < remaining)
|
||||||
|
{
|
||||||
|
if (!IsBase64URL(input[offsetIn + i]))
|
||||||
|
return {};
|
||||||
|
|
||||||
|
quartet[i] = FindURL(input[offsetIn + i]);
|
||||||
|
if (quartet[i] == EHS_UINT_8_MAX)
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
quartet[i] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
result[offsetOut++] = (Char_8)((quartet[0] << 2) | (quartet[1] >> 4));
|
||||||
|
|
||||||
|
if (remaining == 3)
|
||||||
|
result[offsetOut++] = (Char_8)((quartet[1] << 4) | (quartet[2] >> 2));
|
||||||
|
|
||||||
|
offsetIn += remaining;
|
||||||
|
remaining = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i)
|
return result;
|
||||||
{
|
|
||||||
for (j = 0; j < i; j++)
|
|
||||||
char_array_4[j] = Find(char_array_4[j]);
|
|
||||||
|
|
||||||
char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
|
|
||||||
char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
|
|
||||||
|
|
||||||
for (j = 0; (j < i - 1); j++)
|
|
||||||
ret += char_array_3[j];
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
char Base64::Find(const char c)
|
Str_8 Base64::Decode(const Str_8 &input)
|
||||||
{
|
{
|
||||||
for (char i = 0; i < (char)sizeof(ascii); ++i)
|
Str_8 result(input.Size() * 3 / 4);
|
||||||
|
|
||||||
|
UInt_64 remaining = input.Size();
|
||||||
|
UInt_64 offsetIn = 0;
|
||||||
|
UInt_64 offsetOut = 0;
|
||||||
|
UInt_8 quartet[4];
|
||||||
|
|
||||||
|
while (remaining)
|
||||||
{
|
{
|
||||||
|
if (remaining >= 4)
|
||||||
|
{
|
||||||
|
for (UInt_8 i = 0; i < 4; ++i)
|
||||||
|
{
|
||||||
|
if (!IsBase64(input[offsetIn + i]))
|
||||||
|
return {};
|
||||||
|
|
||||||
|
quartet[i] = Find(input[offsetIn + i]);
|
||||||
|
if (quartet[i] == EHS_UINT_8_MAX)
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
result[offsetOut++] = (Char_8)((((UInt_8*)&quartet)[0] << 2) | (((UInt_8*)&quartet)[1] >> 4));
|
||||||
|
result[offsetOut++] = (Char_8)((((UInt_8*)&quartet)[1] << 4) | (((UInt_8*)&quartet)[2] >> 2));
|
||||||
|
result[offsetOut++] = (Char_8)((((UInt_8*)&quartet)[2] << 6) | ((UInt_8*)&quartet)[3]);
|
||||||
|
|
||||||
|
offsetIn += 4;
|
||||||
|
remaining -= 4;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (UInt_8 i = 0; i < 4; ++i)
|
||||||
|
{
|
||||||
|
if (i < remaining)
|
||||||
|
{
|
||||||
|
if (!IsBase64(input[offsetIn + i]))
|
||||||
|
return {};
|
||||||
|
|
||||||
|
quartet[i] = Find(input[offsetIn + i]);
|
||||||
|
if (quartet[i] == EHS_UINT_8_MAX)
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
quartet[i] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
result[offsetOut++] = (Char_8)((quartet[0] << 2) | (quartet[1] >> 4));
|
||||||
|
|
||||||
|
if (remaining == 3)
|
||||||
|
result[offsetOut++] = (Char_8)((quartet[1] << 4) | (quartet[2] >> 2));
|
||||||
|
|
||||||
|
offsetIn += remaining;
|
||||||
|
remaining = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
UInt_8 Base64::FindURL(const UInt_8 &c)
|
||||||
|
{
|
||||||
|
for (UInt_8 i = 0; i < (UInt_8)sizeof(asciiUrl) - 1; ++i)
|
||||||
|
if (asciiUrl[i] == c)
|
||||||
|
return i;
|
||||||
|
|
||||||
|
return EHS_UINT_8_MAX;;
|
||||||
|
}
|
||||||
|
|
||||||
|
UInt_8 Base64::Find(const UInt_8 &c)
|
||||||
|
{
|
||||||
|
for (UInt_8 i = 0; i < (UInt_8)sizeof(ascii) - 1; ++i)
|
||||||
if (ascii[i] == c)
|
if (ascii[i] == c)
|
||||||
return i;
|
return i;
|
||||||
}
|
|
||||||
|
|
||||||
return EHS_SINT_8_MAX;
|
return EHS_SINT_8_MAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Base64::IsBase64(const char c)
|
bool Base64::IsBase64URL(const UInt_8 &c)
|
||||||
{
|
{
|
||||||
return (c > 47 && c < 58) || (c > 64 && c < 91) || (c > 96 && c < 123) || (c == '+') || (c == '/');
|
return (c > 47 && c < 58) || (c > 64 && c < 91) || (c > 96 && c < 123) || c == '-' || c == '_';
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Base64::IsBase64(const UInt_8 &c)
|
||||||
|
{
|
||||||
|
return (c > 47 && c < 58) || (c > 64 && c < 91) || (c > 96 && c < 123) || c == '+' || c == '/';
|
||||||
}
|
}
|
||||||
}
|
}
|
12
src/Math.cpp
12
src/Math.cpp
@ -36,9 +36,9 @@ namespace ehs
|
|||||||
double Math::Sqrt(const double from)
|
double Math::Sqrt(const double from)
|
||||||
{
|
{
|
||||||
#if defined(EHS_ARCH_X64)
|
#if defined(EHS_ARCH_X64)
|
||||||
if (CPU::HasAVX())
|
if (CPU::hasAVX)
|
||||||
return Sqrt_AVX(from);
|
return Sqrt_AVX(from);
|
||||||
else if (CPU::HasSSE())
|
else if (CPU::hasSSE)
|
||||||
return Sqrt_SSE2(from);
|
return Sqrt_SSE2(from);
|
||||||
|
|
||||||
double temp = 0.0;
|
double temp = 0.0;
|
||||||
@ -51,7 +51,7 @@ namespace ehs
|
|||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
#elif defined(EHS_ARCH_ARM64)
|
#elif defined(EHS_ARCH_AARCH64)
|
||||||
return Sqrt_VFP4(from);
|
return Sqrt_VFP4(from);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -59,9 +59,9 @@ namespace ehs
|
|||||||
float Math::Sqrt(const float from)
|
float Math::Sqrt(const float from)
|
||||||
{
|
{
|
||||||
#if defined(EHS_ARCH_X64)
|
#if defined(EHS_ARCH_X64)
|
||||||
if (CPU::HasAVX())
|
if (CPU::hasAVX)
|
||||||
return Sqrt_AVX(from);
|
return Sqrt_AVX(from);
|
||||||
else if (CPU::HasSSE())
|
else if (CPU::hasSSE)
|
||||||
return Sqrt_SSE(from);
|
return Sqrt_SSE(from);
|
||||||
|
|
||||||
float temp = 0.0f;
|
float temp = 0.0f;
|
||||||
@ -74,7 +74,7 @@ namespace ehs
|
|||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
#elif defined(EHS_ARCH_ARM64)
|
#elif defined(EHS_ARCH_AARCH64)
|
||||||
return Sqrt_VFP4(from);
|
return Sqrt_VFP4(from);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
209
src/SHA256.cpp
Normal file
209
src/SHA256.cpp
Normal file
@ -0,0 +1,209 @@
|
|||||||
|
#include "ehs/SHA256.h"
|
||||||
|
|
||||||
|
#include "ehs/Util.h"
|
||||||
|
|
||||||
|
namespace ehs
|
||||||
|
{
|
||||||
|
UInt_32 SHA256::ROTR(const UInt_32 x, const UInt_32 n)
|
||||||
|
{
|
||||||
|
return (x >> n) | (x << (32 - n));
|
||||||
|
}
|
||||||
|
|
||||||
|
UInt_32 SHA256::CH(const UInt_32 x, const UInt_32 y, const UInt_32 z)
|
||||||
|
{
|
||||||
|
return (x & y) ^ (~x & z);
|
||||||
|
}
|
||||||
|
|
||||||
|
UInt_32 SHA256::MAJ(const UInt_32 x, const UInt_32 y, const UInt_32 z)
|
||||||
|
{
|
||||||
|
return (x & y) ^ (x & z) ^ (y & z);
|
||||||
|
}
|
||||||
|
|
||||||
|
UInt_32 SHA256::EP0(const UInt_32 x)
|
||||||
|
{
|
||||||
|
return ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22);
|
||||||
|
}
|
||||||
|
|
||||||
|
UInt_32 SHA256::EP1(const UInt_32 x)
|
||||||
|
{
|
||||||
|
return ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25);
|
||||||
|
}
|
||||||
|
|
||||||
|
UInt_32 SHA256::SIG0(const UInt_32 x)
|
||||||
|
{
|
||||||
|
return ROTR(x, 7) ^ ROTR(x, 18) ^ (x >> 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
UInt_32 SHA256::SIG1(const UInt_32 x)
|
||||||
|
{
|
||||||
|
return ROTR(x,17) ^ ROTR(x, 19) ^ (x >> 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
SHA256::SHA256()
|
||||||
|
: state{0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19},
|
||||||
|
bitLen(0), data{}, dataLen(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
SHA256::SHA256(SHA256&& other) noexcept
|
||||||
|
: state{}, bitLen(0), data{}, dataLen(0)
|
||||||
|
{
|
||||||
|
Util::Copy(state, other.state, sizeof(state) / sizeof(UInt_32));
|
||||||
|
bitLen = other.bitLen;
|
||||||
|
Util::Copy(data, other.data, sizeof(data));
|
||||||
|
dataLen = other.dataLen;
|
||||||
|
|
||||||
|
Util::Zero(other.state, sizeof(state) / sizeof(UInt_32));
|
||||||
|
other.bitLen = 0;
|
||||||
|
Util::Zero(other.data, sizeof(data));
|
||||||
|
other.dataLen = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
SHA256::SHA256(const SHA256& other)
|
||||||
|
: state{}, bitLen(0), data{}, dataLen(0)
|
||||||
|
{
|
||||||
|
Util::Copy(state, other.state, sizeof(state) / sizeof(UInt_32));
|
||||||
|
bitLen = other.bitLen;
|
||||||
|
Util::Copy(data, other.data, sizeof(data));
|
||||||
|
dataLen = other.dataLen;
|
||||||
|
}
|
||||||
|
|
||||||
|
SHA256& SHA256::operator=(SHA256&& other) noexcept
|
||||||
|
{
|
||||||
|
if (this == &other)
|
||||||
|
return *this;
|
||||||
|
|
||||||
|
Util::Copy(state, other.state, sizeof(state) / sizeof(UInt_32));
|
||||||
|
bitLen = other.bitLen;
|
||||||
|
Util::Copy(data, other.data, sizeof(data));
|
||||||
|
dataLen = other.dataLen;
|
||||||
|
|
||||||
|
Util::Zero(other.state, sizeof(state) / sizeof(UInt_32));
|
||||||
|
other.bitLen = 0;
|
||||||
|
Util::Zero(other.data, sizeof(data));
|
||||||
|
other.dataLen = 0;
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
SHA256& SHA256::operator=(const SHA256& other)
|
||||||
|
{
|
||||||
|
if (this == &other)
|
||||||
|
return *this;
|
||||||
|
|
||||||
|
Util::Copy(state, other.state, sizeof(state) / sizeof(UInt_32));
|
||||||
|
bitLen = other.bitLen;
|
||||||
|
Util::Copy(data, other.data, sizeof(data));
|
||||||
|
dataLen = other.dataLen;
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHA256::Update(const Byte* data, const UInt_64 len)
|
||||||
|
{
|
||||||
|
for(UInt_64 i = 0; i < len; ++i)
|
||||||
|
{
|
||||||
|
this->data[dataLen++] = data[i];
|
||||||
|
|
||||||
|
if(dataLen == 64)
|
||||||
|
{
|
||||||
|
Transform(this->data);
|
||||||
|
bitLen += 512;
|
||||||
|
dataLen = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHA256::Final(Byte hash[32])
|
||||||
|
{
|
||||||
|
UInt_32 i = dataLen;
|
||||||
|
|
||||||
|
/* Pad */
|
||||||
|
data[i++] = 0x80;
|
||||||
|
if(i > 56)
|
||||||
|
{
|
||||||
|
while(i < 64)
|
||||||
|
data[i++] = 0x00;
|
||||||
|
|
||||||
|
Transform(data);
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
while(i < 56)
|
||||||
|
data[i++] = 0x00;
|
||||||
|
|
||||||
|
/* Length in bits */
|
||||||
|
bitLen += dataLen * 8ULL;
|
||||||
|
data[63] = bitLen;
|
||||||
|
data[62] = bitLen >> 8;
|
||||||
|
data[61] = bitLen >> 16;
|
||||||
|
data[60] = bitLen >> 24;
|
||||||
|
data[59] = bitLen >> 32;
|
||||||
|
data[58] = bitLen >> 40;
|
||||||
|
data[57] = bitLen >> 48;
|
||||||
|
data[56] = bitLen >> 56;
|
||||||
|
Transform(data);
|
||||||
|
|
||||||
|
/* big‑endian output */
|
||||||
|
for(i = 0; i < 4; ++i) {
|
||||||
|
hash[i] = (state[0] >> (24 - i * 8)) & 0xff;
|
||||||
|
hash[i + 4] = (state[1] >> (24 - i * 8)) & 0xff;
|
||||||
|
hash[i + 8] = (state[2] >> (24 - i * 8)) & 0xff;
|
||||||
|
hash[i + 12] = (state[3] >> (24 - i * 8)) & 0xff;
|
||||||
|
hash[i + 16] = (state[4] >> (24 - i * 8)) & 0xff;
|
||||||
|
hash[i + 20] = (state[5] >> (24 - i * 8)) & 0xff;
|
||||||
|
hash[i + 24] = (state[6] >> (24 - i * 8)) & 0xff;
|
||||||
|
hash[i + 28] = (state[7] >> (24 - i * 8)) & 0xff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHA256::Hash(const Byte* data, const UInt_64 len, Byte hash[32])
|
||||||
|
{
|
||||||
|
Update(data, len);
|
||||||
|
Final(hash);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHA256::Transform(const Byte data[64])
|
||||||
|
{
|
||||||
|
UInt_32 m[64];
|
||||||
|
UInt_32 a = state[0];
|
||||||
|
UInt_32 b = state[1];
|
||||||
|
UInt_32 c = state[2];
|
||||||
|
UInt_32 d = state[3];
|
||||||
|
UInt_32 e = state[4];
|
||||||
|
UInt_32 f = state[5];
|
||||||
|
UInt_32 g = state[6];
|
||||||
|
UInt_32 h = state[7];
|
||||||
|
UInt_32 i, t1, t2;
|
||||||
|
|
||||||
|
for (i = 0; i < 16; ++i)
|
||||||
|
m[i] = (UInt_32)data[i * 4] << 24 | (UInt_32)data[i * 4 + 1] << 16 | (UInt_32)data[i * 4 + 2] << 8 | (UInt_32)data[i * 4 + 3];
|
||||||
|
|
||||||
|
for (; i < 64; ++i)
|
||||||
|
m[i] = SIG1(m[i - 2]) + m[i - 7] + SIG0(m[i - 15]) + m[i - 16];
|
||||||
|
|
||||||
|
for(i = 0; i < 64; ++i)
|
||||||
|
{
|
||||||
|
t1 = h + EP1(e) + CH(e,f,g) + k[i] + m[i];
|
||||||
|
t2 = EP0(a) + MAJ(a,b,c);
|
||||||
|
h = g;
|
||||||
|
g = f;
|
||||||
|
f = e;
|
||||||
|
e = d + t1;
|
||||||
|
d = c;
|
||||||
|
c = b;
|
||||||
|
b = a;
|
||||||
|
a = t1 + t2;
|
||||||
|
}
|
||||||
|
|
||||||
|
state[0] += a;
|
||||||
|
state[1] += b;
|
||||||
|
state[2] += c;
|
||||||
|
state[3] += d;
|
||||||
|
state[4] += e;
|
||||||
|
state[5] += f;
|
||||||
|
state[6] += g;
|
||||||
|
state[7] += h;
|
||||||
|
}
|
||||||
|
}
|
@ -1,5 +1,9 @@
|
|||||||
#include "ehs/Util.h"
|
#include "ehs/Util.h"
|
||||||
|
|
||||||
|
#include "ehs/system/CPU.h"
|
||||||
|
#include "ehs/system/AVX2.h"
|
||||||
|
#include "ehs/system/AVX512.h"
|
||||||
|
|
||||||
namespace ehs
|
namespace ehs
|
||||||
{
|
{
|
||||||
bool Util::Compare(const void* const a, const void* const b, const UInt_64 size)
|
bool Util::Compare(const void* const a, const void* const b, const UInt_64 size)
|
||||||
|
@ -693,7 +693,7 @@ namespace ehs
|
|||||||
Vector<Str_32> Console::GetArgs_32(const UInt_64 bufferSize)
|
Vector<Str_32> Console::GetArgs_32(const UInt_64 bufferSize)
|
||||||
{
|
{
|
||||||
#if defined(EHS_OS_WINDOWS)
|
#if defined(EHS_OS_WINDOWS)
|
||||||
return UTF::To_32(GetCommandLineW()).Split(U" ");
|
return UTF::To_32(GetCommandLineW()).ParseArgs();
|
||||||
#elif defined(EHS_OS_LINUX)
|
#elif defined(EHS_OS_LINUX)
|
||||||
File cmdFile("/proc/self/cmdline", Mode::READ, Disposition::OPEN);
|
File cmdFile("/proc/self/cmdline", Mode::READ, Disposition::OPEN);
|
||||||
Array<Byte> data = cmdFile.ReadArray(bufferSize);
|
Array<Byte> data = cmdFile.ReadArray(bufferSize);
|
||||||
@ -725,7 +725,7 @@ namespace ehs
|
|||||||
Vector<Str_16> Console::GetArgs_16(const UInt_64 bufferSize)
|
Vector<Str_16> Console::GetArgs_16(const UInt_64 bufferSize)
|
||||||
{
|
{
|
||||||
#if defined(EHS_OS_WINDOWS)
|
#if defined(EHS_OS_WINDOWS)
|
||||||
return Str_16(GetCommandLineW()).Split(L" ");
|
return Str_16(GetCommandLineW()).ParseArgs();
|
||||||
#elif defined(EHS_OS_LINUX)
|
#elif defined(EHS_OS_LINUX)
|
||||||
File cmdFile("/proc/self/cmdline", Mode::READ, Disposition::OPEN);
|
File cmdFile("/proc/self/cmdline", Mode::READ, Disposition::OPEN);
|
||||||
Array<Byte> data = cmdFile.ReadArray(bufferSize);
|
Array<Byte> data = cmdFile.ReadArray(bufferSize);
|
||||||
@ -755,7 +755,7 @@ namespace ehs
|
|||||||
Vector<Str_8> Console::GetArgs_8(const UInt_64 bufferSize)
|
Vector<Str_8> Console::GetArgs_8(const UInt_64 bufferSize)
|
||||||
{
|
{
|
||||||
#if defined(EHS_OS_WINDOWS)
|
#if defined(EHS_OS_WINDOWS)
|
||||||
return UTF::To_8(GetCommandLineW()).Split(" ");
|
return UTF::To_8(GetCommandLineW()).ParseArgs();
|
||||||
#elif defined(EHS_OS_LINUX)
|
#elif defined(EHS_OS_LINUX)
|
||||||
File cmdFile("/proc/self/cmdline", Mode::READ, Disposition::OPEN);
|
File cmdFile("/proc/self/cmdline", Mode::READ, Disposition::OPEN);
|
||||||
Array<Byte> data = cmdFile.ReadArray(bufferSize);
|
Array<Byte> data = cmdFile.ReadArray(bufferSize);
|
||||||
|
@ -93,13 +93,13 @@ namespace ehs
|
|||||||
}
|
}
|
||||||
|
|
||||||
AudioDevice::AudioDevice()
|
AudioDevice::AudioDevice()
|
||||||
: id(0), loop(nullptr), context(nullptr), core(nullptr), input(nullptr), output(nullptr)
|
: id(0), loop(nullptr), context(nullptr), core(nullptr), input(nullptr), output(nullptr), paramsHook{}
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioDevice::AudioDevice(AudioDevice&& device) noexcept
|
AudioDevice::AudioDevice(AudioDevice&& device) noexcept
|
||||||
: BaseAudioDevice(device), id(device.id), name((Str_8 &&)device.name), loop(device.loop),
|
: BaseAudioDevice(device), id(device.id), name((Str_8 &&)device.name), loop(device.loop),
|
||||||
context(device.context), core(device.core), input(device.input), output(device.output)
|
context(device.context), core(device.core), input(device.input), output(device.output), paramsHook(device.paramsHook)
|
||||||
{
|
{
|
||||||
device.id = 0;
|
device.id = 0;
|
||||||
device.loop = nullptr;
|
device.loop = nullptr;
|
||||||
@ -107,11 +107,12 @@ namespace ehs
|
|||||||
device.core = nullptr;
|
device.core = nullptr;
|
||||||
device.input = nullptr;
|
device.input = nullptr;
|
||||||
device.output = nullptr;
|
device.output = nullptr;
|
||||||
|
device.paramsHook = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioDevice::AudioDevice(const AudioDevice& device)
|
AudioDevice::AudioDevice(const AudioDevice& device)
|
||||||
: BaseAudioDevice(device), id(device.id), name(device.name), loop(nullptr), context(nullptr), core(nullptr),
|
: BaseAudioDevice(device), id(device.id), name(device.name), loop(nullptr), context(nullptr), core(nullptr),
|
||||||
input(nullptr), output(nullptr)
|
input(nullptr), output(nullptr), paramsHook{}
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -129,6 +130,7 @@ namespace ehs
|
|||||||
core = device.core;
|
core = device.core;
|
||||||
input = device.input;
|
input = device.input;
|
||||||
output = device.output;
|
output = device.output;
|
||||||
|
paramsHook = device.paramsHook;
|
||||||
|
|
||||||
device.id = 0;
|
device.id = 0;
|
||||||
device.loop = nullptr;
|
device.loop = nullptr;
|
||||||
@ -136,6 +138,7 @@ namespace ehs
|
|||||||
device.core = nullptr;
|
device.core = nullptr;
|
||||||
device.input = nullptr;
|
device.input = nullptr;
|
||||||
device.output = nullptr;
|
device.output = nullptr;
|
||||||
|
device.paramsHook = {};
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
@ -154,6 +157,7 @@ namespace ehs
|
|||||||
core = nullptr;
|
core = nullptr;
|
||||||
input = nullptr;
|
input = nullptr;
|
||||||
output = nullptr;
|
output = nullptr;
|
||||||
|
paramsHook = {};
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
@ -206,14 +210,18 @@ namespace ehs
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
pw_stream_connect(
|
SInt_32 err = pw_stream_connect(
|
||||||
output,
|
input,
|
||||||
PW_DIRECTION_INPUT,
|
PW_DIRECTION_INPUT,
|
||||||
id,
|
id,
|
||||||
(pw_stream_flags)(PW_STREAM_FLAG_AUTOCONNECT | PW_STREAM_FLAG_MAP_BUFFERS),
|
(pw_stream_flags)(PW_STREAM_FLAG_AUTOCONNECT | PW_STREAM_FLAG_MAP_BUFFERS),
|
||||||
pod,
|
pod,
|
||||||
1
|
1
|
||||||
);
|
);
|
||||||
|
if (err)
|
||||||
|
{
|
||||||
|
EHS_LOG_INT(LogType::ERR, 2, "Failed to connect input stream for audio device.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GetType() == AudioDeviceType::OUTPUT || GetType() == AudioDeviceType::ALL)
|
if (GetType() == AudioDeviceType::OUTPUT || GetType() == AudioDeviceType::ALL)
|
||||||
@ -225,7 +233,7 @@ namespace ehs
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
pw_stream_connect(
|
SInt_32 err = pw_stream_connect(
|
||||||
output,
|
output,
|
||||||
PW_DIRECTION_OUTPUT,
|
PW_DIRECTION_OUTPUT,
|
||||||
id,
|
id,
|
||||||
@ -233,6 +241,10 @@ namespace ehs
|
|||||||
pod,
|
pod,
|
||||||
1
|
1
|
||||||
);
|
);
|
||||||
|
if (err)
|
||||||
|
{
|
||||||
|
EHS_LOG_INT(LogType::ERR, 2, "Failed to connect output stream for audio device.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static constexpr pw_stream_events streamEvents = {
|
static constexpr pw_stream_events streamEvents = {
|
||||||
@ -240,8 +252,17 @@ namespace ehs
|
|||||||
.param_changed = OnParamChanged
|
.param_changed = OnParamChanged
|
||||||
};
|
};
|
||||||
|
|
||||||
spa_hook streamListener = {};
|
pw_stream_add_listener(output, ¶msHook, &streamEvents, this);
|
||||||
pw_stream_add_listener(output, &streamListener, &streamEvents, this);
|
|
||||||
|
while (pw_stream_get_state(output, nullptr) == PW_STREAM_STATE_CONNECTING)
|
||||||
|
{
|
||||||
|
SInt_32 err = pw_loop_iterate(loop, 0);
|
||||||
|
if (err < 0)
|
||||||
|
{
|
||||||
|
EHS_LOG_INT(LogType::ERR, 3, "Failed to update audio with error #" + Str_8::FromNum(err) + ".");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
EHS_LOG_SUCCESS();
|
EHS_LOG_SUCCESS();
|
||||||
}
|
}
|
||||||
@ -283,7 +304,15 @@ namespace ehs
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
pw_loop_iterate(loop, 0);
|
if (!data || !size)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
SInt_32 err = pw_loop_iterate(loop, 0);
|
||||||
|
if (err < 0)
|
||||||
|
{
|
||||||
|
EHS_LOG_INT(LogType::ERR, 1, "Failed to update audio with error #" + Str_8::FromNum(err) + ".");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (pw_stream_get_state(output, nullptr) != PW_STREAM_STATE_STREAMING)
|
if (pw_stream_get_state(output, nullptr) != PW_STREAM_STATE_STREAMING)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -108,7 +108,7 @@ namespace ehs
|
|||||||
if (!IsValid())
|
if (!IsValid())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
req.AddToHeader("Host", remoteHostName);
|
req.AddHeaderVar({"Host", remoteHostName});
|
||||||
|
|
||||||
SendStr(req.FormResult());
|
SendStr(req.FormResult());
|
||||||
}
|
}
|
||||||
@ -124,10 +124,10 @@ namespace ehs
|
|||||||
|
|
||||||
Response response(header);
|
Response response(header);
|
||||||
|
|
||||||
Str_8 encoding = response.GetHeader("Transfer-Encoding");
|
Str_8 encoding = response.GetHeaderValue("Transfer-Encoding");
|
||||||
if (!encoding.Size())
|
if (!encoding.Size())
|
||||||
{
|
{
|
||||||
int bodySize = response.GetHeader("content-length").ToDecimal<int>();
|
int bodySize = response.GetHeaderValue("content-length").ToDecimal<int>();
|
||||||
if (!bodySize)
|
if (!bodySize)
|
||||||
return response;
|
return response;
|
||||||
|
|
||||||
@ -163,10 +163,10 @@ namespace ehs
|
|||||||
if (request.GetVerb() == Verb::GET)
|
if (request.GetVerb() == Verb::GET)
|
||||||
return request;
|
return request;
|
||||||
|
|
||||||
Str_8 encoding = request.GetHeader("Transfer-Encoding");
|
Str_8 encoding = request.GetHeaderValue("Transfer-Encoding");
|
||||||
if (!encoding.Size())
|
if (!encoding.Size())
|
||||||
{
|
{
|
||||||
int bodySize = request.GetHeader("Content-Length").ToDecimal<int>();
|
int bodySize = request.GetHeaderValue("Content-Length").ToDecimal<int>();
|
||||||
if (!bodySize)
|
if (!bodySize)
|
||||||
return request;
|
return request;
|
||||||
|
|
||||||
|
96
src/io/socket/HeaderVar.cpp
Normal file
96
src/io/socket/HeaderVar.cpp
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
#include "ehs/io/socket/HeaderVar.h"
|
||||||
|
|
||||||
|
namespace ehs
|
||||||
|
{
|
||||||
|
HeaderVar::HeaderVar()
|
||||||
|
: id(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
HeaderVar::HeaderVar(Str_8 name, Str_8 value)
|
||||||
|
: id(name.Hash_64()), name((Str_8 &&)name), value((Str_8 &&)value)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
HeaderVar::HeaderVar(HeaderVar&& other) noexcept
|
||||||
|
: id(other.id), name((Str_8 &&)other.name), value((Str_8 &&)other.value)
|
||||||
|
{
|
||||||
|
other.id = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
HeaderVar::HeaderVar(const HeaderVar& other)
|
||||||
|
: id(other.id), name(other.name), value(other.value)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
HeaderVar& HeaderVar::operator=(HeaderVar&& other) noexcept
|
||||||
|
{
|
||||||
|
if (this == &other)
|
||||||
|
return *this;
|
||||||
|
|
||||||
|
id = other.id;
|
||||||
|
name = (Str_8 &&)other.name;
|
||||||
|
value = (Str_8 &&)other.value;
|
||||||
|
|
||||||
|
other.id = 0;
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
HeaderVar& HeaderVar::operator=(const HeaderVar& other)
|
||||||
|
{
|
||||||
|
if (this == &other)
|
||||||
|
return *this;
|
||||||
|
|
||||||
|
id = other.id;
|
||||||
|
name = other.name;
|
||||||
|
value = other.value;
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HeaderVar::operator==(const HeaderVar& other) const
|
||||||
|
{
|
||||||
|
return id == other.id;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HeaderVar::operator!=(const HeaderVar& other) const
|
||||||
|
{
|
||||||
|
return id != other.id;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HeaderVar::operator==(const UInt_64& otherId) const
|
||||||
|
{
|
||||||
|
return id == otherId;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HeaderVar::operator!=(const UInt_64& otherId) const
|
||||||
|
{
|
||||||
|
return id != otherId;
|
||||||
|
}
|
||||||
|
|
||||||
|
UInt_64 HeaderVar::GetId() const
|
||||||
|
{
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
Str_8 HeaderVar::GetName() const
|
||||||
|
{
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
Str_8 HeaderVar::GetValue() const
|
||||||
|
{
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void HeaderVar::SetValue(Str_8 value)
|
||||||
|
{
|
||||||
|
this->value = (Str_8 &&)value;
|
||||||
|
}
|
||||||
|
|
||||||
|
Str_8 HeaderVar::ToStr() const
|
||||||
|
{
|
||||||
|
return name + ": " + value;
|
||||||
|
}
|
||||||
|
}
|
96
src/io/socket/QueryVar.cpp
Normal file
96
src/io/socket/QueryVar.cpp
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
#include "ehs/io/socket/QueryVar.h"
|
||||||
|
|
||||||
|
namespace ehs
|
||||||
|
{
|
||||||
|
QueryVar::QueryVar()
|
||||||
|
: id(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
QueryVar::QueryVar(Str_8 name, Str_8 value)
|
||||||
|
: id(name.Hash_64()), name((Str_8 &&)name), value((Str_8 &&)value)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
QueryVar::QueryVar(QueryVar&& other) noexcept
|
||||||
|
: id(other.id), name((Str_8 &&)other.name), value((Str_8 &&)other.value)
|
||||||
|
{
|
||||||
|
other.id = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
QueryVar::QueryVar(const QueryVar& other)
|
||||||
|
: id(other.id), name(other.name), value(other.value)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
QueryVar& QueryVar::operator=(QueryVar&& other) noexcept
|
||||||
|
{
|
||||||
|
if (this == &other)
|
||||||
|
return *this;
|
||||||
|
|
||||||
|
id = other.id;
|
||||||
|
name = (Str_8 &&)other.name;
|
||||||
|
value = (Str_8 &&)other.value;
|
||||||
|
|
||||||
|
other.id = 0;
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
QueryVar& QueryVar::operator=(const QueryVar& other)
|
||||||
|
{
|
||||||
|
if (this == &other)
|
||||||
|
return *this;
|
||||||
|
|
||||||
|
id = other.id;
|
||||||
|
name = other.name;
|
||||||
|
value = other.value;
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QueryVar::operator==(const QueryVar& other) const
|
||||||
|
{
|
||||||
|
return id == other.id;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QueryVar::operator!=(const QueryVar& other) const
|
||||||
|
{
|
||||||
|
return id != other.id;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QueryVar::operator==(const UInt_64& otherId) const
|
||||||
|
{
|
||||||
|
return id == otherId;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QueryVar::operator!=(const UInt_64& otherId) const
|
||||||
|
{
|
||||||
|
return id != otherId;
|
||||||
|
}
|
||||||
|
|
||||||
|
UInt_64 QueryVar::GetId() const
|
||||||
|
{
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
Str_8 QueryVar::GetName() const
|
||||||
|
{
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
Str_8 QueryVar::GetValue() const
|
||||||
|
{
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void QueryVar::SetValue(Str_8 value)
|
||||||
|
{
|
||||||
|
this->value = (Str_8 &&)value;
|
||||||
|
}
|
||||||
|
|
||||||
|
Str_8 QueryVar::ToStr() const
|
||||||
|
{
|
||||||
|
return name + "=" + value;
|
||||||
|
}
|
||||||
|
}
|
@ -4,38 +4,70 @@
|
|||||||
namespace ehs
|
namespace ehs
|
||||||
{
|
{
|
||||||
Request::Request()
|
Request::Request()
|
||||||
: verb(Verb::GET), cType(ContentType::NONE)
|
: verb(Verb::POST), cType(ContentType::NONE)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
Request::Request(const Verb verb, const Str_8& rsrc)
|
Request::Request(const Verb &verb, Str_8 rsrc)
|
||||||
: verb(verb), rsrc(rsrc), cType(ContentType::NONE)
|
: verb(verb), rsrc((Str_8 &&)rsrc), cType(ContentType::NONE)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
Request::Request(const char* data, const UInt_64 size)
|
Request::Request(const char *data, const UInt_64 &size)
|
||||||
: verb(Verb::POST), cType(ContentType::NONE)
|
: verb(Verb::POST), cType(ContentType::NONE)
|
||||||
{
|
{
|
||||||
ReadData(Str_8(data, size));
|
ReadData(Str_8(data, size));
|
||||||
}
|
}
|
||||||
|
|
||||||
Request::Request(const Str_8& data)
|
Request::Request(const Str_8 &data)
|
||||||
: verb(Verb::POST), cType(ContentType::NONE)
|
: verb(Verb::POST), cType(ContentType::NONE)
|
||||||
{
|
{
|
||||||
ReadData(data);
|
ReadData(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
Request& Request::operator=(const Request &req)
|
Request::Request(Request&& other) noexcept
|
||||||
|
: verb(other.verb), rsrc((Str_8 &&)other.rsrc), queries((Vector<QueryVar> &&)other.queries),
|
||||||
|
header((Vector<HeaderVar> &&)other.header), cType(other.cType), body((Str_8 &&)other.body)
|
||||||
{
|
{
|
||||||
if (this == &req)
|
other.verb = Verb::POST;
|
||||||
|
other.cType = ContentType::NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
Request::Request(const Request& other)
|
||||||
|
: verb(other.verb), rsrc(other.rsrc), queries(other.queries), header(other.header), cType(other.cType),
|
||||||
|
body(other.body)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Request& Request::operator=(Request&& other) noexcept
|
||||||
|
{
|
||||||
|
if (this == &other)
|
||||||
|
return *this;
|
||||||
|
|
||||||
|
verb = other.verb;
|
||||||
|
rsrc = (Str_8 &&)other.rsrc;
|
||||||
|
queries = (Vector<QueryVar> &&)other.queries;
|
||||||
|
header = (Vector<HeaderVar> &&)other.header;
|
||||||
|
cType = other.cType;
|
||||||
|
body = (Str_8 &&)other.body;
|
||||||
|
|
||||||
|
other.verb = Verb::POST;
|
||||||
|
other.cType = ContentType::NONE;
|
||||||
|
|
||||||
|
return* this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Request& Request::operator=(const Request &other)
|
||||||
|
{
|
||||||
|
if (this == &other)
|
||||||
return *this;
|
return *this;
|
||||||
|
|
||||||
verb = req.verb;
|
verb = other.verb;
|
||||||
rsrc = req.rsrc;
|
rsrc = other.rsrc;
|
||||||
queries = req.queries;
|
queries = other.queries;
|
||||||
header = req.header;
|
header = other.header;
|
||||||
cType = req.cType;
|
cType = other.cType;
|
||||||
body = req.body;
|
body = other.body;
|
||||||
|
|
||||||
return* this;
|
return* this;
|
||||||
}
|
}
|
||||||
@ -45,7 +77,7 @@ namespace ehs
|
|||||||
return verb;
|
return verb;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Request::SetContentType(const ContentType cType)
|
void Request::SetContentType(const ContentType &cType)
|
||||||
{
|
{
|
||||||
if (body.Size())
|
if (body.Size())
|
||||||
body.Resize(0);
|
body.Resize(0);
|
||||||
@ -58,9 +90,9 @@ namespace ehs
|
|||||||
return cType;
|
return cType;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Request::SetResource(const Str_8& rsrc)
|
void Request::SetResource(Str_8 rsrc)
|
||||||
{
|
{
|
||||||
this->rsrc = rsrc;
|
this->rsrc = (Str_8 &&)rsrc;
|
||||||
}
|
}
|
||||||
|
|
||||||
Str_8 Request::GetResource() const
|
Str_8 Request::GetResource() const
|
||||||
@ -68,69 +100,179 @@ namespace ehs
|
|||||||
return rsrc;
|
return rsrc;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Request::AddQuery(const Str_8& var, const Str_8& value)
|
bool Request::HasQueryVar(const UInt_64& id) const
|
||||||
{
|
{
|
||||||
queries.Push(var + "=" + value);
|
for (UInt_64 i = 0; i < queries.Size(); ++i)
|
||||||
|
if (queries[i] == id)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Str_8 Request::GetQuery(const Str_8& var)
|
bool Request::HasQueryVar(const Str_8& name) const
|
||||||
|
{
|
||||||
|
return HasQueryVar(name.Hash_64());
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Request::AddQueryVar(QueryVar var)
|
||||||
|
{
|
||||||
|
if (HasQueryVar(var.GetId()))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
queries.Push((QueryVar &&)var);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Request::RemoveQueryVar(const UInt_64& id)
|
||||||
{
|
{
|
||||||
for (UInt_64 i = 0; i < queries.Size(); ++i)
|
for (UInt_64 i = 0; i < queries.Size(); ++i)
|
||||||
{
|
{
|
||||||
Vector<Str_8> data = queries[i].Split("=");
|
if (queries[i] != id)
|
||||||
|
continue;
|
||||||
|
|
||||||
if (data[0] == var)
|
queries.Swap(i, queries.End());
|
||||||
return data[1];
|
queries.Pop();
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return "";
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector<Str_8> Request::GetQueries() const
|
bool Request::RemoveQueryVar(const Str_8& name)
|
||||||
|
{
|
||||||
|
return RemoveQueryVar(name.Hash_64());
|
||||||
|
}
|
||||||
|
|
||||||
|
QueryVar *Request::GetQueryVar(const UInt_64& id) const
|
||||||
|
{
|
||||||
|
for (UInt_64 i = 0; i < queries.Size(); ++i)
|
||||||
|
if (queries[i] == id)
|
||||||
|
return &queries[i];
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
QueryVar *Request::GetQueryVar(const Str_8& name) const
|
||||||
|
{
|
||||||
|
return GetQueryVar(name.Hash_64());
|
||||||
|
}
|
||||||
|
|
||||||
|
Str_8 Request::GetQueryValue(const UInt_64& id) const
|
||||||
|
{
|
||||||
|
for (UInt_64 i = 0; i < queries.Size(); ++i)
|
||||||
|
if (queries[i] == id)
|
||||||
|
return queries[i].GetValue();
|
||||||
|
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
Str_8 Request::GetQueryValue(const Str_8& name) const
|
||||||
|
{
|
||||||
|
return GetQueryValue(name.Hash_64());
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector<QueryVar> Request::GetQueries() const
|
||||||
{
|
{
|
||||||
return queries;
|
return queries;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Request::BasicAuth(const Str_8& id, const Str_8& secret)
|
void Request::BasicAuth(const Str_8& id, const Str_8& secret)
|
||||||
{
|
{
|
||||||
AddToHeader("Authorization", Str_8("Basic ") + Base64::Encode(id + ":" + secret));
|
AddHeaderVar({"Authorization", Str_8("Basic ") + Base64::Encode(id + ":" + secret)});
|
||||||
}
|
}
|
||||||
|
|
||||||
void Request::BearerAuth(const Str_8& token)
|
void Request::BearerAuth(const Str_8& token)
|
||||||
{
|
{
|
||||||
AddToHeader("Authorization", "Bearer " + token);
|
AddHeaderVar({"Authorization", "Bearer " + token});
|
||||||
}
|
}
|
||||||
|
|
||||||
void Request::BearerAuth(const Str_8& token, const Str_8& clientId)
|
void Request::BearerAuth(const Str_8& token, const Str_8& clientId)
|
||||||
{
|
{
|
||||||
AddToHeader("Authorization", "Bearer " + token);
|
AddHeaderVar({"Authorization", "Bearer " + token});
|
||||||
AddToHeader("Client-Id", clientId);
|
AddHeaderVar({"Client-Id", clientId});
|
||||||
}
|
}
|
||||||
|
|
||||||
void Request::BotAuth(const Str_8& token)
|
void Request::BotAuth(const Str_8& token)
|
||||||
{
|
{
|
||||||
AddToHeader("Authorization", "Bot " + token);
|
AddHeaderVar({"Authorization", "Bot " + token});
|
||||||
}
|
}
|
||||||
|
|
||||||
void Request::AddToHeader(const Str_8& var, const Str_8& value)
|
bool Request::HasHeaderVar(const UInt_64& id) const
|
||||||
{
|
{
|
||||||
header.Push(var + ": " + value);
|
for (UInt_64 i = 0; i < header.Size(); ++i)
|
||||||
|
if (header[i] == id)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Str_8 Request::GetHeader(const Str_8& var) const
|
bool Request::HasHeaderVar(const Str_8& name) const
|
||||||
|
{
|
||||||
|
return HasHeaderVar(name.Hash_64());
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Request::AddHeaderVar(HeaderVar var)
|
||||||
|
{
|
||||||
|
if (HasHeaderVar(var.GetId()))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
header.Push((HeaderVar &&)var);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Request::RemoveHeaderVar(const UInt_64 &id)
|
||||||
{
|
{
|
||||||
for (UInt_64 i = 0; i < header.Size(); ++i)
|
for (UInt_64 i = 0; i < header.Size(); ++i)
|
||||||
{
|
{
|
||||||
Vector<Str_8> data = header[i].Split(": ");
|
if (header[i] != id)
|
||||||
|
continue;
|
||||||
|
|
||||||
if (data[0] == var)
|
header.Swap(i, header.End());
|
||||||
return data[1];
|
header.Pop();
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return "";
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector<Str_8> Request::GetHeader() const
|
bool Request::RemoveHeaderVar(const Str_8 &name)
|
||||||
|
{
|
||||||
|
return RemoveHeaderVar(name.Hash_64());
|
||||||
|
}
|
||||||
|
|
||||||
|
HeaderVar *Request::GetHeaderVar(const UInt_64 &id) const
|
||||||
|
{
|
||||||
|
for (UInt_64 i = 0; i < header.Size(); ++i)
|
||||||
|
if (header[i] == id)
|
||||||
|
return &header[i];
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
HeaderVar *Request::GetHeaderVar(const Str_8 &name) const
|
||||||
|
{
|
||||||
|
return GetHeaderVar(name.Hash_64());
|
||||||
|
}
|
||||||
|
|
||||||
|
Str_8 Request::GetHeaderValue(const UInt_64 &id) const
|
||||||
|
{
|
||||||
|
for (UInt_64 i = 0; i < header.Size(); ++i)
|
||||||
|
if (header[i] == id)
|
||||||
|
return header[i].GetValue();
|
||||||
|
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
Str_8 Request::GetHeaderValue(const Str_8 &name) const
|
||||||
|
{
|
||||||
|
return GetHeaderValue(name.Hash_64());
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector<HeaderVar> Request::GetHeader() const
|
||||||
{
|
{
|
||||||
return header;
|
return header;
|
||||||
}
|
}
|
||||||
@ -200,16 +342,20 @@ namespace ehs
|
|||||||
Str_8 result = VerbToStr(verb) + " " + rsrc;
|
Str_8 result = VerbToStr(verb) + " " + rsrc;
|
||||||
|
|
||||||
if (queries.Size())
|
if (queries.Size())
|
||||||
result += "?" + queries[0];
|
result += "?" + queries[0].ToStr();
|
||||||
|
|
||||||
for (UInt_64 i = 1; i < queries.Size(); ++i)
|
for (UInt_64 i = 1; i < queries.Size(); ++i)
|
||||||
result += "&" + queries[i];
|
result += "&" + queries[i].ToStr();
|
||||||
|
|
||||||
result += " HTTP/1.1\r\n";
|
result += " HTTP/1.1\r\n";
|
||||||
|
|
||||||
for (UInt_64 i = 0; i < header.Size(); ++i)
|
for (UInt_64 i = 0; i < header.Size(); ++i)
|
||||||
{
|
{
|
||||||
result += header[i] + "\r\n";
|
if (header[i] == 11245195881701120957ull || header[i] == 6556302699635904946ull ||
|
||||||
|
header[i] == 13347276190653935221ull) // Content-Length, Server, and Content-Type in order from left to right.
|
||||||
|
continue;
|
||||||
|
|
||||||
|
result += header[i].ToStr() + "\r\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
result += "Content-Type: " + ContentTypeToStr(cType) + "\r\n";
|
result += "Content-Type: " + ContentTypeToStr(cType) + "\r\n";
|
||||||
@ -227,7 +373,7 @@ namespace ehs
|
|||||||
return rsrc.Size() || queries.Size() || header.Size() || body.Size();
|
return rsrc.Size() || queries.Size() || header.Size() || body.Size();
|
||||||
}
|
}
|
||||||
|
|
||||||
Str_8 Request::VerbToStr(const Verb verb)
|
Str_8 Request::VerbToStr(const Verb &verb)
|
||||||
{
|
{
|
||||||
switch (verb)
|
switch (verb)
|
||||||
{
|
{
|
||||||
@ -244,7 +390,7 @@ namespace ehs
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Str_8 Request::ContentTypeToStr(const ContentType cType)
|
Str_8 Request::ContentTypeToStr(const ContentType &cType)
|
||||||
{
|
{
|
||||||
switch (cType)
|
switch (cType)
|
||||||
{
|
{
|
||||||
@ -262,14 +408,18 @@ namespace ehs
|
|||||||
return "text/plain";
|
return "text/plain";
|
||||||
case ContentType::TEXT_HTML:
|
case ContentType::TEXT_HTML:
|
||||||
return "text/html";
|
return "text/html";
|
||||||
|
case ContentType::TEXT_CSS:
|
||||||
|
return "text/css";
|
||||||
case ContentType::TEXT_XML:
|
case ContentType::TEXT_XML:
|
||||||
return "text/xml";
|
return "text/xml";
|
||||||
|
case ContentType::IMG_X_ICON:
|
||||||
|
return "image/x-icon";
|
||||||
default:
|
default:
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ContentType Request::StrToContentType(const Str_8& value)
|
ContentType Request::StrToContentType(const Str_8 &value)
|
||||||
{
|
{
|
||||||
if (value == "multipart/form-data")
|
if (value == "multipart/form-data")
|
||||||
return ContentType::APP_MULTIPART_FORMDATA;
|
return ContentType::APP_MULTIPART_FORMDATA;
|
||||||
@ -285,13 +435,17 @@ namespace ehs
|
|||||||
return ContentType::TEXT_PLAIN;
|
return ContentType::TEXT_PLAIN;
|
||||||
else if (value == "text/html")
|
else if (value == "text/html")
|
||||||
return ContentType::TEXT_HTML;
|
return ContentType::TEXT_HTML;
|
||||||
|
else if (value == "text/css")
|
||||||
|
return ContentType::TEXT_CSS;
|
||||||
else if (value == "text/xml")
|
else if (value == "text/xml")
|
||||||
return ContentType::TEXT_XML;
|
return ContentType::TEXT_XML;
|
||||||
|
else if (value == "image/x-icon")
|
||||||
|
return ContentType::IMG_X_ICON;
|
||||||
else
|
else
|
||||||
return ContentType::NONE;
|
return ContentType::NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Request::ReadData(const Str_8& data)
|
void Request::ReadData(const Str_8 &data)
|
||||||
{
|
{
|
||||||
Vector<Str_8> lines = data.Split("\r\n");
|
Vector<Str_8> lines = data.Split("\r\n");
|
||||||
Vector<Str_8> meta = lines[0].Split(" ");
|
Vector<Str_8> meta = lines[0].Split(" ");
|
||||||
@ -308,7 +462,14 @@ namespace ehs
|
|||||||
{
|
{
|
||||||
rsrc = meta[1].Sub(0, queryIndex);
|
rsrc = meta[1].Sub(0, queryIndex);
|
||||||
cType = ContentType::APP_FORMURLENCODED;
|
cType = ContentType::APP_FORMURLENCODED;
|
||||||
queries = meta[1].Sub(queryIndex + 1).Split("&");
|
|
||||||
|
Vector<Str_8> strQueries = meta[1].Sub(queryIndex + 1).Split("&");
|
||||||
|
for (UInt_64 i = 0; i < strQueries.Size(); ++i)
|
||||||
|
{
|
||||||
|
const Vector<Str_8> queryVar = strQueries[i].Split("=");
|
||||||
|
|
||||||
|
queries.Push({queryVar[0], queryVar[1]});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -331,7 +492,9 @@ namespace ehs
|
|||||||
if (var[0] == "Content-Length")
|
if (var[0] == "Content-Length")
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
header.Push(lines[i]);
|
Vector<Str_8> headerVar = lines[i].Split(": ");
|
||||||
|
|
||||||
|
header.Push({headerVar[0], headerVar[1]});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -2,43 +2,73 @@
|
|||||||
|
|
||||||
namespace ehs
|
namespace ehs
|
||||||
{
|
{
|
||||||
Response::Response(const UInt_32 code, const Str_8& server)
|
|
||||||
: code(code), server(server), cType(ContentType::NONE)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
Response::Response(const char* data, const UInt_64 size)
|
|
||||||
: code(0), cType(ContentType::NONE)
|
|
||||||
{
|
|
||||||
ReadData(Str_8(data, size));
|
|
||||||
}
|
|
||||||
|
|
||||||
Response::Response(const Str_8& data)
|
|
||||||
: code(0), cType(ContentType::NONE)
|
|
||||||
{
|
|
||||||
ReadData(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
Response::Response()
|
Response::Response()
|
||||||
: code(0), cType(ContentType::NONE)
|
: code(0), cType(ContentType::NONE)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
Response& Response::operator=(const Response& res)
|
Response::Response(const UInt_32 &code, Str_8 server)
|
||||||
|
: code(code), server((Str_8 &&)server), cType(ContentType::NONE)
|
||||||
{
|
{
|
||||||
if (this == &res)
|
}
|
||||||
return *this;
|
|
||||||
|
|
||||||
code = res.code;
|
Response::Response(const char *data, const UInt_64 &size)
|
||||||
server = res.server;
|
: code(0), cType(ContentType::NONE)
|
||||||
cType = res.cType;
|
{
|
||||||
header = res.header;
|
ReadData(Str_8(data, size));
|
||||||
body = res.body;
|
}
|
||||||
|
|
||||||
|
Response::Response(const Str_8 &data)
|
||||||
|
: code(0), cType(ContentType::NONE)
|
||||||
|
{
|
||||||
|
ReadData(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
Response::Response(Response&& other) noexcept
|
||||||
|
: code(other.code), server((Str_8 &&)other.server), cType(other.cType), header((Vector<HeaderVar> &&)other.header),
|
||||||
|
body((Str_8 &&)other.body)
|
||||||
|
{
|
||||||
|
other.code = 0;
|
||||||
|
other.cType = ContentType::NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
Response::Response(const Response &other)
|
||||||
|
: code(other.code), server(other.server), cType(other.cType), header(other.header), body(other.body)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Response& Response::operator=(Response&& other) noexcept
|
||||||
|
{
|
||||||
|
if (this == &other)
|
||||||
|
return *this;
|
||||||
|
|
||||||
|
code = other.code;
|
||||||
|
server = (Str_8 &&)other.server;
|
||||||
|
cType = other.cType;
|
||||||
|
header = (Vector<HeaderVar> &&)other.header;
|
||||||
|
body = (Str_8 &&)other.body;
|
||||||
|
|
||||||
|
other.code = 0;
|
||||||
|
other.cType = ContentType::NONE;
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Response::SetCode(const UInt_32 code)
|
Response& Response::operator=(const Response& other)
|
||||||
|
{
|
||||||
|
if (this == &other)
|
||||||
|
return *this;
|
||||||
|
|
||||||
|
code = other.code;
|
||||||
|
server = other.server;
|
||||||
|
cType = other.cType;
|
||||||
|
header = other.header;
|
||||||
|
body = other.body;
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Response::SetCode(const UInt_32 &code)
|
||||||
{
|
{
|
||||||
this->code = code;
|
this->code = code;
|
||||||
}
|
}
|
||||||
@ -48,9 +78,9 @@ namespace ehs
|
|||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Response::SetServer(const Str_8& server)
|
void Response::SetServer(Str_8 server)
|
||||||
{
|
{
|
||||||
this->server = server;
|
this->server = (Str_8 &&)server;
|
||||||
}
|
}
|
||||||
|
|
||||||
Str_8 Response::GetServer() const
|
Str_8 Response::GetServer() const
|
||||||
@ -58,7 +88,7 @@ namespace ehs
|
|||||||
return server;
|
return server;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Response::SetContentType(const ContentType cType)
|
void Response::SetContentType(const ContentType &cType)
|
||||||
{
|
{
|
||||||
this->cType = cType;
|
this->cType = cType;
|
||||||
}
|
}
|
||||||
@ -68,27 +98,80 @@ namespace ehs
|
|||||||
return cType;
|
return cType;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Response::AddToHeader(const Str_8& var, const Str_8& value)
|
bool Response::HasHeaderVar(const UInt_64& id) const
|
||||||
{
|
{
|
||||||
header.Push(var + ": " + value);
|
for (UInt_64 i = 0; i < header.Size(); ++i)
|
||||||
|
if (header[i] == id)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Str_8 Response::GetHeader(const Str_8& var) const
|
bool Response::HasHeaderVar(const Str_8& name) const
|
||||||
{
|
{
|
||||||
Str_8 lIdentity = var.GetLower();
|
return HasHeaderVar(name.Hash_64());
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Response::AddHeaderVar(HeaderVar var)
|
||||||
|
{
|
||||||
|
if (HasHeaderVar(var.GetId()))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
header.Push((HeaderVar &&)var);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Response::RemoveHeaderVar(const UInt_64& id)
|
||||||
|
{
|
||||||
for (UInt_64 i = 0; i < header.Size(); ++i)
|
for (UInt_64 i = 0; i < header.Size(); ++i)
|
||||||
{
|
{
|
||||||
Vector<Str_8> data = header[i].Split(": ");
|
if (header[i] != id)
|
||||||
|
continue;
|
||||||
|
|
||||||
if (data[0].GetLower() == lIdentity)
|
header.Swap(i, header.End());
|
||||||
return data[1];
|
header.Pop();
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return "";
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector<Str_8> Response::GetHeader() const
|
bool Response::RemoveHeaderVar(const Str_8& name)
|
||||||
|
{
|
||||||
|
return RemoveHeaderVar(name.Hash_64());
|
||||||
|
}
|
||||||
|
|
||||||
|
HeaderVar* Response::GetHeaderVar(const UInt_64 &id) const
|
||||||
|
{
|
||||||
|
for (UInt_64 i = 0; i < header.Size(); ++i)
|
||||||
|
if (header[i] == id)
|
||||||
|
return &header[i];
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
HeaderVar *Response::GetHeaderVar(const Str_8 &name) const
|
||||||
|
{
|
||||||
|
return GetHeaderVar(name.Hash_64());
|
||||||
|
}
|
||||||
|
|
||||||
|
Str_8 Response::GetHeaderValue(const UInt_64& id) const
|
||||||
|
{
|
||||||
|
for (UInt_64 i = 0; i < header.Size(); ++i)
|
||||||
|
if (header[i] == id)
|
||||||
|
return header[i].GetValue();
|
||||||
|
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
Str_8 Response::GetHeaderValue(const Str_8& name) const
|
||||||
|
{
|
||||||
|
return GetHeaderValue(name.Hash_64());
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector<HeaderVar> Response::GetHeader() const
|
||||||
{
|
{
|
||||||
return header;
|
return header;
|
||||||
}
|
}
|
||||||
@ -159,14 +242,11 @@ namespace ehs
|
|||||||
|
|
||||||
for (UInt_64 i = 0; i < header.Size(); ++i)
|
for (UInt_64 i = 0; i < header.Size(); ++i)
|
||||||
{
|
{
|
||||||
if (header[i].Find("Content-Length", nullptr, SearchPattern::LEFT_RIGHT, IndexResult::ENDING))
|
if (header[i] == 11245195881701120957ull || header[i] == 6556302699635904946ull ||
|
||||||
continue;
|
header[i] == 13347276190653935221ull) // Content-Length, Server, and Content-Type in order from left to right.
|
||||||
else if (header[i].Find("Server", nullptr, SearchPattern::LEFT_RIGHT, IndexResult::ENDING))
|
|
||||||
continue;
|
|
||||||
else if (header[i].Find("Content-Type", nullptr, SearchPattern::LEFT_RIGHT, IndexResult::ENDING))
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
result += header[i] + "\r\n";
|
result += header[i].ToStr() + "\r\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
result += "Content-Type: " + ContentTypeToStr(cType) + "\r\nContent-Length: " + Str_8::FromNum(body.Size()) + "\r\n\r\n" + body;
|
result += "Content-Type: " + ContentTypeToStr(cType) + "\r\nContent-Length: " + Str_8::FromNum(body.Size()) + "\r\n\r\n" + body;
|
||||||
@ -179,7 +259,7 @@ namespace ehs
|
|||||||
return server.Size() || header.Size() || body.Size();
|
return server.Size() || header.Size() || body.Size();
|
||||||
}
|
}
|
||||||
|
|
||||||
Str_8 Response::CodeToStr(const UInt_32 code)
|
Str_8 Response::CodeToStr(const UInt_32 &code)
|
||||||
{
|
{
|
||||||
if (code == 100)
|
if (code == 100)
|
||||||
return "Continue";
|
return "Continue";
|
||||||
@ -323,7 +403,7 @@ namespace ehs
|
|||||||
return "Unused Status Code";
|
return "Unused Status Code";
|
||||||
}
|
}
|
||||||
|
|
||||||
Str_8 Response::ContentTypeToStr(const ContentType cType)
|
Str_8 Response::ContentTypeToStr(const ContentType &cType)
|
||||||
{
|
{
|
||||||
switch (cType)
|
switch (cType)
|
||||||
{
|
{
|
||||||
@ -341,14 +421,18 @@ namespace ehs
|
|||||||
return "text/plain";
|
return "text/plain";
|
||||||
case ContentType::TEXT_HTML:
|
case ContentType::TEXT_HTML:
|
||||||
return "text/html";
|
return "text/html";
|
||||||
|
case ContentType::TEXT_CSS:
|
||||||
|
return "text/css";
|
||||||
case ContentType::TEXT_XML:
|
case ContentType::TEXT_XML:
|
||||||
return "text/xml";
|
return "text/xml";
|
||||||
|
case ContentType::IMG_X_ICON:
|
||||||
|
return "image/x-icon";
|
||||||
default:
|
default:
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ContentType Response::StrToContentType(const Str_8& value)
|
ContentType Response::StrToContentType(const Str_8 &value)
|
||||||
{
|
{
|
||||||
if (value == "multipart/form-data")
|
if (value == "multipart/form-data")
|
||||||
return ContentType::APP_MULTIPART_FORMDATA;
|
return ContentType::APP_MULTIPART_FORMDATA;
|
||||||
@ -364,13 +448,17 @@ namespace ehs
|
|||||||
return ContentType::TEXT_PLAIN;
|
return ContentType::TEXT_PLAIN;
|
||||||
else if (value == "text/html")
|
else if (value == "text/html")
|
||||||
return ContentType::TEXT_HTML;
|
return ContentType::TEXT_HTML;
|
||||||
|
else if (value == "text/css")
|
||||||
|
return ContentType::TEXT_CSS;
|
||||||
else if (value == "text/xml")
|
else if (value == "text/xml")
|
||||||
return ContentType::TEXT_XML;
|
return ContentType::TEXT_XML;
|
||||||
|
else if (value == "image/x-icon")
|
||||||
|
return ContentType::IMG_X_ICON;
|
||||||
else
|
else
|
||||||
return ContentType::NONE;
|
return ContentType::NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Response::ReadData(const Str_8& data)
|
void Response::ReadData(const Str_8 &data)
|
||||||
{
|
{
|
||||||
Vector<Str_8> lines = data.Split("\r\n");
|
Vector<Str_8> lines = data.Split("\r\n");
|
||||||
Vector<Str_8> meta = lines[0].Split(" ");
|
Vector<Str_8> meta = lines[0].Split(" ");
|
||||||
@ -384,12 +472,12 @@ namespace ehs
|
|||||||
|
|
||||||
Vector<Str_8> var = lines[i].Split(": ");
|
Vector<Str_8> var = lines[i].Split(": ");
|
||||||
|
|
||||||
if (var[0].GetLower() == "server")
|
if (var[0] == "Server")
|
||||||
{
|
{
|
||||||
server = var[1];
|
server = var[1];
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else if (var[0].GetLower() == "content-type")
|
else if (var[0] == "Content-Type")
|
||||||
{
|
{
|
||||||
Vector<Str_8> ctData = var[1].Split(";");
|
Vector<Str_8> ctData = var[1].Split(";");
|
||||||
|
|
||||||
@ -397,7 +485,9 @@ namespace ehs
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
header.Push(lines[i]);
|
Vector<Str_8> headerVar = lines[i].Split(": ");
|
||||||
|
|
||||||
|
header.Push({headerVar[0], headerVar[1]});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -4,6 +4,8 @@
|
|||||||
#include <openssl/bio.h>
|
#include <openssl/bio.h>
|
||||||
#include <openssl/err.h>
|
#include <openssl/err.h>
|
||||||
#include <openssl/pem.h>
|
#include <openssl/pem.h>
|
||||||
|
#include <openssl/opensslv.h>
|
||||||
|
#include <openssl/provider.h>
|
||||||
|
|
||||||
namespace ehs
|
namespace ehs
|
||||||
{
|
{
|
||||||
@ -12,6 +14,11 @@ namespace ehs
|
|||||||
if (!IsValid())
|
if (!IsValid())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
EVP_PKEY_free(pkey);
|
||||||
|
|
||||||
|
X509_free(cert);
|
||||||
|
|
||||||
|
|
||||||
if (sslHdl)
|
if (sslHdl)
|
||||||
{
|
{
|
||||||
if (connection)
|
if (connection)
|
||||||
@ -25,28 +32,28 @@ namespace ehs
|
|||||||
}
|
}
|
||||||
|
|
||||||
SSL::SSL()
|
SSL::SSL()
|
||||||
: ctx(nullptr), sslHdl(nullptr)
|
: server(false), ctx(nullptr), sslHdl(nullptr), cert(nullptr), pkey(nullptr)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
SSL::SSL(const IP type)
|
SSL::SSL(const IP &type, const bool &server)
|
||||||
: TCP(type), ctx(nullptr), sslHdl(nullptr)
|
: TCP(type), server(server), ctx(nullptr), sslHdl(nullptr), cert(nullptr), pkey(nullptr)
|
||||||
{
|
{
|
||||||
SSL::Initialize();
|
SSL::Initialize();
|
||||||
}
|
}
|
||||||
|
|
||||||
SSL::SSL(TCP&& tcp) noexcept
|
SSL::SSL(TCP&& tcp) noexcept
|
||||||
: TCP(std::move(tcp)), ctx(nullptr), sslHdl(nullptr)
|
: TCP(std::move(tcp)), server(false), ctx(nullptr), sslHdl(nullptr), cert(nullptr), pkey(nullptr)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
SSL::SSL(const TCP& tcp)
|
SSL::SSL(const TCP& tcp)
|
||||||
: TCP(tcp), ctx(nullptr), sslHdl(nullptr)
|
: TCP(tcp), server(false), ctx(nullptr), sslHdl(nullptr), cert(nullptr), pkey(nullptr)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
SSL::SSL(const SSL& ssl)
|
SSL::SSL(const SSL& ssl)
|
||||||
: TCP(ssl), ctx(nullptr), sslHdl(nullptr)
|
: TCP(ssl), server(ssl.server), ctx(nullptr), sslHdl(nullptr), cert(nullptr), pkey(nullptr)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -57,8 +64,11 @@ namespace ehs
|
|||||||
|
|
||||||
TCP::operator=(ssl);
|
TCP::operator=(ssl);
|
||||||
|
|
||||||
|
server = ssl.server;
|
||||||
ctx = nullptr;
|
ctx = nullptr;
|
||||||
sslHdl = nullptr;
|
sslHdl = nullptr;
|
||||||
|
cert = nullptr;
|
||||||
|
pkey = nullptr;
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
@ -71,6 +81,40 @@ namespace ehs
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
SSL_library_init();
|
SSL_library_init();
|
||||||
|
OpenSSL_add_ssl_algorithms();
|
||||||
|
SSL_load_error_strings();
|
||||||
|
OPENSSL_init_ssl(OPENSSL_INIT_LOAD_CONFIG, nullptr);
|
||||||
|
OSSL_PROVIDER_load(nullptr, "default");
|
||||||
|
|
||||||
|
SSL_CTX_set_min_proto_version(ctx, TLS1_2_VERSION);
|
||||||
|
|
||||||
|
if (server)
|
||||||
|
{
|
||||||
|
ctx = SSL_CTX_new(TLS_server_method());
|
||||||
|
if (!ctx)
|
||||||
|
{
|
||||||
|
UInt_32 code = ERR_get_error();
|
||||||
|
EHS_LOG_INT(LogType::ERR, 0, ERR_error_string(code, nullptr));
|
||||||
|
}
|
||||||
|
|
||||||
|
SSL_CTX_set_cipher_list(ctx, "HIGH:!aNULL:!MD5");
|
||||||
|
SSL_CTX_set_ciphersuites(ctx,
|
||||||
|
"TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256:"
|
||||||
|
"TLS_CHACHA20_POLY1305_SHA256:ECDHE-RSA-AES128-GCM-SHA256"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ctx = SSL_CTX_new(TLS_client_method());
|
||||||
|
if (!ctx)
|
||||||
|
{
|
||||||
|
UInt_32 code = ERR_get_error();
|
||||||
|
EHS_LOG_INT(LogType::ERR, 0, ERR_error_string(code, nullptr));
|
||||||
|
}
|
||||||
|
|
||||||
|
SSL_CTX_set_default_verify_paths(ctx);
|
||||||
|
SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, nullptr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SSL::Release()
|
void SSL::Release()
|
||||||
@ -80,6 +124,12 @@ namespace ehs
|
|||||||
if (!IsValid())
|
if (!IsValid())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
EVP_PKEY_free(pkey);
|
||||||
|
pkey = nullptr;
|
||||||
|
|
||||||
|
X509_free(cert);
|
||||||
|
cert = nullptr;
|
||||||
|
|
||||||
if (sslHdl)
|
if (sslHdl)
|
||||||
{
|
{
|
||||||
if (connection)
|
if (connection)
|
||||||
@ -97,34 +147,37 @@ namespace ehs
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SSL::Bind(const Str_8& address, unsigned short port)
|
void SSL::Listen()
|
||||||
{
|
{
|
||||||
if (bound)
|
sslHdl = SSL_new(ctx);
|
||||||
return;
|
SSL_set_fd(sslHdl, hdl);
|
||||||
|
|
||||||
OpenSSL_add_all_algorithms();
|
TCP::Listen();
|
||||||
SSL_load_error_strings();
|
|
||||||
ctx = SSL_CTX_new(SSLv23_server_method());
|
|
||||||
|
|
||||||
sslHdl = SSL_new(ctx);
|
EHS_LOG_SUCCESS();
|
||||||
SSL_set_fd(sslHdl, hdl);
|
|
||||||
|
|
||||||
TCP::Bind(address, port);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SSL* SSL::Accept()
|
SSL* SSL::Accept()
|
||||||
{
|
{
|
||||||
if (!bound)
|
if (!bound)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
TCP* tcp = TCP::Accept();
|
TCP* tcp = TCP::Accept();
|
||||||
|
if (!tcp)
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
SSL* client = new SSL(std::move(*tcp));
|
SSL* client = new SSL(std::move(*tcp));
|
||||||
|
|
||||||
delete tcp;
|
delete tcp;
|
||||||
|
|
||||||
client->ctx = nullptr;
|
client->sslHdl = SSL_new(this->ctx);
|
||||||
client->sslHdl = SSL_new(ctx);
|
if (!client->sslHdl)
|
||||||
|
{
|
||||||
|
UInt_32 code = ERR_get_error();
|
||||||
|
EHS_LOG_INT(LogType::ERR, 0, ERR_error_string(code, nullptr));
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
SSL_set_fd(client->sslHdl, client->hdl);
|
SSL_set_fd(client->sslHdl, client->hdl);
|
||||||
|
|
||||||
int err = SSL_accept(client->sslHdl);
|
int err = SSL_accept(client->sslHdl);
|
||||||
@ -134,21 +187,29 @@ namespace ehs
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EHS_LOG_SUCCESS();
|
||||||
|
|
||||||
return client;
|
return client;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SSL::Connect(const Str_8& address, const UInt_16 port)
|
void SSL::Connect(Str_8 address, const UInt_16 &port)
|
||||||
{
|
{
|
||||||
if (bound)
|
|
||||||
return;
|
|
||||||
|
|
||||||
TCP::Connect(address, port);
|
TCP::Connect(address, port);
|
||||||
OpenSSL_add_all_algorithms();
|
|
||||||
SSL_load_error_strings();
|
|
||||||
ctx = SSL_CTX_new(SSLv23_client_method());
|
|
||||||
sslHdl = SSL_new(ctx);
|
sslHdl = SSL_new(ctx);
|
||||||
SSL_set_fd(sslHdl, hdl);
|
SSL_set_fd(sslHdl, hdl);
|
||||||
SSL_connect(sslHdl);
|
|
||||||
|
SSL_set_tlsext_host_name(sslHdl, &address[0]);
|
||||||
|
|
||||||
|
SInt_32 rc = SSL_connect(sslHdl);
|
||||||
|
if (rc != 1)
|
||||||
|
{
|
||||||
|
EHS_LOG_INT(LogType::ERR, 1, "Failed to connect with error #" + Str_8::FromNum(SSL_get_error(sslHdl, rc)) + ".");
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
EHS_LOG_SUCCESS();
|
||||||
}
|
}
|
||||||
|
|
||||||
UInt_64 SSL::Send(const Byte* const buffer, const UInt_32 size)
|
UInt_64 SSL::Send(const Byte* const buffer, const UInt_32 size)
|
||||||
@ -157,8 +218,12 @@ namespace ehs
|
|||||||
if (written <= 0)
|
if (written <= 0)
|
||||||
{
|
{
|
||||||
int code = SSL_get_error(sslHdl, written);
|
int code = SSL_get_error(sslHdl, written);
|
||||||
ERR_print_errors_fp(stderr);
|
if (code != SSL_ERROR_WANT_WRITE)
|
||||||
EHS_LOG_INT(LogType::ERR, 0, "Failed to send data with error #" + Str_8::FromNum(code) + ".");
|
{
|
||||||
|
ERR_print_errors_fp(stderr);
|
||||||
|
EHS_LOG_INT(LogType::ERR, 0, "Failed to send data with error #" + Str_8::FromNum(code) + ".");
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -171,48 +236,46 @@ namespace ehs
|
|||||||
if (received <= 0)
|
if (received <= 0)
|
||||||
{
|
{
|
||||||
int code = SSL_get_error(sslHdl, received);
|
int code = SSL_get_error(sslHdl, received);
|
||||||
ERR_print_errors_fp(stderr);
|
if (code != SSL_ERROR_WANT_READ)
|
||||||
EHS_LOG_INT(LogType::ERR, 0, "Failed to receive data with error #" + Str_8::FromNum(code) + ".");
|
{
|
||||||
|
ERR_print_errors_fp(stderr);
|
||||||
|
EHS_LOG_INT(LogType::ERR, 0, "Failed to receive data with error #" + Str_8::FromNum(code) + ".");
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return received;
|
return received;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SSL::UseCertificate(const Byte* data, const UInt_64 size)
|
void SSL::UseCertificate(const Char_8* data, const UInt_32 &size)
|
||||||
{
|
{
|
||||||
X509 *cert = d2i_X509(nullptr, &data, (long)size);
|
BIO* certBio = BIO_new_mem_buf(data, (int)size);
|
||||||
if (!cert)
|
X509 *cert = PEM_read_bio_X509(certBio, nullptr, nullptr, nullptr);
|
||||||
{
|
|
||||||
EHS_LOG_INT(LogType::ERR, 0, "Invalid certificate.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (SSL_CTX_use_certificate(ctx, cert) != 1)
|
if (!SSL_CTX_use_certificate(ctx, cert))
|
||||||
{
|
{
|
||||||
EHS_LOG_INT(LogType::ERR, 1, "Failed to use certificate.");
|
UInt_32 code = ERR_get_error();
|
||||||
return;
|
EHS_LOG_INT(LogType::ERR, 0, ERR_error_string(code, nullptr));
|
||||||
}
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
X509_free(cert);
|
BIO_free(certBio);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SSL::UsePrivateKey(const Byte* data, const UInt_64 size)
|
void SSL::UsePrivateKey(const Char_8* data, const UInt_32 &size)
|
||||||
{
|
{
|
||||||
EVP_PKEY *key = d2i_PrivateKey(EVP_PKEY_RSA, nullptr, &data, (long)size);
|
BIO* keyBio = BIO_new_mem_buf(data, (int)size);
|
||||||
if (!key)
|
EVP_PKEY* pkey = PEM_read_bio_PrivateKey(keyBio, nullptr, nullptr, nullptr);
|
||||||
{
|
|
||||||
EHS_LOG_INT(LogType::ERR, 0, "Invalid private key.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (SSL_CTX_use_PrivateKey(ctx, key) != 1)
|
if (!SSL_CTX_use_PrivateKey(ctx, pkey))
|
||||||
{
|
{
|
||||||
EHS_LOG_INT(LogType::ERR, 1, "Failed to use private key.");
|
UInt_32 code = ERR_get_error();
|
||||||
return;
|
EHS_LOG_INT(LogType::ERR, 0, ERR_error_string(code, nullptr));
|
||||||
}
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
EVP_PKEY_free(key);
|
BIO_free(keyBio);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SSL::IsValid()
|
bool SSL::IsValid()
|
||||||
|
@ -114,7 +114,7 @@ namespace ehs
|
|||||||
hdl = EHS_INVALID_SOCKET;
|
hdl = EHS_INVALID_SOCKET;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TCP::Bind(const Str_8& address, UInt_16 port)
|
void TCP::Bind(Str_8 address, const UInt_16 &port)
|
||||||
{
|
{
|
||||||
if (!IsValid() || bound || connection)
|
if (!IsValid() || bound || connection)
|
||||||
return;
|
return;
|
||||||
@ -124,7 +124,7 @@ namespace ehs
|
|||||||
else if (ip == IP::V4)
|
else if (ip == IP::V4)
|
||||||
Bind_v4(address, port);
|
Bind_v4(address, port);
|
||||||
|
|
||||||
this->localAddr = address;
|
this->localAddr = (Str_8 &&)address;
|
||||||
this->localPort = port;
|
this->localPort = port;
|
||||||
|
|
||||||
bound = true;
|
bound = true;
|
||||||
@ -207,26 +207,26 @@ namespace ehs
|
|||||||
return client;
|
return client;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TCP::Connect(const Str_8& address, const UInt_16 port)
|
void TCP::Connect(Str_8 address, const UInt_16 &port)
|
||||||
{
|
{
|
||||||
if (connection || !IsValid() || listening)
|
if (connection || !IsValid() || listening)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
remoteHostName = address;
|
remoteHostName = (Str_8 &&)address;
|
||||||
remotePort = port;
|
remotePort = port;
|
||||||
|
|
||||||
if (ip == IP::V6)
|
if (ip == IP::V6)
|
||||||
{
|
{
|
||||||
if (IsIPv6Only())
|
if (IsIPv6Only())
|
||||||
remoteAddr = DNS::Resolve(IP::V6, address);
|
remoteAddr = DNS::Resolve(IP::V6, remoteHostName);
|
||||||
else
|
else
|
||||||
remoteAddr = DNS::Resolve(address);
|
remoteAddr = DNS::Resolve(remoteHostName);
|
||||||
|
|
||||||
Connect_v6(remoteAddr, port);
|
Connect_v6(remoteAddr, port);
|
||||||
}
|
}
|
||||||
else if (ip == IP::V4)
|
else if (ip == IP::V4)
|
||||||
{
|
{
|
||||||
remoteAddr = DNS::Resolve(IP::V4, address);
|
remoteAddr = DNS::Resolve(IP::V4, remoteHostName);
|
||||||
|
|
||||||
Connect_v4(remoteAddr, port);
|
Connect_v4(remoteAddr, port);
|
||||||
}
|
}
|
||||||
@ -385,12 +385,30 @@ namespace ehs
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TCP::SetReuse(const bool &value)
|
||||||
|
{
|
||||||
|
if (!IsValid())
|
||||||
|
{
|
||||||
|
EHS_LOG_INT(LogType::WARN, 1, "Attempted to set address and port reuse while socket is not initialized.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const int result = (int)value;
|
||||||
|
if (setsockopt(hdl, SOL_SOCKET, SO_REUSEPORT, &result, sizeof(int)) == -1)
|
||||||
|
{
|
||||||
|
EHS_LOG_INT(LogType::ERR, 2, "Failed to set address and port reuse with error #" + Str_8::FromNum(errno) + ".");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
EHS_LOG_SUCCESS();
|
||||||
|
}
|
||||||
|
|
||||||
bool TCP::IsValid() const
|
bool TCP::IsValid() const
|
||||||
{
|
{
|
||||||
return hdl != EHS_INVALID_SOCKET;
|
return hdl != EHS_INVALID_SOCKET;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TCP::Bind_v6(const Str_8& address, UInt_16 port)
|
void TCP::Bind_v6(const Str_8& address, const UInt_16 &port) const
|
||||||
{
|
{
|
||||||
sockaddr_in6 result = {};
|
sockaddr_in6 result = {};
|
||||||
result.sin6_family = AF_INET6;
|
result.sin6_family = AF_INET6;
|
||||||
@ -426,7 +444,7 @@ namespace ehs
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TCP::Bind_v4(const Str_8& address, UInt_16 port)
|
void TCP::Bind_v4(const Str_8& address, const UInt_16 &port) const
|
||||||
{
|
{
|
||||||
sockaddr_in result = {};
|
sockaddr_in result = {};
|
||||||
result.sin_family = AF_INET;
|
result.sin_family = AF_INET;
|
||||||
@ -461,7 +479,7 @@ namespace ehs
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TCP::Connect_v6(const Str_8& address, UInt_16 port)
|
void TCP::Connect_v6(const Str_8 &address, const UInt_16 &port)
|
||||||
{
|
{
|
||||||
sockaddr_in6 result = {};
|
sockaddr_in6 result = {};
|
||||||
result.sin6_family = AF_INET6;
|
result.sin6_family = AF_INET6;
|
||||||
@ -498,7 +516,7 @@ namespace ehs
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TCP::Connect_v4(const Str_8& address, UInt_16 port)
|
void TCP::Connect_v4(const Str_8 &address, const UInt_16 &port)
|
||||||
{
|
{
|
||||||
sockaddr_in result = {};
|
sockaddr_in result = {};
|
||||||
result.sin_family = AF_INET;
|
result.sin_family = AF_INET;
|
||||||
|
@ -137,7 +137,7 @@ namespace ehs
|
|||||||
connected = false;
|
connected = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TCP::Bind(const Str_8& address, UInt_16 port)
|
void TCP::Bind(Str_8 address, const UInt_16 &port)
|
||||||
{
|
{
|
||||||
if (!IsValid() || bound || connection)
|
if (!IsValid() || bound || connection)
|
||||||
return;
|
return;
|
||||||
@ -147,7 +147,7 @@ namespace ehs
|
|||||||
else if (ip == IP::V4)
|
else if (ip == IP::V4)
|
||||||
Bind_v4(address, port);
|
Bind_v4(address, port);
|
||||||
|
|
||||||
this->localAddr = address;
|
this->localAddr = (Str_8 &&)address;
|
||||||
this->localPort = port;
|
this->localPort = port;
|
||||||
|
|
||||||
bound = true;
|
bound = true;
|
||||||
@ -236,26 +236,26 @@ namespace ehs
|
|||||||
return client;
|
return client;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TCP::Connect(const Str_8& address, const UInt_16 port)
|
void TCP::Connect(Str_8 address, const UInt_16 &port)
|
||||||
{
|
{
|
||||||
if (connection || !IsValid() || listening)
|
if (connection || !IsValid() || listening)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
remoteHostName = address;
|
remoteHostName = (Str_8 &&)address;
|
||||||
remotePort = port;
|
remotePort = port;
|
||||||
|
|
||||||
if (ip == IP::V6)
|
if (ip == IP::V6)
|
||||||
{
|
{
|
||||||
if (IsIPv6Only())
|
if (IsIPv6Only())
|
||||||
remoteAddr = DNS::Resolve(IP::V6, address);
|
remoteAddr = DNS::Resolve(IP::V6, remoteHostName);
|
||||||
else
|
else
|
||||||
remoteAddr = DNS::Resolve(address);
|
remoteAddr = DNS::Resolve(remoteHostName);
|
||||||
|
|
||||||
Connect_v6(remoteAddr, port);
|
Connect_v6(remoteAddr, port);
|
||||||
}
|
}
|
||||||
else if (ip == IP::V4)
|
else if (ip == IP::V4)
|
||||||
{
|
{
|
||||||
remoteAddr = DNS::Resolve(IP::V4, address);
|
remoteAddr = DNS::Resolve(IP::V4, remoteHostName);
|
||||||
|
|
||||||
Connect_v4(remoteAddr, port);
|
Connect_v4(remoteAddr, port);
|
||||||
}
|
}
|
||||||
@ -406,6 +406,10 @@ namespace ehs
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TCP::SetReuse(const bool &value)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
bool TCP::IsValid() const
|
bool TCP::IsValid() const
|
||||||
{
|
{
|
||||||
return hdl != EHS_INVALID_SOCKET;
|
return hdl != EHS_INVALID_SOCKET;
|
||||||
|
@ -81,7 +81,7 @@ namespace ehs
|
|||||||
authReq.SetContentType(ContentType::APP_FORMURLENCODED);
|
authReq.SetContentType(ContentType::APP_FORMURLENCODED);
|
||||||
authReq.BasicAuth(clientId, secret);
|
authReq.BasicAuth(clientId, secret);
|
||||||
authReq.AddToBody("grant_type", "authorization_code");
|
authReq.AddToBody("grant_type", "authorization_code");
|
||||||
authReq.AddToBody("code", cbReq.GetQuery("code"));
|
authReq.AddToBody("code", cbReq.GetQueryValue("code"));
|
||||||
authReq.AddToBody("redirect_uri", rURI);
|
authReq.AddToBody("redirect_uri", rURI);
|
||||||
|
|
||||||
accounts.SendReq(authReq);
|
accounts.SendReq(authReq);
|
||||||
@ -134,7 +134,7 @@ namespace ehs
|
|||||||
StartConnection();
|
StartConnection();
|
||||||
|
|
||||||
Request req(Verb::PUT, "/v1/me/player/volume");
|
Request req(Verb::PUT, "/v1/me/player/volume");
|
||||||
req.AddQuery("volume_percent", Str_8::FromNum(level));
|
req.AddQueryVar({"volume_percent", Str_8::FromNum(level)});
|
||||||
req.BearerAuth(token);
|
req.BearerAuth(token);
|
||||||
|
|
||||||
client.SendReq(req);
|
client.SendReq(req);
|
||||||
@ -206,7 +206,7 @@ namespace ehs
|
|||||||
}
|
}
|
||||||
|
|
||||||
Request req(Verb::PUT, "/v1/me/player/repeat");
|
Request req(Verb::PUT, "/v1/me/player/repeat");
|
||||||
req.AddQuery("state", result);
|
req.AddQueryVar({"state", result});
|
||||||
req.BearerAuth(token);
|
req.BearerAuth(token);
|
||||||
|
|
||||||
client.SendReq(req);
|
client.SendReq(req);
|
||||||
@ -226,7 +226,7 @@ namespace ehs
|
|||||||
StartConnection();
|
StartConnection();
|
||||||
|
|
||||||
Request req(Verb::PUT, "/v1/me/player/repeat");
|
Request req(Verb::PUT, "/v1/me/player/repeat");
|
||||||
req.AddQuery("state", state ? "true" : "false");
|
req.AddQueryVar({"state", state ? "true" : "false"});
|
||||||
req.BearerAuth(token);
|
req.BearerAuth(token);
|
||||||
|
|
||||||
client.SendReq(req);
|
client.SendReq(req);
|
||||||
@ -258,10 +258,10 @@ namespace ehs
|
|||||||
|
|
||||||
q += "+track%3A" + name.ReplaceAll(" ", "+");
|
q += "+track%3A" + name.ReplaceAll(" ", "+");
|
||||||
|
|
||||||
req.AddQuery("q", q);
|
req.AddQueryVar({"q", q});
|
||||||
req.AddQuery("type", "track");
|
req.AddQueryVar({"type", "track"});
|
||||||
req.AddQuery("limit", "1");
|
req.AddQueryVar({"limit", "1"});
|
||||||
req.AddQuery("offset", "0");
|
req.AddQueryVar({"offset", "0"});
|
||||||
req.BearerAuth(token);
|
req.BearerAuth(token);
|
||||||
|
|
||||||
client.SendReq(req);
|
client.SendReq(req);
|
||||||
@ -454,7 +454,7 @@ namespace ehs
|
|||||||
StartConnection();
|
StartConnection();
|
||||||
|
|
||||||
Request req(Verb::POST, "/v1/me/player/queue");
|
Request req(Verb::POST, "/v1/me/player/queue");
|
||||||
req.AddQuery("uri", "spotify:track:" + id);
|
req.AddQueryVar({"uri", "spotify:track:" + id});
|
||||||
req.BearerAuth(token);
|
req.BearerAuth(token);
|
||||||
|
|
||||||
client.SendReq(req);
|
client.SendReq(req);
|
||||||
@ -505,8 +505,8 @@ namespace ehs
|
|||||||
StartConnection();
|
StartConnection();
|
||||||
|
|
||||||
Request req(Verb::POST, "/v1/playlists/" + playlistId + "/tracks");
|
Request req(Verb::POST, "/v1/playlists/" + playlistId + "/tracks");
|
||||||
req.AddQuery("position", Str_8::FromNum(pos));
|
req.AddQueryVar({"position", Str_8::FromNum(pos)});
|
||||||
req.AddQuery("uris", "spotify:track:" + trackId);
|
req.AddQueryVar({"uris", "spotify:track:" + trackId});
|
||||||
req.BearerAuth(token);
|
req.BearerAuth(token);
|
||||||
|
|
||||||
client.SendReq(req);
|
client.SendReq(req);
|
||||||
@ -564,7 +564,7 @@ namespace ehs
|
|||||||
StartConnection();
|
StartConnection();
|
||||||
|
|
||||||
Request req(Verb::PUT, "/v1/me/player/seek");
|
Request req(Verb::PUT, "/v1/me/player/seek");
|
||||||
req.AddQuery("position_ms", Str_8::FromNum(pos));
|
req.AddQueryVar({"position_ms", Str_8::FromNum(pos)});
|
||||||
req.BearerAuth(token);
|
req.BearerAuth(token);
|
||||||
|
|
||||||
client.SendReq(req);
|
client.SendReq(req);
|
||||||
|
@ -78,7 +78,7 @@ namespace ehs
|
|||||||
authReq.SetContentType(ContentType::APP_FORMURLENCODED);
|
authReq.SetContentType(ContentType::APP_FORMURLENCODED);
|
||||||
authReq.AddToBody("client_id", clientId);
|
authReq.AddToBody("client_id", clientId);
|
||||||
authReq.AddToBody("client_secret", secret);
|
authReq.AddToBody("client_secret", secret);
|
||||||
authReq.AddToBody("code", cbReq.GetQuery("code"));
|
authReq.AddToBody("code", cbReq.GetQueryValue("code"));
|
||||||
authReq.AddToBody("grant_type", "authorization_code");
|
authReq.AddToBody("grant_type", "authorization_code");
|
||||||
authReq.AddToBody("redirect_uri", redURI);
|
authReq.AddToBody("redirect_uri", redURI);
|
||||||
|
|
||||||
|
24
src/system/AVX2_AARCH64.cpp
Normal file
24
src/system/AVX2_AARCH64.cpp
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
#include "ehs/system/AVX2.h"
|
||||||
|
|
||||||
|
namespace ehs
|
||||||
|
{
|
||||||
|
bool AVX2::CompareUnaligned(const UInt_64* a, const UInt_64* b)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AVX2::CompareUnaligned(const SInt_64* a, const SInt_64* b)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AVX2::CompareAligned(const UInt_64* a, const UInt_64* b)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AVX2::CompareAligned(const SInt_64* a, const SInt_64* b)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
49
src/system/AVX2_GCC_AMD64.asm
Normal file
49
src/system/AVX2_GCC_AMD64.asm
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
global _ZN3ehs4AVX216CompareUnalignedEPKmS2_
|
||||||
|
global _ZN3ehs4AVX216CompareUnalignedEPKlS2_
|
||||||
|
global _ZN3ehs4AVX214CompareAlignedEPKmS2_
|
||||||
|
global _ZN3ehs4AVX214CompareAlignedEPKlS2_
|
||||||
|
|
||||||
|
section .text
|
||||||
|
_ZN3ehs4AVX216CompareUnalignedEPKmS2_:
|
||||||
|
VMOVDQU YMM0, [RDI]
|
||||||
|
VMOVDQU YMM1, [RSI]
|
||||||
|
VPCMPEQQ YMM2, YMM0, YMM1
|
||||||
|
|
||||||
|
VPMOVMSKB EAX, YMM2
|
||||||
|
CMP EAX, 0xFFFFFFFF
|
||||||
|
SETE AL
|
||||||
|
|
||||||
|
RET
|
||||||
|
|
||||||
|
_ZN3ehs4AVX216CompareUnalignedEPKlS2_:
|
||||||
|
VMOVDQU YMM0, [RDI]
|
||||||
|
VMOVDQU YMM1, [RSI]
|
||||||
|
VPCMPEQQ YMM2, YMM0, YMM1
|
||||||
|
|
||||||
|
VPMOVMSKB EAX, YMM2
|
||||||
|
CMP EAX, 0xFFFFFFFF
|
||||||
|
SETE AL
|
||||||
|
|
||||||
|
RET
|
||||||
|
|
||||||
|
_ZN3ehs4AVX214CompareAlignedEPKmS2_:
|
||||||
|
VMOVDQA YMM0, [RDI]
|
||||||
|
VMOVDQA YMM1, [RSI]
|
||||||
|
VPCMPEQQ YMM2, YMM0, YMM1
|
||||||
|
|
||||||
|
VPMOVMSKB EAX, YMM2
|
||||||
|
CMP EAX, 0xFFFFFFFF
|
||||||
|
SETE AL
|
||||||
|
|
||||||
|
RET
|
||||||
|
|
||||||
|
_ZN3ehs4AVX214CompareAlignedEPKlS2_:
|
||||||
|
VMOVDQA YMM0, [RDI]
|
||||||
|
VMOVDQA YMM1, [RSI]
|
||||||
|
VPCMPEQQ YMM2, YMM0, YMM1
|
||||||
|
|
||||||
|
VPMOVMSKB EAX, YMM2
|
||||||
|
CMP EAX, 0xFFFFFFFF
|
||||||
|
SETE AL
|
||||||
|
|
||||||
|
RET
|
49
src/system/AVX2_MSVC_AMD64.asm
Normal file
49
src/system/AVX2_MSVC_AMD64.asm
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
global ?CompareUnaligned@AVX2@ehs@@SA_NPEBK0@Z
|
||||||
|
global ?CompareUnaligned@AVX2@ehs@@SA_NPEBJ0@Z
|
||||||
|
global ?CompareAligned@AVX2@ehs@@SA_NPEBK0@Z
|
||||||
|
global ?CompareAligned@AVX2@ehs@@SA_NPEBJ0@Z
|
||||||
|
|
||||||
|
section .text
|
||||||
|
?CompareUnaligned@AVX2@ehs@@SA_NPEBK0@Z:
|
||||||
|
VMOVDQU YMM0, [RCX]
|
||||||
|
VMOVDQU YMM1, [RDX]
|
||||||
|
VPCMPEQQ YMM2, YMM0, YMM1
|
||||||
|
|
||||||
|
VPMOVMSKB EAX, YMM2
|
||||||
|
CMP EAX, 0xFFFFFFFF
|
||||||
|
SETE AL
|
||||||
|
|
||||||
|
RET
|
||||||
|
|
||||||
|
?CompareUnaligned@AVX2@ehs@@SA_NPEBJ0@Z:
|
||||||
|
VMOVDQU YMM0, [RCX]
|
||||||
|
VMOVDQU YMM1, [RDX]
|
||||||
|
VPCMPEQQ YMM2, YMM0, YMM1
|
||||||
|
|
||||||
|
VPMOVMSKB EAX, YMM2
|
||||||
|
CMP EAX, 0xFFFFFFFF
|
||||||
|
SETE AL
|
||||||
|
|
||||||
|
RET
|
||||||
|
|
||||||
|
?CompareAligned@AVX2@ehs@@SA_NPEBK0@Z:
|
||||||
|
VMOVDQA YMM0, [RCX]
|
||||||
|
VMOVDQA YMM1, [RDX]
|
||||||
|
VPCMPEQQ YMM2, YMM0, YMM1
|
||||||
|
|
||||||
|
VPMOVMSKB EAX, YMM2
|
||||||
|
CMP EAX, 0xFFFFFFFF
|
||||||
|
SETE AL
|
||||||
|
|
||||||
|
RET
|
||||||
|
|
||||||
|
?CompareAligned@AVX2@ehs@@SA_NPEBJ0@Z:
|
||||||
|
VMOVDQA YMM0, [RCX]
|
||||||
|
VMOVDQA YMM1, [RDX]
|
||||||
|
VPCMPEQQ YMM2, YMM0, YMM1
|
||||||
|
|
||||||
|
VPMOVMSKB EAX, YMM2
|
||||||
|
CMP EAX, 0xFFFFFFFF
|
||||||
|
SETE AL
|
||||||
|
|
||||||
|
RET
|
24
src/system/AVX512_AARCH64.cpp
Normal file
24
src/system/AVX512_AARCH64.cpp
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
#include "ehs/system/AVX512.h"
|
||||||
|
|
||||||
|
namespace ehs
|
||||||
|
{
|
||||||
|
bool AVX512::CompareUnaligned(const UInt_64* a, const UInt_64* b)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AVX512::CompareUnaligned(const SInt_64* a, const SInt_64* b)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AVX512::CompareAligned(const UInt_64* a, const UInt_64* b)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AVX512::CompareAligned(const SInt_64* a, const SInt_64* b)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
49
src/system/AVX512_GCC_AMD64.asm
Normal file
49
src/system/AVX512_GCC_AMD64.asm
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
global _ZN3ehs6AVX51216CompareUnalignedEPKmS2_
|
||||||
|
global _ZN3ehs6AVX51216CompareUnalignedEPKlS2_
|
||||||
|
global _ZN3ehs6AVX51214CompareAlignedEPKmS2_
|
||||||
|
global _ZN3ehs6AVX51214CompareAlignedEPKlS2_
|
||||||
|
|
||||||
|
section .text
|
||||||
|
_ZN3ehs6AVX51216CompareUnalignedEPKmS2_:
|
||||||
|
VMOVDQU64 ZMM0, [RDI]
|
||||||
|
VMOVDQU64 ZMM1, [RSI]
|
||||||
|
|
||||||
|
VPCMPEQQ K1, ZMM0, ZMM1
|
||||||
|
|
||||||
|
KORTESTQ K1, K1
|
||||||
|
SETC AL
|
||||||
|
|
||||||
|
RET
|
||||||
|
|
||||||
|
_ZN3ehs6AVX51216CompareUnalignedEPKlS2_:
|
||||||
|
VMOVDQU64 ZMM0, [RDI]
|
||||||
|
VMOVDQU64 ZMM1, [RSI]
|
||||||
|
|
||||||
|
VPCMPEQQ K1, ZMM0, ZMM1
|
||||||
|
|
||||||
|
KORTESTQ K1, K1
|
||||||
|
SETC AL
|
||||||
|
|
||||||
|
RET
|
||||||
|
|
||||||
|
_ZN3ehs6AVX51214CompareAlignedEPKmS2_:
|
||||||
|
VMOVDQA64 ZMM0, [RDI]
|
||||||
|
VMOVDQA64 ZMM1, [RSI]
|
||||||
|
|
||||||
|
VPCMPEQQ K1, ZMM0, ZMM1
|
||||||
|
|
||||||
|
KORTESTQ K1, K1
|
||||||
|
SETC AL
|
||||||
|
|
||||||
|
RET
|
||||||
|
|
||||||
|
_ZN3ehs6AVX51214CompareAlignedEPKlS2_:
|
||||||
|
VMOVDQA64 ZMM0, [RDI]
|
||||||
|
VMOVDQA64 ZMM1, [RSI]
|
||||||
|
|
||||||
|
VPCMPEQQ K1, ZMM0, ZMM1
|
||||||
|
|
||||||
|
KORTESTQ K1, K1
|
||||||
|
SETC AL
|
||||||
|
|
||||||
|
RET
|
49
src/system/AVX512_MSVC_AMD64.asm
Normal file
49
src/system/AVX512_MSVC_AMD64.asm
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
global ?CompareUnaligned@AVX512@ehs@@SA_NPEBK0@Z
|
||||||
|
global ?CompareUnaligned@AVX512@ehs@@SA_NPEBJ0@Z
|
||||||
|
global ?CompareAligned@AVX512@ehs@@SA_NPEBK0@Z
|
||||||
|
global ?CompareAligned@AVX512@ehs@@SA_NPEBJ0@Z
|
||||||
|
|
||||||
|
section .text
|
||||||
|
?CompareUnaligned@AVX512@ehs@@SA_NPEBK0@Z:
|
||||||
|
VMOVDQU64 ZMM0, [RCX]
|
||||||
|
VMOVDQU64 ZMM1, [RDX]
|
||||||
|
|
||||||
|
VPCMPEQQ K1, ZMM0, ZMM1
|
||||||
|
|
||||||
|
KORTESTQ K1, K1
|
||||||
|
SETC AL
|
||||||
|
|
||||||
|
RET
|
||||||
|
|
||||||
|
?CompareUnaligned@AVX512@ehs@@SA_NPEBJ0@Z:
|
||||||
|
VMOVDQU64 ZMM0, [RCX]
|
||||||
|
VMOVDQU64 ZMM1, [RDX]
|
||||||
|
|
||||||
|
VPCMPEQQ K1, ZMM0, ZMM1
|
||||||
|
|
||||||
|
KORTESTQ K1, K1
|
||||||
|
SETC AL
|
||||||
|
|
||||||
|
RET
|
||||||
|
|
||||||
|
?CompareAligned@AVX512@ehs@@SA_NPEBK0@Z:
|
||||||
|
VMOVDQA64 ZMM0, [RCX]
|
||||||
|
VMOVDQA64 ZMM1, [RDX]
|
||||||
|
|
||||||
|
VPCMPEQQ K1, ZMM0, ZMM1
|
||||||
|
|
||||||
|
KORTESTQ K1, K1
|
||||||
|
SETC AL
|
||||||
|
|
||||||
|
RET
|
||||||
|
|
||||||
|
?CompareAligned@AVX512@ehs@@SA_NPEBJ0@Z:
|
||||||
|
VMOVDQA64 ZMM0, [RCX]
|
||||||
|
VMOVDQA64 ZMM1, [RDX]
|
||||||
|
|
||||||
|
VPCMPEQQ K1, ZMM0, ZMM1
|
||||||
|
|
||||||
|
KORTESTQ K1, K1
|
||||||
|
SETC AL
|
||||||
|
|
||||||
|
RET
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
namespace ehs
|
namespace ehs
|
||||||
{
|
{
|
||||||
void BaseSystem::OpenURI(const Str_8& uri)
|
void BaseSystem::OpenURI(Str_8 uri)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,11 +10,75 @@ namespace ehs
|
|||||||
UInt_64 CPU::TSC_Freq = 0;
|
UInt_64 CPU::TSC_Freq = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
const bool CPU::hasFPU = RetrieveFPU();
|
||||||
|
const bool CPU::hasVME = RetrieveVME();
|
||||||
|
const bool CPU::hasDE = RetrieveDE();
|
||||||
|
const bool CPU::hasPSE = RetrievePSE();
|
||||||
|
const bool CPU::hasTSC = RetrieveTSC();
|
||||||
|
const bool CPU::hasMSR = RetrieveMSR();
|
||||||
|
const bool CPU::hasPAE = RetrievePAE();
|
||||||
|
const bool CPU::hasMCE = RetrieveMCE();
|
||||||
|
const bool CPU::hasCX8 = RetrieveCX8();
|
||||||
|
const bool CPU::hasAPIC = RetrieveAPIC();
|
||||||
|
const bool CPU::hasSEP = RetrieveSEP();
|
||||||
|
const bool CPU::hasMTRR = RetrieveMTRR();
|
||||||
|
const bool CPU::hasPGE = RetrievePGE();
|
||||||
|
const bool CPU::hasMCA = RetrieveMCA();
|
||||||
|
const bool CPU::hasCMOV = RetrieveCMOV();
|
||||||
|
const bool CPU::hasPSE_36 = RetrievePSE_36();
|
||||||
|
const bool CPU::hasPSN = RetrievePSN();
|
||||||
|
const bool CPU::hasCLFSH = RetrieveCLFSH();
|
||||||
|
const bool CPU::hasDS = RetrieveDS();
|
||||||
|
const bool CPU::hasACPI = RetrieveACPI();
|
||||||
|
const bool CPU::hasMMX = RetrieveMMX();
|
||||||
|
const bool CPU::hasFXSR = RetrieveFXSR();
|
||||||
|
const bool CPU::hasSSE = RetrieveSSE();
|
||||||
|
const bool CPU::hasSSE2 = RetrieveSSE2();
|
||||||
|
const bool CPU::hasSS = RetrieveSS();
|
||||||
|
const bool CPU::hasHTT = RetrieveHTT();
|
||||||
|
const bool CPU::hasTM = RetrieveTM();
|
||||||
|
const bool CPU::hasIA64 = RetrieveIA64();
|
||||||
|
const bool CPU::hasPBE = RetrievePBE();
|
||||||
|
const bool CPU::hasSSE3 = RetrieveSSE3();
|
||||||
|
const bool CPU::hasPCLMULQDQ = RetrievePCLMULQDQ();
|
||||||
|
const bool CPU::hasDTES64 = RetrieveDTES64();
|
||||||
|
const bool CPU::hasMONITOR = RetrieveMONITOR();
|
||||||
|
const bool CPU::hasVMX = RetrieveVMX();
|
||||||
|
const bool CPU::hasSMX = RetrieveSMX();
|
||||||
|
const bool CPU::hasEST = RetrieveEST();
|
||||||
|
const bool CPU::hasTM2 = RetrieveTM2();
|
||||||
|
const bool CPU::hasSSSE3 = RetrieveSSSE3();
|
||||||
|
const bool CPU::hasCNXT_ID = RetrieveCNXT_ID();
|
||||||
|
const bool CPU::hasSDBG = RetrieveSDBG();
|
||||||
|
const bool CPU::hasFMA = RetrieveFMA();
|
||||||
|
const bool CPU::hasCX16 = RetrieveCX16();
|
||||||
|
const bool CPU::hasXTPR = RetrieveXTPR();
|
||||||
|
const bool CPU::hasPDCM = RetrievePDCM();
|
||||||
|
const bool CPU::hasPCID = RetrievePCID();
|
||||||
|
const bool CPU::hasDCA = RetrieveDCA();
|
||||||
|
const bool CPU::hasSSE4_1 = RetrieveSSE4_1();
|
||||||
|
const bool CPU::hasSSE4_2 = RetrieveSSE4_2();
|
||||||
|
const bool CPU::hasX2APIC = RetrieveX2APIC();
|
||||||
|
const bool CPU::hasMOVBE = RetrieveMOVBE();
|
||||||
|
const bool CPU::hasPOPCNT = RetrievePOPCNT();
|
||||||
|
const bool CPU::hasTSC_DEADLINE = RetrieveTSC_DEADLINE();
|
||||||
|
const bool CPU::hasAES = RetrieveAES();
|
||||||
|
const bool CPU::hasXSAVE = RetrieveXSAVE();
|
||||||
|
const bool CPU::hasOSXSAVE = RetrieveOSXSAVE();
|
||||||
|
const bool CPU::hasAVX = RetrieveAVX();
|
||||||
|
const bool CPU::hasF16C = RetrieveF16C();
|
||||||
|
const bool CPU::hasRDRND = RetrieveRDRND();
|
||||||
|
const bool CPU::hasHYPERVISOR = RetrieveHYPERVISOR();
|
||||||
|
const bool CPU::hasAVX2 = RetrieveAVX2();
|
||||||
|
const bool CPU::hasAVX512F = RetrieveAVX512F();
|
||||||
|
const bool CPU::hasRDSEED = RetrieveRDSEED();
|
||||||
|
const bool CPU::hasADX = RetrieveADX();
|
||||||
|
|
||||||
Architecture CPU::GetArchitecture()
|
Architecture CPU::GetArchitecture()
|
||||||
{
|
{
|
||||||
#if defined(EHS_ARCH_X64)
|
#if defined(EHS_ARCH_X64)
|
||||||
return Architecture::X64;
|
return Architecture::X64;
|
||||||
#elif defined(EHS_ARCH_ARM64)
|
#elif defined(EHS_ARCH_AARCH64)
|
||||||
return Architecture::ARM64;
|
return Architecture::ARM64;
|
||||||
#else
|
#else
|
||||||
return Architecture::UNKNOWN;
|
return Architecture::UNKNOWN;
|
||||||
@ -49,13 +113,19 @@ namespace ehs
|
|||||||
|
|
||||||
return frequency.QuadPart;
|
return frequency.QuadPart;
|
||||||
#elif defined(EHS_OS_LINUX)
|
#elif defined(EHS_OS_LINUX)
|
||||||
if (!TSC_Freq)
|
#if defined(EHS_ARCH_X64)
|
||||||
TSC_Freq = RetrieveTSC_Freq();
|
if (!TSC_Freq)
|
||||||
|
TSC_Freq = RetrieveTSC_Freq();
|
||||||
|
|
||||||
return TSC_Freq;
|
return TSC_Freq;
|
||||||
|
#elif defined(EHS_ARCH_AARCH64)
|
||||||
|
return RetrieveFreq_AARCH64();
|
||||||
|
#else
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
return 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
UInt_64 CPU::GetTSC()
|
UInt_64 CPU::GetTSC()
|
||||||
@ -69,7 +139,7 @@ namespace ehs
|
|||||||
TSC tsc;
|
TSC tsc;
|
||||||
RDTSCP(&tsc);
|
RDTSCP(&tsc);
|
||||||
|
|
||||||
#if defined(EHS_ARCH_X64)
|
#if defined(EHS_ARCH_X64) || defined(EHS_ARCH_AARCH64)
|
||||||
UInt_64 result = 0;
|
UInt_64 result = 0;
|
||||||
|
|
||||||
#if defined(EHS_LITTLE_ENDIAN)
|
#if defined(EHS_LITTLE_ENDIAN)
|
||||||
@ -119,324 +189,589 @@ namespace ehs
|
|||||||
return (UInt_8)(GetInfoBits() >> 20);
|
return (UInt_8)(GetInfoBits() >> 20);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasFPU()
|
bool CPU::RetrieveFPU()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_1() & 0b00000000000000000000000000000001;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_1() & 0b00000000000000000000000000000001;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasVME()
|
bool CPU::RetrieveVME()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_1() & 0b00000000000000000000000000000010;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_1() & 0b00000000000000000000000000000010;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasDE()
|
bool CPU::RetrieveDE()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_1() & 0b00000000000000000000000000000100;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_1() & 0b00000000000000000000000000000100;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasPSE()
|
bool CPU::RetrievePSE()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_1() & 0b00000000000000000000000000001000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_1() & 0b00000000000000000000000000001000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasTSC()
|
bool CPU::RetrieveTSC()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_1() & 0b00000000000000000000000000010000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_1() & 0b00000000000000000000000000010000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasMSR()
|
bool CPU::RetrieveMSR()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_1() & 0b00000000000000000000000000100000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_1() & 0b00000000000000000000000000100000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasPAE()
|
bool CPU::RetrievePAE()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_1() & 0b00000000000000000000000001000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_1() & 0b00000000000000000000000001000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasMCE()
|
bool CPU::RetrieveMCE()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_1() & 0b00000000000000000000000010000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_1() & 0b00000000000000000000000010000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasCX8()
|
bool CPU::RetrieveCX8()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_1() & 0b00000000000000000000000100000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_1() & 0b00000000000000000000000100000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasAPIC()
|
bool CPU::RetrieveAPIC()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_1() & 0b00000000000000000000001000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_1() & 0b00000000000000000000001000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasSEP()
|
bool CPU::RetrieveSEP()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_1() & 0b00000000000000000000100000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_1() & 0b00000000000000000000100000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasMTRR()
|
bool CPU::RetrieveMTRR()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_1() & 0b00000000000000000001000000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_1() & 0b00000000000000000001000000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasPGE()
|
bool CPU::RetrievePGE()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_1() & 0b00000000000000000010000000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_1() & 0b00000000000000000010000000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasMCA()
|
bool CPU::RetrieveMCA()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_1() & 0b00000000000000000100000000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_1() & 0b00000000000000000100000000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasCMOV()
|
bool CPU::RetrieveCMOV()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_1() & 0b00000000000000001000000000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_1() & 0b00000000000000001000000000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasPAT()
|
bool CPU::RetrievePAT()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_1() & 0b00000000000000010000000000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_1() & 0b00000000000000010000000000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasPSE_36()
|
bool CPU::RetrievePSE_36()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_1() & 0b00000000000000100000000000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_1() & 0b00000000000000100000000000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasPSN()
|
bool CPU::RetrievePSN()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_1() & 0b00000000000001000000000000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_1() & 0b00000000000001000000000000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasCLFSH()
|
bool CPU::RetrieveCLFSH()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_1() & 0b00000000000010000000000000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_1() & 0b00000000000010000000000000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasDS()
|
bool CPU::RetrieveDS()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_1() & 0b00000000001000000000000000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_1() & 0b00000000001000000000000000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasACPI()
|
bool CPU::RetrieveACPI()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_1() & 0b00000000010000000000000000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_1() & 0b00000000010000000000000000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasMMX()
|
bool CPU::RetrieveMMX()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_1() & 0b00000000100000000000000000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_1() & 0b00000000100000000000000000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasFXSR()
|
bool CPU::RetrieveFXSR()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_1() & 0b00000001000000000000000000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_1() & 0b00000001000000000000000000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasSSE()
|
bool CPU::RetrieveSSE()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_1() & 0b00000010000000000000000000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_1() & 0b00000010000000000000000000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasSSE2()
|
bool CPU::RetrieveSSE2()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_1() & 0b00000100000000000000000000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_1() & 0b00000100000000000000000000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasSS()
|
bool CPU::RetrieveSS()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_1() & 0b00001000000000000000000000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_1() & 0b00001000000000000000000000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasHTT()
|
bool CPU::RetrieveHTT()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_1() & 0b00010000000000000000000000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_1() & 0b00010000000000000000000000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasTM()
|
bool CPU::RetrieveTM()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_1() & 0b00100000000000000000000000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_1() & 0b00100000000000000000000000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasIA64()
|
bool CPU::RetrieveIA64()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_1() & 0b01000000000000000000000000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_1() & 0b01000000000000000000000000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasPBE()
|
bool CPU::RetrievePBE()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_1() & 0b10000000000000000000000000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_1() & 0b10000000000000000000000000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasSSE3()
|
bool CPU::RetrieveSSE3()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_2() & 0b00000000000000000000000000000001;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_2() & 0b00000000000000000000000000000001;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasPCLMULQDQ()
|
bool CPU::RetrievePCLMULQDQ()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_2() & 0b00000000000000000000000000000010;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_2() & 0b00000000000000000000000000000010;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasDTES64()
|
bool CPU::RetrieveDTES64()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_2() & 0b00000000000000000000000000000100;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_2() & 0b00000000000000000000000000000100;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasMONITOR()
|
bool CPU::RetrieveMONITOR()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_2() & 0b00000000000000000000000000001000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_2() & 0b00000000000000000000000000001000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasDS_CPL()
|
bool CPU::RetrieveDS_CPL()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_2() & 0b00000000000000000000000000010000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_2() & 0b00000000000000000000000000010000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasVMX()
|
bool CPU::RetrieveVMX()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_2() & 0b00000000000000000000000000100000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_2() & 0b00000000000000000000000000100000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasSMX()
|
bool CPU::RetrieveSMX()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_2() & 0b00000000000000000000000001000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_2() & 0b00000000000000000000000001000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasEST()
|
bool CPU::RetrieveEST()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_2() & 0b00000000000000000000000010000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_2() & 0b00000000000000000000000010000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasTM2()
|
bool CPU::RetrieveTM2()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_2() & 0b00000000000000000000000100000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_2() & 0b00000000000000000000000100000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasSSSE3()
|
bool CPU::RetrieveSSSE3()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_2() & 0b00000000000000000000001000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_2() & 0b00000000000000000000001000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasCNXT_ID()
|
bool CPU::RetrieveCNXT_ID()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_2() & 0b00000000000000000000010000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_2() & 0b00000000000000000000010000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasSDBG()
|
bool CPU::RetrieveSDBG()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_2() & 0b00000000000000000000100000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_2() & 0b00000000000000000000100000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasFMA()
|
bool CPU::RetrieveFMA()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_2() & 0b00000000000000000001000000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_2() & 0b00000000000000000001000000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasCX16()
|
bool CPU::RetrieveCX16()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_2() & 0b00000000000000000010000000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_2() & 0b00000000000000000010000000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasXTPR()
|
bool CPU::RetrieveXTPR()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_2() & 0b00000000000000000100000000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_2() & 0b00000000000000000100000000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasPDCM()
|
bool CPU::RetrievePDCM()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_2() & 0b00000000000000001000000000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_2() & 0b00000000000000001000000000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasPCID()
|
bool CPU::RetrievePCID()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_2() & 0b00000000000000100000000000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_2() & 0b00000000000000100000000000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasDCA()
|
bool CPU::RetrieveDCA()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_2() & 0b00000000000001000000000000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_2() & 0b00000000000001000000000000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasSSE4_1()
|
bool CPU::RetrieveSSE4_1()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_2() & 0b00000000000010000000000000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_2() & 0b00000000000010000000000000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasSSE4_2()
|
bool CPU::RetrieveSSE4_2()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_2() & 0b00000000000100000000000000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_2() & 0b00000000000100000000000000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasX2APIC()
|
bool CPU::RetrieveX2APIC()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_2() & 0b00000000001000000000000000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_2() & 0b00000000001000000000000000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasMOVBE()
|
bool CPU::RetrieveMOVBE()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_2() & 0b00000000010000000000000000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_2() & 0b00000000010000000000000000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasPOPCNT()
|
bool CPU::RetrievePOPCNT()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_2() & 0b00000000100000000000000000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_2() & 0b00000000100000000000000000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasTSC_DEADLINE()
|
bool CPU::RetrieveTSC_DEADLINE()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_2() & 0b00000001000000000000000000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_2() & 0b00000001000000000000000000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasAES()
|
bool CPU::RetrieveAES()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_2() & 0b00000010000000000000000000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_2() & 0b00000010000000000000000000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasXSAVE()
|
bool CPU::RetrieveXSAVE()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_2() & 0b00000100000000000000000000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_2() & 0b00000100000000000000000000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasOSXSAVE()
|
bool CPU::RetrieveOSXSAVE()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_2() & 0b00001000000000000000000000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_2() & 0b00001000000000000000000000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasAVX()
|
bool CPU::RetrieveAVX()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_2() & 0b00010000000000000000000000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_2() & 0b00010000000000000000000000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasF16C()
|
bool CPU::RetrieveF16C()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_2() & 0b00100000000000000000000000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_2() & 0b00100000000000000000000000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasRDRND()
|
bool CPU::RetrieveRDRND()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_2() & 0b01000000000000000000000000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_2() & 0b01000000000000000000000000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasHYPERVISOR()
|
bool CPU::RetrieveHYPERVISOR()
|
||||||
{
|
{
|
||||||
return GetFeatureBits_2() & 0b10000000000000000000000000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetFeatureBits_2() & 0b10000000000000000000000000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasAVX2()
|
bool CPU::RetrieveAVX2()
|
||||||
{
|
{
|
||||||
return GetExtFeatureBits_1() & 0b00000000000000000000000000100000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetExtFeatureBits_1() & 0b00000000000000000000000000100000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasRDSEED()
|
bool CPU::RetrieveAVX512F()
|
||||||
{
|
{
|
||||||
return GetExtFeatureBits_1() & 0b00000000000001000000000000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetExtFeatureBits_1() & 0b00000000000000010000000000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPU::HasADX()
|
bool CPU::RetrieveRDSEED()
|
||||||
{
|
{
|
||||||
return GetExtFeatureBits_1() & 0b00000000000010000000000000000000;
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetExtFeatureBits_1() & 0b00000000000001000000000000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CPU::RetrieveADX()
|
||||||
|
{
|
||||||
|
#ifdef EHS_ARCH_X64
|
||||||
|
return GetExtFeatureBits_1() & 0b00000000000010000000000000000000;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -2,10 +2,6 @@
|
|||||||
|
|
||||||
namespace ehs
|
namespace ehs
|
||||||
{
|
{
|
||||||
void CPU::RDTSCP(TSC* tsc)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void CPU::GetManufacturer(Char_8* input)
|
void CPU::GetManufacturer(Char_8* input)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
14
src/system/CPU_GCC_AARCH64.s
Normal file
14
src/system/CPU_GCC_AARCH64.s
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
.global _ZN3ehs3CPU6RDTSCPEPNS_3TSCE
|
||||||
|
.global _ZN3ehs3CPU20RetrieveFreq_AARCH64Ev
|
||||||
|
|
||||||
|
.section .text
|
||||||
|
_ZN3ehs3CPU6RDTSCPEPNS_3TSCE:
|
||||||
|
MRS X2, CNTVCT_EL0
|
||||||
|
EOR W1, W1, W1
|
||||||
|
STR W1, [X0]
|
||||||
|
STR X2, [X0, #4]
|
||||||
|
RET
|
||||||
|
|
||||||
|
_ZN3ehs3CPU20RetrieveFreq_AARCH64Ev:
|
||||||
|
MRS X0, CNTFRQ_EL0
|
||||||
|
RET
|
@ -13,13 +13,17 @@ namespace ehs
|
|||||||
|
|
||||||
system("xdg-open \"" + *uri + "\"");
|
system("xdg-open \"" + *uri + "\"");
|
||||||
|
|
||||||
|
delete uri;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void System::OpenURI(const Str_8& uri)
|
void System::OpenURI(Str_8 uri)
|
||||||
{
|
{
|
||||||
|
Str_8 *arg = new Str_8((Str_8&&)uri);
|
||||||
|
|
||||||
Thread xdg;
|
Thread xdg;
|
||||||
xdg.Start(XDG_Thread, (void*)&uri);
|
xdg.Start(XDG_Thread, arg);
|
||||||
xdg.Detach();
|
xdg.Detach();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
namespace ehs
|
namespace ehs
|
||||||
{
|
{
|
||||||
void System::OpenURI(const Str_8& uri)
|
void System::OpenURI(Str_8 uri)
|
||||||
{
|
{
|
||||||
ShellExecuteA(nullptr, "open", uri, nullptr, nullptr, SW_SHOW);
|
ShellExecuteA(nullptr, "open", uri, nullptr, nullptr, SW_SHOW);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user