+EXPORT_API
+int notification_setting_db_update(const char *package_name, int allow_to_notify, int do_not_disturb_except, int visibility_class, uid_t uid)
+{
+ int err = NOTIFICATION_ERROR_NONE;
+ sqlite3 *db = NULL;
+ char *sqlbuf = NULL;
+ int sqlret;
+
+ if (package_name == NULL || strlen(package_name) == 0)
+ return NOTIFICATION_ERROR_INVALID_PARAMETER;
+
+ sqlret = db_util_open(DBPATH, &db, 0);
+ if (sqlret != SQLITE_OK || db == NULL) {
+ NOTIFICATION_ERR("db_util_open failed [%s][%d]", DBPATH, sqlret);
+ return NOTIFICATION_ERROR_FROM_DB;
+ }
+
+ sqlbuf = sqlite3_mprintf("UPDATE %s SET allow_to_notify = %d, do_not_disturb_except = %d, visibility_class = %d " \
+ "WHERE package_name = %Q AND uid = %d",
+ NOTIFICATION_SETTING_DB_TABLE, allow_to_notify, do_not_disturb_except, visibility_class, package_name, uid);
+ if (!sqlbuf) {
+ NOTIFICATION_ERR("fail to alloc query");
+ err = NOTIFICATION_ERROR_OUT_OF_MEMORY;
+ goto return_close_db;
+ }
+
+ err = notification_db_exec(db, sqlbuf, NULL);
+
+return_close_db:
+ if (sqlbuf)
+ sqlite3_free(sqlbuf);
+
+ sqlret = db_util_close(db);
+ if (sqlret != SQLITE_OK)
+ NOTIFICATION_WARN("fail to db_util_close - [%d]", sqlret);
+
+ return err;
+}
+
+EXPORT_API
+int notification_setting_db_update_system_setting(int do_not_disturb, int visibility_class,
+ int dnd_schedule_enabled, int dnd_schedule_day,
+ int dnd_start_hour, int dnd_start_min,
+ int dnd_end_hour, int dnd_end_min, uid_t uid)
+{
+ int err = NOTIFICATION_ERROR_NONE;
+ int sqlret;
+ int field_index = 1;
+ sqlite3 *db = NULL;
+ sqlite3_stmt *db_statement = NULL;
+
+ sqlret = db_util_open(DBPATH, &db, 0);
+
+ if (sqlret != SQLITE_OK || db == NULL) {
+ NOTIFICATION_ERR("db_util_open failed [%s][%d][%s]", DBPATH, sqlret, sqlite3_errmsg(db));
+ err = NOTIFICATION_ERROR_FROM_DB;
+ goto return_close_db;
+ }
+
+ sqlite3_exec(db, "BEGIN immediate;", NULL, NULL, NULL);
+
+ sqlret = sqlite3_prepare_v2(db, "INSERT OR REPLACE INTO notification_system_setting (uid, do_not_disturb, visibility_class, dnd_schedule_enabled, dnd_schedule_day, dnd_start_hour, dnd_start_min, dnd_end_hour, dnd_end_min) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?) ", -1, &db_statement, NULL);
+
+ if (sqlret != SQLITE_OK) {
+ NOTIFICATION_ERR("sqlite3_prepare_v2 failed [%d][%s]", sqlret, sqlite3_errmsg(db));
+ err = NOTIFICATION_ERROR_FROM_DB;
+ goto return_close_db;
+ }
+
+ sqlite3_bind_int(db_statement, field_index++, uid);
+ sqlite3_bind_int(db_statement, field_index++, do_not_disturb);
+ sqlite3_bind_int(db_statement, field_index++, visibility_class);
+ sqlite3_bind_int(db_statement, field_index++, dnd_schedule_enabled);
+ sqlite3_bind_int(db_statement, field_index++, dnd_schedule_day);
+ sqlite3_bind_int(db_statement, field_index++, dnd_start_hour);
+ sqlite3_bind_int(db_statement, field_index++, dnd_start_min);
+ sqlite3_bind_int(db_statement, field_index++, dnd_end_hour);
+ sqlite3_bind_int(db_statement, field_index++, dnd_end_min);
+
+ sqlret = sqlite3_step(db_statement);
+ if (sqlret != SQLITE_OK && sqlret != SQLITE_DONE) {
+ NOTIFICATION_ERR("sqlite3_step failed [%d][%s]", sqlret, sqlite3_errmsg(db));
+ err = NOTIFICATION_ERROR_FROM_DB;
+ goto return_close_db;
+ }
+
+ sqlret = sqlite3_changes(db);
+
+ if (sqlret == 0)
+ NOTIFICATION_WARN("No changes on DB");
+
+return_close_db:
+ if (db_statement)
+ sqlite3_finalize(db_statement);
+
+
+ if (db) {
+ if (err == NOTIFICATION_ERROR_NONE)
+ sqlite3_exec(db, "END;", NULL, NULL, NULL);
+ else
+ sqlite3_exec(db, "ROLLBACK;", NULL, NULL, NULL);
+
+ sqlret = db_util_close(db);
+ }
+
+ if (sqlret != SQLITE_OK)
+ NOTIFICATION_WARN("fail to db_util_close - [%d]", sqlret);
+
+ return err;
+}
+
+EXPORT_API
+int notification_setting_db_update_do_not_disturb(int do_not_disturb, uid_t uid)
+{
+ int err = NOTIFICATION_ERROR_NONE;
+ int sqlret;
+ sqlite3 *db = NULL;
+ char *sqlbuf = NULL;
+
+ sqlret = db_util_open(DBPATH, &db, 0);
+ if (sqlret != SQLITE_OK || db == NULL) {
+ NOTIFICATION_ERR("db_util_open failed [%s][%d]", DBPATH, sqlret);
+ return NOTIFICATION_ERROR_FROM_DB;
+ }
+
+ sqlbuf = sqlite3_mprintf("UPDATE notification_system_setting SET do_not_disturb = %d WHERE uid = %d", do_not_disturb, uid);
+ if (!sqlbuf) {
+ NOTIFICATION_ERR("fail to alloc query");
+ err = NOTIFICATION_ERROR_OUT_OF_MEMORY;
+ goto return_close_db;
+ }
+
+ err = notification_db_exec(db, sqlbuf, NULL);
+
+return_close_db:
+ if (sqlbuf)
+ sqlite3_free(sqlbuf);
+
+ sqlret = db_util_close(db);
+ if (sqlret != SQLITE_OK)
+ NOTIFICATION_WARN("fail to db_util_close - [%d]", sqlret);
+
+ return err;
+}
+
+EXPORT_API
+int noti_system_setting_set_alarm(int week_flag, int hour, int min, alarm_cb_t handler, alarm_id_t *dnd_schedule_alarm_id)
+{
+ int err = NOTIFICATION_ERROR_NONE;
+ struct tm struct_time;
+ alarm_entry_t *alarm_info = NULL;
+ alarm_date_t alarm_time;
+ alarm_id_t alarm_id = -1;
+
+ err = alarmmgr_init("notification");
+ if (err < 0) {
+ NOTIFICATION_ERR("alarmmgr_init failed (%d)", err);
+ goto out;
+ }
+
+ err = alarmmgr_set_cb(handler, NULL);
+ if (err < 0) {
+ NOTIFICATION_ERR("alarmmgr_set_cb failed (%d)", err);
+ goto out;
+ }
+
+ err = _get_current_time(&struct_time);
+ if (err != NOTIFICATION_ERROR_NONE) {
+ NOTIFICATION_ERR("get_current_time failed");
+ goto out;
+ }
+
+ alarm_info = alarmmgr_create_alarm();
+ if (alarm_info == NULL) {
+ NOTIFICATION_ERR("alarmmgr_create_alarm failed");
+ goto out;
+ }
+
+ alarm_time.year = struct_time.tm_year + 1900;
+ alarm_time.month = struct_time.tm_mon + 1;
+ alarm_time.day = struct_time.tm_mday;
+ alarm_time.hour = hour;
+ alarm_time.min = min;
+ alarm_time.sec = 0;
+
+ err = alarmmgr_set_time(alarm_info, alarm_time);
+ if (err != ALARMMGR_RESULT_SUCCESS) {
+ NOTIFICATION_ERR("alarmmgr_set_time failed (%d)", err);
+ goto out;
+ }
+
+ err = alarmmgr_set_repeat_mode(alarm_info, ALARM_REPEAT_MODE_WEEKLY, week_flag);
+ if (err != ALARMMGR_RESULT_SUCCESS) {
+ NOTIFICATION_ERR("alarmmgr_set_repeat_mode failed (%d)", err);
+ goto out;
+ }
+
+ err = alarmmgr_set_type(alarm_info, ALARM_TYPE_VOLATILE);
+ if (err != ALARMMGR_RESULT_SUCCESS) {
+ NOTIFICATION_ERR("alarmmgr_set_type failed (%d)", err);
+ goto out;
+ }
+
+ err = alarmmgr_add_alarm_with_localtime(alarm_info, NULL, &alarm_id);
+ if (err != ALARMMGR_RESULT_SUCCESS) {
+ NOTIFICATION_ERR("alarmmgr_add_alarm_with_localtime failed (%d)", err);
+ goto out;
+ }
+
+ *dnd_schedule_alarm_id = alarm_id;
+
+ NOTIFICATION_DBG("alarm_id [%d]", *dnd_schedule_alarm_id);
+
+out:
+ if (alarm_info)
+ alarmmgr_free_alarm(alarm_info);
+
+ return err;
+}