To support openssl new feature
[platform/core/uifw/dali-adaptor.git] / dali / internal / imaging / common / file-download.h
1 #ifndef __DALI_TIZEN_PLATFORM_NETWORK_FILE_DOWNLOAD_H__
2 #define __DALI_TIZEN_PLATFORM_NETWORK_FILE_DOWNLOAD_H__
3
4 /*
5  * Copyright (c) 2018 Samsung Electronics Co., Ltd.
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  */
20
21 // EXTERNAL INCLUDES
22 #include <dali/public-api/common/dali-vector.h>
23 #include <string>
24 #include <mutex> //c++11
25 #include <stdint.h> // uint8
26 #include <openssl/crypto.h>
27
28 namespace Dali
29 {
30
31 namespace TizenPlatform
32 {
33
34 namespace Network
35 {
36
37 /**
38  * Set up the cURL environment - this will ensure curl_global_init is called on startup
39  * and curl_global_cleanup is called on shutdown.
40  * Having this environment enables curl to be used in a single or multi-threaded
41  * program safely.
42  */
43 class CurlEnvironment
44 {
45 public:
46   /**
47    * Constructor calls curl_global_init()
48    */
49   CurlEnvironment();
50
51   /**
52    * Destructor calls curl_global_cleanup()
53    */
54   ~CurlEnvironment();
55
56   // Moveable but not copyable
57
58   CurlEnvironment( const CurlEnvironment& ) = delete;
59   CurlEnvironment& operator=( const CurlEnvironment& ) = delete;
60   CurlEnvironment( CurlEnvironment&& ) = default;
61   CurlEnvironment& operator=( CurlEnvironment&& ) = default;
62
63   /**
64    * Locking function for libcurl with openssl
65    */
66   static void OnOpenSSLLocking( int mode, int n, const char* file, int line );
67
68   /**
69    * Gets thread id for libcurl with openssl
70    */
71   static void GetThreadId( CRYPTO_THREADID* tid );
72
73 private:
74
75   void SetLockingFunction();
76
77   void UnsetLockingFunction();
78
79   static std::mutex* mMutexs;
80 };
81
82
83 /**
84  * Download a requested file into a memory buffer.
85  *
86  * @note Threading notes: This function can be called from multiple threads, however
87  * we must explicitly call curl_global_init() from a single thread before using curl
88  * as the global function calls are not thread safe.
89  *
90  * @param[in] url The requested file url
91  * @param[out] dataBuffer  A memory buffer object to be written with downloaded file data.
92  * @param[out] dataSize  The size of the memory buffer.
93  * @param[in] maximumAllowedSize The maxmimum allowed file size in bytes to download. E.g. for an Image file this may be 50 MB
94  * @return true on success, false on failure
95  *
96  */
97 bool DownloadRemoteFileIntoMemory( const std::string& url,
98                                    Dali::Vector<uint8_t>& dataBuffer,
99                                    size_t& dataSize,
100                                    size_t maximumAllowedSizeBytes );
101
102 } // namespace Network
103
104 } // namespace TizenPlatform
105
106 } // namespace Dali
107
108 #endif // __DALI_TIZEN_PLATFORM_RESOURCE_THREAD_IMAGE_H__