From 6bdda735777fa106e97977ba8546882f557a4217 Mon Sep 17 00:00:00 2001 From: Mu-Woong Lee Date: Thu, 29 Jun 2017 15:27:56 +0900 Subject: [PATCH 01/16] SensorRecorderService realizes IUserService instead of IService Change-Id: I5a6ce9b3a7b99dd80cba722d2258ad8cea6735b3 Signed-off-by: Mu-Woong Lee --- include/private/SensorRecorderService.h | 20 ++++++++------------ src/server-dummy/SensorRecorderService.cpp | 20 ++++++-------------- src/server/MethodCallHandler.cpp | 9 --------- src/server/MethodCallHandler.h | 1 - src/server/SensorRecorderService.cpp | 30 ++++++++---------------------- 5 files changed, 22 insertions(+), 58 deletions(-) diff --git a/include/private/SensorRecorderService.h b/include/private/SensorRecorderService.h index 0235691..aff866f 100644 --- a/include/private/SensorRecorderService.h +++ b/include/private/SensorRecorderService.h @@ -19,33 +19,29 @@ /* This header SHOULD NOT be included by other headers in this directory. */ -#include +#include #include #include #include namespace ctx { - class EXPORT_API SensorRecorderService : public IService { + class EXPORT_API SensorRecorderService : public IUserService { public: SensorRecorderService(); ~SensorRecorderService(); + // Inherited from IService void setServiceRunner(IServiceRunner* runner); - - bool isUserService(); - const char* getServiceName(); const char* getMethodSpecs(); - - bool prepare(); - void cleanup(); - - void onUserActivated(); - void onUserDeactivated(); - IMethodCallHandler* createMethodCallHandler(IClient* client); + // Inherited from IUserService + bool prepare(uid_t uid); + void cleanup(uid_t uid); + + // Own members GDBusConnection* getConnection(); private: diff --git a/src/server-dummy/SensorRecorderService.cpp b/src/server-dummy/SensorRecorderService.cpp index 5ef92f8..b5052a4 100644 --- a/src/server-dummy/SensorRecorderService.cpp +++ b/src/server-dummy/SensorRecorderService.cpp @@ -34,11 +34,6 @@ void SensorRecorderService::setServiceRunner(IServiceRunner* runner) { } -bool SensorRecorderService::isUserService() -{ - return true; -} - const char* SensorRecorderService::getServiceName() { return NULL; @@ -49,24 +44,21 @@ const char* SensorRecorderService::getMethodSpecs() return NULL; } -bool SensorRecorderService::prepare() -{ - return false; -} - -void SensorRecorderService::cleanup() +IMethodCallHandler* SensorRecorderService::createMethodCallHandler(IClient* client) { + return NULL; } -void SensorRecorderService::onUserActivated() +bool SensorRecorderService::prepare(uid_t uid) { + return false; } -void SensorRecorderService::onUserDeactivated() +void SensorRecorderService::cleanup(uid_t uid) { } -IMethodCallHandler* SensorRecorderService::createMethodCallHandler(IClient* client) +GDBusConnection* SensorRecorderService::getConnection() { return NULL; } diff --git a/src/server/MethodCallHandler.cpp b/src/server/MethodCallHandler.cpp index 6acc120..c821a24 100644 --- a/src/server/MethodCallHandler.cpp +++ b/src/server/MethodCallHandler.cpp @@ -36,7 +36,6 @@ MethodCallHandler::~MethodCallHandler() void MethodCallHandler::onMethodCalled(IMethodCall* methodCall) { try { - __verifyUid(methodCall->getUid()); std::string subject = __extractParameter(methodCall->getParam(), IDX_SUBJECT); _D("%s(%s)", methodCall->getMethodName().c_str(), subject.c_str()); @@ -67,14 +66,6 @@ void MethodCallHandler::onDisconnected() { } -void MethodCallHandler::__verifyUid(uid_t uid) -{ - if (!util::isSystemUid(uid) && uid != util::getActiveUid()) { - _E("Invalid Uid: %u != %u (ActiveUser)", uid, util::getActiveUid()); - throw static_cast(E_ACCESS); - } -} - std::string MethodCallHandler::__extractParameter(GVariant* param, unsigned int idx) { const char* val = NULL; diff --git a/src/server/MethodCallHandler.h b/src/server/MethodCallHandler.h index 83ff751..817d4bb 100644 --- a/src/server/MethodCallHandler.h +++ b/src/server/MethodCallHandler.h @@ -34,7 +34,6 @@ namespace ctx { void onDisconnected(); private: - void __verifyUid(uid_t uid); std::string __extractParameter(GVariant* param, unsigned int idx); void __startRecording(SensorProvider& provider, IMethodCall& methodCall); void __stopRecording(SensorProvider& provider, IMethodCall& methodCall); diff --git a/src/server/SensorRecorderService.cpp b/src/server/SensorRecorderService.cpp index 8fba83b..0b62991 100644 --- a/src/server/SensorRecorderService.cpp +++ b/src/server/SensorRecorderService.cpp @@ -14,7 +14,6 @@ * limitations under the License. */ -#include #include #include #include "MethodCallHandler.h" @@ -39,11 +38,6 @@ void SensorRecorderService::setServiceRunner(IServiceRunner* runner) __serviceRunner = runner; } -bool SensorRecorderService::isUserService() -{ - return true; -} - const char* SensorRecorderService::getServiceName() { return CTX_SENSOR_RECORDER; @@ -54,11 +48,16 @@ const char* SensorRecorderService::getMethodSpecs() return CTX_SENSOR_RECORDER_SPEC; } -bool SensorRecorderService::prepare() +IMethodCallHandler* SensorRecorderService::createMethodCallHandler(IClient* client) +{ + return new MethodCallHandler(client); +} + +bool SensorRecorderService::prepare(uid_t uid) { RecorderClientInfo::setHostService(this); - if (!SensorDatabase::open(util::getActiveUid())) + if (!SensorDatabase::open(uid)) return false; SensorTimer::init(); @@ -67,26 +66,13 @@ bool SensorRecorderService::prepare() return true; } -void SensorRecorderService::cleanup() +void SensorRecorderService::cleanup(uid_t uid) { SensorProvider::release(); SensorTimer::release(); SensorDatabase::close(); } -void SensorRecorderService::onUserActivated() -{ -} - -void SensorRecorderService::onUserDeactivated() -{ -} - -IMethodCallHandler* SensorRecorderService::createMethodCallHandler(IClient* client) -{ - return new MethodCallHandler(client); -} - GDBusConnection* SensorRecorderService::getConnection() { return __serviceRunner->getConnection(); -- 2.7.4 From 2f6cec5d5c89d6277488a93078a4ebf5a79608ba Mon Sep 17 00:00:00 2001 From: Mu-Woong Lee Date: Fri, 30 Jun 2017 10:28:40 +0900 Subject: [PATCH 02/16] Prevent uncaught exceptions from ctx_sensor_rec_read & ctx_sensor_rec_read_sync Change-Id: I6f6402d0cdb98fe418a2fb5220d27d5cf49ce974 Signed-off-by: Mu-Woong Lee --- src/client/sensor_recorder.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/client/sensor_recorder.cpp b/src/client/sensor_recorder.cpp index e599b34..86c64c9 100644 --- a/src/client/sensor_recorder.cpp +++ b/src/client/sensor_recorder.cpp @@ -161,10 +161,12 @@ EXPORT_API int ctx_sensor_rec_read(const char* subject, ctx_sensor_rec_query_h q { IF_FAIL_RETURN(subject && query && cb, E_PARAM); + QueryResultListener* listener = new(std::nothrow) QueryResultListener(subject, cb, user_data); + IF_FAIL_RETURN_TAG(listener, E_NO_MEM, _E, E_STR_ALLOC); + std::string queryStr = __mapToJson(*static_cast(query)); GVariant* param = g_variant_new("(ss)", subject, queryStr.c_str()); - QueryResultListener* listener = new QueryResultListener(subject, cb, user_data); int error = __getServiceProxy()->call(METHOD_READ_REC, param, listener); if (error != E_NONE) @@ -177,6 +179,9 @@ EXPORT_API int ctx_sensor_rec_read_sync(const char* subject, ctx_sensor_rec_quer { IF_FAIL_RETURN(subject && query && cb, E_PARAM); + QueryResultListener* listener = new(std::nothrow) QueryResultListener(subject, cb, user_data); + IF_FAIL_RETURN_TAG(listener, E_NO_MEM, _E, E_STR_ALLOC); + std::string queryStr = __mapToJson(*static_cast(query)); GVariant* param = g_variant_new("(ss)", subject, queryStr.c_str()); @@ -184,7 +189,6 @@ EXPORT_API int ctx_sensor_rec_read_sync(const char* subject, ctx_sensor_rec_quer int error = __getServiceProxy()->call(METHOD_READ_REC, param, &outParam); IF_FAIL_RETURN(error == E_NONE, error); - QueryResultListener* listener = new QueryResultListener(subject, cb, user_data); listener->onSuccess(METHOD_READ_REC, outParam); g_variant_unref(outParam); -- 2.7.4 From 10a9f13e028b41ab81650d123fc9e9b6b5984eed Mon Sep 17 00:00:00 2001 From: Mu-Woong Lee Date: Fri, 30 Jun 2017 11:26:52 +0900 Subject: [PATCH 03/16] Version 4.0.0 release 1 Change-Id: I4bdc5e9a467e4c13d38f034639e1a00437a9fd9c Signed-off-by: Mu-Woong Lee --- packaging/context-sensor-recorder.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/context-sensor-recorder.spec b/packaging/context-sensor-recorder.spec index 63c9fa9..aaadc2d 100644 --- a/packaging/context-sensor-recorder.spec +++ b/packaging/context-sensor-recorder.spec @@ -1,6 +1,6 @@ Name: context-sensor-recorder Summary: Sensor recorder service server and client libraries -Version: 1.0.1 +Version: 4.0.0 Release: 1 Group: Service Framework/Context License: Apache-2.0 -- 2.7.4 From abd10dd23c14643e3f6362f9ddb8c032f09c6012 Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Tue, 23 May 2017 21:55:05 +0900 Subject: [PATCH 04/16] Change std::map to ctx::CtxJson for managing method options * CtxJson will be changed to Jsoncpp Change-Id: Ie97f308cbb30f986dcbdf3f4aefb01d3de929339 Signed-off-by: kibak.yoon --- src/client/sensor_recorder.cpp | 50 ++++++++++++++---------------------------- 1 file changed, 16 insertions(+), 34 deletions(-) diff --git a/src/client/sensor_recorder.cpp b/src/client/sensor_recorder.cpp index 86c64c9..618cfcf 100644 --- a/src/client/sensor_recorder.cpp +++ b/src/client/sensor_recorder.cpp @@ -14,43 +14,22 @@ * limitations under the License. */ -#include #include #include #include +#include #include "QueryResultListener.h" #define STR_BUFFER_SIZE 128 using namespace ctx; -typedef std::map ctx_sensor_rec_option_t; -typedef std::map ctx_sensor_rec_query_t; - static ServiceProxy* __getServiceProxy() { static ServiceProxy proxy(CTX_SENSOR_RECORDER); return &proxy; } -static std::string __mapToJson(const std::map& input) -{ - std::string output("{"); - char buf[STR_BUFFER_SIZE]; - - for (auto& elem : input) { - snprintf(buf, STR_BUFFER_SIZE, "\"%s\":%lld,", elem.first.c_str(), elem.second); - output += buf; - } - - if (output.back() == ',') - output.back() = '}'; - else - output += "}"; - - return output; -} - EXPORT_API int ctx_sensor_rec_is_supported(const char* subject, bool *supported) { IF_FAIL_RETURN(subject && supported, E_PARAM); @@ -68,10 +47,10 @@ EXPORT_API int ctx_sensor_rec_start(const char* subject, ctx_sensor_rec_option_h { IF_FAIL_RETURN(subject, E_PARAM); - std::string optionStr(""); - + std::string optionStr; if (option) - optionStr = __mapToJson(*static_cast(option)); + optionStr = static_cast(option)->str(); + GVariant* param = g_variant_new("(ss)", subject, optionStr.c_str()); return __getServiceProxy()->call(METHOD_START_REC, param); @@ -87,7 +66,7 @@ EXPORT_API int ctx_sensor_rec_create_option(ctx_sensor_rec_option_h *option) { IF_FAIL_RETURN(option, E_PARAM); - *option = new(std::nothrow) ctx_sensor_rec_option_t; + *option = new(std::nothrow) ctx::CtxJson; IF_FAIL_RETURN(*option, E_NO_MEM); return E_NONE; @@ -97,7 +76,7 @@ EXPORT_API int ctx_sensor_rec_destroy_option(ctx_sensor_rec_option_h option) { IF_FAIL_RETURN(option, E_PARAM); - delete static_cast(option); + delete static_cast(option); return E_NONE; } @@ -108,7 +87,8 @@ EXPORT_API int ctx_sensor_rec_option_set_int(ctx_sensor_rec_option_h option, con IF_FAIL_RETURN(STR_EQ(param, CTX_SENSOR_RECORDER_KEY_INTERVAL) || STR_EQ(param, CTX_SENSOR_RECORDER_KEY_RETENTION), E_PARAM); - (*static_cast(option))[param] = static_cast(value); + ctx::CtxJson* optionCtxJson = static_cast(option); + optionCtxJson->set(NULL, param, static_cast(value)); return E_NONE; } @@ -117,7 +97,7 @@ EXPORT_API int ctx_sensor_rec_create_query(ctx_sensor_rec_query_h *query) { IF_FAIL_RETURN(query, E_PARAM); - *query = new(std::nothrow) ctx_sensor_rec_query_t; + *query = new(std::nothrow) ctx::CtxJson; IF_FAIL_RETURN(*query, E_NO_MEM); return E_NONE; @@ -127,7 +107,7 @@ EXPORT_API int ctx_sensor_rec_destroy_query(ctx_sensor_rec_query_h query) { IF_FAIL_RETURN(query, E_PARAM); - delete static_cast(query); + delete static_cast(query); return E_NONE; } @@ -140,7 +120,8 @@ EXPORT_API int ctx_sensor_rec_query_set_int(ctx_sensor_rec_query_h query, const STR_EQ(param, CTX_SENSOR_RECORDER_KEY_START_TIME) || STR_EQ(param, CTX_SENSOR_RECORDER_KEY_END_TIME), E_PARAM); - (*static_cast(query))[param] = static_cast(value); + ctx::CtxJson* queryCtxJson = static_cast(query); + queryCtxJson->set(NULL, param, static_cast(value)); return E_NONE; } @@ -152,7 +133,8 @@ EXPORT_API int ctx_sensor_rec_query_set_time(ctx_sensor_rec_query_h query, const STR_EQ(param, CTX_SENSOR_RECORDER_KEY_START_TIME) || STR_EQ(param, CTX_SENSOR_RECORDER_KEY_END_TIME), E_PARAM); - (*static_cast(query))[param] = static_cast(t); + ctx::CtxJson* queryCtxJson = static_cast(query); + queryCtxJson->set(NULL, param, static_cast(t)); return E_NONE; } @@ -164,7 +146,7 @@ EXPORT_API int ctx_sensor_rec_read(const char* subject, ctx_sensor_rec_query_h q QueryResultListener* listener = new(std::nothrow) QueryResultListener(subject, cb, user_data); IF_FAIL_RETURN_TAG(listener, E_NO_MEM, _E, E_STR_ALLOC); - std::string queryStr = __mapToJson(*static_cast(query)); + std::string queryStr = static_cast(query)->str(); GVariant* param = g_variant_new("(ss)", subject, queryStr.c_str()); int error = __getServiceProxy()->call(METHOD_READ_REC, param, listener); @@ -182,7 +164,7 @@ EXPORT_API int ctx_sensor_rec_read_sync(const char* subject, ctx_sensor_rec_quer QueryResultListener* listener = new(std::nothrow) QueryResultListener(subject, cb, user_data); IF_FAIL_RETURN_TAG(listener, E_NO_MEM, _E, E_STR_ALLOC); - std::string queryStr = __mapToJson(*static_cast(query)); + std::string queryStr = static_cast(query)->str(); GVariant* param = g_variant_new("(ss)", subject, queryStr.c_str()); GVariant* outParam = NULL; -- 2.7.4 From 61da57e6c5ea97e9ea7a038ea2b810aeba940770 Mon Sep 17 00:00:00 2001 From: Mu-Woong Lee Date: Sat, 1 Jul 2017 23:18:44 +0900 Subject: [PATCH 05/16] Replace the glib-json wrapper CtxJson with jsoncpp Change-Id: I73edc779b88688e675bef73c9e43089df631cf5f Signed-off-by: Mu-Woong Lee --- packaging/context-sensor-recorder.spec | 1 + src/client/CMakeLists.txt | 2 +- src/client/sensor_recorder.cpp | 37 +++++++++------ src/server/CMakeLists.txt | 2 +- src/server/legacy/Querier.cpp | 6 +-- src/server/legacy/Querier.h | 6 +-- src/server/legacy/RecorderClientInfo.cpp | 35 ++++++++------ src/server/legacy/RecorderClientInfo.h | 10 ++-- src/server/legacy/SensorProvider.cpp | 59 ++++++++++++++---------- src/server/legacy/SensorProvider.h | 8 ++-- src/server/legacy/heartrate/HeartRate.cpp | 15 ++---- src/server/legacy/heartrate/HeartRate.h | 2 +- src/server/legacy/heartrate/HeartRateLogger.cpp | 2 +- src/server/legacy/heartrate/HeartRateQuerier.cpp | 4 +- src/server/legacy/heartrate/HeartRateQuerier.h | 4 +- src/server/legacy/pedometer/PedometerQuerier.cpp | 6 +-- src/server/legacy/pedometer/PedometerQuerier.h | 6 +-- src/server/legacy/pressure/PressureQuerier.cpp | 6 +-- src/server/legacy/pressure/PressureQuerier.h | 6 +-- src/server/legacy/sleep/SleepQuerier.cpp | 4 +- src/server/legacy/sleep/SleepQuerier.h | 4 +- 21 files changed, 123 insertions(+), 102 deletions(-) diff --git a/packaging/context-sensor-recorder.spec b/packaging/context-sensor-recorder.spec index aaadc2d..6a27459 100644 --- a/packaging/context-sensor-recorder.spec +++ b/packaging/context-sensor-recorder.spec @@ -9,6 +9,7 @@ Source0: %{name}-%{version}.tar.gz BuildRequires: cmake BuildRequires: pkgconfig(glib-2.0) BuildRequires: pkgconfig(gio-2.0) +BuildRequires: pkgconfig(jsoncpp) BuildRequires: pkgconfig(dlog) BuildRequires: pkgconfig(sensor) BuildRequires: pkgconfig(capi-base-common) diff --git a/src/client/CMakeLists.txt b/src/client/CMakeLists.txt index 8f551d7..46d4131 100644 --- a/src/client/CMakeLists.txt +++ b/src/client/CMakeLists.txt @@ -1,6 +1,6 @@ SET(target "${PROJECT_NAME}-client-genuine") -SET(DEPS "${DEPS} context-common-client") +SET(DEPS "${DEPS} jsoncpp context-common-client") FILE(GLOB_RECURSE SRCS *.cpp ../shared/*.cpp) MESSAGE("Sources: ${SRCS}") diff --git a/src/client/sensor_recorder.cpp b/src/client/sensor_recorder.cpp index 618cfcf..1973f76 100644 --- a/src/client/sensor_recorder.cpp +++ b/src/client/sensor_recorder.cpp @@ -14,10 +14,10 @@ * limitations under the License. */ +#include #include #include #include -#include #include "QueryResultListener.h" #define STR_BUFFER_SIZE 128 @@ -48,8 +48,11 @@ EXPORT_API int ctx_sensor_rec_start(const char* subject, ctx_sensor_rec_option_h IF_FAIL_RETURN(subject, E_PARAM); std::string optionStr; - if (option) - optionStr = static_cast(option)->str(); + if (option) { + Json::FastWriter fw; + fw.omitEndingLineFeed(); + optionStr = fw.write(*static_cast(option)); + } GVariant* param = g_variant_new("(ss)", subject, optionStr.c_str()); @@ -66,7 +69,7 @@ EXPORT_API int ctx_sensor_rec_create_option(ctx_sensor_rec_option_h *option) { IF_FAIL_RETURN(option, E_PARAM); - *option = new(std::nothrow) ctx::CtxJson; + *option = new(std::nothrow) Json::Value; IF_FAIL_RETURN(*option, E_NO_MEM); return E_NONE; @@ -76,7 +79,7 @@ EXPORT_API int ctx_sensor_rec_destroy_option(ctx_sensor_rec_option_h option) { IF_FAIL_RETURN(option, E_PARAM); - delete static_cast(option); + delete static_cast(option); return E_NONE; } @@ -87,8 +90,8 @@ EXPORT_API int ctx_sensor_rec_option_set_int(ctx_sensor_rec_option_h option, con IF_FAIL_RETURN(STR_EQ(param, CTX_SENSOR_RECORDER_KEY_INTERVAL) || STR_EQ(param, CTX_SENSOR_RECORDER_KEY_RETENTION), E_PARAM); - ctx::CtxJson* optionCtxJson = static_cast(option); - optionCtxJson->set(NULL, param, static_cast(value)); + Json::Value& optionJson = *static_cast(option); + optionJson[param] = value; return E_NONE; } @@ -97,7 +100,7 @@ EXPORT_API int ctx_sensor_rec_create_query(ctx_sensor_rec_query_h *query) { IF_FAIL_RETURN(query, E_PARAM); - *query = new(std::nothrow) ctx::CtxJson; + *query = new(std::nothrow) Json::Value; IF_FAIL_RETURN(*query, E_NO_MEM); return E_NONE; @@ -107,7 +110,7 @@ EXPORT_API int ctx_sensor_rec_destroy_query(ctx_sensor_rec_query_h query) { IF_FAIL_RETURN(query, E_PARAM); - delete static_cast(query); + delete static_cast(query); return E_NONE; } @@ -120,8 +123,8 @@ EXPORT_API int ctx_sensor_rec_query_set_int(ctx_sensor_rec_query_h query, const STR_EQ(param, CTX_SENSOR_RECORDER_KEY_START_TIME) || STR_EQ(param, CTX_SENSOR_RECORDER_KEY_END_TIME), E_PARAM); - ctx::CtxJson* queryCtxJson = static_cast(query); - queryCtxJson->set(NULL, param, static_cast(value)); + Json::Value& queryJson = *static_cast(query); + queryJson[param] = value; return E_NONE; } @@ -133,8 +136,8 @@ EXPORT_API int ctx_sensor_rec_query_set_time(ctx_sensor_rec_query_h query, const STR_EQ(param, CTX_SENSOR_RECORDER_KEY_START_TIME) || STR_EQ(param, CTX_SENSOR_RECORDER_KEY_END_TIME), E_PARAM); - ctx::CtxJson* queryCtxJson = static_cast(query); - queryCtxJson->set(NULL, param, static_cast(t)); + Json::Value& queryJson = *static_cast(query); + queryJson[param] = static_cast(t); return E_NONE; } @@ -146,7 +149,9 @@ EXPORT_API int ctx_sensor_rec_read(const char* subject, ctx_sensor_rec_query_h q QueryResultListener* listener = new(std::nothrow) QueryResultListener(subject, cb, user_data); IF_FAIL_RETURN_TAG(listener, E_NO_MEM, _E, E_STR_ALLOC); - std::string queryStr = static_cast(query)->str(); + Json::FastWriter fw; + fw.omitEndingLineFeed(); + std::string queryStr = fw.write(*static_cast(query)); GVariant* param = g_variant_new("(ss)", subject, queryStr.c_str()); int error = __getServiceProxy()->call(METHOD_READ_REC, param, listener); @@ -164,7 +169,9 @@ EXPORT_API int ctx_sensor_rec_read_sync(const char* subject, ctx_sensor_rec_quer QueryResultListener* listener = new(std::nothrow) QueryResultListener(subject, cb, user_data); IF_FAIL_RETURN_TAG(listener, E_NO_MEM, _E, E_STR_ALLOC); - std::string queryStr = static_cast(query)->str(); + Json::FastWriter fw; + fw.omitEndingLineFeed(); + std::string queryStr = fw.write(*static_cast(query)); GVariant* param = g_variant_new("(ss)", subject, queryStr.c_str()); GVariant* outParam = NULL; diff --git a/src/server/CMakeLists.txt b/src/server/CMakeLists.txt index ee007d8..d380df0 100644 --- a/src/server/CMakeLists.txt +++ b/src/server/CMakeLists.txt @@ -1,6 +1,6 @@ SET(target "${PROJECT_NAME}-server-genuine") -SET(DEPS "${DEPS} context-common-server capi-system-info sensor") +SET(DEPS "${DEPS} jsoncpp context-common-server capi-system-info sensor") FILE(GLOB_RECURSE SRCS *.cpp ../shared/*.cpp) MESSAGE("Sources: ${SRCS}") diff --git a/src/server/legacy/Querier.cpp b/src/server/legacy/Querier.cpp index 37f16e8..3eee5bf 100644 --- a/src/server/legacy/Querier.cpp +++ b/src/server/legacy/Querier.cpp @@ -39,17 +39,17 @@ int Querier::query(const char *sql, std::vector>* tuples) return ret ? E_NONE : E_FAILED; } -int Querier::queryRaw(int startTime, int endTime, std::vector>* tuples) +int Querier::queryRaw(time_t startTime, time_t endTime, std::vector>* tuples) { return E_PARAM; } -int Querier::query(int startTime, int endTime, std::vector>* tuples) +int Querier::query(time_t startTime, time_t endTime, std::vector>* tuples) { return E_PARAM; } -int Querier::query(int startTime, int endTime, int anchor, int interval, std::vector>* tuples) +int Querier::query(time_t startTime, time_t endTime, time_t anchor, int interval, std::vector>* tuples) { _D("Ignore anchor & interval"); return query(startTime, endTime, tuples); diff --git a/src/server/legacy/Querier.h b/src/server/legacy/Querier.h index 354681d..948fa4e 100644 --- a/src/server/legacy/Querier.h +++ b/src/server/legacy/Querier.h @@ -29,9 +29,9 @@ namespace ctx { virtual std::string getProjection(); - virtual int queryRaw(int startTime, int endTime, std::vector>* tuples); - virtual int query(int startTime, int endTime, std::vector>* tuples); - virtual int query(int startTime, int endTime, int anchor, int interval, std::vector>* tuples); + virtual int queryRaw(time_t startTime, time_t endTime, std::vector>* tuples); + virtual int query(time_t startTime, time_t endTime, std::vector>* tuples); + virtual int query(time_t startTime, time_t endTime, time_t anchor, int interval, std::vector>* tuples); protected: int query(const char *sql, std::vector>* tuples); diff --git a/src/server/legacy/RecorderClientInfo.cpp b/src/server/legacy/RecorderClientInfo.cpp index 2bf99d8..56b8f02 100644 --- a/src/server/legacy/RecorderClientInfo.cpp +++ b/src/server/legacy/RecorderClientInfo.cpp @@ -55,7 +55,7 @@ RecorderClientInfo::~RecorderClientInfo() __uninstallMonitor = NULL; } -int RecorderClientInfo::get(std::string subject, std::string pkgId, CtxJson& option) +int RecorderClientInfo::get(std::string subject, std::string pkgId, Json::Value& option) { bool ret; std::string optStr; @@ -73,12 +73,14 @@ int RecorderClientInfo::get(std::string subject, std::string pkgId, CtxJson& opt IF_FAIL_RETURN(!tuples.empty(), E_NO_DATA); tuples[0]->getAt(0, &optStr); - option = optStr; + + Json::Reader jr; + jr.parse(optStr, option); return E_NONE; } -int RecorderClientInfo::get(std::string subject, std::vector& options) +int RecorderClientInfo::get(std::string subject, std::vector& options) { bool ret; std::string optStr; @@ -95,9 +97,15 @@ int RecorderClientInfo::get(std::string subject, std::vector& options) IF_FAIL_RETURN(ret, E_FAILED); IF_FAIL_RETURN(!tuples.empty(), E_NO_DATA); + Json::Reader jr; + for (auto& tuple : tuples) { tuple->getAt(0, &optStr); - options.push_back(CtxJson(optStr)); + + Json::Value opt; + jr.parse(optStr, opt); + + options.push_back(opt); } return E_NONE; @@ -122,12 +130,15 @@ bool RecorderClientInfo::exist(std::string subject) return true; } -bool RecorderClientInfo::set(std::string subject, std::string pkgId, CtxJson option, int retentionPeriod) +bool RecorderClientInfo::set(std::string subject, std::string pkgId, const Json::Value& option, int retentionPeriod) { bool ret; + Json::FastWriter fw; + fw.omitEndingLineFeed(); + char *query = sqlite3_mprintf( "INSERT INTO " CLIENT_INFO " VALUES ('%q', '%q', '%q', %d)", - subject.c_str(), pkgId.c_str(), option.str().c_str(), retentionPeriod); + subject.c_str(), pkgId.c_str(), fw.write(option).c_str(), retentionPeriod); ret = SensorDatabase::execute(query, NULL); sqlite3_free(query); @@ -149,17 +160,15 @@ bool RecorderClientInfo::remove(std::string subject, std::string pkgId) return ret; } -void RecorderClientInfo::getParam(std::vector &options, const char *key, float *min, float *max) +void RecorderClientInfo::getParam(std::vector &options, const char *key, float *min, float *max) { - double val; - - for (CtxJson& opt : options) { - if (!opt.get(NULL, key, &val)) + for (auto& opt : options) { + if (!opt.isMember(key)) continue; if (min) - *min = MIN(*min, static_cast(val)); + *min = MIN(*min, static_cast(opt[key].asInt64())); if (max) - *max = MAX(*max, static_cast(val)); + *max = MAX(*max, static_cast(opt[key].asInt64())); } } diff --git a/src/server/legacy/RecorderClientInfo.h b/src/server/legacy/RecorderClientInfo.h index 0c85919..1b8b710 100644 --- a/src/server/legacy/RecorderClientInfo.h +++ b/src/server/legacy/RecorderClientInfo.h @@ -17,9 +17,9 @@ #ifndef __SENSOR_RECORDER_CLIENT_INFO_H__ #define __SENSOR_RECORDER_CLIENT_INFO_H__ +#include #include #include -#include #include #include "UninstallMonitor.h" @@ -32,14 +32,14 @@ namespace ctx { RecorderClientInfo(); ~RecorderClientInfo(); - int get(std::string subject, std::string pkgId, CtxJson& option); - int get(std::string subject, std::vector& options); + int get(std::string subject, std::string pkgId, Json::Value& option); + int get(std::string subject, std::vector& options); bool exist(std::string subject); - bool set(std::string subject, std::string pkgId, CtxJson option, int retentionPeriod); + bool set(std::string subject, std::string pkgId, const Json::Value& option, int retentionPeriod); bool remove(std::string subject, std::string pkgId); - void getParam(std::vector& options, const char *key, float *min, float *max); + void getParam(std::vector& options, const char *key, float *min, float *max); static void purgeClient(std::string pkgId); static void setHostService(SensorRecorderService* hostService); diff --git a/src/server/legacy/SensorProvider.cpp b/src/server/legacy/SensorProvider.cpp index a31a050..a3a4e00 100644 --- a/src/server/legacy/SensorProvider.cpp +++ b/src/server/legacy/SensorProvider.cpp @@ -98,24 +98,32 @@ const char* SensorProvider::getPrivilege() return NULL; } -int SensorProvider::readRecords(CtxJson option, std::string* projection, std::vector>* tuples) +int SensorProvider::readRecords(const std::string& option, std::string* projection, std::vector>* tuples) { - int endTime = static_cast(time(NULL)) + 1; - int startTime = endTime - DEFAULT_QUERY_PERIOD - 1; - int anchor = -1; + time_t endTime = time(NULL) + 1; + time_t startTime = endTime - DEFAULT_QUERY_PERIOD - 1; + time_t anchor = -1; int interval = -1; - if (option.get(NULL, KEY_START_TIME, &startTime)) - IF_FAIL_RETURN(startTime >= 0, E_PARAM); + Json::Reader jr; + Json::Value optionJson; + jr.parse(option, optionJson); - if (option.get(NULL, KEY_END_TIME, &endTime)) - IF_FAIL_RETURN(endTime >= 0, E_PARAM); + startTime = static_cast(optionJson.get(KEY_START_TIME, static_cast(startTime)).asInt64()); + IF_FAIL_RETURN(startTime >= 0, E_PARAM); - if (option.get(NULL, KEY_ANCHOR, &anchor)) + endTime = static_cast(optionJson.get(KEY_END_TIME, static_cast(endTime)).asInt64()); + IF_FAIL_RETURN(endTime >= 0, E_PARAM); + + if (optionJson.isMember(KEY_ANCHOR)) { + anchor = static_cast(optionJson[KEY_ANCHOR].asInt64()); IF_FAIL_RETURN(anchor >= 0, E_PARAM); + } - if (option.get(NULL, KEY_INTERVAL, &interval)) + if (optionJson.isMember(KEY_INTERVAL)) { + interval = optionJson[KEY_INTERVAL].asInt(); IF_FAIL_RETURN(interval >= 0, E_PARAM); + } if (endTime >= 0 && startTime >= endTime) return E_PARAM; @@ -141,21 +149,24 @@ int SensorProvider::readRecords(CtxJson option, std::string* projection, std::ve return ret; } -int SensorProvider::startRecording(const std::string& pkgId, CtxJson option) +int SensorProvider::startRecording(const std::string& pkgId, const std::string& option) { int retentionPeriod = DEFAULT_RETENTION; - _D("PkgId: %s", pkgId.c_str()); - _J("Option", option); + _D("PkgId: %s, Option: %s", pkgId.c_str(), option.c_str()); + + Json::Reader jr; + Json::Value optionJson; + jr.parse(option, optionJson); - if (option.get(NULL, KEY_RETENTION, &retentionPeriod)) { - retentionPeriod *= SECONDS_PER_HOUR; - option.remove(NULL, KEY_RETENTION); + if (optionJson.isMember(KEY_RETENTION)) { + retentionPeriod = optionJson[KEY_RETENTION].asInt() * SECONDS_PER_HOUR; + optionJson.removeMember(KEY_RETENTION); } - IF_FAIL_RETURN(verifyOption(option), E_PARAM); + IF_FAIL_RETURN(verifyOption(optionJson), E_PARAM); - return __addClient(pkgId, retentionPeriod, option); + return __addClient(pkgId, retentionPeriod, optionJson); } int SensorProvider::stopRecording(const std::string& pkgId) @@ -165,16 +176,14 @@ int SensorProvider::stopRecording(const std::string& pkgId) return __removeClient(pkgId); } -bool SensorProvider::verifyOption(CtxJson option) +bool SensorProvider::verifyOption(const Json::Value& option) { - std::list keys; - option.getKeys(&keys); - return keys.size() == 0; + return option.empty(); } -int SensorProvider::__addClient(std::string pkgId, int retentionPeriod, CtxJson option) +int SensorProvider::__addClient(std::string pkgId, int retentionPeriod, Json::Value& option) { - CtxJson tmp; + Json::Value tmp; int ret; /* Validate the retention period */ @@ -197,7 +206,7 @@ int SensorProvider::__addClient(std::string pkgId, int retentionPeriod, CtxJson int SensorProvider::__removeClient(std::string pkgId) { - std::vector options; + std::vector options; int ret; /* Remove the app's request first */ diff --git a/src/server/legacy/SensorProvider.h b/src/server/legacy/SensorProvider.h index 0e17775..e76068a 100644 --- a/src/server/legacy/SensorProvider.h +++ b/src/server/legacy/SensorProvider.h @@ -35,8 +35,8 @@ namespace ctx { const char* getSubject(); - int readRecords(CtxJson option, std::string* projection, std::vector>* tuples); - int startRecording(const std::string& pkgId, CtxJson option); + int readRecords(const std::string& option, std::string* projection, std::vector>* tuples); + int startRecording(const std::string& pkgId, const std::string& option); int stopRecording(const std::string& pkgId); virtual bool isSupported(); @@ -55,10 +55,10 @@ namespace ctx { virtual SensorLogger* getLogger() = 0; virtual Querier* getQuerier() = 0; - virtual bool verifyOption(CtxJson option); + virtual bool verifyOption(const Json::Value& option); private: - int __addClient(std::string pkgId, int retentionPeriod, CtxJson option); + int __addClient(std::string pkgId, int retentionPeriod, Json::Value& option); int __removeClient(std::string pkgId); std::string __subject; diff --git a/src/server/legacy/heartrate/HeartRate.cpp b/src/server/legacy/heartrate/HeartRate.cpp index 55dadf2..17ef774 100644 --- a/src/server/legacy/heartrate/HeartRate.cpp +++ b/src/server/legacy/heartrate/HeartRate.cpp @@ -49,18 +49,13 @@ Querier* HeartRateProvider::getQuerier() return &__querier; } -bool HeartRateProvider::verifyOption(CtxJson option) +bool HeartRateProvider::verifyOption(const Json::Value& option) { - std::list keys; - option.getKeys(&keys); + IF_FAIL_RETURN(option.size() <= 1, false); - IF_FAIL_RETURN(keys.size() <= 1, false); - - int interval = 0; - if (option.get(NULL, KEY_INTERVAL, &interval)) { - if (interval < MIN_MEASURING_INTERVAL || interval > MAX_MEASURING_INTERVAL) - return false; - } + int interval = option.get(KEY_INTERVAL, MIN_MEASURING_INTERVAL).asInt(); + if (interval < MIN_MEASURING_INTERVAL || interval > MAX_MEASURING_INTERVAL) + return false; return true; } diff --git a/src/server/legacy/heartrate/HeartRate.h b/src/server/legacy/heartrate/HeartRate.h index 05b1e60..0aaab05 100644 --- a/src/server/legacy/heartrate/HeartRate.h +++ b/src/server/legacy/heartrate/HeartRate.h @@ -34,7 +34,7 @@ namespace ctx { protected: SensorLogger* getLogger(); Querier* getQuerier(); - bool verifyOption(CtxJson option); + bool verifyOption(const Json::Value& option); private: HeartRateLogger __logger; diff --git a/src/server/legacy/heartrate/HeartRateLogger.cpp b/src/server/legacy/heartrate/HeartRateLogger.cpp index 427fcf1..15c2f12 100644 --- a/src/server/legacy/heartrate/HeartRateLogger.cpp +++ b/src/server/legacy/heartrate/HeartRateLogger.cpp @@ -58,7 +58,7 @@ HeartRateLogger::~HeartRateLogger() bool HeartRateLogger::start() { - std::vector options; + std::vector options; RecorderClientInfo clientInfo; float interval = MAX_MEASURING_INTERVAL; diff --git a/src/server/legacy/heartrate/HeartRateQuerier.cpp b/src/server/legacy/heartrate/HeartRateQuerier.cpp index 2bf1fba..546a50d 100644 --- a/src/server/legacy/heartrate/HeartRateQuerier.cpp +++ b/src/server/legacy/heartrate/HeartRateQuerier.cpp @@ -39,12 +39,12 @@ std::string HeartRateQuerier::getProjection() return KEY_HEART_RATE "," KEY_START_TIME "," KEY_END_TIME; } -int HeartRateQuerier::queryRaw(int startTime, int endTime, std::vector>* tuples) +int HeartRateQuerier::queryRaw(time_t startTime, time_t endTime, std::vector>* tuples) { return query(startTime, endTime, tuples); } -int HeartRateQuerier::query(int startTime, int endTime, std::vector>* tuples) +int HeartRateQuerier::query(time_t startTime, time_t endTime, std::vector>* tuples) { char *sql = sqlite3_mprintf( "SELECT " PROJECTION \ diff --git a/src/server/legacy/heartrate/HeartRateQuerier.h b/src/server/legacy/heartrate/HeartRateQuerier.h index 9ca670e..01995d3 100644 --- a/src/server/legacy/heartrate/HeartRateQuerier.h +++ b/src/server/legacy/heartrate/HeartRateQuerier.h @@ -28,8 +28,8 @@ namespace ctx { std::string getProjection(); - int queryRaw(int startTime, int endTime, std::vector>* tuples); - int query(int startTime, int endTime, std::vector>* tuples); + int queryRaw(time_t startTime, time_t endTime, std::vector>* tuples); + int query(time_t startTime, time_t endTime, std::vector>* tuples); }; } diff --git a/src/server/legacy/pedometer/PedometerQuerier.cpp b/src/server/legacy/pedometer/PedometerQuerier.cpp index 648c5d0..6df0d11 100644 --- a/src/server/legacy/pedometer/PedometerQuerier.cpp +++ b/src/server/legacy/pedometer/PedometerQuerier.cpp @@ -59,7 +59,7 @@ std::string PedometerQuerier::getProjection() KEY_END_TIME; } -int PedometerQuerier::queryRaw(int startTime, int endTime, std::vector>* tuples) +int PedometerQuerier::queryRaw(time_t startTime, time_t endTime, std::vector>* tuples) { char *sql = sqlite3_mprintf( "SELECT " PROJECTION_RAW \ @@ -74,7 +74,7 @@ int PedometerQuerier::queryRaw(int startTime, int endTime, std::vector>* tuples) +int PedometerQuerier::query(time_t startTime, time_t endTime, std::vector>* tuples) { char *sql = sqlite3_mprintf( "SELECT " PROJECTION \ @@ -88,7 +88,7 @@ int PedometerQuerier::query(int startTime, int endTime, std::vector>* tuples) +int PedometerQuerier::query(time_t startTime, time_t endTime, time_t anchor, int interval, std::vector>* tuples) { char *sql = sqlite3_mprintf( "SELECT " PROJECTION \ diff --git a/src/server/legacy/pedometer/PedometerQuerier.h b/src/server/legacy/pedometer/PedometerQuerier.h index 057d0d4..08ce5f7 100644 --- a/src/server/legacy/pedometer/PedometerQuerier.h +++ b/src/server/legacy/pedometer/PedometerQuerier.h @@ -28,9 +28,9 @@ namespace ctx { std::string getProjection(); - int queryRaw(int startTime, int endTime, std::vector>* tuples); - int query(int startTime, int endTime, std::vector>* tuples); - int query(int startTime, int endTime, int anchor, int interval, std::vector>* tuples); + int queryRaw(time_t startTime, time_t endTime, std::vector>* tuples); + int query(time_t startTime, time_t endTime, std::vector>* tuples); + int query(time_t startTime, time_t endTime, time_t anchor, int interval, std::vector>* tuples); }; } diff --git a/src/server/legacy/pressure/PressureQuerier.cpp b/src/server/legacy/pressure/PressureQuerier.cpp index 00f67bb..070dc25 100644 --- a/src/server/legacy/pressure/PressureQuerier.cpp +++ b/src/server/legacy/pressure/PressureQuerier.cpp @@ -57,7 +57,7 @@ std::string PressureQuerier::getProjection() KEY_END_TIME; } -int PressureQuerier::queryRaw(int startTime, int endTime, std::vector>* tuples) +int PressureQuerier::queryRaw(time_t startTime, time_t endTime, std::vector>* tuples) { char *sql = sqlite3_mprintf( "SELECT " PROJECTION_RAW \ @@ -71,7 +71,7 @@ int PressureQuerier::queryRaw(int startTime, int endTime, std::vector>* tuples) +int PressureQuerier::query(time_t startTime, time_t endTime, std::vector>* tuples) { char *sql = sqlite3_mprintf( "SELECT " PROJECTION \ @@ -85,7 +85,7 @@ int PressureQuerier::query(int startTime, int endTime, std::vector>* tuples) +int PressureQuerier::query(time_t startTime, time_t endTime, time_t anchor, int interval, std::vector>* tuples) { char *sql = sqlite3_mprintf( "SELECT " PROJECTION \ diff --git a/src/server/legacy/pressure/PressureQuerier.h b/src/server/legacy/pressure/PressureQuerier.h index f6380e6..a89e7ba 100644 --- a/src/server/legacy/pressure/PressureQuerier.h +++ b/src/server/legacy/pressure/PressureQuerier.h @@ -28,9 +28,9 @@ namespace ctx { std::string getProjection(); - int queryRaw(int startTime, int endTime, std::vector>* tuples); - int query(int startTime, int endTime, std::vector>* tuples); - int query(int startTime, int endTime, int anchor, int interval, std::vector>* tuples); + int queryRaw(time_t startTime, time_t endTime, std::vector>* tuples); + int query(time_t startTime, time_t endTime, std::vector>* tuples); + int query(time_t startTime, time_t endTime, time_t anchor, int interval, std::vector>* tuples); }; } diff --git a/src/server/legacy/sleep/SleepQuerier.cpp b/src/server/legacy/sleep/SleepQuerier.cpp index 1e3e344..9b2dd0f 100644 --- a/src/server/legacy/sleep/SleepQuerier.cpp +++ b/src/server/legacy/sleep/SleepQuerier.cpp @@ -40,12 +40,12 @@ std::string SleepQuerier::getProjection() return KEY_STATE "," KEY_START_TIME "," KEY_END_TIME; } -int SleepQuerier::queryRaw(int startTime, int endTime, std::vector>* tuples) +int SleepQuerier::queryRaw(time_t startTime, time_t endTime, std::vector>* tuples) { return query(startTime, endTime, tuples); } -int SleepQuerier::query(int startTime, int endTime, std::vector>* tuples) +int SleepQuerier::query(time_t startTime, time_t endTime, std::vector>* tuples) { char *sql = sqlite3_mprintf( "SELECT " PROJECTION \ diff --git a/src/server/legacy/sleep/SleepQuerier.h b/src/server/legacy/sleep/SleepQuerier.h index e76fc10..69da521 100644 --- a/src/server/legacy/sleep/SleepQuerier.h +++ b/src/server/legacy/sleep/SleepQuerier.h @@ -28,8 +28,8 @@ namespace ctx { std::string getProjection(); - int queryRaw(int startTime, int endTime, std::vector>* tuples); - int query(int startTime, int endTime, std::vector>* tuples); + int queryRaw(time_t startTime, time_t endTime, std::vector>* tuples); + int query(time_t startTime, time_t endTime, std::vector>* tuples); }; } -- 2.7.4 From f3bd13032f6dcc877c04403165d560a506e3aefb Mon Sep 17 00:00:00 2001 From: Mu-Woong Lee Date: Wed, 12 Jul 2017 19:10:58 +0900 Subject: [PATCH 06/16] Apply the changed function names in context-common Change-Id: I4f1c26d00d7b79be5f5c169188054e2108500f61 Signed-off-by: Mu-Woong Lee --- src/client/QueryResultListener.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/QueryResultListener.cpp b/src/client/QueryResultListener.cpp index 501856a..72566c0 100644 --- a/src/client/QueryResultListener.cpp +++ b/src/client/QueryResultListener.cpp @@ -36,7 +36,7 @@ void QueryResultListener::onSuccess(const std::string& methodName, GVariant* par int remains = records.size(); ctx_sensor_rec_data_s data; - data.keys = util::tokenizeString(schema, ","); + data.keys = util::tokenize_string(schema, ","); _D("%d records received", remains); -- 2.7.4 From 3f92573dbd96716512489dd5cb91605aa19d8c9b Mon Sep 17 00:00:00 2001 From: Mu-Woong Lee Date: Wed, 12 Jul 2017 19:10:58 +0900 Subject: [PATCH 07/16] Apply the changed function names in context-common Change-Id: I4f1c26d00d7b79be5f5c169188054e2108500f61 Signed-off-by: Mu-Woong Lee (cherry picked from commit f3bd13032f6dcc877c04403165d560a506e3aefb) --- src/client/QueryResultListener.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/QueryResultListener.cpp b/src/client/QueryResultListener.cpp index 501856a..72566c0 100644 --- a/src/client/QueryResultListener.cpp +++ b/src/client/QueryResultListener.cpp @@ -36,7 +36,7 @@ void QueryResultListener::onSuccess(const std::string& methodName, GVariant* par int remains = records.size(); ctx_sensor_rec_data_s data; - data.keys = util::tokenizeString(schema, ","); + data.keys = util::tokenize_string(schema, ","); _D("%d records received", remains); -- 2.7.4 From cdc1d81a1435e606e12b89e1f0c0f4556ef3fbf2 Mon Sep 17 00:00:00 2001 From: Somin Kim Date: Mon, 11 Sep 2017 21:12:36 +0900 Subject: [PATCH 08/16] Fix coding rule violations Change-Id: Ie46bcbd0f0bd966d5ba12c20f0a8c4b8add5b450 Signed-off-by: Somin Kim --- src/server/MethodCallHandler.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/server/MethodCallHandler.cpp b/src/server/MethodCallHandler.cpp index c821a24..9b27d50 100644 --- a/src/server/MethodCallHandler.cpp +++ b/src/server/MethodCallHandler.cpp @@ -53,7 +53,6 @@ void MethodCallHandler::onMethodCalled(IMethodCall* methodCall) } else if (methodCall->getMethodName() == METHOD_READ_REC) { __readRecords(*provider, *methodCall); } - } catch (const int error) { _W("Catch: %s", CTX_ERROR_STR(error)); methodCall->reply(error); -- 2.7.4 From 2e29f97d4b06c423e842007b1c1ca20ab5a844da Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Fri, 13 Oct 2017 20:18:38 +0900 Subject: [PATCH 09/16] Revert "Replace the glib-json wrapper CtxJson with jsoncpp" This reverts commit 61da57e6c5ea97e9ea7a038ea2b810aeba940770. Change-Id: I6f61206006264eb36f35a09267c496ca15561252 --- packaging/context-sensor-recorder.spec | 1 - src/client/CMakeLists.txt | 2 +- src/client/sensor_recorder.cpp | 37 ++++++--------- src/server/CMakeLists.txt | 2 +- src/server/legacy/Querier.cpp | 6 +-- src/server/legacy/Querier.h | 6 +-- src/server/legacy/RecorderClientInfo.cpp | 35 ++++++-------- src/server/legacy/RecorderClientInfo.h | 10 ++-- src/server/legacy/SensorProvider.cpp | 59 ++++++++++-------------- src/server/legacy/SensorProvider.h | 8 ++-- src/server/legacy/heartrate/HeartRate.cpp | 15 ++++-- src/server/legacy/heartrate/HeartRate.h | 2 +- src/server/legacy/heartrate/HeartRateLogger.cpp | 2 +- src/server/legacy/heartrate/HeartRateQuerier.cpp | 4 +- src/server/legacy/heartrate/HeartRateQuerier.h | 4 +- src/server/legacy/pedometer/PedometerQuerier.cpp | 6 +-- src/server/legacy/pedometer/PedometerQuerier.h | 6 +-- src/server/legacy/pressure/PressureQuerier.cpp | 6 +-- src/server/legacy/pressure/PressureQuerier.h | 6 +-- src/server/legacy/sleep/SleepQuerier.cpp | 4 +- src/server/legacy/sleep/SleepQuerier.h | 4 +- 21 files changed, 102 insertions(+), 123 deletions(-) diff --git a/packaging/context-sensor-recorder.spec b/packaging/context-sensor-recorder.spec index 6a27459..aaadc2d 100644 --- a/packaging/context-sensor-recorder.spec +++ b/packaging/context-sensor-recorder.spec @@ -9,7 +9,6 @@ Source0: %{name}-%{version}.tar.gz BuildRequires: cmake BuildRequires: pkgconfig(glib-2.0) BuildRequires: pkgconfig(gio-2.0) -BuildRequires: pkgconfig(jsoncpp) BuildRequires: pkgconfig(dlog) BuildRequires: pkgconfig(sensor) BuildRequires: pkgconfig(capi-base-common) diff --git a/src/client/CMakeLists.txt b/src/client/CMakeLists.txt index 46d4131..8f551d7 100644 --- a/src/client/CMakeLists.txt +++ b/src/client/CMakeLists.txt @@ -1,6 +1,6 @@ SET(target "${PROJECT_NAME}-client-genuine") -SET(DEPS "${DEPS} jsoncpp context-common-client") +SET(DEPS "${DEPS} context-common-client") FILE(GLOB_RECURSE SRCS *.cpp ../shared/*.cpp) MESSAGE("Sources: ${SRCS}") diff --git a/src/client/sensor_recorder.cpp b/src/client/sensor_recorder.cpp index 1973f76..618cfcf 100644 --- a/src/client/sensor_recorder.cpp +++ b/src/client/sensor_recorder.cpp @@ -14,10 +14,10 @@ * limitations under the License. */ -#include #include #include #include +#include #include "QueryResultListener.h" #define STR_BUFFER_SIZE 128 @@ -48,11 +48,8 @@ EXPORT_API int ctx_sensor_rec_start(const char* subject, ctx_sensor_rec_option_h IF_FAIL_RETURN(subject, E_PARAM); std::string optionStr; - if (option) { - Json::FastWriter fw; - fw.omitEndingLineFeed(); - optionStr = fw.write(*static_cast(option)); - } + if (option) + optionStr = static_cast(option)->str(); GVariant* param = g_variant_new("(ss)", subject, optionStr.c_str()); @@ -69,7 +66,7 @@ EXPORT_API int ctx_sensor_rec_create_option(ctx_sensor_rec_option_h *option) { IF_FAIL_RETURN(option, E_PARAM); - *option = new(std::nothrow) Json::Value; + *option = new(std::nothrow) ctx::CtxJson; IF_FAIL_RETURN(*option, E_NO_MEM); return E_NONE; @@ -79,7 +76,7 @@ EXPORT_API int ctx_sensor_rec_destroy_option(ctx_sensor_rec_option_h option) { IF_FAIL_RETURN(option, E_PARAM); - delete static_cast(option); + delete static_cast(option); return E_NONE; } @@ -90,8 +87,8 @@ EXPORT_API int ctx_sensor_rec_option_set_int(ctx_sensor_rec_option_h option, con IF_FAIL_RETURN(STR_EQ(param, CTX_SENSOR_RECORDER_KEY_INTERVAL) || STR_EQ(param, CTX_SENSOR_RECORDER_KEY_RETENTION), E_PARAM); - Json::Value& optionJson = *static_cast(option); - optionJson[param] = value; + ctx::CtxJson* optionCtxJson = static_cast(option); + optionCtxJson->set(NULL, param, static_cast(value)); return E_NONE; } @@ -100,7 +97,7 @@ EXPORT_API int ctx_sensor_rec_create_query(ctx_sensor_rec_query_h *query) { IF_FAIL_RETURN(query, E_PARAM); - *query = new(std::nothrow) Json::Value; + *query = new(std::nothrow) ctx::CtxJson; IF_FAIL_RETURN(*query, E_NO_MEM); return E_NONE; @@ -110,7 +107,7 @@ EXPORT_API int ctx_sensor_rec_destroy_query(ctx_sensor_rec_query_h query) { IF_FAIL_RETURN(query, E_PARAM); - delete static_cast(query); + delete static_cast(query); return E_NONE; } @@ -123,8 +120,8 @@ EXPORT_API int ctx_sensor_rec_query_set_int(ctx_sensor_rec_query_h query, const STR_EQ(param, CTX_SENSOR_RECORDER_KEY_START_TIME) || STR_EQ(param, CTX_SENSOR_RECORDER_KEY_END_TIME), E_PARAM); - Json::Value& queryJson = *static_cast(query); - queryJson[param] = value; + ctx::CtxJson* queryCtxJson = static_cast(query); + queryCtxJson->set(NULL, param, static_cast(value)); return E_NONE; } @@ -136,8 +133,8 @@ EXPORT_API int ctx_sensor_rec_query_set_time(ctx_sensor_rec_query_h query, const STR_EQ(param, CTX_SENSOR_RECORDER_KEY_START_TIME) || STR_EQ(param, CTX_SENSOR_RECORDER_KEY_END_TIME), E_PARAM); - Json::Value& queryJson = *static_cast(query); - queryJson[param] = static_cast(t); + ctx::CtxJson* queryCtxJson = static_cast(query); + queryCtxJson->set(NULL, param, static_cast(t)); return E_NONE; } @@ -149,9 +146,7 @@ EXPORT_API int ctx_sensor_rec_read(const char* subject, ctx_sensor_rec_query_h q QueryResultListener* listener = new(std::nothrow) QueryResultListener(subject, cb, user_data); IF_FAIL_RETURN_TAG(listener, E_NO_MEM, _E, E_STR_ALLOC); - Json::FastWriter fw; - fw.omitEndingLineFeed(); - std::string queryStr = fw.write(*static_cast(query)); + std::string queryStr = static_cast(query)->str(); GVariant* param = g_variant_new("(ss)", subject, queryStr.c_str()); int error = __getServiceProxy()->call(METHOD_READ_REC, param, listener); @@ -169,9 +164,7 @@ EXPORT_API int ctx_sensor_rec_read_sync(const char* subject, ctx_sensor_rec_quer QueryResultListener* listener = new(std::nothrow) QueryResultListener(subject, cb, user_data); IF_FAIL_RETURN_TAG(listener, E_NO_MEM, _E, E_STR_ALLOC); - Json::FastWriter fw; - fw.omitEndingLineFeed(); - std::string queryStr = fw.write(*static_cast(query)); + std::string queryStr = static_cast(query)->str(); GVariant* param = g_variant_new("(ss)", subject, queryStr.c_str()); GVariant* outParam = NULL; diff --git a/src/server/CMakeLists.txt b/src/server/CMakeLists.txt index d380df0..ee007d8 100644 --- a/src/server/CMakeLists.txt +++ b/src/server/CMakeLists.txt @@ -1,6 +1,6 @@ SET(target "${PROJECT_NAME}-server-genuine") -SET(DEPS "${DEPS} jsoncpp context-common-server capi-system-info sensor") +SET(DEPS "${DEPS} context-common-server capi-system-info sensor") FILE(GLOB_RECURSE SRCS *.cpp ../shared/*.cpp) MESSAGE("Sources: ${SRCS}") diff --git a/src/server/legacy/Querier.cpp b/src/server/legacy/Querier.cpp index 3eee5bf..37f16e8 100644 --- a/src/server/legacy/Querier.cpp +++ b/src/server/legacy/Querier.cpp @@ -39,17 +39,17 @@ int Querier::query(const char *sql, std::vector>* tuples) return ret ? E_NONE : E_FAILED; } -int Querier::queryRaw(time_t startTime, time_t endTime, std::vector>* tuples) +int Querier::queryRaw(int startTime, int endTime, std::vector>* tuples) { return E_PARAM; } -int Querier::query(time_t startTime, time_t endTime, std::vector>* tuples) +int Querier::query(int startTime, int endTime, std::vector>* tuples) { return E_PARAM; } -int Querier::query(time_t startTime, time_t endTime, time_t anchor, int interval, std::vector>* tuples) +int Querier::query(int startTime, int endTime, int anchor, int interval, std::vector>* tuples) { _D("Ignore anchor & interval"); return query(startTime, endTime, tuples); diff --git a/src/server/legacy/Querier.h b/src/server/legacy/Querier.h index 948fa4e..354681d 100644 --- a/src/server/legacy/Querier.h +++ b/src/server/legacy/Querier.h @@ -29,9 +29,9 @@ namespace ctx { virtual std::string getProjection(); - virtual int queryRaw(time_t startTime, time_t endTime, std::vector>* tuples); - virtual int query(time_t startTime, time_t endTime, std::vector>* tuples); - virtual int query(time_t startTime, time_t endTime, time_t anchor, int interval, std::vector>* tuples); + virtual int queryRaw(int startTime, int endTime, std::vector>* tuples); + virtual int query(int startTime, int endTime, std::vector>* tuples); + virtual int query(int startTime, int endTime, int anchor, int interval, std::vector>* tuples); protected: int query(const char *sql, std::vector>* tuples); diff --git a/src/server/legacy/RecorderClientInfo.cpp b/src/server/legacy/RecorderClientInfo.cpp index 56b8f02..2bf99d8 100644 --- a/src/server/legacy/RecorderClientInfo.cpp +++ b/src/server/legacy/RecorderClientInfo.cpp @@ -55,7 +55,7 @@ RecorderClientInfo::~RecorderClientInfo() __uninstallMonitor = NULL; } -int RecorderClientInfo::get(std::string subject, std::string pkgId, Json::Value& option) +int RecorderClientInfo::get(std::string subject, std::string pkgId, CtxJson& option) { bool ret; std::string optStr; @@ -73,14 +73,12 @@ int RecorderClientInfo::get(std::string subject, std::string pkgId, Json::Value& IF_FAIL_RETURN(!tuples.empty(), E_NO_DATA); tuples[0]->getAt(0, &optStr); - - Json::Reader jr; - jr.parse(optStr, option); + option = optStr; return E_NONE; } -int RecorderClientInfo::get(std::string subject, std::vector& options) +int RecorderClientInfo::get(std::string subject, std::vector& options) { bool ret; std::string optStr; @@ -97,15 +95,9 @@ int RecorderClientInfo::get(std::string subject, std::vector& optio IF_FAIL_RETURN(ret, E_FAILED); IF_FAIL_RETURN(!tuples.empty(), E_NO_DATA); - Json::Reader jr; - for (auto& tuple : tuples) { tuple->getAt(0, &optStr); - - Json::Value opt; - jr.parse(optStr, opt); - - options.push_back(opt); + options.push_back(CtxJson(optStr)); } return E_NONE; @@ -130,15 +122,12 @@ bool RecorderClientInfo::exist(std::string subject) return true; } -bool RecorderClientInfo::set(std::string subject, std::string pkgId, const Json::Value& option, int retentionPeriod) +bool RecorderClientInfo::set(std::string subject, std::string pkgId, CtxJson option, int retentionPeriod) { bool ret; - Json::FastWriter fw; - fw.omitEndingLineFeed(); - char *query = sqlite3_mprintf( "INSERT INTO " CLIENT_INFO " VALUES ('%q', '%q', '%q', %d)", - subject.c_str(), pkgId.c_str(), fw.write(option).c_str(), retentionPeriod); + subject.c_str(), pkgId.c_str(), option.str().c_str(), retentionPeriod); ret = SensorDatabase::execute(query, NULL); sqlite3_free(query); @@ -160,15 +149,17 @@ bool RecorderClientInfo::remove(std::string subject, std::string pkgId) return ret; } -void RecorderClientInfo::getParam(std::vector &options, const char *key, float *min, float *max) +void RecorderClientInfo::getParam(std::vector &options, const char *key, float *min, float *max) { - for (auto& opt : options) { - if (!opt.isMember(key)) + double val; + + for (CtxJson& opt : options) { + if (!opt.get(NULL, key, &val)) continue; if (min) - *min = MIN(*min, static_cast(opt[key].asInt64())); + *min = MIN(*min, static_cast(val)); if (max) - *max = MAX(*max, static_cast(opt[key].asInt64())); + *max = MAX(*max, static_cast(val)); } } diff --git a/src/server/legacy/RecorderClientInfo.h b/src/server/legacy/RecorderClientInfo.h index 1b8b710..0c85919 100644 --- a/src/server/legacy/RecorderClientInfo.h +++ b/src/server/legacy/RecorderClientInfo.h @@ -17,9 +17,9 @@ #ifndef __SENSOR_RECORDER_CLIENT_INFO_H__ #define __SENSOR_RECORDER_CLIENT_INFO_H__ -#include #include #include +#include #include #include "UninstallMonitor.h" @@ -32,14 +32,14 @@ namespace ctx { RecorderClientInfo(); ~RecorderClientInfo(); - int get(std::string subject, std::string pkgId, Json::Value& option); - int get(std::string subject, std::vector& options); + int get(std::string subject, std::string pkgId, CtxJson& option); + int get(std::string subject, std::vector& options); bool exist(std::string subject); - bool set(std::string subject, std::string pkgId, const Json::Value& option, int retentionPeriod); + bool set(std::string subject, std::string pkgId, CtxJson option, int retentionPeriod); bool remove(std::string subject, std::string pkgId); - void getParam(std::vector& options, const char *key, float *min, float *max); + void getParam(std::vector& options, const char *key, float *min, float *max); static void purgeClient(std::string pkgId); static void setHostService(SensorRecorderService* hostService); diff --git a/src/server/legacy/SensorProvider.cpp b/src/server/legacy/SensorProvider.cpp index a3a4e00..a31a050 100644 --- a/src/server/legacy/SensorProvider.cpp +++ b/src/server/legacy/SensorProvider.cpp @@ -98,32 +98,24 @@ const char* SensorProvider::getPrivilege() return NULL; } -int SensorProvider::readRecords(const std::string& option, std::string* projection, std::vector>* tuples) +int SensorProvider::readRecords(CtxJson option, std::string* projection, std::vector>* tuples) { - time_t endTime = time(NULL) + 1; - time_t startTime = endTime - DEFAULT_QUERY_PERIOD - 1; - time_t anchor = -1; + int endTime = static_cast(time(NULL)) + 1; + int startTime = endTime - DEFAULT_QUERY_PERIOD - 1; + int anchor = -1; int interval = -1; - Json::Reader jr; - Json::Value optionJson; - jr.parse(option, optionJson); + if (option.get(NULL, KEY_START_TIME, &startTime)) + IF_FAIL_RETURN(startTime >= 0, E_PARAM); - startTime = static_cast(optionJson.get(KEY_START_TIME, static_cast(startTime)).asInt64()); - IF_FAIL_RETURN(startTime >= 0, E_PARAM); + if (option.get(NULL, KEY_END_TIME, &endTime)) + IF_FAIL_RETURN(endTime >= 0, E_PARAM); - endTime = static_cast(optionJson.get(KEY_END_TIME, static_cast(endTime)).asInt64()); - IF_FAIL_RETURN(endTime >= 0, E_PARAM); - - if (optionJson.isMember(KEY_ANCHOR)) { - anchor = static_cast(optionJson[KEY_ANCHOR].asInt64()); + if (option.get(NULL, KEY_ANCHOR, &anchor)) IF_FAIL_RETURN(anchor >= 0, E_PARAM); - } - if (optionJson.isMember(KEY_INTERVAL)) { - interval = optionJson[KEY_INTERVAL].asInt(); + if (option.get(NULL, KEY_INTERVAL, &interval)) IF_FAIL_RETURN(interval >= 0, E_PARAM); - } if (endTime >= 0 && startTime >= endTime) return E_PARAM; @@ -149,24 +141,21 @@ int SensorProvider::readRecords(const std::string& option, std::string* projecti return ret; } -int SensorProvider::startRecording(const std::string& pkgId, const std::string& option) +int SensorProvider::startRecording(const std::string& pkgId, CtxJson option) { int retentionPeriod = DEFAULT_RETENTION; - _D("PkgId: %s, Option: %s", pkgId.c_str(), option.c_str()); - - Json::Reader jr; - Json::Value optionJson; - jr.parse(option, optionJson); + _D("PkgId: %s", pkgId.c_str()); + _J("Option", option); - if (optionJson.isMember(KEY_RETENTION)) { - retentionPeriod = optionJson[KEY_RETENTION].asInt() * SECONDS_PER_HOUR; - optionJson.removeMember(KEY_RETENTION); + if (option.get(NULL, KEY_RETENTION, &retentionPeriod)) { + retentionPeriod *= SECONDS_PER_HOUR; + option.remove(NULL, KEY_RETENTION); } - IF_FAIL_RETURN(verifyOption(optionJson), E_PARAM); + IF_FAIL_RETURN(verifyOption(option), E_PARAM); - return __addClient(pkgId, retentionPeriod, optionJson); + return __addClient(pkgId, retentionPeriod, option); } int SensorProvider::stopRecording(const std::string& pkgId) @@ -176,14 +165,16 @@ int SensorProvider::stopRecording(const std::string& pkgId) return __removeClient(pkgId); } -bool SensorProvider::verifyOption(const Json::Value& option) +bool SensorProvider::verifyOption(CtxJson option) { - return option.empty(); + std::list keys; + option.getKeys(&keys); + return keys.size() == 0; } -int SensorProvider::__addClient(std::string pkgId, int retentionPeriod, Json::Value& option) +int SensorProvider::__addClient(std::string pkgId, int retentionPeriod, CtxJson option) { - Json::Value tmp; + CtxJson tmp; int ret; /* Validate the retention period */ @@ -206,7 +197,7 @@ int SensorProvider::__addClient(std::string pkgId, int retentionPeriod, Json::Va int SensorProvider::__removeClient(std::string pkgId) { - std::vector options; + std::vector options; int ret; /* Remove the app's request first */ diff --git a/src/server/legacy/SensorProvider.h b/src/server/legacy/SensorProvider.h index e76068a..0e17775 100644 --- a/src/server/legacy/SensorProvider.h +++ b/src/server/legacy/SensorProvider.h @@ -35,8 +35,8 @@ namespace ctx { const char* getSubject(); - int readRecords(const std::string& option, std::string* projection, std::vector>* tuples); - int startRecording(const std::string& pkgId, const std::string& option); + int readRecords(CtxJson option, std::string* projection, std::vector>* tuples); + int startRecording(const std::string& pkgId, CtxJson option); int stopRecording(const std::string& pkgId); virtual bool isSupported(); @@ -55,10 +55,10 @@ namespace ctx { virtual SensorLogger* getLogger() = 0; virtual Querier* getQuerier() = 0; - virtual bool verifyOption(const Json::Value& option); + virtual bool verifyOption(CtxJson option); private: - int __addClient(std::string pkgId, int retentionPeriod, Json::Value& option); + int __addClient(std::string pkgId, int retentionPeriod, CtxJson option); int __removeClient(std::string pkgId); std::string __subject; diff --git a/src/server/legacy/heartrate/HeartRate.cpp b/src/server/legacy/heartrate/HeartRate.cpp index 17ef774..55dadf2 100644 --- a/src/server/legacy/heartrate/HeartRate.cpp +++ b/src/server/legacy/heartrate/HeartRate.cpp @@ -49,13 +49,18 @@ Querier* HeartRateProvider::getQuerier() return &__querier; } -bool HeartRateProvider::verifyOption(const Json::Value& option) +bool HeartRateProvider::verifyOption(CtxJson option) { - IF_FAIL_RETURN(option.size() <= 1, false); + std::list keys; + option.getKeys(&keys); - int interval = option.get(KEY_INTERVAL, MIN_MEASURING_INTERVAL).asInt(); - if (interval < MIN_MEASURING_INTERVAL || interval > MAX_MEASURING_INTERVAL) - return false; + IF_FAIL_RETURN(keys.size() <= 1, false); + + int interval = 0; + if (option.get(NULL, KEY_INTERVAL, &interval)) { + if (interval < MIN_MEASURING_INTERVAL || interval > MAX_MEASURING_INTERVAL) + return false; + } return true; } diff --git a/src/server/legacy/heartrate/HeartRate.h b/src/server/legacy/heartrate/HeartRate.h index 0aaab05..05b1e60 100644 --- a/src/server/legacy/heartrate/HeartRate.h +++ b/src/server/legacy/heartrate/HeartRate.h @@ -34,7 +34,7 @@ namespace ctx { protected: SensorLogger* getLogger(); Querier* getQuerier(); - bool verifyOption(const Json::Value& option); + bool verifyOption(CtxJson option); private: HeartRateLogger __logger; diff --git a/src/server/legacy/heartrate/HeartRateLogger.cpp b/src/server/legacy/heartrate/HeartRateLogger.cpp index 15c2f12..427fcf1 100644 --- a/src/server/legacy/heartrate/HeartRateLogger.cpp +++ b/src/server/legacy/heartrate/HeartRateLogger.cpp @@ -58,7 +58,7 @@ HeartRateLogger::~HeartRateLogger() bool HeartRateLogger::start() { - std::vector options; + std::vector options; RecorderClientInfo clientInfo; float interval = MAX_MEASURING_INTERVAL; diff --git a/src/server/legacy/heartrate/HeartRateQuerier.cpp b/src/server/legacy/heartrate/HeartRateQuerier.cpp index 546a50d..2bf1fba 100644 --- a/src/server/legacy/heartrate/HeartRateQuerier.cpp +++ b/src/server/legacy/heartrate/HeartRateQuerier.cpp @@ -39,12 +39,12 @@ std::string HeartRateQuerier::getProjection() return KEY_HEART_RATE "," KEY_START_TIME "," KEY_END_TIME; } -int HeartRateQuerier::queryRaw(time_t startTime, time_t endTime, std::vector>* tuples) +int HeartRateQuerier::queryRaw(int startTime, int endTime, std::vector>* tuples) { return query(startTime, endTime, tuples); } -int HeartRateQuerier::query(time_t startTime, time_t endTime, std::vector>* tuples) +int HeartRateQuerier::query(int startTime, int endTime, std::vector>* tuples) { char *sql = sqlite3_mprintf( "SELECT " PROJECTION \ diff --git a/src/server/legacy/heartrate/HeartRateQuerier.h b/src/server/legacy/heartrate/HeartRateQuerier.h index 01995d3..9ca670e 100644 --- a/src/server/legacy/heartrate/HeartRateQuerier.h +++ b/src/server/legacy/heartrate/HeartRateQuerier.h @@ -28,8 +28,8 @@ namespace ctx { std::string getProjection(); - int queryRaw(time_t startTime, time_t endTime, std::vector>* tuples); - int query(time_t startTime, time_t endTime, std::vector>* tuples); + int queryRaw(int startTime, int endTime, std::vector>* tuples); + int query(int startTime, int endTime, std::vector>* tuples); }; } diff --git a/src/server/legacy/pedometer/PedometerQuerier.cpp b/src/server/legacy/pedometer/PedometerQuerier.cpp index 6df0d11..648c5d0 100644 --- a/src/server/legacy/pedometer/PedometerQuerier.cpp +++ b/src/server/legacy/pedometer/PedometerQuerier.cpp @@ -59,7 +59,7 @@ std::string PedometerQuerier::getProjection() KEY_END_TIME; } -int PedometerQuerier::queryRaw(time_t startTime, time_t endTime, std::vector>* tuples) +int PedometerQuerier::queryRaw(int startTime, int endTime, std::vector>* tuples) { char *sql = sqlite3_mprintf( "SELECT " PROJECTION_RAW \ @@ -74,7 +74,7 @@ int PedometerQuerier::queryRaw(time_t startTime, time_t endTime, std::vector>* tuples) +int PedometerQuerier::query(int startTime, int endTime, std::vector>* tuples) { char *sql = sqlite3_mprintf( "SELECT " PROJECTION \ @@ -88,7 +88,7 @@ int PedometerQuerier::query(time_t startTime, time_t endTime, std::vector>* tuples) +int PedometerQuerier::query(int startTime, int endTime, int anchor, int interval, std::vector>* tuples) { char *sql = sqlite3_mprintf( "SELECT " PROJECTION \ diff --git a/src/server/legacy/pedometer/PedometerQuerier.h b/src/server/legacy/pedometer/PedometerQuerier.h index 08ce5f7..057d0d4 100644 --- a/src/server/legacy/pedometer/PedometerQuerier.h +++ b/src/server/legacy/pedometer/PedometerQuerier.h @@ -28,9 +28,9 @@ namespace ctx { std::string getProjection(); - int queryRaw(time_t startTime, time_t endTime, std::vector>* tuples); - int query(time_t startTime, time_t endTime, std::vector>* tuples); - int query(time_t startTime, time_t endTime, time_t anchor, int interval, std::vector>* tuples); + int queryRaw(int startTime, int endTime, std::vector>* tuples); + int query(int startTime, int endTime, std::vector>* tuples); + int query(int startTime, int endTime, int anchor, int interval, std::vector>* tuples); }; } diff --git a/src/server/legacy/pressure/PressureQuerier.cpp b/src/server/legacy/pressure/PressureQuerier.cpp index 070dc25..00f67bb 100644 --- a/src/server/legacy/pressure/PressureQuerier.cpp +++ b/src/server/legacy/pressure/PressureQuerier.cpp @@ -57,7 +57,7 @@ std::string PressureQuerier::getProjection() KEY_END_TIME; } -int PressureQuerier::queryRaw(time_t startTime, time_t endTime, std::vector>* tuples) +int PressureQuerier::queryRaw(int startTime, int endTime, std::vector>* tuples) { char *sql = sqlite3_mprintf( "SELECT " PROJECTION_RAW \ @@ -71,7 +71,7 @@ int PressureQuerier::queryRaw(time_t startTime, time_t endTime, std::vector>* tuples) +int PressureQuerier::query(int startTime, int endTime, std::vector>* tuples) { char *sql = sqlite3_mprintf( "SELECT " PROJECTION \ @@ -85,7 +85,7 @@ int PressureQuerier::query(time_t startTime, time_t endTime, std::vector>* tuples) +int PressureQuerier::query(int startTime, int endTime, int anchor, int interval, std::vector>* tuples) { char *sql = sqlite3_mprintf( "SELECT " PROJECTION \ diff --git a/src/server/legacy/pressure/PressureQuerier.h b/src/server/legacy/pressure/PressureQuerier.h index a89e7ba..f6380e6 100644 --- a/src/server/legacy/pressure/PressureQuerier.h +++ b/src/server/legacy/pressure/PressureQuerier.h @@ -28,9 +28,9 @@ namespace ctx { std::string getProjection(); - int queryRaw(time_t startTime, time_t endTime, std::vector>* tuples); - int query(time_t startTime, time_t endTime, std::vector>* tuples); - int query(time_t startTime, time_t endTime, time_t anchor, int interval, std::vector>* tuples); + int queryRaw(int startTime, int endTime, std::vector>* tuples); + int query(int startTime, int endTime, std::vector>* tuples); + int query(int startTime, int endTime, int anchor, int interval, std::vector>* tuples); }; } diff --git a/src/server/legacy/sleep/SleepQuerier.cpp b/src/server/legacy/sleep/SleepQuerier.cpp index 9b2dd0f..1e3e344 100644 --- a/src/server/legacy/sleep/SleepQuerier.cpp +++ b/src/server/legacy/sleep/SleepQuerier.cpp @@ -40,12 +40,12 @@ std::string SleepQuerier::getProjection() return KEY_STATE "," KEY_START_TIME "," KEY_END_TIME; } -int SleepQuerier::queryRaw(time_t startTime, time_t endTime, std::vector>* tuples) +int SleepQuerier::queryRaw(int startTime, int endTime, std::vector>* tuples) { return query(startTime, endTime, tuples); } -int SleepQuerier::query(time_t startTime, time_t endTime, std::vector>* tuples) +int SleepQuerier::query(int startTime, int endTime, std::vector>* tuples) { char *sql = sqlite3_mprintf( "SELECT " PROJECTION \ diff --git a/src/server/legacy/sleep/SleepQuerier.h b/src/server/legacy/sleep/SleepQuerier.h index 69da521..e76fc10 100644 --- a/src/server/legacy/sleep/SleepQuerier.h +++ b/src/server/legacy/sleep/SleepQuerier.h @@ -28,8 +28,8 @@ namespace ctx { std::string getProjection(); - int queryRaw(time_t startTime, time_t endTime, std::vector>* tuples); - int query(time_t startTime, time_t endTime, std::vector>* tuples); + int queryRaw(int startTime, int endTime, std::vector>* tuples); + int query(int startTime, int endTime, std::vector>* tuples); }; } -- 2.7.4 From 5e67e6d4e7fd9278a161e37516eba8e239d5a6be Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Fri, 13 Oct 2017 22:29:48 +0900 Subject: [PATCH 10/16] sensor-recorder: restore CtxJson to prevent crash issue Change-Id: I7078393fd0613f43b55d65981bd02c65b36c8b14 Signed-off-by: kibak.yoon --- CMakeLists.txt | 2 +- include/CtxJson.h | 122 +++++ packaging/context-sensor-recorder.spec | 1 + src/shared/CtxJson.cpp | 926 +++++++++++++++++++++++++++++++++ 4 files changed, 1050 insertions(+), 1 deletion(-) create mode 100644 include/CtxJson.h create mode 100644 src/shared/CtxJson.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 745ada6..412fd39 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.6) PROJECT(context-sensor-recorder) INCLUDE(GNUInstallDirs) -SET(DEPS "glib-2.0 gio-2.0 dlog capi-base-common") +SET(DEPS "glib-2.0 gio-2.0 json-glib-1.0 dlog capi-base-common") SET(INCDIR "${CMAKE_INSTALL_INCLUDEDIR}/context-service") INCLUDE_DIRECTORIES( diff --git a/include/CtxJson.h b/include/CtxJson.h new file mode 100644 index 0000000..4f661e4 --- /dev/null +++ b/include/CtxJson.h @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CONTEXT_JSON_H__ +#define __CONTEXT_JSON_H__ + +#include +#include +#include +#include + +#define _J(cmt, jobj) \ +do { \ + _SD("%s: %s", (cmt), jobj.str().c_str()); \ +} while (0) + +#define EMPTY_JSON_OBJECT "{}" + +namespace ctx { + + class EXPORT_API CtxJson { + public: + CtxJson(); + CtxJson(const char *s); + CtxJson(const std::string &s); + + /* This CtxJson(const CtxJson &j) only copies the reference to the underlying CtxJson node. + * Therefore, changes applied to a CtxJson object affect the other. + * If you need to create a 'real' copy of a CtxJson, which can be manipulated separately, + * utilize the str() function, e.g., ctx::CtxJson copy(original.str()); + */ + CtxJson(const CtxJson &j); + + ~CtxJson(); + + CtxJson& operator=(const char *s); + CtxJson& operator=(const std::string &s); + + /* This operator=(const CtxJson &j) only copies the reference to the underlying CtxJson node. + * Therefore, changes applied to a CtxJson object affect the other. + * If you need to create a 'real' copy of a CtxJson, which can be manipulated separately, + * utilize the str() function, e.g., ctx::CtxJson copy = original.str(); + */ + CtxJson& operator=(const CtxJson &j); + + bool operator==(const CtxJson &rhs); + bool operator!=(const CtxJson &rhs); + + std::string str(); + + bool getKeys(std::list *list); + bool valid(); + + bool set(const char *path, const char *key, CtxJson &val); + bool set(const char *path, const char *key, int val); + bool set(const char *path, const char *key, int64_t val); + bool set(const char *path, const char *key, double val); + bool set(const char *path, const char *key, std::string val); + bool set(const char *path, const char *key, GVariant *val); + + bool get(const char *path, const char *key, CtxJson *val); + bool get(const char *path, const char *key, int *val); + bool get(const char *path, const char *key, int64_t *val); + bool get(const char *path, const char *key, double *val); + bool get(const char *path, const char *key, std::string *val); + bool get(const char *path, const char *key, GVariant **val); + + bool remove(const char *path, const char *key); + + /* Array operations */ + int getSize(const char *path, const char *key); + + bool append(const char *path, const char *key, CtxJson &val); + bool append(const char *path, const char *key, int val); + bool append(const char *path, const char *key, int64_t val); + bool append(const char *path, const char *key, double val); + bool append(const char *path, const char *key, std::string val); + + bool setAt(const char *path, const char *key, int index, CtxJson &val); + bool setAt(const char *path, const char *key, int index, int val); + bool setAt(const char *path, const char *key, int index, int64_t val); + bool setAt(const char *path, const char *key, int index, double val); + bool setAt(const char *path, const char *key, int index, std::string val); + + bool getAt(const char *path, const char *key, int index, CtxJson *val); + bool getAt(const char *path, const char *key, int index, int *val); + bool getAt(const char *path, const char *key, int index, int64_t *val); + bool getAt(const char *path, const char *key, int index, double *val); + bool getAt(const char *path, const char *key, int index, std::string *val); + + private: + typedef struct _JsonNode json_node_t; + json_node_t *__jsonNode; + + void __parse(const char *s); + void __release(); + char* __strDup(); + + /* For json vs json comparison */ + bool __getMembers(json_node_t *node, std::list &list); + bool __nodeEq(json_node_t *lhs, json_node_t *rhs); + bool __valueEq(json_node_t *lhs, json_node_t *rhs); + bool __objectEq(json_node_t *lhs, json_node_t *rhs); + bool __arrayEq(json_node_t *lhs, json_node_t *rhs); + }; + +} /* namespace ctx */ + +#endif /* __CONTEXT_JSON_H__ */ diff --git a/packaging/context-sensor-recorder.spec b/packaging/context-sensor-recorder.spec index aaadc2d..45f1913 100644 --- a/packaging/context-sensor-recorder.spec +++ b/packaging/context-sensor-recorder.spec @@ -9,6 +9,7 @@ Source0: %{name}-%{version}.tar.gz BuildRequires: cmake BuildRequires: pkgconfig(glib-2.0) BuildRequires: pkgconfig(gio-2.0) +BuildRequires: pkgconfig(json-glib-1.0) BuildRequires: pkgconfig(dlog) BuildRequires: pkgconfig(sensor) BuildRequires: pkgconfig(capi-base-common) diff --git a/src/shared/CtxJson.cpp b/src/shared/CtxJson.cpp new file mode 100644 index 0000000..c226271 --- /dev/null +++ b/src/shared/CtxJson.cpp @@ -0,0 +1,926 @@ +/* + * Copyright (c) 2015 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define PATH_DELIM '.' +#define MAX_PRECISION 15 +#define GVAR_VALUES "values" +#define GVAR_TYPES "types" + +#define STR_EQ(X, Y) (g_strcmp0((X), (Y)) == 0) + +using namespace ctx; + +static std::string __double_to_string(double in) +{ + /* Locale-independent double-to-string conversion */ + int prec = MAX_PRECISION; + std::string out; + std::ostringstream ostr; + + ostr.imbue(std::locale("C")); + ostr << std::setprecision(prec) << in; + out = ostr.str(); + + if (out.find('e') == std::string::npos) + return out; + + /* If 'out' is in scientific notation */ + ostr.clear(); + ostr.str(std::string()); + ostr.imbue(std::locale("C")); + + /* Get the number of fraction digits to precisely print the number */ + double number = in * 10; + while (static_cast(number) == 0) { + number *= 10; + ++prec; + } + + ostr << std::fixed << std::setprecision(prec) << in; + out = ostr.str(); + + /* Remove trailing '0' */ + std::size_t found = out.find_last_not_of("0"); + if (found != std::string::npos) + out.erase(found + 1); + + /* If 'out' ends with '.' */ + if (out.back() == '.') + out.erase(out.end() - 1); + + return out; +} + +static double __string_to_double(const char* in) +{ + IF_FAIL_RETURN_TAG(in, 0, _E, "Parameter NULL"); + + double out; + + /* Locale-independent string-to-double conversion */ + std::istringstream istr(in); + istr.imbue(std::locale("C")); + istr >> out; + + return out; +} + +CtxJson::CtxJson() : + __jsonNode(NULL) +{ + JsonObject *obj = json_object_new(); + IF_FAIL_VOID_TAG(obj, _E, "CtxJson object construction failed"); + + __jsonNode = json_node_new(JSON_NODE_OBJECT); + if (!__jsonNode) { + json_object_unref(obj); + _E("CtxJson object construction failed"); + } + + json_node_set_object(__jsonNode, obj); + json_object_unref(obj); +} + +CtxJson::CtxJson(const CtxJson &j) + : __jsonNode(NULL) +{ + __jsonNode = json_node_copy(j.__jsonNode); + IF_FAIL_VOID_TAG(__jsonNode, _E, "CtxJson object construction failed"); +} + +CtxJson::CtxJson(const char *s) + : __jsonNode(NULL) +{ + if (s) { + __parse(s); + } else { + __parse(EMPTY_JSON_OBJECT); + } +} + +CtxJson::CtxJson(const std::string &s) + : __jsonNode(NULL) +{ + if (s.empty()) { + __parse(EMPTY_JSON_OBJECT); + } else { + __parse(s.c_str()); + } +} + +CtxJson::~CtxJson() +{ + __release(); +} + +void CtxJson::__parse(const char *s) +{ + gboolean result; + JsonParser *parser = NULL; + JsonNode *root = NULL; + + parser = json_parser_new(); + IF_FAIL_VOID_TAG(parser, _E, "Memory allocation failed"); + + result = json_parser_load_from_data(parser, s, -1, NULL); + IF_FAIL_CATCH_TAG(result, _E, "Parsing failed"); + + root = json_parser_get_root(parser); + IF_FAIL_CATCH_TAG(root, _E, "Getting root failed"); + + __jsonNode = json_node_copy(root); + IF_FAIL_CATCH_TAG(__jsonNode, _E, "Copying failed"); + +CATCH: + if (parser) + g_object_unref(parser); +} + +void CtxJson::__release() +{ + if (__jsonNode) { + json_node_free(__jsonNode); + __jsonNode = NULL; + } +} + +bool CtxJson::valid() +{ + return (__jsonNode != NULL); +} + +CtxJson& CtxJson::operator=(const CtxJson &j) +{ + __release(); + __jsonNode = json_node_copy(j.__jsonNode); + if (!__jsonNode) { + _E("CtxJson object copy failed"); + } + return *this; +} + +CtxJson& CtxJson::operator=(const char *s) +{ + __release(); + if (s) { + __parse(s); + } else { + __parse(EMPTY_JSON_OBJECT); + } + return *this; +} + +CtxJson& CtxJson::operator=(const std::string &s) +{ + __release(); + if (s.empty()) { + __parse(EMPTY_JSON_OBJECT); + } else { + __parse(s.c_str()); + } + return *this; +} + +bool CtxJson::operator==(const CtxJson &rhs) +{ + return __nodeEq(__jsonNode, rhs.__jsonNode); +} + +bool CtxJson::operator!=(const CtxJson &rhs) +{ + return !operator==(rhs); +} + +char* CtxJson::__strDup() +{ + IF_FAIL_RETURN_TAG(__jsonNode, NULL, _E, "CtxJson object not initialized"); + + JsonGenerator *jgen = NULL; + char *output = NULL; + + jgen = json_generator_new(); + IF_FAIL_CATCH(jgen); + + json_generator_set_root(jgen, __jsonNode); + output = json_generator_to_data(jgen, NULL); + IF_FAIL_CATCH(output); + + g_object_unref(jgen); + return output; + +CATCH: + if (jgen) { + g_object_unref(jgen); + } + + _E("Memory allocation failed"); + return NULL; +} + +std::string CtxJson::str() +{ + std::string output; + char *_s = __strDup(); + IF_FAIL_RETURN(_s, output = EMPTY_JSON_OBJECT); + + output = _s; + g_free(_s); + + return output; +} + +static std::vector __tokenize_path(std::string path) +{ + std::vector tokens; + std::size_t begin = 0; + std::size_t end = path.find(PATH_DELIM, 0); + + while (end != std::string::npos) { + tokens.push_back(path.substr(begin, end - begin)); + begin = end + 1; + end = path.find(PATH_DELIM, begin); + } + + tokens.push_back(path.substr(begin)); + return tokens; +} + +static JsonObject* __traverse(JsonNode *jnode, const char *path, bool force) +{ + IF_FAIL_RETURN_TAG(jnode, NULL, _E, "Invalid parameter"); + + unsigned int depth = 0; + std::vector pathToken; + JsonObject *jobj = NULL; + JsonObject *childObj = NULL; + JsonNode *childNode = NULL; + + jobj = json_node_get_object(jnode); + IF_FAIL_RETURN(jobj, NULL); + + if (path) + pathToken = __tokenize_path(path); + + for (depth = 0; depth < pathToken.size(); depth++) { + if (!json_object_has_member(jobj, pathToken[depth].c_str())) { + if (!force) { + return NULL; + } + childObj = json_object_new(); + IF_FAIL_RETURN_TAG(childObj, NULL, _E, "Memory allocation failed"); + json_object_set_object_member(jobj, pathToken[depth].c_str(), childObj); + } + childNode = json_object_get_member(jobj, pathToken[depth].c_str()); + IF_FAIL_RETURN(childNode && json_node_get_node_type(childNode) == JSON_NODE_OBJECT, NULL); + + jobj = json_node_get_object(childNode); + IF_FAIL_RETURN(jobj, NULL); + } + + return jobj; +} + +bool CtxJson::set(const char *path, const char *key, CtxJson &val) +{ + IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "CtxJson object not initialized"); + IF_FAIL_RETURN_TAG(key && val.__jsonNode, false, _E, "Invalid parameter"); + + JsonObject *jobj = __traverse(__jsonNode, path, true); + IF_FAIL_RETURN(jobj, false); + + if (json_object_has_member(jobj, key)) + json_object_remove_member(jobj, key); + + json_object_set_member(jobj, key, val.__jsonNode); + val.__jsonNode = NULL; + val = CtxJson(); + + return true; +} + +bool CtxJson::set(const char *path, const char *key, int val) +{ + return set(path, key, static_cast(val)); +} + +bool CtxJson::set(const char *path, const char *key, int64_t val) +{ + IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "CtxJson object not initialized"); + IF_FAIL_RETURN_TAG(key, false, _E, "Invalid parameter"); + + JsonObject *jobj = __traverse(__jsonNode, path, true); + IF_FAIL_RETURN(jobj, false); + + if (json_object_has_member(jobj, key)) + json_object_remove_member(jobj, key); + + json_object_set_int_member(jobj, key, val); + return true; +} + +bool CtxJson::set(const char *path, const char *key, double val) +{ + return set(path, key, __double_to_string(val)); +} + +bool CtxJson::set(const char *path, const char *key, std::string val) +{ + IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "CtxJson object not initialized"); + IF_FAIL_RETURN_TAG(key, false, _E, "Invalid parameter"); + + JsonObject *jobj = __traverse(__jsonNode, path, true); + IF_FAIL_RETURN(jobj, false); + + if (json_object_has_member(jobj, key)) { + json_object_remove_member(jobj, key); + } + + json_object_set_string_member(jobj, key, val.c_str()); + return true; +} + +bool CtxJson::set(const char *path, const char *key, GVariant *val) +{ +#if JSON_CHECK_VERSION(0, 14, 0) + IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "CtxJson object not initialized"); + IF_FAIL_RETURN_TAG(key && val, false, _E, "Invalid parameter"); + + const gchar *typeStr = g_variant_get_type_string(val); + IF_FAIL_RETURN_TAG(typeStr, false, _E, "GVariant manipulation failed"); + + json_node_t *node = json_gvariant_serialize(val); + IF_FAIL_RETURN_TAG(node, false, _E, "GVariant manipulation failed"); + + CtxJson gvarJson; + gvarJson.set(NULL, GVAR_TYPES, std::string(typeStr)); + json_object_set_member(json_node_get_object(gvarJson.__jsonNode), GVAR_VALUES, node); + + return set(path, key, gvarJson); +#else + _E("Insufficient version of json-glib(" JSON_VERSION_S ")"); + return false; +#endif +} + +bool CtxJson::get(const char *path, const char *key, CtxJson *val) +{ + IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "CtxJson object not initialized"); + IF_FAIL_RETURN_TAG(key && val, false, _E, "Invalid parameter"); + + JsonObject *jobj = NULL; + JsonNode *node = NULL; + + jobj = __traverse(__jsonNode, path, false); + IF_FAIL_RETURN(jobj && json_object_has_member(jobj, key), false); + + node = json_object_dup_member(jobj, key); + IF_FAIL_RETURN_TAG(node, false, _E, "Memory allocation failed"); + + if (val->__jsonNode) { + json_node_free(val->__jsonNode); + } + val->__jsonNode = node; + + return true; +} + +static JsonNode* __get_value_node(JsonNode *jnode, const char *path, const char *key) +{ + JsonNode *node = NULL; + JsonObject *jobj = NULL; + JsonNodeType ntype; + + jobj = __traverse(jnode, path, false); + IF_FAIL_RETURN(jobj && json_object_has_member(jobj, key), NULL); + + node = json_object_get_member(jobj, key); + ntype = json_node_get_node_type(node); + IF_FAIL_RETURN(ntype == JSON_NODE_VALUE, NULL); + + return node; +} + +bool CtxJson::get(const char *path, const char *key, int *val) +{ + IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "CtxJson object not initialized"); + IF_FAIL_RETURN_TAG(key && val, false, _E, "Invalid parameter"); + + int64_t v; + + if (get(path, key, &v)) { + *val = v; + return true; + } + + return false; +} + +bool CtxJson::get(const char *path, const char *key, int64_t *val) +{ + IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "CtxJson object not initialized"); + IF_FAIL_RETURN_TAG(key && val, false, _E, "Invalid parameter"); + + JsonNode *node = __get_value_node(__jsonNode, path, key); + IF_FAIL_RETURN(node, false); + + GType vtype = json_node_get_value_type(node); + if (vtype == G_TYPE_INT64) { + *val = json_node_get_int(node); + } else if (vtype == G_TYPE_STRING) { + //TODO: if the string is not a number? + *val = static_cast(__string_to_double(json_node_get_string(node))); + } else { + return false; + } + + return true; +} + +bool CtxJson::get(const char *path, const char *key, double *val) +{ + IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "CtxJson object not initialized"); + IF_FAIL_RETURN_TAG(key && val, false, _E, "Invalid parameter"); + + JsonNode *node = __get_value_node(__jsonNode, path, key); + IF_FAIL_RETURN(node, false); + + GType vtype = json_node_get_value_type(node); + if (vtype == G_TYPE_DOUBLE) { + *val = json_node_get_double(node); + } else if (vtype == G_TYPE_INT64) { + *val = json_node_get_int(node); + } else if (vtype == G_TYPE_STRING) { + *val = __string_to_double(json_node_get_string(node)); + } else { + return false; + } + + return true; +} + +bool CtxJson::get(const char *path, const char *key, std::string *val) +{ + IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "CtxJson object not initialized"); + IF_FAIL_RETURN_TAG(key && val, false, _E, "Invalid parameter"); + + JsonNode *node = __get_value_node(__jsonNode, path, key); + IF_FAIL_RETURN(node, false); + + GType vtype = json_node_get_value_type(node); + IF_FAIL_RETURN(vtype == G_TYPE_STRING, false); + + const char *str_val = json_node_get_string(node); + IF_FAIL_RETURN_TAG(str_val, false, _E, "Getting string failed"); + + *val = str_val; + return true; +} + +bool CtxJson::get(const char *path, const char *key, GVariant **val) +{ +#if JSON_CHECK_VERSION(0, 14, 0) + IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "CtxJson object not initialized"); + IF_FAIL_RETURN_TAG(key && val, false, _E, "Invalid parameter"); + + bool ret; + CtxJson gvarJson; + ret = get(path, key, &gvarJson); + IF_FAIL_RETURN(ret, false); + + std::string gvarTypes; + ret = gvarJson.get(NULL, GVAR_TYPES, &gvarTypes); + IF_FAIL_RETURN(ret, false); + + CtxJson gvarValues; + ret = gvarJson.get(NULL, GVAR_VALUES, &gvarValues); + IF_FAIL_RETURN(ret, false); + + GError *gerr = NULL; + *val = json_gvariant_deserialize(gvarValues.__jsonNode, gvarTypes.c_str(), &gerr); + HANDLE_GERROR(gerr); + IF_FAIL_RETURN(*val, false); + + return true; +#else + _E("Insufficient version of json-glib(" JSON_VERSION_S ")"); + *val = NULL; + return false; +#endif +} + +bool CtxJson::remove(const char *path, const char *key) +{ + IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "CtxJson object not initialized"); + IF_FAIL_RETURN_TAG(key, false, _E, "Invalid parameter"); + + JsonObject *jobj = __traverse(__jsonNode, path, true); + IF_FAIL_RETURN(jobj, false); + + if (json_object_has_member(jobj, key)) + json_object_remove_member(jobj, key); + + return true; +} + +static JsonArray* __get_array(JsonNode *jnode, const char *path, const char *key, bool force) +{ + JsonNode *node = NULL; + JsonArray *arr = NULL; + JsonObject *jobj = NULL; + + jobj = __traverse(jnode, path, force); + IF_FAIL_RETURN(jobj, NULL); + + if (!json_object_has_member(jobj, key)) { + if (force) { + arr = json_array_new(); + IF_FAIL_RETURN_TAG(arr, NULL, _E, "Memory allocation failed"); + json_object_set_array_member(jobj, key, arr); + } else { + return NULL; + } + } + node = json_object_get_member(jobj, key); + IF_FAIL_RETURN_TAG(node && json_node_get_node_type(node) == JSON_NODE_ARRAY, + NULL, _W, "Type mismatched: %s", key); + + return json_node_get_array(node); +} + +int CtxJson::getSize(const char *path, const char *key) +{ + IF_FAIL_RETURN_TAG(this->__jsonNode, -1, _E, "CtxJson object not initialized"); + IF_FAIL_RETURN_TAG(key, -1, _E, "Invalid parameter"); + + JsonArray *jarr = __get_array(__jsonNode, path, key, false); + IF_FAIL_RETURN_TAG(jarr, -1, _D, "Mismatched data type"); + + return json_array_get_length(jarr); +} + +bool CtxJson::append(const char *path, const char *key, CtxJson &val) +{ + IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "CtxJson object not initialized"); + IF_FAIL_RETURN_TAG(key && val.__jsonNode, false, _E, "Invalid parameter"); + + JsonArray *arr = __get_array(__jsonNode, path, key, true); + IF_FAIL_RETURN(arr, false); + + json_array_add_element(arr, val.__jsonNode); + val.__jsonNode = NULL; + val = CtxJson(); + + return true; +} + +bool CtxJson::append(const char *path, const char *key, int val) +{ + return append(path, key, static_cast(val)); +} + +bool CtxJson::append(const char *path, const char *key, int64_t val) +{ + IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "CtxJson object not initialized"); + IF_FAIL_RETURN_TAG(key, false, _E, "Invalid parameter"); + + JsonArray *arr = __get_array(__jsonNode, path, key, true); + IF_FAIL_RETURN(arr, false); + + json_array_add_int_element(arr, val); + return true; +} + +bool CtxJson::append(const char *path, const char *key, double val) +{ + return append(path, key, __double_to_string(val)); +} + +bool CtxJson::append(const char *path, const char *key, std::string val) +{ + IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "CtxJson object not initialized"); + IF_FAIL_RETURN_TAG(key, false, _E, "Invalid parameter"); + + JsonArray *arr = __get_array(__jsonNode, path, key, true); + IF_FAIL_RETURN(arr, false); + + json_array_add_string_element(arr, val.c_str()); + return true; +} + +static JsonNode* __get_array_elem(JsonNode *jnode, const char *path, const char *key, int index) +{ + JsonArray *jarr = __get_array(jnode, path, key, false); + IF_FAIL_RETURN_TAG(jarr, NULL, _W, "Mismatched data type"); + + int size = json_array_get_length(jarr); + IF_FAIL_RETURN(size > index, NULL); + + JsonNode *node = json_array_get_element(jarr, index); + IF_FAIL_RETURN_TAG(node, NULL, _E, "Failed to get an array element"); + + return node; +} + +bool CtxJson::setAt(const char *path, const char *key, int index, CtxJson &val) +{ + IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "CtxJson object not initialized"); + IF_FAIL_RETURN_TAG(val.__jsonNode && key && index >= 0, false, _E, "Invalid parameter"); + + JsonNode *node = __get_array_elem(__jsonNode, path, key, index); + IF_FAIL_RETURN_TAG(node, false, _W, "Out of range"); + + JsonObject *obj = json_node_get_object(val.__jsonNode); + IF_FAIL_RETURN_TAG(obj, false, _E, "Getting object failed"); + + json_node_set_object(node, obj); + json_node_free(val.__jsonNode); + val.__jsonNode = NULL; + val = CtxJson(); + + return true; +} + +bool CtxJson::setAt(const char *path, const char *key, int index, int val) +{ + return setAt(path, key, index, static_cast(val)); +} + +bool CtxJson::setAt(const char *path, const char *key, int index, int64_t val) +{ + IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "CtxJson object not initialized"); + IF_FAIL_RETURN_TAG(key && index >= 0, false, _E, "Invalid parameter"); + + JsonNode *node = __get_array_elem(__jsonNode, path, key, index); + IF_FAIL_RETURN_TAG(node, false, _W, "Out of range"); + IF_FAIL_RETURN_TAG(json_node_get_node_type(node) == JSON_NODE_VALUE, false, _E, "Type mismatched: %s[%d]", key, index); + + json_node_set_int(node, val); + return true; +} + +bool CtxJson::setAt(const char *path, const char *key, int index, double val) +{ + return setAt(path, key, index, __double_to_string(val)); +} + +bool CtxJson::setAt(const char *path, const char *key, int index, std::string val) +{ + IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "CtxJson object not initialized"); + IF_FAIL_RETURN_TAG(key && index >= 0, false, _E, "Invalid parameter"); + + JsonNode *node = __get_array_elem(__jsonNode, path, key, index); + IF_FAIL_RETURN_TAG(node, false, _W, "Out of range"); + IF_FAIL_RETURN_TAG(json_node_get_node_type(node) == JSON_NODE_VALUE, false, _E, "Type mismatched: %s[%d]", key, index); + + json_node_set_string(node, val.c_str()); + return true; +} + +bool CtxJson::getAt(const char *path, const char *key, int index, CtxJson *val) +{ + IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "CtxJson object not initialized"); + IF_FAIL_RETURN_TAG(key && val && index >= 0, false, _E, "Invalid parameter"); + + JsonNode *node = __get_array_elem(__jsonNode, path, key, index); + IF_FAIL_RETURN(node, false); + + JsonNode *nodeCopy = json_node_copy(node); + IF_FAIL_RETURN_TAG(nodeCopy, false, _E, "Memory allocation failed"); + + if (val->__jsonNode) { + json_node_free(val->__jsonNode); + } + val->__jsonNode = nodeCopy; + + return true; +} + +bool CtxJson::getAt(const char *path, const char *key, int index, int *val) +{ + IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "CtxJson object not initialized"); + IF_FAIL_RETURN_TAG(key && val && index >= 0, false, _E, "Invalid parameter"); + + int64_t v; + if (getAt(path, key, index, &v)) { + *val = v; + return true; + } + + return false; +} + +bool CtxJson::getAt(const char *path, const char *key, int index, int64_t *val) +{ + IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "CtxJson object not initialized"); + IF_FAIL_RETURN_TAG(key && val && index >= 0, false, _E, "Invalid parameter"); + + JsonNode *node = __get_array_elem(__jsonNode, path, key, index); + IF_FAIL_RETURN(node, false); + + JsonNodeType ntype = json_node_get_node_type(node); + IF_FAIL_RETURN_TAG(ntype == JSON_NODE_VALUE, false, _E, "Type mismatched: %s", key); + + GType vtype = json_node_get_value_type(node); + if (vtype == G_TYPE_INT64) { + *val = json_node_get_int(node); + } else if (vtype == G_TYPE_STRING) { + *val = static_cast(__string_to_double(json_node_get_string(node))); + } else { + _E("Type mismatched: %s", key); + return false; + } + + return true; +} + +bool CtxJson::getAt(const char *path, const char *key, int index, double *val) +{ + IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "CtxJson object not initialized"); + IF_FAIL_RETURN_TAG(key && val && index >= 0, false, _E, "Invalid parameter"); + + JsonNode *node = __get_array_elem(__jsonNode, path, key, index); + IF_FAIL_RETURN(node, false); + + JsonNodeType ntype = json_node_get_node_type(node); + IF_FAIL_RETURN_TAG(ntype == JSON_NODE_VALUE, false, _E, "Type mismatched: %s", key); + + GType vtype = json_node_get_value_type(node); + if (vtype == G_TYPE_DOUBLE) { + *val = json_node_get_double(node); + } else if (vtype == G_TYPE_INT64) { + *val = json_node_get_int(node); + } else if (vtype == G_TYPE_STRING) { + *val = __string_to_double(json_node_get_string(node)); + } else { + _E("Type mismatched: %s", key); + return false; + } + + return true; +} + +bool CtxJson::getAt(const char *path, const char *key, int index, std::string *val) +{ + IF_FAIL_RETURN_TAG(this->__jsonNode, false, _E, "CtxJson object not initialized"); + IF_FAIL_RETURN_TAG(key && val && index >= 0, false, _E, "Invalid parameter"); + + JsonNode *node = __get_array_elem(__jsonNode, path, key, index); + IF_FAIL_RETURN(node, false); + + JsonNodeType ntype = json_node_get_node_type(node); + IF_FAIL_RETURN_TAG(ntype == JSON_NODE_VALUE, false, _E, "Type mismatched: %s", key); + + GType vtype = json_node_get_value_type(node); + IF_FAIL_RETURN_TAG(vtype == G_TYPE_STRING, false, _E, "Type mismatched: %s", key); + + const char *str_val = json_node_get_string(node); + IF_FAIL_RETURN_TAG(str_val, false, _E, "Getting string failed"); + + *val = str_val; + return true; +} + +bool CtxJson::__getMembers(json_node_t *node, std::list &list) +{ + IF_FAIL_RETURN(node, false); + list.clear(); + + JsonObject *jobj = json_node_get_object(node); + IF_FAIL_RETURN_TAG(jobj, false, _E, "Getting CtxJson object failed"); + + GList *members = json_object_get_members(jobj); + IF_FAIL_RETURN(members, true); + + for (GList *it = g_list_first(members); it; it = g_list_next(it)) { + const char *key = static_cast(it->data); + if (!key) { + list.clear(); + g_list_free(members); + _E("Member list extraction failed"); + return false; + } + + list.push_back(key); + } + + g_list_free(members); + return true; +} + +bool CtxJson::getKeys(std::list* list) +{ + IF_FAIL_RETURN_TAG(list, false, _E, "Invalid parameter"); + return __getMembers(__jsonNode, *list); +} + +bool CtxJson::__nodeEq(json_node_t *lhs, json_node_t *rhs) +{ + IF_FAIL_RETURN(lhs && rhs, false); + + JsonNodeType ltype = json_node_get_node_type(lhs); + JsonNodeType rtype = json_node_get_node_type(rhs); + IF_FAIL_RETURN(ltype == rtype, false); + + switch (ltype) { + case JSON_NODE_VALUE: + IF_FAIL_RETURN(__valueEq(lhs, rhs), false); + break; + case JSON_NODE_OBJECT: + IF_FAIL_RETURN(__objectEq(lhs, rhs), false); + break; + case JSON_NODE_ARRAY: + IF_FAIL_RETURN(__arrayEq(lhs, rhs), false); + break; + default: + _W("Unsupported type"); + return false; + } + + return true; +} + +bool CtxJson::__valueEq(json_node_t *lhs, json_node_t *rhs) +{ + GType ltype = json_node_get_value_type(lhs); + GType rtype = json_node_get_value_type(rhs); + IF_FAIL_RETURN(ltype == rtype, false); + + switch (ltype) { + case G_TYPE_INT64: + return json_node_get_int(lhs) == json_node_get_int(rhs); + case G_TYPE_DOUBLE: + return json_node_get_double(lhs) == json_node_get_double(rhs); + case G_TYPE_STRING: + return STR_EQ(json_node_get_string(lhs), json_node_get_string(rhs)); + default: + _W("Unsupported type"); + return false; + } +} + +bool CtxJson::__objectEq(json_node_t *lhs, json_node_t *rhs) +{ + std::list lm, rm; + IF_FAIL_RETURN(__getMembers(lhs, lm), false); + IF_FAIL_RETURN(__getMembers(rhs, rm), false); + IF_FAIL_RETURN(lm.size() == rm.size(), false); + + lm.sort(); + rm.sort(); + + std::list::iterator lit, rit; + lit = lm.begin(); + rit = rm.begin(); + + while (lit != lm.end()) { + IF_FAIL_RETURN(*lit == *rit, false); + + json_node_t *lhsChild = json_object_get_member(json_node_get_object(lhs), (*lit).c_str()); + json_node_t *rhsChild = json_object_get_member(json_node_get_object(rhs), (*rit).c_str()); + IF_FAIL_RETURN(__nodeEq(lhsChild, rhsChild), false); + + ++lit; + ++rit; + } + + return true; +} + +bool CtxJson::__arrayEq(json_node_t *lhs, json_node_t *rhs) +{ + JsonArray *larr = json_node_get_array(lhs); + JsonArray *rarr = json_node_get_array(rhs); + + int size = json_array_get_length(larr); + IF_FAIL_RETURN(size == static_cast(json_array_get_length(rarr)), false); + + for (int i = 0; i < size; ++i) { + json_node_t *lhsChild = json_array_get_element(larr, i); + json_node_t *rhsChild = json_array_get_element(rarr, i); + IF_FAIL_RETURN(__nodeEq(lhsChild, rhsChild), false); + } + + return true; +} -- 2.7.4 From 12ed1dfd08e8abd0f0f16bff7bc4d1b1c0b68838 Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Fri, 19 Jan 2018 15:11:47 +0900 Subject: [PATCH 11/16] sensor-recorder: fix bug that sleep event is not recording - change subject name: "sleep_monitor" -> "sleep" - fix wrong feature Change-Id: I59ad5a536af589f11be8f3a640fcb37692efa49a Signed-off-by: kibak.yoon --- src/server/legacy/TypesInternal.h | 2 +- src/server/legacy/sleep/Sleep.cpp | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/server/legacy/TypesInternal.h b/src/server/legacy/TypesInternal.h index 5a8cbaf..3f9e1f4 100644 --- a/src/server/legacy/TypesInternal.h +++ b/src/server/legacy/TypesInternal.h @@ -47,7 +47,7 @@ #define SUBJ_SENSOR "sensor/" #define SUBJ_SENSOR_HEART_RATE SUBJ_SENSOR "heart_rate" #define SUBJ_SENSOR_PEDOMETER SUBJ_SENSOR "pedometer" -#define SUBJ_SENSOR_SLEEP_MONITOR SUBJ_SENSOR "sleep_monitor" +#define SUBJ_SENSOR_SLEEP_MONITOR SUBJ_SENSOR "sleep" #define SUBJ_SENSOR_PRESSURE SUBJ_SENSOR "pressure" #define SUBJ_SENSOR_EXERCISE SUBJ_SENSOR "exercise" diff --git a/src/server/legacy/sleep/Sleep.cpp b/src/server/legacy/sleep/Sleep.cpp index 25ec3f1..1234640 100644 --- a/src/server/legacy/sleep/Sleep.cpp +++ b/src/server/legacy/sleep/Sleep.cpp @@ -36,8 +36,7 @@ const char* SleepProvider::getPrivilege() bool SleepProvider::isSupported() { - return (getSystemInfo("tizen.org/feature/sensor.sleep_monitor") - && getSystemInfo("tizen.org/feature/sensor.sleep_detector")); + return getSystemInfo("tizen.org/feature/sensor.sleep_monitor"); } SensorLogger* SleepProvider::getLogger() -- 2.7.4 From f4158f2c44deef40a7d1849282cb75c23bffdeb8 Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Fri, 19 Jan 2018 15:11:47 +0900 Subject: [PATCH 12/16] sensor-recorder: fix bug that sleep event is not recording - change subject name: "sleep_monitor" -> "sleep" - fix wrong feature Change-Id: I59ad5a536af589f11be8f3a640fcb37692efa49a Signed-off-by: kibak.yoon (cherry picked from commit b1bf69826764287c0210a6de83f9cfc1a94d174c) --- src/server/legacy/TypesInternal.h | 2 +- src/server/legacy/sleep/Sleep.cpp | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/server/legacy/TypesInternal.h b/src/server/legacy/TypesInternal.h index 5a8cbaf..3f9e1f4 100644 --- a/src/server/legacy/TypesInternal.h +++ b/src/server/legacy/TypesInternal.h @@ -47,7 +47,7 @@ #define SUBJ_SENSOR "sensor/" #define SUBJ_SENSOR_HEART_RATE SUBJ_SENSOR "heart_rate" #define SUBJ_SENSOR_PEDOMETER SUBJ_SENSOR "pedometer" -#define SUBJ_SENSOR_SLEEP_MONITOR SUBJ_SENSOR "sleep_monitor" +#define SUBJ_SENSOR_SLEEP_MONITOR SUBJ_SENSOR "sleep" #define SUBJ_SENSOR_PRESSURE SUBJ_SENSOR "pressure" #define SUBJ_SENSOR_EXERCISE SUBJ_SENSOR "exercise" diff --git a/src/server/legacy/sleep/Sleep.cpp b/src/server/legacy/sleep/Sleep.cpp index 25ec3f1..1234640 100644 --- a/src/server/legacy/sleep/Sleep.cpp +++ b/src/server/legacy/sleep/Sleep.cpp @@ -36,8 +36,7 @@ const char* SleepProvider::getPrivilege() bool SleepProvider::isSupported() { - return (getSystemInfo("tizen.org/feature/sensor.sleep_monitor") - && getSystemInfo("tizen.org/feature/sensor.sleep_detector")); + return getSystemInfo("tizen.org/feature/sensor.sleep_monitor"); } SensorLogger* SleepProvider::getLogger() -- 2.7.4 From 318c2f4abef20430b6aa81f76ff1e98a5b31ac7a Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Thu, 25 Jan 2018 00:51:30 +0900 Subject: [PATCH 13/16] sensor-recorder: [TNEXT-10177] fix sleep monitor-related issue - fix wrong timestamp conversion - fix wrong sleep state key value Change-Id: I2ee62f96757e201a626a662d7bbfbad173ddf10a Signed-off-by: kibak.yoon (cherry picked from commit 7ed36e93f13079e0fcbf737ec4a8db32ce7c9d3f) --- include/sensor_recorder_internal.h | 2 +- src/client/sensor_recorder.cpp | 16 ++++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/include/sensor_recorder_internal.h b/include/sensor_recorder_internal.h index 7ba49aa..6d966ba 100644 --- a/include/sensor_recorder_internal.h +++ b/include/sensor_recorder_internal.h @@ -51,7 +51,7 @@ extern "C" #define CTX_SENSOR_RECORDER_KEY_AVG_PRESSURE "AvgPressure" #define CTX_SENSOR_RECORDER_KEY_MIN_PRESSURE "MinPressure" #define CTX_SENSOR_RECORDER_KEY_MAX_PRESSURE "MaxPressure" -#define CTX_SENSOR_RECORDER_KEY_SLEEP_STATE "SleepState" +#define CTX_SENSOR_RECORDER_KEY_SLEEP_STATE "State" #define CTX_SENSOR_RECORDER_KEY_HEART_RATE "HeartRate" typedef void* ctx_sensor_rec_option_h; diff --git a/src/client/sensor_recorder.cpp b/src/client/sensor_recorder.cpp index 618cfcf..37a579c 100644 --- a/src/client/sensor_recorder.cpp +++ b/src/client/sensor_recorder.cpp @@ -192,15 +192,19 @@ EXPORT_API int ctx_sensor_rec_data_get_time(ctx_sensor_rec_data_h data, time_t * const char* buf = NULL; - if (__getValueFromData(static_cast(data), CTX_SENSOR_RECORDER_KEY_START_TIME, &buf)) - *start_time = static_cast(g_ascii_strtoll(buf, NULL, 10)); - else + if (__getValueFromData(static_cast(data), CTX_SENSOR_RECORDER_KEY_START_TIME, &buf)) { + int64_t start = static_cast(g_ascii_strtoll(buf, NULL, 10)); + *start_time = static_cast(start / 1000); + } else { return E_PARAM; + } - if (__getValueFromData(static_cast(data), CTX_SENSOR_RECORDER_KEY_END_TIME, &buf)) - *end_time = static_cast(g_ascii_strtoll(buf, NULL, 10)); - else + if (__getValueFromData(static_cast(data), CTX_SENSOR_RECORDER_KEY_END_TIME, &buf)) { + int64_t end = static_cast(g_ascii_strtoll(buf, NULL, 10)); + *end_time = static_cast(end / 1000); + } else { return E_PARAM; + } return E_NONE; } -- 2.7.4 From d467cf575886562e80b465890198730f7985a2b5 Mon Sep 17 00:00:00 2001 From: Somin Kim Date: Thu, 25 Jan 2018 17:51:18 +0900 Subject: [PATCH 14/16] Change sensor-recorder as system service & version 4.0.1 Change-Id: Ib21da8b598081b4bbcef86bb55847875c7f66f5a Signed-off-by: Somin Kim --- include/private/SensorRecorderService.h | 12 +++++----- packaging/context-sensor-recorder.spec | 2 +- src/server-dummy/SensorRecorderService.cpp | 12 ++++++++-- src/server/SensorDatabase.cpp | 35 ++++++++++++++---------------- src/server/SensorDatabase.h | 4 ++-- src/server/SensorRecorderService.cpp | 14 +++++++++--- src/server/legacy/SensorProvider.cpp | 1 + 7 files changed, 48 insertions(+), 32 deletions(-) diff --git a/include/private/SensorRecorderService.h b/include/private/SensorRecorderService.h index aff866f..086605f 100644 --- a/include/private/SensorRecorderService.h +++ b/include/private/SensorRecorderService.h @@ -19,14 +19,14 @@ /* This header SHOULD NOT be included by other headers in this directory. */ -#include +#include #include #include #include namespace ctx { - class EXPORT_API SensorRecorderService : public IUserService { + class EXPORT_API SensorRecorderService : public ISystemService { public: SensorRecorderService(); ~SensorRecorderService(); @@ -37,9 +37,11 @@ namespace ctx { const char* getMethodSpecs(); IMethodCallHandler* createMethodCallHandler(IClient* client); - // Inherited from IUserService - bool prepare(uid_t uid); - void cleanup(uid_t uid); + // Inherited from ISystemService + bool prepare(); + void cleanup(); + void onUserActivated(uid_t uid); + void onUserDeactivated(uid_t uid); // Own members GDBusConnection* getConnection(); diff --git a/packaging/context-sensor-recorder.spec b/packaging/context-sensor-recorder.spec index 45f1913..42b8b81 100644 --- a/packaging/context-sensor-recorder.spec +++ b/packaging/context-sensor-recorder.spec @@ -1,6 +1,6 @@ Name: context-sensor-recorder Summary: Sensor recorder service server and client libraries -Version: 4.0.0 +Version: 4.0.1 Release: 1 Group: Service Framework/Context License: Apache-2.0 diff --git a/src/server-dummy/SensorRecorderService.cpp b/src/server-dummy/SensorRecorderService.cpp index b5052a4..36eb955 100644 --- a/src/server-dummy/SensorRecorderService.cpp +++ b/src/server-dummy/SensorRecorderService.cpp @@ -49,12 +49,20 @@ IMethodCallHandler* SensorRecorderService::createMethodCallHandler(IClient* clie return NULL; } -bool SensorRecorderService::prepare(uid_t uid) +bool SensorRecorderService::prepare() { return false; } -void SensorRecorderService::cleanup(uid_t uid) +void SensorRecorderService::cleanup() +{ +} + +void SensorRecorderService::onUserActivated(uid_t uid) +{ +} + +void SensorRecorderService::onUserDeactivated(uid_t uid) { } diff --git a/src/server/SensorDatabase.cpp b/src/server/SensorDatabase.cpp index b08ce19..08787e7 100644 --- a/src/server/SensorDatabase.cpp +++ b/src/server/SensorDatabase.cpp @@ -19,57 +19,54 @@ using namespace ctx; -Database* SensorDatabase::__userDatabase = NULL; +Database* SensorDatabase::__database = NULL; SensorDatabase::SensorDatabase() { } -bool SensorDatabase::open(uid_t uid) +bool SensorDatabase::open() { - if (isReady()) { - _W("Closing the current DB"); - close(); - } + IF_FAIL_RETURN(!isReady(), true); - __userDatabase = new PlatformDatabase(BASE_PATH, uid); + __database = new PlatformDatabase(BASE_PATH); - if (!__userDatabase->open()) { + if (!__database->open()) { _E("DB open failed"); - delete __userDatabase; - __userDatabase = NULL; + delete __database; + __database = NULL; return false; } - _I("User DB opened"); + _I("System DB opened"); return true; } void SensorDatabase::close() { - if (!__userDatabase) + if (!__database) return; - __userDatabase->close(); - _I("User DB closed"); + __database->close(); + _I("System DB closed"); - delete __userDatabase; - __userDatabase = NULL; + delete __database; + __database = NULL; } bool SensorDatabase::isReady() { - return (__userDatabase != NULL); + return (__database != NULL); } bool SensorDatabase::execute(const std::string& query, const std::string& columnTypes, std::vector* columnNames, std::vector>* queryResult) { IF_FAIL_RETURN_TAG(isReady(), false, _W, "DB not ready"); - return __userDatabase->execute(query, columnTypes, columnNames, queryResult); + return __database->execute(query, columnTypes, columnNames, queryResult); } bool SensorDatabase::execute(const std::string& query, std::vector>* queryResult) { IF_FAIL_RETURN_TAG(isReady(), false, _W, "DB not ready"); - return __userDatabase->execute(query, queryResult); + return __database->execute(query, queryResult); } diff --git a/src/server/SensorDatabase.h b/src/server/SensorDatabase.h index a61375c..a82235e 100644 --- a/src/server/SensorDatabase.h +++ b/src/server/SensorDatabase.h @@ -24,7 +24,7 @@ namespace ctx { class SensorDatabase { public: - static bool open(uid_t uid); + static bool open(); static void close(); static bool isReady(); static bool execute(const std::string& query, const std::string& columnTypes, std::vector* columnNames, std::vector>* queryResult); @@ -33,7 +33,7 @@ namespace ctx { private: SensorDatabase(); - static Database* __userDatabase; + static Database* __database; }; } diff --git a/src/server/SensorRecorderService.cpp b/src/server/SensorRecorderService.cpp index 0b62991..a50eb34 100644 --- a/src/server/SensorRecorderService.cpp +++ b/src/server/SensorRecorderService.cpp @@ -53,11 +53,11 @@ IMethodCallHandler* SensorRecorderService::createMethodCallHandler(IClient* clie return new MethodCallHandler(client); } -bool SensorRecorderService::prepare(uid_t uid) +bool SensorRecorderService::prepare() { RecorderClientInfo::setHostService(this); - if (!SensorDatabase::open(uid)) + if (!SensorDatabase::open()) return false; SensorTimer::init(); @@ -66,13 +66,21 @@ bool SensorRecorderService::prepare(uid_t uid) return true; } -void SensorRecorderService::cleanup(uid_t uid) +void SensorRecorderService::cleanup() { SensorProvider::release(); SensorTimer::release(); SensorDatabase::close(); } +void SensorRecorderService::onUserActivated(uid_t uid) +{ +} + +void SensorRecorderService::onUserDeactivated(uid_t uid) +{ +} + GDBusConnection* SensorRecorderService::getConnection() { return __serviceRunner->getConnection(); diff --git a/src/server/legacy/SensorProvider.cpp b/src/server/legacy/SensorProvider.cpp index a31a050..f62160a 100644 --- a/src/server/legacy/SensorProvider.cpp +++ b/src/server/legacy/SensorProvider.cpp @@ -90,6 +90,7 @@ bool SensorProvider::getSystemInfo(const char* key) bool supported = false; int ret = system_info_get_platform_bool(key, &supported); IF_FAIL_RETURN_TAG(ret == SYSTEM_INFO_ERROR_NONE, false, _E, "system_info_get_platform_bool() failed"); + return supported; } -- 2.7.4 From bb38ccc2e23e11c72b807a78e257e40d5afee848 Mon Sep 17 00:00:00 2001 From: Abhishek Vijay Date: Fri, 23 Mar 2018 17:48:56 +0530 Subject: [PATCH 15/16] [Coverity Fixes][Sensor Recorder] Change-Id: I102aa9e56929d118ccd8cca2dc4108eba8708668 Signed-off-by: Abhishek Vijay --- src/client/sensor_recorder.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/client/sensor_recorder.cpp b/src/client/sensor_recorder.cpp index 37a579c..f3754f9 100644 --- a/src/client/sensor_recorder.cpp +++ b/src/client/sensor_recorder.cpp @@ -169,8 +169,11 @@ EXPORT_API int ctx_sensor_rec_read_sync(const char* subject, ctx_sensor_rec_quer GVariant* outParam = NULL; int error = __getServiceProxy()->call(METHOD_READ_REC, param, &outParam); - IF_FAIL_RETURN(error == E_NONE, error); - + if (error != E_NONE) { + delete listener; + listener = NULL; + return error; + } listener->onSuccess(METHOD_READ_REC, outParam); g_variant_unref(outParam); -- 2.7.4 From 1e90114aaac469b9aad38fb36bdee682bb84e945 Mon Sep 17 00:00:00 2001 From: Dewal Agarwal Date: Wed, 12 Dec 2018 10:11:37 +0530 Subject: [PATCH 16/16] Dlog Print Format Updates Change-Id: I18df9799a37a9f88726c10052caf324e8217fe7f Signed-off-by: Dewal Agarwal --- src/server/legacy/heartrate/HeartRateLogger.cpp | 2 +- src/server/legacy/sleep/SleepLogger.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/server/legacy/heartrate/HeartRateLogger.cpp b/src/server/legacy/heartrate/HeartRateLogger.cpp index 427fcf1..1c4bbed 100644 --- a/src/server/legacy/heartrate/HeartRateLogger.cpp +++ b/src/server/legacy/heartrate/HeartRateLogger.cpp @@ -110,7 +110,7 @@ bool HeartRateLogger::onTimerExpired(unsigned int timerId, unsigned int interval _W("Starting sensor failed"); __expiredTime = TimeUtil::getTime(); - _I("Measuring starts at %llu", __expiredTime); + _I("Measuring starts at %llu",(long long unsigned int)__expiredTime); return true; } diff --git a/src/server/legacy/sleep/SleepLogger.cpp b/src/server/legacy/sleep/SleepLogger.cpp index b9e5723..036e47c 100644 --- a/src/server/legacy/sleep/SleepLogger.cpp +++ b/src/server/legacy/sleep/SleepLogger.cpp @@ -130,20 +130,20 @@ void SleepLogger::record(uint64_t startTime, uint64_t endTime, int state) if (__startTime == 0) { __startTime = startTime; __endTime = endTime; - _D("Initial event: %llu ~ %llu", __startTime, __endTime); + _D("Initial event: %llu ~ %llu",(long long unsigned int)__startTime,(long long unsigned int)__endTime); return; } if (startTime < __endTime + TIME_GAP) { __endTime = MAX(endTime, __endTime); - _D("Merged event: %llu ~ %llu", __startTime, __endTime); + _D("Merged event: %llu ~ %llu", (long long unsigned int)__startTime, (long long unsigned int)__endTime); return; } __appendQuery(__startTime, __endTime); __startTime = startTime; __endTime = endTime; - _D("Reset event: %llu ~ %llu", __startTime, __endTime); + _D("Reset event: %llu ~ %llu", (long long unsigned int)__startTime, (long long unsigned int)__endTime); } void SleepLogger::flushCache(bool force) -- 2.7.4