diff --git a/partners_api/CMakeLists.txt b/partners_api/CMakeLists.txt index d3e8239399..a76b739127 100644 --- a/partners_api/CMakeLists.txt +++ b/partners_api/CMakeLists.txt @@ -11,8 +11,8 @@ set( banner.hpp booking_api.cpp booking_api.hpp - booking_http.cpp - booking_http.hpp + booking_availability_params.cpp + booking_availability_params.hpp cian_api.cpp cian_api.hpp facebook_ads.cpp @@ -37,6 +37,7 @@ set( taxi_provider.hpp uber_api.cpp uber_api.hpp + utils.cpp utils.hpp viator_api.cpp viator_api.hpp diff --git a/partners_api/booking_api.cpp b/partners_api/booking_api.cpp index 0b26a51682..27943f1c98 100644 --- a/partners_api/booking_api.cpp +++ b/partners_api/booking_api.cpp @@ -1,5 +1,7 @@ #include "partners_api/booking_api.hpp" +#include "partners_api/utils.hpp" +#include "platform/http_client.hpp" #include "platform/platform.hpp" #include "coding/url_encode.hpp" @@ -9,6 +11,7 @@ #include "base/thread.hpp" #include "base/url_helpers.hpp" +#include #include #include #include @@ -19,7 +22,7 @@ using namespace base; using namespace booking; -using namespace booking::http; +using namespace platform; using namespace std; using namespace std::chrono; @@ -33,6 +36,21 @@ string const kPhotoSmallUrl = "http://aff.bstatic.com/images/hotel/max300/"; string const kSearchBaseUrl = "https://www.booking.com/search.html"; string g_BookingUrlForTesting = ""; +bool RunSimpleHttpRequest(bool const needAuth, string const & url, string & result) +{ + HttpClient request(url); + + if (needAuth) + request.SetUserAndPassword(BOOKING_KEY, BOOKING_SECRET); + + return request.RunHttpRequest(result); +} + +std::string FormatTime(system_clock::time_point p) +{ + return partners_api::FormatTime(p, "%Y-%m-%d"); +} + string MakeApiUrlV1(string const & func, url::Params const & params) { if (!g_BookingUrlForTesting.empty()) @@ -214,7 +232,7 @@ void FillPriceAndCurrency(string const & src, string const & currency, string & } } -void FillHotelIds(string const & src, vector & result) +void FillHotelIds(string const & src, vector & result) { my::Json root(src.c_str()); auto const resultsArray = json_object_get(root.get(), "result"); @@ -225,7 +243,9 @@ void FillHotelIds(string const & src, vector & result) for (size_t i = 0; i < size; ++i) { auto const obj = json_array_get(resultsArray, i); - FromJSONObject(obj, "hotel_id", result[i]); + uint64_t id = 0; + FromJSONObject(obj, "hotel_id", id); + result[i] = std::to_string(id); } } } // namespace @@ -299,7 +319,8 @@ string Api::GetSearchUrl(string const & city, string const & name) const return resultStream.str(); } -void Api::GetMinPrice(string const & hotelId, string const & currency, GetMinPriceCallback const & fn) +void Api::GetMinPrice(string const & hotelId, string const & currency, + GetMinPriceCallback const & fn) const { GetPlatform().RunOnNetworkThread([hotelId, currency, fn]() { @@ -326,7 +347,8 @@ void Api::GetMinPrice(string const & hotelId, string const & currency, GetMinPri }); } -void Api::GetHotelInfo(string const & hotelId, string const & lang, GetHotelInfoCallback const & fn) +void Api::GetHotelInfo(string const & hotelId, string const & lang, + GetHotelInfoCallback const & fn) const { GetPlatform().RunOnNetworkThread([hotelId, lang, fn]() { @@ -355,15 +377,15 @@ void Api::GetHotelInfo(string const & hotelId, string const & lang, GetHotelInfo } void Api::GetHotelAvailability(AvailabilityParams const & params, - GetHotelAvailabilityCallback const & fn) + GetHotelAvailabilityCallback const & fn) const { GetPlatform().RunOnNetworkThread([params, fn]() { - std::vector result; + std::vector result; string httpResult; if (!RawApi::HotelAvailability(params, httpResult)) { - fn(result); + fn(std::move(result)); return; } @@ -377,7 +399,7 @@ void Api::GetHotelAvailability(AvailabilityParams const & params, result.clear(); } - fn(result); + fn(std::move(result)); }); } diff --git a/partners_api/booking_api.hpp b/partners_api/booking_api.hpp index 5940952b98..36ba04f377 100644 --- a/partners_api/booking_api.hpp +++ b/partners_api/booking_api.hpp @@ -1,6 +1,6 @@ #pragma once -#include "partners_api/booking_http.hpp" +#include "partners_api/booking_availability_params.hpp" #include "platform/safe_callback.hpp" @@ -55,13 +55,16 @@ public: static bool GetHotelAvailability(std::string const & hotelId, std::string const & currency, std::string & result); static bool GetExtendedInfo(std::string const & hotelId, std::string const & lang, std::string & result); // Booking Api v2 methods: - static bool HotelAvailability(http::AvailabilityParams const & params, std::string & result); + static bool HotelAvailability(AvailabilityParams const & params, std::string & result); }; using GetMinPriceCallback = platform::SafeCallback; using GetHotelInfoCallback = platform::SafeCallback; -using GetHotelAvailabilityCallback = platform::SafeCallback hotelIds)>; +// NOTE: this callback will be called NOT on main thread. +using GetHotelAvailabilityCallback = std::function hotelIds)>; +/// Guarantees the preservation of the sequence of calls callbacks in accordance with +/// the sequence of method calls. class Api { public: @@ -72,14 +75,17 @@ public: /// Real-time information methods (used for retrieving rapidly changing information). /// These methods send requests directly to Booking. - void GetMinPrice(std::string const & hotelId, std::string const & currency, GetMinPriceCallback const & fn); + void GetMinPrice(std::string const & hotelId, std::string const & currency, + GetMinPriceCallback const & fn) const; + + /// NOTE: callback will be called NOT on main thread. + void GetHotelAvailability(AvailabilityParams const & params, + GetHotelAvailabilityCallback const & fn) const; /// Static information methods (use for information that can be cached). /// These methods use caching server to prevent Booking from being ddossed. - void GetHotelInfo(std::string const & hotelId, std::string const & lang, GetHotelInfoCallback const & fn); - - void GetHotelAvailability(http::AvailabilityParams const & params, - GetHotelAvailabilityCallback const & fn); + void GetHotelInfo(std::string const & hotelId, std::string const & lang, + GetHotelInfoCallback const & fn) const; }; void SetBookingUrlForTesting(std::string const & url); diff --git a/partners_api/booking_http.cpp b/partners_api/booking_availability_params.cpp similarity index 53% rename from partners_api/booking_http.cpp rename to partners_api/booking_availability_params.cpp index 8a4a6c0d4d..005ed7adeb 100644 --- a/partners_api/booking_http.cpp +++ b/partners_api/booking_availability_params.cpp @@ -1,41 +1,22 @@ -#include "partners_api/booking_http.hpp" - -#include "platform/http_client.hpp" +#include "partners_api/booking_availability_params.hpp" +#include "partners_api/utils.hpp" #include "base/string_utils.hpp" -#include -#include - #include "private.h" using namespace base::url; -using namespace platform; -using namespace std; -using namespace std::chrono; + +namespace +{ +std::string FormatTime(booking::AvailabilityParams::Time p) +{ + return partners_api::FormatTime(p, "%Y-%m-%d"); +} +} // namespace namespace booking { -namespace http -{ -bool RunSimpleHttpRequest(bool const needAuth, string const & url, string & result) -{ - HttpClient request(url); - - if (needAuth) - request.SetUserAndPassword(BOOKING_KEY, BOOKING_SECRET); - - return request.RunHttpRequest(result); -} - -string FormatTime(Time p) -{ - time_t t = duration_cast(p.time_since_epoch()).count(); - ostringstream os; - os << put_time(gmtime(&t), "%Y-%m-%d"); - return os.str(); -} - Params AvailabilityParams::Get() const { Params result; @@ -55,5 +36,9 @@ Params AvailabilityParams::Get() const return result; } -} // namespace http + +bool AvailabilityParams::IsEmpty() const +{ + return m_checkin == Time() || m_checkout == Time() || m_rooms.empty(); +} } // namespace booking diff --git a/partners_api/booking_http.hpp b/partners_api/booking_availability_params.hpp similarity index 80% rename from partners_api/booking_http.hpp rename to partners_api/booking_availability_params.hpp index d7eaa556a0..aa0cf9e53b 100644 --- a/partners_api/booking_http.hpp +++ b/partners_api/booking_availability_params.hpp @@ -8,22 +8,17 @@ namespace booking { -namespace http -{ -bool RunSimpleHttpRequest(bool const needAuth, std::string const & url, std::string & result); - -using Time = std::chrono::system_clock::time_point; -using Hotels = std::vector; -using Rooms = std::vector; -using Stars = std::vector; - -std::string FormatTime(Time p); - /// Params for checking availability of hotels. /// [m_hotelIds], [m_checkin], [m_checkout], [m_rooms] are required. struct AvailabilityParams { + using Time = std::chrono::system_clock::time_point; + using Hotels = std::vector; + using Rooms = std::vector; + using Stars = std::vector; + base::url::Params Get() const; + bool IsEmpty() const; /// Limit the result list to the specified hotels where they have availability for the /// specified guests and dates. @@ -44,5 +39,4 @@ struct AvailabilityParams /// Limit to hotels with the given number(s) of stars. Supported values 1-5. Stars m_stars; }; -} // namespace http } // namespace booking diff --git a/partners_api/partners_api.pro b/partners_api/partners_api.pro index ef946fff85..092bb05506 100644 --- a/partners_api/partners_api.pro +++ b/partners_api/partners_api.pro @@ -12,7 +12,7 @@ SOURCES += \ ads_base.cpp \ ads_engine.cpp \ booking_api.cpp \ - booking_http.cpp \ + booking_availability_params.cpp \ cian_api.cpp \ facebook_ads.cpp \ google_ads.cpp \ @@ -24,6 +24,7 @@ SOURCES += \ taxi_countries.cpp \ taxi_engine.cpp \ uber_api.cpp \ + utils.cpp \ viator_api.cpp \ yandex_api.cpp \ @@ -32,7 +33,7 @@ HEADERS += \ ads_engine.hpp \ banner.hpp \ booking_api.hpp \ - booking_http.hpp \ + booking_availability_params.hpp cian_api.hpp \ facebook_ads.hpp \ google_ads.hpp \ diff --git a/partners_api/partners_api_tests/booking_tests.cpp b/partners_api/partners_api_tests/booking_tests.cpp index 43cc4d8bc9..6ec377e6a6 100644 --- a/partners_api/partners_api_tests/booking_tests.cpp +++ b/partners_api/partners_api_tests/booking_tests.cpp @@ -4,13 +4,10 @@ #include "partners_api/booking_api.hpp" -#include "base/scope_guard.hpp" - #include using namespace partners_api; using namespace booking; -using namespace booking::http; namespace { @@ -143,15 +140,15 @@ UNIT_CLASS_TEST(AsyncGuiThread, GetHotelInfo) UNIT_CLASS_TEST(AsyncGuiThreadBooking, GetHotelAvailability) { AvailabilityParams params; - params.m_hotelIds = {"77615", "10623"}; + params.m_hotelIds = {"0"}; // Internal hotel id for testing. params.m_rooms = {"A,A"}; params.m_checkin = std::chrono::system_clock::now() + std::chrono::hours(24); params.m_checkout = std::chrono::system_clock::now() + std::chrono::hours(24 * 7); params.m_stars = {"4"}; Api api; - std::vector result; + std::vector result; - api.GetHotelAvailability(params, [&result](std::vector const & r) + api.GetHotelAvailability(params, [&result](std::vector const & r) { result = r; testing::Notify(); @@ -159,8 +156,8 @@ UNIT_CLASS_TEST(AsyncGuiThreadBooking, GetHotelAvailability) testing::Wait(); TEST_EQUAL(result.size(), 3, ()); - TEST_EQUAL(result[0], 10623, ()); - TEST_EQUAL(result[1], 10624, ()); - TEST_EQUAL(result[2], 10625, ()); + TEST_EQUAL(result[0], "10623", ()); + TEST_EQUAL(result[1], "10624", ()); + TEST_EQUAL(result[2], "10625", ()); } } diff --git a/partners_api/utils.cpp b/partners_api/utils.cpp new file mode 100644 index 0000000000..fdf4609234 --- /dev/null +++ b/partners_api/utils.cpp @@ -0,0 +1,33 @@ +#include "partners_api/utils.hpp" + +#include +#include +#include + +using namespace std; +using namespace std::chrono; + +namespace partners_api +{ +namespace http +{ +Result RunSimpleRequest(std::string const & url) +{ + platform::HttpClient request(url); + bool result = false; + + if (request.RunHttpRequest() && !request.WasRedirected() && request.ErrorCode() == 200) + result = true; + + return {result, request.ErrorCode(), request.ServerResponse()}; +} +} // namespace http + +string FormatTime(system_clock::time_point p, string const & format) +{ + time_t t = duration_cast(p.time_since_epoch()).count(); + ostringstream os; + os << put_time(gmtime(&t), format.c_str()); + return os.str(); +} +} // namespace partners_api diff --git a/partners_api/utils.hpp b/partners_api/utils.hpp index b7dfb3ce33..700fd8996d 100644 --- a/partners_api/utils.hpp +++ b/partners_api/utils.hpp @@ -2,6 +2,7 @@ #include "platform/http_client.hpp" +#include #include namespace partners_api @@ -22,15 +23,8 @@ struct Result std::string m_data; }; -inline Result RunSimpleRequest(std::string const & url) -{ - platform::HttpClient request(url); - bool result = false; - - if (request.RunHttpRequest() && !request.WasRedirected() && request.ErrorCode() == 200) - result = true; - - return {result, request.ErrorCode(), request.ServerResponse()}; -} +Result RunSimpleRequest(std::string const & url); } // namespace http + +std::string FormatTime(std::chrono::system_clock::time_point p, std::string const & format); } // namespace partners_api diff --git a/xcode/partners_api/partners_api.xcodeproj/project.pbxproj b/xcode/partners_api/partners_api.xcodeproj/project.pbxproj index 561ceb175c..d9424283eb 100644 --- a/xcode/partners_api/partners_api.xcodeproj/project.pbxproj +++ b/xcode/partners_api/partners_api.xcodeproj/project.pbxproj @@ -19,8 +19,6 @@ 3488B0371E9D11860068AFD8 /* ads_engine_tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 346E889D1E9D088200D4CE9B /* ads_engine_tests.cpp */; }; 3488B0381E9D11890068AFD8 /* rb_tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 346E889E1E9D088200D4CE9B /* rb_tests.cpp */; }; 3488B0391E9D118D0068AFD8 /* facebook_tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3DBC1C501E4B14810016897F /* facebook_tests.cpp */; }; - 3D3731EF1F98A7AF00D2121B /* booking_http.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3D3731ED1F98A7AF00D2121B /* booking_http.cpp */; }; - 3D3731F01F98A7AF00D2121B /* booking_http.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3D3731EE1F98A7AF00D2121B /* booking_http.hpp */; }; 3D452AEF1EE6D202009EAB9B /* google_tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3D452AED1EE6D202009EAB9B /* google_tests.cpp */; }; 3D452AF01EE6D202009EAB9B /* mopub_tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3D452AEE1EE6D202009EAB9B /* mopub_tests.cpp */; }; 3D452AF31EE6D20D009EAB9B /* google_ads.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3D452AF11EE6D20D009EAB9B /* google_ads.cpp */; }; @@ -33,6 +31,9 @@ 3D47B2AD1F14BE89000828D2 /* cian_api.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3D47B2AB1F14BE89000828D2 /* cian_api.hpp */; }; 3D47B2AF1F14BE94000828D2 /* cian_tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3D47B2AE1F14BE94000828D2 /* cian_tests.cpp */; }; 3D47B2B11F14FA14000828D2 /* utils.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3D47B2B01F14FA14000828D2 /* utils.hpp */; }; + 3D4E997C1FB439260025B48C /* booking_availability_params.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3D4E997A1FB439260025B48C /* booking_availability_params.hpp */; }; + 3D4E997D1FB439260025B48C /* booking_availability_params.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3D4E997B1FB439260025B48C /* booking_availability_params.cpp */; }; + 3D4E997F1FB439300025B48C /* utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3D4E997E1FB439300025B48C /* utils.cpp */; }; 3D7815761F3A14910068B6AC /* async_gui_thread.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3D7815751F3A14910068B6AC /* async_gui_thread.hpp */; }; 3DBC1C541E4B14920016897F /* facebook_ads.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3DBC1C521E4B14920016897F /* facebook_ads.cpp */; }; 3DBC1C551E4B14920016897F /* facebook_ads.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3DBC1C531E4B14920016897F /* facebook_ads.hpp */; }; @@ -82,8 +83,6 @@ 346E889E1E9D088200D4CE9B /* rb_tests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = rb_tests.cpp; sourceTree = ""; }; 3475E0E11DBF581B004C7E69 /* common-debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "common-debug.xcconfig"; path = "../common-debug.xcconfig"; sourceTree = ""; }; 3475E0E21DBF581B004C7E69 /* common-release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "common-release.xcconfig"; path = "../common-release.xcconfig"; sourceTree = ""; }; - 3D3731ED1F98A7AF00D2121B /* booking_http.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = booking_http.cpp; sourceTree = ""; }; - 3D3731EE1F98A7AF00D2121B /* booking_http.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = booking_http.hpp; sourceTree = ""; }; 3D452AED1EE6D202009EAB9B /* google_tests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = google_tests.cpp; sourceTree = ""; }; 3D452AEE1EE6D202009EAB9B /* mopub_tests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mopub_tests.cpp; sourceTree = ""; }; 3D452AF11EE6D20D009EAB9B /* google_ads.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = google_ads.cpp; sourceTree = ""; }; @@ -97,6 +96,9 @@ 3D47B2AB1F14BE89000828D2 /* cian_api.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = cian_api.hpp; sourceTree = ""; }; 3D47B2AE1F14BE94000828D2 /* cian_tests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cian_tests.cpp; sourceTree = ""; }; 3D47B2B01F14FA14000828D2 /* utils.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = utils.hpp; sourceTree = ""; }; + 3D4E997A1FB439260025B48C /* booking_availability_params.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = booking_availability_params.hpp; sourceTree = ""; }; + 3D4E997B1FB439260025B48C /* booking_availability_params.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = booking_availability_params.cpp; sourceTree = ""; }; + 3D4E997E1FB439300025B48C /* utils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = utils.cpp; sourceTree = ""; }; 3D7815751F3A14910068B6AC /* async_gui_thread.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = async_gui_thread.hpp; sourceTree = ""; }; 3DBC1C501E4B14810016897F /* facebook_tests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = facebook_tests.cpp; sourceTree = ""; }; 3DBC1C521E4B14920016897F /* facebook_ads.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = facebook_ads.cpp; sourceTree = ""; }; @@ -185,8 +187,9 @@ F6B5363B1DA520B20067EEA5 /* partners_api */ = { isa = PBXGroup; children = ( - 3D3731ED1F98A7AF00D2121B /* booking_http.cpp */, - 3D3731EE1F98A7AF00D2121B /* booking_http.hpp */, + 3D4E997E1FB439300025B48C /* utils.cpp */, + 3D4E997B1FB439260025B48C /* booking_availability_params.cpp */, + 3D4E997A1FB439260025B48C /* booking_availability_params.hpp */, BB1956E41F543D7B003ECE6C /* locals_api.cpp */, BB1956E51F543D7C003ECE6C /* locals_api.hpp */, 3D47B2B01F14FA14000828D2 /* utils.hpp */, @@ -296,8 +299,8 @@ 3DFEBF9F1EFBFC1500317D5C /* yandex_api.hpp in Headers */, 3DFEBF9D1EFBFC1500317D5C /* taxi_provider.hpp in Headers */, 346E88991E9D087400D4CE9B /* ads_engine.hpp in Headers */, + 3D4E997C1FB439260025B48C /* booking_availability_params.hpp in Headers */, 3DFEBF9C1EFBFC1500317D5C /* taxi_engine.hpp in Headers */, - 3D3731F01F98A7AF00D2121B /* booking_http.hpp in Headers */, F6B536431DA520E40067EEA5 /* uber_api.hpp in Headers */, 3DBC1C551E4B14920016897F /* facebook_ads.hpp in Headers */, BB1956E71F543D7C003ECE6C /* locals_api.hpp in Headers */, @@ -397,12 +400,13 @@ 3DFEBFA41EFBFC2300317D5C /* yandex_tests.cpp in Sources */, 3D452AEF1EE6D202009EAB9B /* google_tests.cpp in Sources */, 3D452AF01EE6D202009EAB9B /* mopub_tests.cpp in Sources */, + 3D4E997F1FB439300025B48C /* utils.cpp in Sources */, 3430643C1E9FBCF500DC7665 /* mopub_ads.cpp in Sources */, 346E88961E9D087400D4CE9B /* ads_base.cpp in Sources */, 3DFEBF891EF82C1300317D5C /* viator_tests.cpp in Sources */, 3DFEBF851EF82BEA00317D5C /* viator_api.cpp in Sources */, + 3D4E997D1FB439260025B48C /* booking_availability_params.cpp in Sources */, F6B536421DA520E40067EEA5 /* uber_api.cpp in Sources */, - 3D3731EF1F98A7AF00D2121B /* booking_http.cpp in Sources */, 3DFEBF9B1EFBFC1500317D5C /* taxi_engine.cpp in Sources */, 346E889B1E9D087400D4CE9B /* rb_ads.cpp in Sources */, 3DBC1C541E4B14920016897F /* facebook_ads.cpp in Sources */,