Skip to content

Commit 98b995a

Browse files
Add NetworkOffline for offline environment (#1470)
There are cases where device want to rely on the offline data only or even want to completely avoid network related libs like libcurl and libssl. Relates-To: OLPEDGE-2861 Signed-off-by: Rustam Gamidov <ext-rustam.gamidov@here.com>
1 parent 2e70b67 commit 98b995a

File tree

6 files changed

+219
-39
lines changed

6 files changed

+219
-39
lines changed

CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright (C) 2019-2021 HERE Europe B.V.
1+
# Copyright (C) 2019-2024 HERE Europe B.V.
22
#
33
# Licensed under the Apache License, Version 2.0 (the "License");
44
# you may not use this file except in compliance with the License.
@@ -46,6 +46,7 @@ option(OLP_SDK_ENABLE_DEFAULT_CACHE "Enable default cache implementation based o
4646
option(OLP_SDK_ENABLE_DEFAULT_CACHE_LMDB "Enable default cache implementation based on LMDB" OFF)
4747
option(OLP_SDK_ENABLE_ANDROID_CURL "Enable curl based network layer for Android" OFF)
4848
option(OLP_SDK_ENABLE_IOS_BACKGROUND_DOWNLOAD "Enable iOS network layer downloading in background. Under testing." OFF)
49+
option(OLP_SDK_ENABLE_OFFLINE_MODE "Enable offline mode. Network layer is excluded from the build and all network requests returned with error." OFF)
4950

5051
# C++ standard version. Minimum supported version is 11.
5152
set(CMAKE_CXX_STANDARD 11)

olp-cpp-sdk-core/CMakeLists.txt

Lines changed: 44 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright (C) 2019-2023 HERE Europe B.V.
1+
# Copyright (C) 2019-2024 HERE Europe B.V.
22
#
33
# Licensed under the Apache License, Version 2.0 (the "License");
44
# you may not use this file except in compliance with the License.
@@ -39,7 +39,7 @@ include(cmake/CompileChecks.cmake)
3939

4040
porting_do_checks()
4141

42-
if(IOS OR (WIN32 AND NOT MINGW))
42+
if(OLP_SDK_ENABLE_OFFLINE_MODE OR IOS OR (WIN32 AND NOT MINGW))
4343
set(NETWORK_NO_CURL ON)
4444
elseif(ANDROID)
4545
if(OLP_SDK_ENABLE_ANDROID_CURL)
@@ -56,10 +56,14 @@ endif()
5656

5757
set(Network_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
5858

59-
include(cmake/curl.cmake)
60-
include(cmake/winhttp.cmake)
61-
include(cmake/android.cmake)
62-
include(cmake/ios.cmake)
59+
if(OLP_SDK_ENABLE_OFFLINE_MODE)
60+
include(cmake/offline.cmake)
61+
else()
62+
include(cmake/curl.cmake)
63+
include(cmake/winhttp.cmake)
64+
include(cmake/android.cmake)
65+
include(cmake/ios.cmake)
66+
endif()
6367

6468
set(OLP_SDK_CACHE_HEADERS
6569
./include/olp/core/cache/CacheSettings.h
@@ -299,41 +303,46 @@ set(OLP_SDK_PLATFORM_SOURCES
299303
./src/context/ContextInternal.h
300304
)
301305

302-
if (ANDROID)
303-
# http network Android implementation:
304-
set(OLP_SDK_HTTP_ANDROID_SOURCES
305-
./src/http/android/NetworkAndroid.h
306-
./src/http/android/NetworkAndroid.cpp
307-
./src/http/android/utils/JNIThreadBinder.h
308-
./src/http/android/utils/JNIScopedLocalReference.h
309-
)
306+
if (NOT OLP_SDK_ENABLE_OFFLINE_MODE)
307+
if (ANDROID)
308+
# http network Android implementation:
309+
set(OLP_SDK_HTTP_ANDROID_SOURCES
310+
./src/http/android/NetworkAndroid.h
311+
./src/http/android/NetworkAndroid.cpp
312+
./src/http/android/utils/JNIThreadBinder.h
313+
./src/http/android/utils/JNIScopedLocalReference.h
314+
)
310315

311-
set(OLP_SDK_HTTP_SOURCES ${OLP_SDK_HTTP_SOURCES} ${OLP_SDK_HTTP_ANDROID_SOURCES})
312-
set(OLP_SDK_DEFAULT_NETWORK_DEFINITION OLP_SDK_NETWORK_HAS_ANDROID)
313-
endif()
316+
set(OLP_SDK_HTTP_SOURCES ${OLP_SDK_HTTP_SOURCES} ${OLP_SDK_HTTP_ANDROID_SOURCES})
317+
set(OLP_SDK_DEFAULT_NETWORK_DEFINITION OLP_SDK_NETWORK_HAS_ANDROID)
318+
endif()
314319

315-
if (UNIX AND (NOT ANDROID OR OLP_SDK_ENABLE_ANDROID_CURL))
316-
set(OLP_SDK_HTTP_SOURCES ${OLP_SDK_HTTP_SOURCES} ${OLP_SDK_HTTP_CURL_SOURCES})
320+
if (UNIX AND (NOT ANDROID OR OLP_SDK_ENABLE_ANDROID_CURL))
321+
set(OLP_SDK_HTTP_SOURCES ${OLP_SDK_HTTP_SOURCES} ${OLP_SDK_HTTP_CURL_SOURCES})
317322

318-
set(OLP_SDK_DEFAULT_NETWORK_DEFINITION OLP_SDK_NETWORK_HAS_CURL)
319-
endif()
323+
set(OLP_SDK_DEFAULT_NETWORK_DEFINITION OLP_SDK_NETWORK_HAS_CURL)
324+
endif()
320325

321-
if (IOS)
322-
set(OLP_SDK_HTTP_SOURCES ${OLP_SDK_HTTP_SOURCES} ${OLP_SDK_HTTP_IOS_SOURCES})
323-
set(OLP_SDK_PLATFORM_HEADERS ${OLP_SDK_PLATFORM_HEADERS} ${OLP_SDK_PLATFORM_IOS_HEADERS})
324-
set(OLP_SDK_PLATFORM_SOURCES ${OLP_SDK_PLATFORM_SOURCES} ${OLP_SDK_PLATFORM_IOS_SOURCES})
326+
if (IOS)
327+
set(OLP_SDK_HTTP_SOURCES ${OLP_SDK_HTTP_SOURCES} ${OLP_SDK_HTTP_IOS_SOURCES})
328+
set(OLP_SDK_PLATFORM_HEADERS ${OLP_SDK_PLATFORM_HEADERS} ${OLP_SDK_PLATFORM_IOS_HEADERS})
329+
set(OLP_SDK_PLATFORM_SOURCES ${OLP_SDK_PLATFORM_SOURCES} ${OLP_SDK_PLATFORM_IOS_SOURCES})
325330

326-
set(OLP_SDK_DEFAULT_NETWORK_DEFINITION OLP_SDK_NETWORK_HAS_IOS)
327-
endif()
331+
set(OLP_SDK_DEFAULT_NETWORK_DEFINITION OLP_SDK_NETWORK_HAS_IOS)
332+
endif()
328333

329-
if (WIN32)
330-
if (MINGW)
331-
set(OLP_SDK_HTTP_SOURCES ${OLP_SDK_HTTP_SOURCES} ${OLP_SDK_HTTP_CURL_SOURCES})
332-
set(OLP_SDK_DEFAULT_NETWORK_DEFINITION OLP_SDK_NETWORK_HAS_CURL)
333-
else()
334-
set(OLP_SDK_HTTP_SOURCES ${OLP_SDK_HTTP_SOURCES} ${OLP_SDK_HTTP_WIN_SOURCES})
335-
set(OLP_SDK_DEFAULT_NETWORK_DEFINITION OLP_SDK_NETWORK_HAS_WINHTTP)
334+
if (WIN32)
335+
if (MINGW)
336+
set(OLP_SDK_HTTP_SOURCES ${OLP_SDK_HTTP_SOURCES} ${OLP_SDK_HTTP_CURL_SOURCES})
337+
set(OLP_SDK_DEFAULT_NETWORK_DEFINITION OLP_SDK_NETWORK_HAS_CURL)
338+
else()
339+
set(OLP_SDK_HTTP_SOURCES ${OLP_SDK_HTTP_SOURCES} ${OLP_SDK_HTTP_WIN_SOURCES})
340+
set(OLP_SDK_DEFAULT_NETWORK_DEFINITION OLP_SDK_NETWORK_HAS_WINHTTP)
341+
endif()
336342
endif()
343+
else()
344+
set(OLP_SDK_HTTP_SOURCES ${OLP_SDK_HTTP_SOURCES} ${OLP_SDK_HTTP_OFFLINE_SOURCES})
345+
set(OLP_SDK_DEFAULT_NETWORK_DEFINITION OLP_SDK_NETWORK_OFFLINE)
337346
endif()
338347

339348
set(OLP_SDK_UTILS_SOURCES
@@ -509,7 +518,7 @@ if(IOS)
509518
target_link_libraries(${PROJECT_NAME} PRIVATE ${OLP_SDK_CORE_FOUNDATION_FRAMEWORK}
510519
${OLP_SDK_SECURITY_FRAMEWORK}
511520
${OLP_SDK_CFNETWORK_FRAMEWORK})
512-
elseif(ANDROID AND NOT OLP_SDK_ENABLE_ANDROID_CURL)
521+
elseif(ANDROID AND NOT OLP_SDK_ENABLE_ANDROID_CURL AND NOT OLP_SDK_ENABLE_OFFLINE_MODE)
513522
# Make sure that OlpHttpClient.jar is built before olp-cpp-sdk-core
514523
add_dependencies(${PROJECT_NAME} ${OLP_SDK_ANDROID_HTTP_CLIENT_JAR})
515524
endif()

olp-cpp-sdk-core/cmake/offline.cmake

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# Copyright (C) 2024 HERE Europe B.V.
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
#
15+
# SPDX-License-Identifier: Apache-2.0
16+
# License-Filename: LICENSE
17+
18+
19+
set(OLP_SDK_HTTP_OFFLINE_SOURCES
20+
"${CMAKE_CURRENT_LIST_DIR}/../src/http/offline/NetworkOffline.cpp"
21+
"${CMAKE_CURRENT_LIST_DIR}/../src/http/offline/NetworkOffline.h"
22+
)
23+
24+
add_definitions(-DOLP_SDK_NETWORK_OFFLINE)

olp-cpp-sdk-core/src/http/Network.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2019-2023 HERE Europe B.V.
2+
* Copyright (C) 2019-2024 HERE Europe B.V.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -22,7 +22,9 @@
2222
#include "http/DefaultNetwork.h"
2323
#include "olp/core/utils/WarningWorkarounds.h"
2424

25-
#ifdef OLP_SDK_NETWORK_HAS_CURL
25+
#ifdef OLP_SDK_NETWORK_OFFLINE
26+
#include "offline/NetworkOffline.h"
27+
#elif OLP_SDK_NETWORK_HAS_CURL
2628
#include "curl/NetworkCurl.h"
2729
#elif OLP_SDK_NETWORK_HAS_ANDROID
2830
#include "android/NetworkAndroid.h"
@@ -39,7 +41,9 @@ namespace {
3941
std::shared_ptr<Network> CreateDefaultNetworkImpl(
4042
NetworkInitializationSettings settings) {
4143
OLP_SDK_CORE_UNUSED(settings);
42-
#ifdef OLP_SDK_NETWORK_HAS_CURL
44+
#ifdef OLP_SDK_NETWORK_OFFLINE
45+
return std::make_shared<NetworkOffline>();
46+
#elif OLP_SDK_NETWORK_HAS_CURL
4347
return std::make_shared<NetworkCurl>(settings);
4448
#elif OLP_SDK_NETWORK_HAS_ANDROID
4549
return std::make_shared<NetworkAndroid>(settings.max_requests_count);
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/*
2+
* Copyright (C) 2024 HERE Europe B.V.
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+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*
16+
* SPDX-License-Identifier: Apache-2.0
17+
* License-Filename: LICENSE
18+
*/
19+
20+
#include "NetworkOffline.h"
21+
22+
#include <memory>
23+
24+
#include "olp/core/http/HttpStatusCode.h"
25+
#include "olp/core/logging/Log.h"
26+
27+
namespace olp {
28+
namespace http {
29+
30+
namespace {
31+
32+
const char* kLogTag = "NetworkOffline";
33+
34+
} // anonymous namespace
35+
36+
NetworkOffline::NetworkOffline() {
37+
OLP_SDK_LOG_TRACE(kLogTag, "Created NetworkOffline with address=" << this);
38+
}
39+
40+
NetworkOffline::~NetworkOffline() {
41+
OLP_SDK_LOG_TRACE(kLogTag, "Destroyed NetworkOffline object, this=" << this);
42+
}
43+
44+
SendOutcome NetworkOffline::Send(NetworkRequest request,
45+
std::shared_ptr<std::ostream> payload,
46+
Network::Callback callback,
47+
Network::HeaderCallback header_callback,
48+
Network::DataCallback data_callback) {
49+
OLP_SDK_CORE_UNUSED(payload);
50+
OLP_SDK_CORE_UNUSED(callback);
51+
OLP_SDK_CORE_UNUSED(header_callback);
52+
OLP_SDK_CORE_UNUSED(data_callback);
53+
OLP_SDK_LOG_ERROR(
54+
kLogTag, "Send failed - network is offline, url=" << request.GetUrl());
55+
return SendOutcome(ErrorCode::OFFLINE_ERROR);
56+
}
57+
58+
void NetworkOffline::Cancel(RequestId id) {
59+
OLP_SDK_LOG_ERROR(kLogTag, "Cancel failed - network is offline, id=" << id);
60+
return;
61+
}
62+
63+
} // namespace http
64+
} // namespace olp
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
/*
2+
* Copyright (C) 2024 HERE Europe B.V.
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+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*
16+
* SPDX-License-Identifier: Apache-2.0
17+
* License-Filename: LICENSE
18+
*/
19+
20+
#pragma once
21+
22+
#include "olp/core/http/Network.h"
23+
#include "olp/core/http/NetworkRequest.h"
24+
25+
namespace olp {
26+
namespace http {
27+
28+
/**
29+
* @brief The implementation of Network based on cURL.
30+
*/
31+
class NetworkOffline : public olp::http::Network,
32+
public std::enable_shared_from_this<NetworkOffline> {
33+
public:
34+
/**
35+
* @brief NetworkOffline constructor.
36+
*/
37+
NetworkOffline();
38+
39+
/**
40+
* @brief ~NetworkOffline destructor.
41+
*/
42+
~NetworkOffline() override;
43+
44+
/**
45+
* @brief Not copyable.
46+
*/
47+
NetworkOffline(const NetworkOffline& other) = delete;
48+
49+
/**
50+
* @brief Not movable.
51+
*/
52+
NetworkOffline(NetworkOffline&& other) = delete;
53+
54+
/**
55+
* @brief Not copy-assignable.
56+
*/
57+
NetworkOffline& operator=(const NetworkOffline& other) = delete;
58+
59+
/**
60+
* @brief Not move-assignable.
61+
*/
62+
NetworkOffline& operator=(NetworkOffline&& other) = delete;
63+
64+
/**
65+
* @brief Implementation of Send method from Network abstract class.
66+
*/
67+
SendOutcome Send(NetworkRequest request, Payload payload, Callback callback,
68+
HeaderCallback header_callback = nullptr,
69+
DataCallback data_callback = nullptr) override;
70+
71+
/**
72+
* @brief Implementation of Cancel method from Network abstract class.
73+
*/
74+
void Cancel(RequestId id) override;
75+
};
76+
77+
} // namespace http
78+
} // namespace olp

0 commit comments

Comments
 (0)