#include <sstream>
#include <Types.h>
#include "UserPlaces.h"
-#include "../place/PlacesDetector.h"
#include <MyPlaceTypes.h>
+#include <gmodule.h>
+
+#define SO_PATH "/usr/lib/context-service/libctx-prvd-my-place-places-detector.so"
+
+typedef void (*places_detector_t)();
#define __GET_PLACES_QUERY "SELECT "\
PLACE_COLUMN_CATEG_ID ", "\
ctx::UserPlaces::UserPlaces(PlaceRecogMode energyMode):
__visitDetector(nullptr),
- __placesDetector(nullptr),
- __placesDetectorTimerId(-1)
+ __timerId(-1)
{
time_t now = std::time(nullptr);
__visitDetector = new(std::nothrow) VisitDetector(now, energyMode);
return;
}
- __placesDetector = new(std::nothrow) PlacesDetector();
- if (__placesDetector == nullptr) {
- _E("Cannot initialize __placesDetector");
- return;
- }
-
- __placesDetectorTimerId = __timerManager.setAt( // execute once every night
+ __timerId = __timerManager.setAt( // execute once every night
PLACES_DETECTOR_TASK_START_HOUR,
PLACES_DETECTOR_TASK_START_MINUTE,
DayOfWeek::EVERYDAY,
- __placesDetector);
- if (__placesDetectorTimerId < 0) {
- _E("PlacesDetector timer set FAIL");
+ this);
+ if (__timerId < 0) {
+ _E("timer set FAIL");
return;
} else {
- _D("PlacesDetector timer set SUCCESS");
+ _D("timer set SUCCESS");
}
}
ctx::UserPlaces::~UserPlaces()
{
- if (__placesDetectorTimerId >= 0) {
- __timerManager.remove(__placesDetectorTimerId);
- _D("PlacesDetector timer removed");
+ if (__timerId >= 0) {
+ __timerManager.remove(__timerId);
}
if (__visitDetector)
delete __visitDetector;
- if (__placesDetector)
- delete __placesDetector;
};
ctx::Json ctx::UserPlaces::getPlaces()
__visitDetector->setMode(energyMode);
}
+bool ctx::UserPlaces::onTimerExpired(int timerId)
+{
+ _D("mmastern try to detect places from UserPlaces");
+ GModule *soHandle = g_module_open(SO_PATH, G_MODULE_BIND_LAZY);
+ IF_FAIL_RETURN_TAG(soHandle, true, _E, "%s", g_module_error());
+
+ gpointer symbol;
+ if (!g_module_symbol(soHandle, "detectPlaces", &symbol) || symbol == NULL) {
+ _E("mmastern %s", g_module_error());
+ g_module_close(soHandle);
+ return true;
+ }
+
+ places_detector_t detectPlaces = reinterpret_cast<places_detector_t>(symbol);
+
+ detectPlaces();
+ g_module_close(soHandle);
+ return true;
+}
+
std::vector<ctx::Json> ctx::UserPlaces::__dbGetPlaces()
{
std::vector<Json> records;
#include <string>
#include <Json.h>
#include <TimerManager.h>
+#include <ITimerListener.h>
#include <DatabaseManager.h>
#include "../visit-detector/VisitDetector.h"
#include "../place/PlacesDetector.h"
namespace ctx {
- class UserPlaces {
+ class UserPlaces : public ITimerListener {
private:
VisitDetector *__visitDetector;
- PlacesDetector *__placesDetector;
DatabaseManager *__dbManager;
- int __placesDetectorTimerId;
+ int __timerId;
TimerManager __timerManager;
std::vector<Json> __dbGetPlaces();
std::map<std::string, std::string> __dbGetWifiAPsMap();
std::vector<std::shared_ptr<Place>> __getPlaces();
static Json __composeJson(std::vector<std::shared_ptr<Place>> places);
+ bool onTimerExpired(int timerId);
+
public:
UserPlaces(PlaceRecogMode energyMode = PLACE_RECOG_HIGH_ACCURACY_MODE);
~UserPlaces();