Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
54c76d6
feat: header file
arifBurakDemiray Jan 6, 2026
7459679
feat: initial impl
arifBurakDemiray Jan 6, 2026
7289c7e
feat: adding init module
arifBurakDemiray Jan 6, 2026
65b3704
feat: adding to module file
arifBurakDemiray Jan 6, 2026
c89333b
feat: changelog
arifBurakDemiray Jan 6, 2026
7c74605
feat: intoruce config provider contract
arifBurakDemiray Jan 7, 2026
1f796dc
feat: impl config contract to request module
arifBurakDemiray Jan 7, 2026
a01e9eb
feat: imp contract to modules
arifBurakDemiray Jan 7, 2026
71a6bd3
feat: impl contract
arifBurakDemiray Jan 7, 2026
61ac50d
fix: move stting provider to after module inits
arifBurakDemiray Jan 7, 2026
dda3be2
feat: update gitignore
arifBurakDemiray Jan 7, 2026
5766a52
feat: sbs RQ limit
arifBurakDemiray Jan 7, 2026
ecb436b
feat: use atomic for accessing sbs values
arifBurakDemiray Jan 7, 2026
533c25f
feat: use EQ size sbs
arifBurakDemiray Jan 7, 2026
cc14a3b
feat: remove unsued sbs
arifBurakDemiray Jan 7, 2026
8fc0e6e
feat: integrate custom event tracking
arifBurakDemiray Jan 7, 2026
e00e8fd
feat: session update interval
arifBurakDemiray Jan 8, 2026
2460bfc
feat: config provider to views module
arifBurakDemiray Jan 8, 2026
d8749b9
feat: config to crash module
arifBurakDemiray Jan 8, 2026
1d20263
feat: expose crash reporting flag to provider
arifBurakDemiray Jan 8, 2026
6f752c5
feat: expose view reporting flag to provider
arifBurakDemiray Jan 8, 2026
50bf4ea
feat: integrate sbs to view tracking
arifBurakDemiray Jan 8, 2026
e182799
feat: integrate sbs to crash reporting
arifBurakDemiray Jan 8, 2026
c21bcaa
feat: integrate session tracking
arifBurakDemiray Jan 8, 2026
eaeeb7b
feat: record location expose to cly delegate
arifBurakDemiray Jan 8, 2026
210e9ac
mixed: location tracking & cly delegate to config module
arifBurakDemiray Jan 8, 2026
98731b4
refactor: more precise param setting
arifBurakDemiray Jan 8, 2026
5195333
feat: config module update timer
arifBurakDemiray Jan 8, 2026
2556c7b
refactor: reorder functions internal
arifBurakDemiray Jan 8, 2026
ea27c94
feat: introduce storage for sbs
arifBurakDemiray Jan 8, 2026
efc88dc
feat: impls of them
arifBurakDemiray Jan 8, 2026
001f430
feat: fetching from storage
arifBurakDemiray Jan 8, 2026
5790876
feat: SBS configs in configuration
arifBurakDemiray Jan 9, 2026
c83af8b
feat: using sbs updates config
arifBurakDemiray Jan 9, 2026
923d9e1
feat: impl provided sbs
arifBurakDemiray Jan 12, 2026
c3ac4d2
feat: on sbs changed for sbs update interval
arifBurakDemiray Jan 12, 2026
70cecc0
feat: add missing session params for update
arifBurakDemiray Jan 12, 2026
368b142
feat: use networking
arifBurakDemiray Jan 12, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,7 @@ compile_commands.json
CTestTestfile.cmake
_deps
cmake-build-debug/

.DS_Store
test_results_*.log
*.db
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
## XX.XX.XX
- ! Minor breaking change ! SDK Behavior Settings is now enabled by default. Changes made on SDK Manager > SDK Behavior Settings on your server will affect SDK behavior directly.

## 23.2.4
- Mitigated an issue where cached events were not queued when a user property was recorded.

Expand Down
3 changes: 2 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,8 @@ add_library(countly
${CMAKE_CURRENT_SOURCE_DIR}/src/request_builder.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/storage_module_db.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/storage_module_memory.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/event.cpp)
${CMAKE_CURRENT_SOURCE_DIR}/src/event.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/configuration_module.cpp)

