It's not possible to easily switch between the TLS and non-TLS

websocketpp clients because they don't share a common base type. Added
RawWebSocketClient to wrap this annoying difference.
This commit is contained in:
casey langen 2020-10-17 18:15:11 -07:00
parent 45ac21508b
commit ed0da3155d
7 changed files with 274 additions and 36 deletions

View File

@ -260,6 +260,7 @@
<ObjectFileName>$(IntDir)</ObjectFileName>
<ProgramDataBaseFileName>$(IntDir)$(ProjectName).pdb</ProgramDataBaseFileName>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug-DLL|Win32'">
@ -278,6 +279,7 @@
<ObjectFileName>$(IntDir)</ObjectFileName>
<ProgramDataBaseFileName>$(IntDir)$(ProjectName).pdb</ProgramDataBaseFileName>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<AdditionalDependencies>libcurl.lib;libssl-1_1.lib;libcrypto-1_1.lib;%(AdditionalDependencies)</AdditionalDependencies>
@ -300,6 +302,7 @@
<ObjectFileName>$(IntDir)</ObjectFileName>
<ProgramDataBaseFileName>$(IntDir)$(ProjectName).pdb</ProgramDataBaseFileName>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
@ -317,6 +320,7 @@
<ObjectFileName>$(IntDir)</ObjectFileName>
<ProgramDataBaseFileName>$(IntDir)$(ProjectName).pdb</ProgramDataBaseFileName>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug-DLL|x64'">
@ -334,6 +338,7 @@
<ObjectFileName>$(IntDir)</ObjectFileName>
<ProgramDataBaseFileName>$(IntDir)$(ProjectName).pdb</ProgramDataBaseFileName>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<AdditionalDependencies>libcurl.lib;libssl-1_1.lib;libcrypto-1_1.lib;%(AdditionalDependencies)</AdditionalDependencies>
@ -355,6 +360,7 @@
<ObjectFileName>$(IntDir)</ObjectFileName>
<ProgramDataBaseFileName>$(IntDir)$(ProjectName).pdb</ProgramDataBaseFileName>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@ -374,6 +380,7 @@
<FunctionLevelLinking>true</FunctionLevelLinking>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
<ExceptionHandling>Sync</ExceptionHandling>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release-DLL|Win32'">
@ -393,6 +400,7 @@
<FunctionLevelLinking>true</FunctionLevelLinking>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
<ExceptionHandling>Sync</ExceptionHandling>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<AdditionalDependencies>libcurl.lib;libssl-1_1.lib;libcrypto-1_1.lib;%(AdditionalDependencies)</AdditionalDependencies>
@ -416,6 +424,7 @@
<FunctionLevelLinking>true</FunctionLevelLinking>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
<ExceptionHandling>Sync</ExceptionHandling>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
@ -435,6 +444,7 @@
<FunctionLevelLinking>true</FunctionLevelLinking>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
<ExceptionHandling>Sync</ExceptionHandling>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release-DLL|x64'">
@ -454,6 +464,7 @@
<FunctionLevelLinking>true</FunctionLevelLinking>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
<ExceptionHandling>Sync</ExceptionHandling>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<AdditionalDependencies>libcurl.lib;libssl-1_1.lib;libcrypto-1_1.lib;%(AdditionalDependencies)</AdditionalDependencies>
@ -477,6 +488,7 @@
<FunctionLevelLinking>true</FunctionLevelLinking>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
<ExceptionHandling>Sync</ExceptionHandling>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
</ItemDefinitionGroup>
<ItemGroup>
@ -526,6 +538,7 @@
<ClCompile Include="library\track\LibraryTrack.cpp" />
<ClCompile Include="library\track\Track.cpp" />
<ClCompile Include="library\track\TrackList.cpp" />
<ClCompile Include="net\RawWebSocketClient.cpp" />
<ClCompile Include="net\WebSocketClient.cpp" />
<ClCompile Include="pch.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
@ -616,6 +629,7 @@
<ClInclude Include="library\track\Track.h" />
<ClInclude Include="library\track\TrackList.h" />
<ClInclude Include="musikcore_c.h" />
<ClInclude Include="net\RawWebSocketClient.h" />
<ClInclude Include="net\WebSocketClient.h" />
<ClInclude Include="pch.hpp" />
<ClInclude Include="config.h" />

