1/*
2* Copyright 2010-2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
3*
4* Licensed under the Apache License, Version 2.0 (the "License").
5* You may not use this file except in compliance with the License.
6* A copy of the License is located at
7*
8* http://aws.amazon.com/apache2.0
9*
10* or in the "license" file accompanying this file. This file is distributed
11* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
12* express or implied. See the License for the specific language governing
13* permissions and limitations under the License.
14*/
15#include <aws/core/Version.h>
16#include <aws/core/utils/logging/LogMacros.h>
17#include <aws/core/Aws.h>
18#include <aws/core/client/CoreErrors.h>
19#include <aws/core/utils/logging/AWSLogging.h>
20#include <aws/core/utils/logging/DefaultLogSystem.h>
21#include <aws/core/Globals.h>
22#include <aws/core/external/cjson/cJSON.h>
23#include <aws/core/monitoring/MonitoringManager.h>
24#include <aws/core/net/Net.h>
25#include <aws/core/config/AWSProfileConfigLoader.h>
26
27namespace Aws
28{
29 static const char* ALLOCATION_TAG = "Aws_Init_Cleanup";
30
31 void InitAPI(const SDKOptions &options)
32 {
33#ifdef USE_AWS_MEMORY_MANAGEMENT
34 if(options.memoryManagementOptions.memoryManager)
35 {
36 Aws::Utils::Memory::InitializeAWSMemorySystem(*options.memoryManagementOptions.memoryManager);
37 }
38#endif // USE_AWS_MEMORY_MANAGEMENT
39 Aws::Client::CoreErrorsMapper::InitCoreErrorsMapper();
40 if(options.loggingOptions.logLevel != Aws::Utils::Logging::LogLevel::Off)
41 {
42 if(options.loggingOptions.logger_create_fn)
43 {
44 Aws::Utils::Logging::InitializeAWSLogging(options.loggingOptions.logger_create_fn());
45 }
46 else
47 {
48 Aws::Utils::Logging::InitializeAWSLogging(
49 Aws::MakeShared<Aws::Utils::Logging::DefaultLogSystem>(ALLOCATION_TAG, options.loggingOptions.logLevel, options.loggingOptions.defaultLogPrefix));
50 }
51 // For users to better debugging in case multiple versions of SDK installed
52 AWS_LOGSTREAM_INFO(ALLOCATION_TAG, "Initiate AWS SDK for C++ with Version:" << Aws::String(Aws::Version::GetVersionString()));
53 }
54
55 Aws::Config::InitConfigAndCredentialsCacheManager();
56
57 if (options.cryptoOptions.aes_CBCFactory_create_fn)
58 {
59 Aws::Utils::Crypto::SetAES_CBCFactory(options.cryptoOptions.aes_CBCFactory_create_fn());
60 }
61
62 if(options.cryptoOptions.aes_CTRFactory_create_fn)
63 {
64 Aws::Utils::Crypto::SetAES_CTRFactory(options.cryptoOptions.aes_CTRFactory_create_fn());
65 }
66
67 if(options.cryptoOptions.aes_GCMFactory_create_fn)
68 {
69 Aws::Utils::Crypto::SetAES_GCMFactory(options.cryptoOptions.aes_GCMFactory_create_fn());
70 }
71
72 if(options.cryptoOptions.md5Factory_create_fn)
73 {
74 Aws::Utils::Crypto::SetMD5Factory(options.cryptoOptions.md5Factory_create_fn());
75 }
76
77 if(options.cryptoOptions.sha256Factory_create_fn)
78 {
79 Aws::Utils::Crypto::SetSha256Factory(options.cryptoOptions.sha256Factory_create_fn());
80 }
81
82 if(options.cryptoOptions.sha256HMACFactory_create_fn)
83 {
84 Aws::Utils::Crypto::SetSha256HMACFactory(options.cryptoOptions.sha256HMACFactory_create_fn());
85 }
86
87 if (options.cryptoOptions.aes_KeyWrapFactory_create_fn)
88 {
89 Aws::Utils::Crypto::SetAES_KeyWrapFactory(options.cryptoOptions.aes_KeyWrapFactory_create_fn());
90 }
91
92 if(options.cryptoOptions.secureRandomFactory_create_fn)
93 {
94 Aws::Utils::Crypto::SetSecureRandomFactory(options.cryptoOptions.secureRandomFactory_create_fn());
95 }
96
97 Aws::Utils::Crypto::SetInitCleanupOpenSSLFlag(options.cryptoOptions.initAndCleanupOpenSSL);
98 Aws::Utils::Crypto::InitCrypto();
99
100 if(options.httpOptions.httpClientFactory_create_fn)
101 {
102 Aws::Http::SetHttpClientFactory(options.httpOptions.httpClientFactory_create_fn());
103 }
104
105 Aws::Http::SetInitCleanupCurlFlag(options.httpOptions.initAndCleanupCurl);
106 Aws::Http::SetInstallSigPipeHandlerFlag(options.httpOptions.installSigPipeHandler);
107 Aws::Http::InitHttp();
108 Aws::InitializeEnumOverflowContainer();
109 cJSON_Hooks hooks;
110 hooks.malloc_fn = [](size_t sz) { return Aws::Malloc("cJSON_Tag", sz); };
111 hooks.free_fn = Aws::Free;
112 cJSON_InitHooks(&hooks);
113 Aws::Net::InitNetwork();
114 Aws::Monitoring::InitMonitoring(options.monitoringOptions.customizedMonitoringFactory_create_fn);
115 }
116
117 void ShutdownAPI(const SDKOptions& options)
118 {
119 Aws::Monitoring::CleanupMonitoring();
120 Aws::Net::CleanupNetwork();
121 Aws::CleanupEnumOverflowContainer();
122 Aws::Http::CleanupHttp();
123 Aws::Utils::Crypto::CleanupCrypto();
124
125 Aws::Config::CleanupConfigAndCredentialsCacheManager();
126
127 if(options.loggingOptions.logLevel != Aws::Utils::Logging::LogLevel::Off)
128 {
129 Aws::Utils::Logging::ShutdownAWSLogging();
130 }
131
132 Aws::Client::CoreErrorsMapper::CleanupCoreErrorsMapper();
133
134#ifdef USE_AWS_MEMORY_MANAGEMENT
135 if(options.memoryManagementOptions.memoryManager)
136 {
137 Aws::Utils::Memory::ShutdownAWSMemorySystem();
138 }
139#endif // USE_AWS_MEMORY_MANAGEMENT
140 }
141}
142