target_include_directories(countly
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
Expand Down
34 changes: 34 additions & 0 deletions include/countly.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@
#include "countly/logger_module.hpp"
#include "countly/storage_module_base.hpp"
#include "countly/views_module.hpp"
#include <countly/configuration_module.hpp>
#include <countly/configuration_provider.hpp>
#include <countly/crash_module.hpp>
#include <countly/request_builder.hpp>
#include <countly/request_module.hpp>
Expand Down Expand Up @@ -257,6 +259,8 @@ class Countly : public cly::CountlyDelegates {
addEvent(event);
}

void RecordLocation(const std::string &countryCode, const std::string &city, const std::string &gpsCoordinates, const std::string &ipAddress) override { setLocation(countryCode, city, gpsCoordinates, ipAddress); };

/* Provide 'updateInterval' in seconds. */
inline void setAutomaticSessionUpdateInterval(unsigned short updateInterval) {
if (is_sdk_initialized) {
Expand All @@ -267,6 +271,35 @@ class Countly : public cly::CountlyDelegates {
configuration->sessionDuration = updateInterval;
}

/**
* Disable SDK behavior settings updates that SDK performs periodically from the server.
*/
void disableSDKBehaviorSettingsUpdates() {
if (is_sdk_initialized) {
log(LogLevel::WARNING, "[Countly] disableSDKBehaviorSettingsUpdates, You can not disable SDK behavior settings updates after SDK initialization.");
return;
}

configuration->sdkBehaviorSettingsUpdatesDisabled = true;
}

/**
* Provide SDK behavior settings in JSON format string.
*/
void setSDKBehaviorSettings(std::string &settings_json) {
if (is_sdk_initialized) {
log(LogLevel::WARNING, "[Countly] setSDKBehaviorSettings, You can not provide SDK behavior settings after SDK initialization.");
return;
}

if(settings_json.empty()) {
log(LogLevel::WARNING, "[Countly] setSDKBehaviorSettings, Provided SDK behavior settings is empty.");
return;
}

configuration->sdkBehaviorSettings = settings_json;
}

#ifdef COUNTLY_BUILD_TESTS
/**
* Convert event queue into list.
Expand Down Expand Up @@ -345,6 +378,7 @@ class Countly : public cly::CountlyDelegates {
std::shared_ptr<cly::RequestBuilder> requestBuilder;
std::shared_ptr<cly::RequestModule> requestModule;
std::shared_ptr<cly::StorageModuleBase> storageModule;
std::shared_ptr<cly::ConfigurationModule> configurationModule;
std::shared_ptr<std::mutex> mutex = std::make_shared<std::mutex>();

bool is_queue_being_processed = false;
Expand Down
42 changes: 42 additions & 0 deletions include/countly/configuration_module.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
#ifndef CONFIGURATION_MODULE_HPP_
#define CONFIGURATION_MODULE_HPP_

#include "countly/configuration_provider.hpp"
#include "countly/constants.hpp"
#include "countly/countly_configuration.hpp"
#include "countly/logger_module.hpp"
#include "countly/request_builder.hpp"
#include "countly/request_module.hpp"
#include "countly/storage_module_base.hpp"

namespace cly {
class ConfigurationModule : public ConfigurationProvider {

public:
~ConfigurationModule();
ConfigurationModule(cly::CountlyDelegates *cly, std::shared_ptr<CountlyConfiguration> config, std::shared_ptr<LoggerModule> logger, std::shared_ptr<RequestBuilder> requestBuilder, std::shared_ptr<StorageModuleBase> storageModule, std::shared_ptr<RequestModule> requestModule,
std::shared_ptr<std::mutex> mutex);

void fetchConfigFromServer(nlohmann::json session_params);
void fetchConfigFromStorage();
void startServerConfigUpdateTimer(nlohmann::json session_params);
void stopTimer();
bool isTrackingEnabled() const override;
bool isNetworkingEnabled() const override;

bool isLocationTrackingEnabled();
bool isViewTrackingEnabled() const override;
bool isSessionTrackingEnabled();
bool isCustomEventTrackingEnabled();
bool isCrashReportingEnabled() const override;

unsigned int getRequestQueueSizeLimit() const override;
unsigned int getEventQueueSizeLimit();
unsigned int getSessionUpdateInterval();

private:
class ConfigurationModuleImpl;
std::unique_ptr<ConfigurationModuleImpl> impl;
};
} // namespace cly
#endif
16 changes: 16 additions & 0 deletions include/countly/configuration_provider.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#ifndef CONFIGURATION_PROVIDER_HPP_
#define CONFIGURATION_PROVIDER_HPP_
namespace cly {

class ConfigurationProvider {
public:
virtual ~ConfigurationProvider() = default;

virtual bool isNetworkingEnabled() const = 0;
virtual bool isTrackingEnabled() const = 0;
virtual bool isCrashReportingEnabled() const = 0;
virtual bool isViewTrackingEnabled() const = 0;
virtual unsigned int getRequestQueueSizeLimit() const = 0;
};
} // namespace cly
#endif
2 changes: 2 additions & 0 deletions include/countly/constants.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,8 @@ class CountlyDelegates {
virtual void RecordEvent(const std::string &key, const std::map<std::string, std::string> &segmentation, int count, double sum) = 0;

virtual void RecordEvent(const std::string &key, const std::map<std::string, std::string> &segmentation, int count, double sum, double duration) = 0;

virtual void RecordLocation(const std::string &countryCode, const std::string &city, const std::string &gpsCoordinates, const std::string &ipAddress) = 0;
};

} // namespace cly
Expand Down
4 changes: 4 additions & 0 deletions include/countly/countly_configuration.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,10 @@ struct CountlyConfiguration {

nlohmann::json metrics;

bool sdkBehaviorSettingsUpdatesDisabled = false;

std::string sdkBehaviorSettings;

CountlyConfiguration(const std::string appKey, std::string serverUrl) {
this->appKey = appKey;
this->serverUrl = serverUrl;
Expand Down
2 changes: 2 additions & 0 deletions include/countly/crash_module.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,10 @@ class CrashModule {
void recordException(const std::string &title, const std::string &stackTrace, const bool fatal, const std::map<std::string, std::string> &crashMetrics, const std::map<std::string, std::string> &segmentation = {});

private:
friend class Countly;
class CrashModuleImpl;
std::unique_ptr<CrashModuleImpl> impl;
void setConfigurationProvider(std::weak_ptr<ConfigurationProvider> provider); // try injecting
};
} // namespace cly
#endif
3 changes: 3 additions & 0 deletions include/countly/request_module.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include "countly/logger_module.hpp"
#include "countly/request_builder.hpp"
#include "countly/storage_module_base.hpp"
#include "countly/configuration_provider.hpp"

namespace cly {
class RequestModule {
Expand Down Expand Up @@ -36,10 +37,12 @@ class RequestModule {
void clearRequestQueue();

long long RQSize();
void setConfigurationProvider(std::weak_ptr<ConfigurationProvider> provider); // try injecting

private:
class RequestModuleImpl;
std::unique_ptr<RequestModuleImpl> impl;
std::weak_ptr<ConfigurationProvider> _configProvider;
};
} // namespace cly
#endif
4 changes: 4 additions & 0 deletions include/countly/storage_module_base.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,10 @@ class StorageModuleBase {
* @param request: content of the request
*/
virtual void RQInsertAtEnd(const std::string &request) = 0;

virtual void storeSDKBehaviorSettings(const std::string &sdk_behavior_settings) = 0;

virtual std::string getSDKBehaviorSettings() = 0;
};

} // namespace cly
Expand Down
2 changes: 2 additions & 0 deletions include/countly/storage_module_db.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ class StorageModuleDB : public StorageModuleBase {
std::vector<std::shared_ptr<DataEntry>> RQPeekAll() override;
void RQRemoveFront(std::shared_ptr<DataEntry> request) override;
void RQInsertAtEnd(const std::string &request) override;
void storeSDKBehaviorSettings(const std::string &sdk_behavior_settings) override;
std::string getSDKBehaviorSettings() override;
};
} // namespace cly
#endif
2 changes: 2 additions & 0 deletions include/countly/storage_module_memory.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ class StorageModuleMemory : public StorageModuleBase {
std::vector<std::shared_ptr<DataEntry>> RQPeekAll() override;
void RQRemoveFront(std::shared_ptr<DataEntry> request) override;
void RQInsertAtEnd(const std::string &request) override;
void storeSDKBehaviorSettings(const std::string &sdk_behavior_settings) override;
std::string getSDKBehaviorSettings() override;
};
} // namespace cly
#endif
4 changes: 4 additions & 0 deletions include/countly/views_module.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#include <memory>
#include <string>

#include "countly/configuration_provider.hpp"
#include "countly/constants.hpp"
#include "countly/logger_module.hpp"

Expand Down Expand Up @@ -36,10 +37,13 @@ class ViewsModule {
*/
std::string openView(const std::string &name, const std::map<std::string, std::string> &segmentation = {});


private:
friend class Countly;
void _recordView(std::string eventID);
class ViewModuleImpl;
std::unique_ptr<ViewModuleImpl> impl;
void setConfigurationProvider(std::weak_ptr<ConfigurationProvider> provider); // try injecting
};
} // namespace cly
#endif
Loading
Loading