View File

@ -259,6 +259,9 @@
<ClCompile Include="library\MasterLibrary.cpp">
<Filter>src\library</Filter>
</ClCompile>
<ClCompile Include="net\RawWebSocketClient.cpp">
<Filter>src\net</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="pch.hpp">
@ -636,5 +639,8 @@
<ClInclude Include="version.h">
<Filter>src</Filter>
</ClInclude>
<ClInclude Include="net\RawWebSocketClient.h">
<Filter>src\net</Filter>
</ClInclude>
</ItemGroup>
</Project>

View File

@ -0,0 +1,134 @@
//////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2004-2020 musikcube team
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// * Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// * Neither the name of the author nor the names of other contributors may
// be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
//
//////////////////////////////////////////////////////////////////////////////
#include "pch.hpp"
#include <musikcore/net/RawWebSocketClient.h>
using namespace musik::core;
using namespace musik::core::net;
static inline RawWebSocketClient::SslContext createSslContext() {
RawWebSocketClient::SslContext ctx =
std::make_shared<boost::asio::ssl::context>(boost::asio::ssl::context::sslv23);
try {
ctx->set_options(boost::asio::ssl::context::default_workarounds |
boost::asio::ssl::context::no_sslv2 |
boost::asio::ssl::context::no_sslv3 |
boost::asio::ssl::context::single_dh_use |
boost::asio::ssl::context::verify_none);
}
catch (std::exception& e) {
std::cerr << "Error in context pointer: " << e.what() << std::endl;
}
return ctx;
}
RawWebSocketClient::RawWebSocketClient(boost::asio::io_service& io) {
websocketpp::lib::error_code ec;
plainTextClient = std::make_unique<PlainTextClient>();
plainTextClient->clear_access_channels(websocketpp::log::alevel::all);
plainTextClient->init_asio(&io, ec);
tlsClient = std::make_unique<TlsClient>();
tlsClient->clear_access_channels(websocketpp::log::alevel::all);
tlsClient->init_asio(&io, ec);
tlsClient->set_tls_init_handler([](Connection connection) -> SslContext {
return createSslContext();
});
}
RawWebSocketClient::~RawWebSocketClient() {
}
void RawWebSocketClient::SetMode(Mode mode) {
this->mode = mode;
}
void RawWebSocketClient::SetOpenHandler(OpenHandler openHandler) {
this->plainTextClient->set_open_handler(openHandler);
this->tlsClient->set_open_handler(openHandler);
}
void RawWebSocketClient::SetFailHandler(FailHandler failHandler) {
this->plainTextClient->set_fail_handler(failHandler);
this->tlsClient->set_fail_handler(failHandler);
}
void RawWebSocketClient::SetMessageHandler(MessageHandler messageHandler) {
this->plainTextClient->set_message_handler(messageHandler);
this->tlsClient->set_message_handler(messageHandler);
}
void RawWebSocketClient::SetCloseHandler(CloseHandler closeHandler) {
this->plainTextClient->set_close_handler(closeHandler);
this->tlsClient->set_close_handler(closeHandler);
}
void RawWebSocketClient::Send(Connection connection, const std::string& message) {
if (mode == Mode::PlainText) {
this->plainTextClient->send(connection, message, websocketpp::frame::opcode::text);
}
else if (mode == Mode::TLS) {
this->tlsClient->send(connection, message, websocketpp::frame::opcode::text);
}
}
void RawWebSocketClient::SetPongTimeout(long timeoutMs) {
this->plainTextClient->set_pong_timeout(timeoutMs);
this->tlsClient->set_pong_timeout(timeoutMs);
}
void RawWebSocketClient::Connect(const std::string& uri) {
websocketpp::lib::error_code ec;
if (mode == Mode::PlainText) {
PlainTextClient::connection_ptr connection = plainTextClient->get_connection(uri, ec);
plainTextClient->connect(connection);
}
else if (mode == Mode::TLS) {
TlsClient::connection_ptr connection = tlsClient->get_connection(uri, ec);
tlsClient->connect(connection);
}
}
void RawWebSocketClient::Run() {
if (mode == Mode::PlainText) {
plainTextClient->run();
}
else if (mode == Mode::TLS) {
tlsClient->run();
}
}

