Files
2026-02-28 12:32:28 -05:00

241 lines
9.9 KiB
C++

#pragma once
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
#include <aws/crt/Types.h>
#include <aws/crt/crypto/HMAC.h>
#include <aws/crt/crypto/Hash.h>
#include <aws/crt/mqtt/Mqtt5Client.h>
#include <aws/crt/mqtt/MqttClient.h>
#include <aws/common/logging.h>
namespace Aws
{
namespace Crt
{
/**
* Detail level control for logging output
*/
enum class LogLevel
{
None = AWS_LL_NONE,
Fatal = AWS_LL_FATAL,
Error = AWS_LL_ERROR,
Warn = AWS_LL_WARN,
Info = AWS_LL_INFO,
Debug = AWS_LL_DEBUG,
Trace = AWS_LL_TRACE,
Count
};
/**
* Should the API Handle destructor block on all shutdown/thread completion logic or not?
*/
enum class ApiHandleShutdownBehavior
{
Blocking,
NonBlocking
};
/**
* A singleton object representing the init/cleanup state of the entire CRT. It's invalid to have more than one
* active simultaneously and it's also invalid to use CRT functionality without one active.
*/
class AWS_CRT_CPP_API ApiHandle
{
public:
/**
* Customize the ApiAllocator(), which is be used by any objects
* constructed without an explicit allocator.
*/
ApiHandle(Allocator *allocator) noexcept;
ApiHandle() noexcept;
~ApiHandle();
ApiHandle(const ApiHandle &) = delete;
ApiHandle(ApiHandle &&) = delete;
ApiHandle &operator=(const ApiHandle &) = delete;
ApiHandle &operator=(ApiHandle &&) = delete;
/**
* Initialize logging in awscrt.
* @param level: Display messages of this importance and higher. LogLevel.NoLogs will disable
* logging.
* @param filename: Logging destination, a file path from the disk.
*/
void InitializeLogging(LogLevel level, const char *filename);
/**
* Initialize logging in awscrt.
* @param level: Display messages of this importance and higher. LogLevel.NoLogs will disable
* logging.
* @param fp: The FILE object for logging destination.
*/
void InitializeLogging(LogLevel level, FILE *fp);
/**
* Configures the shutdown behavior of the api handle instance
* @param behavior desired shutdown behavior
*/
void SetShutdownBehavior(ApiHandleShutdownBehavior behavior);
/**
* BYO_CRYPTO: set callback for creating MD5 hashes.
* If using BYO_CRYPTO, you must call this.
*/
void SetBYOCryptoNewMD5Callback(Crypto::CreateHashCallback &&callback);
/**
* BYO_CRYPTO: set callback for creating SHA256 hashes.
* If using BYO_CRYPTO, you must call this.
*/
void SetBYOCryptoNewSHA256Callback(Crypto::CreateHashCallback &&callback);
/**
* BYO_CRYPTO: set callback for creating SHA1 hashes.
* If using BYO_CRYPTO, you must call this.
*/
void SetBYOCryptoNewSHA1Callback(Crypto::CreateHashCallback &&callback);
/**
* BYO_CRYPTO: set callback for creating Streaming SHA256 HMAC objects.
* If using BYO_CRYPTO, you must call this.
*/
void SetBYOCryptoNewSHA256HMACCallback(Crypto::CreateHMACCallback &&callback);
/**
* BYO_CRYPTO: set callback for creating a ClientTlsChannelHandler.
* If using BYO_CRYPTO, you must call this prior to creating any client channels in the
* application.
*/
void SetBYOCryptoClientTlsCallback(Io::NewClientTlsHandlerCallback &&callback);
/**
* BYO_CRYPTO: set callbacks for the TlsContext.
* If using BYO_CRYPTO, you need to call this function prior to creating a TlsContext.
*
* @param newCallback Create custom implementation object, to be stored inside TlsContext.
* Return nullptr if failure occurs.
* @param deleteCallback Destroy object that was created by newCallback.
* @param alpnCallback Return whether ALPN is supported.
*/
void SetBYOCryptoTlsContextCallbacks(
Io::NewTlsContextImplCallback &&newCallback,
Io::DeleteTlsContextImplCallback &&deleteCallback,
Io::IsTlsAlpnSupportedCallback &&alpnCallback);
/// @private
static const Io::NewTlsContextImplCallback &GetBYOCryptoNewTlsContextImplCallback();
/// @private
static const Io::DeleteTlsContextImplCallback &GetBYOCryptoDeleteTlsContextImplCallback();
/// @private
static const Io::IsTlsAlpnSupportedCallback &GetBYOCryptoIsTlsAlpnSupportedCallback();
/**
* Gets the static default ClientBootstrap, creating it if necessary.
*
* This default will be used when a ClientBootstrap is not explicitly passed but is needed
* to allow the process to function. An example of this would be in the MQTT connection creation workflow.
* The default ClientBootstrap will use the default EventLoopGroup and HostResolver, creating them if
* necessary.
*
* The default ClientBootstrap will be automatically managed and released by the API handle when it's
* resources are being freed, not requiring any manual memory management.
*
* @return ClientBootstrap* A pointer to the static default ClientBootstrap
*/
static Io::ClientBootstrap *GetOrCreateStaticDefaultClientBootstrap();
/**
* Gets the static default EventLoopGroup, creating it if necessary.
*
* This default will be used when a EventLoopGroup is not explicitly passed but is needed
* to allow the process to function. An example of this would be in the MQTT connection creation workflow.
*
* The EventLoopGroup will automatically pick a default number of threads based on the system. You can
* manually adjust the number of threads being used by creating a EventLoopGroup and passing it through
* the SetDefaultEventLoopGroup function.
*
* The default EventLoopGroup will be automatically managed and released by the API handle when it's
* resources are being freed, not requiring any manual memory management.
*
* @return EventLoopGroup* A pointer to the static default EventLoopGroup
*/
static Io::EventLoopGroup *GetOrCreateStaticDefaultEventLoopGroup();
/**
* Gets the static default HostResolver, creating it if necessary.
*
* This default will be used when a HostResolver is not explicitly passed but is needed
* to allow the process to function. An example of this would be in the MQTT connection creation workflow.
*
* The HostResolver will be set to have a maximum of 8 entries by default. You can
* manually adjust the maximum number of entries being used by creating a HostResolver and passing it
* through the SetDefaultEventLoopGroup function.
*
* The default HostResolver will be automatically managed and released by the API handle when it's
* resources are being freed, not requiring any manual memory management.
*
* @return HostResolver* A pointer to the static default HostResolver
*/
static Io::HostResolver *GetOrCreateStaticDefaultHostResolver();
#pragma pack(push, 1)
struct Version
{
uint16_t major;
uint16_t minor;
uint16_t patch;
};
#pragma pack(pop)
/**
* Gets the version of the AWS-CRT-CPP library
* @return Version representing the library version
*/
Version GetCrtVersion() const;
private:
void InitializeLoggingCommon(struct aws_logger_standard_options &options);
aws_logger m_logger;
ApiHandleShutdownBehavior m_shutdownBehavior;
static Io::ClientBootstrap *s_static_bootstrap;
static std::mutex s_lock_client_bootstrap;
static void ReleaseStaticDefaultClientBootstrap();
static Io::EventLoopGroup *s_static_event_loop_group;
static std::mutex s_lock_event_loop_group;
static void ReleaseStaticDefaultEventLoopGroup();
static int s_host_resolver_default_max_hosts;
static Io::HostResolver *s_static_default_host_resolver;
static std::mutex s_lock_default_host_resolver;
static void ReleaseStaticDefaultHostResolver();
Version m_version = {0, 0, 0};
};
/**
* Gets a string description of a CRT error code
* @param error error code to get a descriptive string for
* @return a string description of the error code
*/
AWS_CRT_CPP_API const char *ErrorDebugString(int error) noexcept;
/**
* @return the value of the last aws error on the current thread. Return 0 if no aws-error raised before.
*/
AWS_CRT_CPP_API int LastError() noexcept;
/**
* @return the value of the last aws error on the current thread. Return AWS_ERROR_UNKNOWN, if no aws-error
* raised before.
*/
AWS_CRT_CPP_API int LastErrorOrUnknown() noexcept;
} // namespace Crt
} // namespace Aws