View File

@ -0,0 +1,89 @@
//////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2004-2020 musikcube team
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// * Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// * Neither the name of the author nor the names of other contributors may
// be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
//
//////////////////////////////////////////////////////////////////////////////
#pragma once
#include <musikcore/config.h>
#include <websocketpp/config/asio_no_tls_client.hpp>
#include <websocketpp/config/asio_client.hpp>
#include <websocketpp/client.hpp>
#include <atomic>
#include <memory>
#include <functional>
namespace musik { namespace core { namespace net {
class RawWebSocketClient {
public:
using PlainTextClient = websocketpp::client<websocketpp::config::asio_client>;
using PlainTextClientPtr = std::unique_ptr<PlainTextClient>;
using TlsClient = websocketpp::client<websocketpp::config::asio_tls_client>;
using TlsClientPtr = std::unique_ptr<TlsClient>;
using SslContext = std::shared_ptr<boost::asio::ssl::context>;
using Message = websocketpp::config::asio_client::message_type::ptr;
using Connection = websocketpp::connection_hdl;
using OpenHandler = std::function<void(Connection)>;
using FailHandler = std::function<void(Connection)>;
using MessageHandler = std::function<void(Connection, Message)>;
using CloseHandler = std::function<void(Connection)>;
enum class Mode: int {
PlainText = 0,
TLS = 1
};
RawWebSocketClient(boost::asio::io_service& io);
RawWebSocketClient(const RawWebSocketClient&) = delete;
~RawWebSocketClient();
void SetMode(Mode mode);
void SetOpenHandler(OpenHandler openHandler);
void SetFailHandler(FailHandler failHandler);
void SetMessageHandler(MessageHandler messageHandler);
void SetCloseHandler(CloseHandler closeHandler);
void Send(Connection connection, const std::string& message);
void SetPongTimeout(long timeoutMs);
void Connect(const std::string& uri);
void Run();
private:
Mode mode;
TlsClientPtr tlsClient;
PlainTextClientPtr plainTextClient;
};
} } }

View File

@ -43,7 +43,6 @@
using namespace musik::core;
using namespace musik::core::net;
using Client = WebSocketClient::Client;
using ClientPtr = WebSocketClient::ClientPtr;
using Message = WebSocketClient::Message;
using Connection = WebSocketClient::Connection;
@ -93,30 +92,23 @@ static inline bool extractRawQueryResult(
}
WebSocketClient::WebSocketClient(Listener* listener) {
client = std::make_unique<Client>();
#if 1
client->clear_access_channels(websocketpp::log::alevel::all);
#endif
rawClient = std::make_unique<RawWebSocketClient>(io);
this->listener = listener;
websocketpp::lib::error_code ec;
client->init_asio(&io, ec);
rawClient->SetMode(RawWebSocketClient::Mode::TLS);
client->set_open_handler([this](Connection connection) {
rawClient->SetOpenHandler([this](Connection connection) {
this->SetState(State::Authenticating);
this->client->send(
connection,
createAuthenticateRequest(this->password),
websocketpp::frame::opcode::text);
this->rawClient->Send(
connection, createAuthenticateRequest(this->password));
});
client->set_fail_handler([this](Connection connection) {
rawClient->SetFailHandler([this](Connection connection) {
this->SetDisconnected(ConnectionError::ConnectionFailed);
});
client->set_message_handler([this](Connection connection, Message message) {
rawClient->SetMessageHandler([this](Connection connection, Message message) {
nlohmann::json responseJson = nlohmann::json::parse(message->get_payload());
auto name = responseJson["name"].get<std::string>();
auto messageId = responseJson["id"].get<std::string>();
@ -156,7 +148,7 @@ WebSocketClient::WebSocketClient(Listener* listener) {
}
});
client->set_close_handler([this](Connection connection) {
rawClient->SetCloseHandler([this](Connection connection) {
if (this->state == State::Authenticating) {
this->SetDisconnected(ConnectionError::InvalidPassword);
this->listener->OnClientInvalidPassword(this);
@ -171,7 +163,7 @@ WebSocketClient::~WebSocketClient() {
this->Disconnect();
/* need to ensure this is destroyed before the io_service, hence
wrapping it in a unique_ptr and explicitly resetting it here. */
this->client.reset();
this->rawClient.reset();
}
WebSocketClient::ConnectionError WebSocketClient::LastConnectionError() const {
@ -204,10 +196,9 @@ std::string WebSocketClient::EnqueueQuery(Query query) {
auto messageId = generateMessageId();
messageIdToQuery[messageId] = query;
if (this->state == State::Connected) {
this->client->send(
this->rawClient->Send(
this->connection,
createSendRawQueryRequest(query->SerializeQuery(), messageId),
websocketpp::frame::opcode::text);
createSendRawQueryRequest(query->SerializeQuery(), messageId));
}
return messageId;
}
@ -248,10 +239,9 @@ void WebSocketClient::Reconnect() {
if (uri.size()) {
websocketpp::lib::error_code ec;
Client::connection_ptr connection = client->get_connection(this->uri, ec);
client->set_pong_timeout(timeout);
client->connect(connection);
client->run();
rawClient->SetPongTimeout(timeout);
rawClient->Connect(uri);
rawClient->Run();
}
this->SetState(State::Disconnected);
@ -290,10 +280,9 @@ void WebSocketClient::SendPendingQueries() {
for (auto& kv : this->messageIdToQuery) {
auto messageId = kv.first;
auto query = kv.second;
this->client->send(
this->rawClient->Send(
this->connection,
createSendRawQueryRequest(query->SerializeQuery(), messageId),
websocketpp::frame::opcode::text);
createSendRawQueryRequest(query->SerializeQuery(), messageId));
}
}

View File

@ -35,10 +35,8 @@
#pragma once
#include <musikcore/config.h>
#include <musikcore/net/RawWebSocketClient.h>
#include <musikcore/library/IQuery.h>
#include <websocketpp/config/asio_no_tls_client.hpp>
#include <websocketpp/config/asio_client.hpp>
#include <websocketpp/client.hpp>
#include <thread>
#include <unordered_map>
#include <atomic>
@ -48,11 +46,7 @@ namespace musik { namespace core { namespace net {
class WebSocketClient {
public:
using Client = websocketpp::client<websocketpp::config::asio_client>;
using ClientPtr = std::unique_ptr<Client>;
using SslClient = websocketpp::client<websocketpp::config::asio_tls_client>;
using SslClientPtr = std::unique_ptr<SslClient>;
using SslContext = std::shared_ptr<boost::asio::ssl::context>;
using ClientPtr = std::unique_ptr<RawWebSocketClient>;
using Message = websocketpp::config::asio_client::message_type::ptr;
using Connection = websocketpp::connection_hdl;
using Query = std::shared_ptr<musik::core::db::ISerializableQuery>;
@ -111,7 +105,7 @@ namespace musik { namespace core { namespace net {
void SendPendingQueries();
void SetDisconnected(ConnectionError errorCode);
ClientPtr client;
ClientPtr rawClient;
Connection connection;
boost::asio::io_service io;
std::shared_ptr<std::thread> thread;

View File

@ -292,6 +292,7 @@
<ObjectFileName>$(IntDir)</ObjectFileName>
<ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<AdditionalLibraryDirectories>../../../boost_1_74_0/lib32-msvc-14.2;../3rdparty/bin/win32/lib;../3rdparty/bin/win32/lib/debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
@ -333,6 +334,7 @@ xcopy "$(SolutionDir)src\3rdparty\bin\win\font\*.ttf" "$(TargetDir)fonts\" /Y /e
<ObjectFileName>$(IntDir)</ObjectFileName>
<ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<AdditionalLibraryDirectories>../../../boost_1_74_0/lib32-msvc-14.2;../3rdparty/bin/win32/lib;../3rdparty/bin/win32/lib/debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
@ -374,6 +376,7 @@ xcopy "$(SolutionDir)src\3rdparty\bin\win\font\*.ttf" "$(TargetDir)fonts\" /Y /e
<ObjectFileName>$(IntDir)</ObjectFileName>
<ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<AdditionalLibraryDirectories>../../../boost_1_74_0/lib32-msvc-14.2;../3rdparty/bin/win32/lib;../3rdparty/bin/win32/lib/debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
@ -414,6 +417,7 @@ xcopy "$(SolutionDir)src\3rdparty\bin\win\font\*.ttf" "$(TargetDir)fonts\" /Y /e
<ObjectFileName>$(IntDir)</ObjectFileName>
<ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<AdditionalLibraryDirectories>../../../boost_1_74_0/lib64-msvc-14.2;../3rdparty/bin/win64/lib;../3rdparty/bin/win64/lib/debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
@ -453,6 +457,7 @@ xcopy "$(SolutionDir)src\3rdparty\bin\win\font\*.ttf" "$(TargetDir)fonts\" /Y /e
<ObjectFileName>$(IntDir)</ObjectFileName>
<ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<AdditionalLibraryDirectories>../../../boost_1_74_0/lib64-msvc-14.2;../3rdparty/bin/win64/lib;../3rdparty/bin/win64/lib/debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
@ -492,6 +497,7 @@ xcopy "$(SolutionDir)src\3rdparty\bin\win\font\*.ttf" "$(TargetDir)fonts\" /Y /e
<ObjectFileName>$(IntDir)</ObjectFileName>
<ProgramDataBaseFileName>$(IntDir)vc$(PlatformToolsetVersion).pdb</ProgramDataBaseFileName>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<AdditionalLibraryDirectories>../../../boost_1_74_0/lib64-msvc-14.2;../3rdparty/bin/win64/lib;../3rdparty/bin/win64/lib/debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
@ -534,6 +540,7 @@ xcopy "$(SolutionDir)src\3rdparty\bin\win\font\*.ttf" "$(TargetDir)fonts\" /Y /e
<IntrinsicFunctions>true</IntrinsicFunctions>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
<ExceptionHandling>Sync</ExceptionHandling>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<AdditionalLibraryDirectories>../../../boost_1_74_0/lib32-msvc-14.2;../3rdparty/bin/win32/lib;../3rdparty/bin/win32/lib/release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
@ -581,6 +588,7 @@ xcopy "$(SolutionDir)src\3rdparty\bin\win\font\*.ttf" "$(TargetDir)fonts\" /Y /e
<IntrinsicFunctions>true</IntrinsicFunctions>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
<ExceptionHandling>Sync</ExceptionHandling>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<AdditionalLibraryDirectories>../../../boost_1_74_0/lib32-msvc-14.2;../3rdparty/bin/win32/lib;../3rdparty/bin/win32/lib/release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
@ -628,6 +636,7 @@ xcopy "$(SolutionDir)src\3rdparty\bin\win\font\*.ttf" "$(TargetDir)fonts\" /Y /e
<IntrinsicFunctions>true</IntrinsicFunctions>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
<ExceptionHandling>Sync</ExceptionHandling>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<AdditionalLibraryDirectories>../../../boost_1_74_0/lib32-msvc-14.2;../3rdparty/bin/win32/lib;../3rdparty/bin/win32/lib/release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
@ -675,6 +684,7 @@ xcopy "$(SolutionDir)src\3rdparty\bin\win\font\*.ttf" "$(TargetDir)fonts\" /Y /e
<IntrinsicFunctions>true</IntrinsicFunctions>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
<ExceptionHandling>Sync</ExceptionHandling>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<AdditionalLibraryDirectories>../../../boost_1_74_0/lib64-msvc-14.2;../3rdparty/bin/win64/lib;../3rdparty/bin/win64/lib/release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
@ -721,6 +731,7 @@ xcopy "$(SolutionDir)src\3rdparty\bin\win\font\*.ttf" "$(TargetDir)fonts\" /Y /e
<IntrinsicFunctions>true</IntrinsicFunctions>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
<ExceptionHandling>Sync</ExceptionHandling>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<AdditionalLibraryDirectories>../../../boost_1_74_0/lib64-msvc-14.2;../3rdparty/bin/win64/lib;../3rdparty/bin/win64/lib/release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
@ -767,6 +778,7 @@ xcopy "$(SolutionDir)src\3rdparty\bin\win\font\*.ttf" "$(TargetDir)fonts\" /Y /e
<IntrinsicFunctions>true</IntrinsicFunctions>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
<ExceptionHandling>Sync</ExceptionHandling>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Link>
<AdditionalLibraryDirectories>../../../boost_1_74_0/lib64-msvc-14.2;../3rdparty/bin/win64/lib;../3rdparty/bin/win64/lib/release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>