return ret;
}
+API int contacts_phone_log_reset_statistics_by_sim(int sim_slot_no)
+{
+ int ret;
+ contacts_h contact = NULL;
+
+ ret = ctsvc_client_handle_get_p(&contact);
+ RETVM_IF(CONTACTS_ERROR_NONE != ret, ret, "ctsvc_client_handle_get_p() Fail(%d)", ret);
+
+ ret = ctsvc_client_phone_log_reset_statistics_by_sim(contact, sim_slot_no);
+
+ return ret;
+}
+
+
API int contacts_phone_log_delete(contacts_phone_log_delete_e op, ...)
{
int ret;
}
+int ctsvc_client_phone_log_reset_statistics_by_sim(contacts_h contact,
+ int sim_slot_no)
+{
+#ifndef ENABLE_LOG_FEATURE
+ return CONTACTS_ERROR_NOT_SUPPORTED;
+#endif /* ENABLE_LOG_FEATURE */
+
+ int ret = CONTACTS_ERROR_NONE;
+
+ pims_ipc_data_h indata = NULL;
+ pims_ipc_data_h outdata = NULL;
+
+ RETV_IF(NULL == contact, CONTACTS_ERROR_INVALID_PARAMETER);
+ RETV_IF(sim_slot_no < 0, CONTACTS_ERROR_INVALID_PARAMETER);
+
+ /* make indata */
+ indata = pims_ipc_data_create(0);
+ if (indata == NULL) {
+ ERR("pims_ipc_data_create() Fail");
+ ret = CONTACTS_ERROR_OUT_OF_MEMORY;
+ return ret;
+ }
+
+ ret = ctsvc_ipc_marshal_handle(contact, indata);
+ if (CONTACTS_ERROR_NONE != ret) {
+ ERR("ctsvc_ipc_marshal_handle() Fail(%d)", ret);
+ pims_ipc_data_destroy(indata);
+ return ret;
+ }
+
+ ret = ctsvc_ipc_marshal_int(sim_slot_no, indata);
+ if (CONTACTS_ERROR_NONE != ret) {
+ ERR("ctsvc_ipc_marshal_int() Fail(%d)", ret);
+ pims_ipc_data_destroy(indata);
+ return ret;
+ }
+
+ /* ipc call */
+ if (ctsvc_ipc_call(CTSVC_IPC_PHONELOG_MODULE,
+ CTSVC_IPC_SERVER_PHONELOG_RESET_STATISTICS_BY_SIM,
+ indata, &outdata) != 0) {
+ ERR("ctsvc_ipc_call() Fail");
+ pims_ipc_data_destroy(indata);
+ return CONTACTS_ERROR_IPC;
+ }
+
+ pims_ipc_data_destroy(indata);
+
+ if (outdata) {
+ if (CONTACTS_ERROR_NONE != ctsvc_ipc_unmarshal_int(outdata, &ret)) {
+ ERR("ctsvc_ipc_unmarshal_int() Fail");
+ pims_ipc_data_destroy(outdata);
+ return CONTACTS_ERROR_IPC;
+ }
+
+ if (CONTACTS_ERROR_NONE == ret) {
+ int transaction_ver = 0;
+ if (CONTACTS_ERROR_NONE != ctsvc_ipc_unmarshal_int(outdata, &transaction_ver)) {
+ ERR("ctsvc_ipc_unmarshal_int() Fail");
+ pims_ipc_data_destroy(outdata);
+ return CONTACTS_ERROR_IPC;
+ }
+ ctsvc_client_ipc_set_change_version(contact, transaction_ver);
+ }
+
+ pims_ipc_data_destroy(outdata);
+ }
+
+ return ret;
+}
+
int ctsvc_client_phone_log_delete(contacts_h contact, contacts_phone_log_delete_e op,
va_list args)
{
#include "contacts_phone_log_internal.h"
int ctsvc_client_phone_log_reset_statistics(contacts_h contact);
+int ctsvc_client_phone_log_reset_statistics_by_sim(contacts_h contact, int sim_slot_no);
int ctsvc_client_phone_log_delete(contacts_h contact, contacts_phone_log_delete_e op, va_list args);
-#endif /* __CTSVC_CLIENT_PHONELOG_HELPER_H__ */
\ No newline at end of file
+#endif /* __CTSVC_CLIENT_PHONELOG_HELPER_H__ */
int ret;
RETV_IF(NULL == filter, CONTACTS_ERROR_INVALID_PARAMETER);
- RETVM_IF(property_id == CTSVC_PROPERTY_PHONELOG_SIM_SLOT_NO
- && (CONTACTS_MATCH_GREATER_THAN <= match && match <= CONTACTS_MATCH_LESS_THAN_OR_EQUAL),
+ RETVM_IF((CTSVC_PROPERTY_PHONELOG_SIM_SLOT_NO == property_id
+ || CTSVC_PROPERTY_PHONELOG_STAT_SIM_SLOT_NO == property_id)
+ && (CONTACTS_MATCH_GREATER_THAN <= match
+ && match <= CONTACTS_MATCH_LESS_THAN_OR_EQUAL),
CONTACTS_ERROR_INVALID_PARAMETER, "Not support this condition");
com_filter = (ctsvc_composite_filter_s*)filter;
data = cursor->data;
if (data->property_id == property_id) {
#ifdef _CONTACTS_IPC_SERVER
- if (property_id == CTSVC_PROPERTY_PHONELOG_SIM_SLOT_NO) {
+ if (CTSVC_PROPERTY_PHONELOG_SIM_SLOT_NO == property_id
+ || CTSVC_PROPERTY_PHONELOG_STAT_SIM_SLOT_NO == property_id) {
CHECK_DIRTY_VAL(data->value.i, value, is_dirty);
data->value.i = ctsvc_server_sim_get_sim_slot_no_by_info_id(value);
} else
data->property_id = property_id;
data->type = CTSVC_VIEW_DATA_TYPE_INT;
#ifdef _CONTACTS_IPC_SERVER
- if (property_id == CTSVC_PROPERTY_PHONELOG_SIM_SLOT_NO) {
+ if (CTSVC_PROPERTY_PHONELOG_SIM_SLOT_NO == property_id
+ || CTSVC_PROPERTY_PHONELOG_STAT_SIM_SLOT_NO == property_id) {
CHECK_DIRTY_VAL(data->value.i, value, is_dirty);
data->value.i = ctsvc_server_sim_get_sim_slot_no_by_info_id(value);
} else
._uri = CTSVC_VIEW_URI_READ_ONLY_PHONELOG_STAT,
.log_count = CTSVC_PROPERTY_PHONELOG_STAT_LOG_COUNT,
.log_type = CTSVC_PROPERTY_PHONELOG_STAT_LOG_TYPE,
+ .sim_slot_no = CTSVC_PROPERTY_PHONELOG_STAT_SIM_SLOT_NO,
};
#endif /* ENABLE_LOG_FEATURE */
const property_info_s __property_phonelog_stat[] = { /* _contacts_phone_log_stat */
{CTSVC_PROPERTY_PHONELOG_STAT_LOG_COUNT, CTSVC_SEARCH_PROPERTY_PROJECTION, "log_count"},
{CTSVC_PROPERTY_PHONELOG_STAT_LOG_TYPE, CTSVC_SEARCH_PROPERTY_ALL, "log_type"},
+ {CTSVC_PROPERTY_PHONELOG_STAT_SIM_SLOT_NO, CTSVC_SEARCH_PROPERTY_ALL, "sim_id"},
};
#endif
/* phonelog_stat */
CTSVC_PROPERTY_PHONELOG_STAT_LOG_COUNT = (CTSVC_PROPERTY_PHONELOG_STAT | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY),
CTSVC_PROPERTY_PHONELOG_STAT_LOG_TYPE = (CTSVC_PROPERTY_PHONELOG_STAT | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY) +1,
+ CTSVC_PROPERTY_PHONELOG_STAT_SIM_SLOT_NO = (CTSVC_PROPERTY_PHONELOG_STAT | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY) +2,
/* contact sip */
CTSVC_PROPERTY_SIP_ID = (CTSVC_PROPERTY_SIP | CTSVC_VIEW_DATA_TYPE_INT | CTSVC_READ_ONLY_PROPERTY),
#define CTSVC_IPC_SERVER_PERSON_GET_AGGREGATION_SUGGESTIONS "person_get_aggregation_suggestions"
#define CTSVC_IPC_SERVER_PHONELOG_RESET_STATISTICS "phonelog_reset_statistics"
+#define CTSVC_IPC_SERVER_PHONELOG_RESET_STATISTICS_BY_SIM "phonelog_reset_statistics_by_sim"
#define CTSVC_IPC_SERVER_PHONELOG_DELETE "phonelog_delete"
#define CTSVC_IPC_SERVER_SETTING_GET_NAME_DISPLAY_ORDER "setting_get_name_display_order"
*/
int contacts_phone_log_reset_statistics(void);
+/**
+ * @brief Resets the phone log's count by sim slot no.
+ *
+ * @since_tizen 3.0
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/callhistory.write
+ *
+ * @param[in] sim_slot_no It is related to the SIM slot number. sim_slot_no 0 means first SIM, sim_slot_no 1 means second SIM
+ *
+ * @return @c 0 on success,
+ * otherwise a negative error value
+ *
+ * @retval #CONTACTS_ERROR_NONE Successful
+ * @retval #CONTACTS_ERROR_OUT_OF_MEMORY Out of memory
+ * @retval #CONTACTS_ERROR_FILE_NO_SPACE FS Full
+ * @retval #CONTACTS_ERROR_DB Database operation failure
+ * @retval #CONTACTS_ERROR_IPC IPC error
+ * @retval #CONTACTS_ERROR_PERMISSION_DENIED Permission denied. This application does not have the privilege to call this method.
+ * @retval #CONTACTS_ERROR_NOT_SUPPORTED Not supported
+ *
+ * @pre contacts_connect() should be called to open a connection to the contacts service.
+ *
+ * @see contacts_connect()
+ */
+int contacts_phone_log_reset_statistics_by_sim(int sim_slot_no);
/**
* @}
* <tr><td>record</td><td>relationship</td><td>read, write</td><td> _contacts_relationship child record (multiple)</td></tr>
* <tr><td>record</td><td>image</td><td>read, write</td><td> _contacts_image child record (multiple)</td></tr>
* <tr><td>record</td><td>group_relation</td><td>read, write</td><td> _contacts_group_relation child record (multiple)</td></tr>
- * <tr><td>record</td><td>sip</td><td>read, write</td><td> _contacts_sip child record (multiple) </td></tr>
+ * <tr><td>record</td><td>sip</td><td>read, write</td><td> _contacts_sip child record (multiple) (Since 3.0)</td></tr>
* </table>
*/
_CONTACTS_BEGIN_VIEW()
* <tr><td>record</td><td>profile</td><td>read, write</td><td> _contacts_profile child record (multiple) </td></tr>
* <tr><td>record</td><td>relationship</td><td>read, write</td><td> _contacts_relationship child record (multiple) </td></tr>
* <tr><td>record</td><td>image</td><td>read, write</td><td> _contacts_image child record (multiple) </td></tr>
- * <tr><td>record</td><td>sip</td><td>read, write</td><td> _contacts_sip child record (multiple) </td></tr>
+ * <tr><td>record</td><td>sip</td><td>read, write</td><td> _contacts_sip child record (multiple) (Since 3.0) </td></tr>
* </table>
*/
_CONTACTS_BEGIN_VIEW()
* <tr><td>string</td><td>_uri</td><td> Identifier of this log stat view </td></tr>
* <tr><td>integer</td><td> log_count </td><td>Log count (projection) </td></tr>
* <tr><td>integer</td><td> log_type </td><td> Log type, see the @ref contacts_phone_log_type_e </td></tr>
+ * <tr><td>integer</td><td> sim_slot_no </td><td>It is related to the SIM slot number. sim_slot_no 0 means first SIM card, sim_slot_no 1 means second SIM. It is same with handle index of telephony handle list. Refer to the telephony_init() (Since 3.0)</td></tr>
* </table>
*/
_CONTACTS_BEGIN_READ_ONLY_VIEW()
_CONTACTS_PROPERTY_PROJECTION_INT(log_count)
_CONTACTS_PROPERTY_INT(log_type)
+ _CONTACTS_PROPERTY_INT(sim_slot_no) /*(Since 3.0)*/
_CONTACTS_END_READ_ONLY_VIEW(_contacts_phone_log_stat)
/**
* @addtogroup CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE View/Property
- * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_sip _contacts_sip view
+ * @section CAPI_SOCIAL_CONTACTS_SVC_VIEW_MODULE_contacts_sip _contacts_sip view (Since 3.0)
* <table>
* <tr>
* <th>Type</th>
Name: contacts-service
Summary: Contacts Service
-Version: 0.13.47
+Version: 0.13.48
Release: 0
Group: Social & Content/Service
License: Apache-2.0
--PRAGMA journal_mode = PERSIST;
--PRAGMA journal_mode = TRUNCATE;
-PRAGMA user_version = 102;
+PRAGMA user_version = 103;
CREATE TABLE persons
(
CREATE TABLE phonelog_stat
(
- log_type INTEGER PRIMARY KEY,
- log_count INTEGER
+ log_type INTEGER,
+ log_count INTEGER,
+ sim_id INTEGER
);
CREATE TRIGGER trg_phonelogs_insert AFTER INSERT ON phonelogs
BEGIN
- INSERT OR REPLACE INTO phonelog_stat values(new.log_type, coalesce((SELECT log_count+1 FROM phonelog_stat WHERE log_type=new.log_type), 1));
+ UPDATE phonelog_stat SET log_count = log_count+1 WHERE log_type=new.log_type AND sim_id=new.sim_id;
+ INSERT INTO phonelog_stat SELECT new.log_type, 1, new.sim_id WHERE NOT EXISTS (SELECT * FROM phonelog_stat WHERE log_type=new.log_type AND sim_id=new.sim_id);
END;
CREATE TABLE contact_stat
}
#ifdef ENABLE_LOG_FEATURE
-void ctsvc_ipc_phone_log_reset_statistics(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata)
+void ctsvc_ipc_phone_log_reset_statistics(pims_ipc_h ipc,
+ pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata)
{
int ret;
contacts_h contact = NULL;
return;
}
+void ctsvc_ipc_phone_log_reset_statistics_by_sim(pims_ipc_h ipc,
+ pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata)
+{
+ int ret;
+ int sim_slot_no;
+ contacts_h contact = NULL;
+
+ if (indata) {
+ ret = ctsvc_ipc_unmarshal_handle(indata, &contact);
+ if (CONTACTS_ERROR_NONE != ret) {
+ ERR("ctsvc_ipc_unmarshal_handle Fail(%d)", ret);
+ goto ERROR_RETURN;
+ }
+
+ ret = ctsvc_ipc_unmarshal_int(indata, &sim_slot_no);
+ if (CONTACTS_ERROR_NONE != ret) {
+ ERR("ctsvc_ipc_unmarshal_int() Fail(%d)", ret);
+ goto ERROR_RETURN;
+ }
+ }
+
+ if (!ctsvc_have_permission(ipc, CTSVC_PERMISSION_PHONELOG_WRITE)) {
+ ret = CONTACTS_ERROR_PERMISSION_DENIED;
+ goto ERROR_RETURN;
+ }
+
+ ret = ctsvc_phone_log_reset_statistics_by_sim(sim_slot_no);
+
+ERROR_RETURN:
+ if (outdata) {
+ *outdata = pims_ipc_data_create(0);
+ if (NULL == *outdata) {
+ ERR("pims_ipc_data_create() Fail");
+ goto DATA_FREE;
+ }
+ if (CONTACTS_ERROR_NONE != ctsvc_ipc_marshal_int(ret, *outdata)) {
+ pims_ipc_data_destroy(*outdata);
+ *outdata = NULL;
+ ERR("ctsvc_ipc_marshal_int() Fail");
+ goto DATA_FREE;
+ }
+ if (CONTACTS_ERROR_NONE == ret) {
+ int transaction_ver = ctsvc_get_transaction_ver();
+ if (CONTACTS_ERROR_NONE != ctsvc_ipc_marshal_int(transaction_ver, *outdata)) {
+ pims_ipc_data_destroy(*outdata);
+ *outdata = NULL;
+ ERR("ctsvc_ipc_marshal_int() Fail");
+ goto DATA_FREE;
+ }
+ }
+ } else {
+ ERR("outdata is NULL");
+ }
+DATA_FREE:
+ ctsvc_handle_destroy(contact);
+ ctsvc_server_start_timeout();
+ return;
+}
+
+
void ctsvc_ipc_phone_log_delete(pims_ipc_h ipc, pims_ipc_data_h indata,
pims_ipc_data_h *outdata, void *userdata)
{
#ifdef ENABLE_LOG_FEATURE
void ctsvc_ipc_phone_log_reset_statistics(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata);
+void ctsvc_ipc_phone_log_reset_statistics_by_sim(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata);
void ctsvc_ipc_phone_log_delete(pims_ipc_h ipc, pims_ipc_data_h indata, pims_ipc_data_h *outdata, void *userdata);
#endif /* ENABLE_LOG_FEATURE */
#ifdef ENABLE_LOG_FEATURE
if (pims_ipc_svc_register(CTSVC_IPC_PHONELOG_MODULE, CTSVC_IPC_SERVER_PHONELOG_RESET_STATISTICS, ctsvc_ipc_phone_log_reset_statistics, NULL) != 0) break;
+ if (pims_ipc_svc_register(CTSVC_IPC_PHONELOG_MODULE, CTSVC_IPC_SERVER_PHONELOG_RESET_STATISTICS_BY_SIM, ctsvc_ipc_phone_log_reset_statistics_by_sim, NULL) != 0) break;
if (pims_ipc_svc_register(CTSVC_IPC_PHONELOG_MODULE, CTSVC_IPC_SERVER_PHONELOG_DELETE, ctsvc_ipc_phone_log_delete, NULL) != 0) break;
#endif /* ENABLE_LOG_FEATURE */
return ctsvc_query_exec(query);
}
+int ctsvc_phone_log_reset_statistics_by_sim(int sim_slot_no)
+{
+ char query[CTS_SQL_MIN_LEN] = {0};
+ int sim_info_id;
+
+ sim_info_id = ctsvc_server_sim_get_info_id_by_sim_slot_no(sim_slot_no);
+ if (sim_info_id <= 0) {
+ ERR("ctsvc_server_sim_get_info_id_by_sim_slot_no() Fail(%d)", sim_info_id);
+ return CONTACTS_ERROR_NO_DATA;
+ }
+
+ snprintf(query, sizeof(query), "DELETE FROM "CTS_TABLE_PHONELOG_STAT
+ " WHERE sim_id = %d", sim_info_id);
+ return ctsvc_query_exec(query);
+}
+
int ctsvc_phone_log_delete(contacts_phone_log_delete_e op, ...)
{
int ret;
#include "contacts_phone_log_internal.h"
int ctsvc_phone_log_reset_statistics();
+int ctsvc_phone_log_reset_statistics_by_sim(int sim_slot_no);
int ctsvc_phone_log_delete(contacts_phone_log_delete_e op, ...);
void ctsvc_db_phone_log_delete_callback(sqlite3_context *context,
int argc, sqlite3_value **argv);
* You have to update user version schema.sql
* PRAGMA user_version = 100;
*/
-#define CTSVC_SCHEMA_VERSION 102
+#define CTSVC_SCHEMA_VERSION 103
#ifdef ENABLE_LOG_FEATURE
static int __ctsvc_server_find_person_id_of_phonelog(sqlite3 *__db, char *normal_num,
old_version = 102;
}
+ if (old_version <= 102) {
+ ret = sqlite3_exec(__db, "DROP TABLE phonelog_stat", NULL, 0, &errmsg);
+ if (SQLITE_OK != ret) {
+ ERR("drop phonelog_stat Fail(%d) : %s", ret, errmsg);
+ sqlite3_free(errmsg);
+ }
+
+ ret = sqlite3_exec(__db, "CREATE TABLE "CTS_TABLE_PHONELOG_STAT" "
+ "(log_type INTEGER, "
+ "log_count INTEGER, "
+ "sim_id INTEGER)"
+ , NULL, 0, &errmsg);
+ if (SQLITE_OK != ret) {
+ ERR("create phonelog_stat Fail(%d) : %s", ret, errmsg);
+ sqlite3_free(errmsg);
+ }
+
+ ret = sqlite3_exec(__db, "DROP trigger trg_phonelogs_insert", NULL, 0, &errmsg);
+ if (SQLITE_OK != ret) {
+ ERR("drop trigger trg_phonelogs_insert Fail(%d) : %s", ret, errmsg);
+ sqlite3_free(errmsg);
+ }
+
+ ret = sqlite3_exec(__db,
+ "CREATE TRIGGER trg_phonelogs_insert AFTER INSERT ON phonelogs "
+ " BEGIN "
+ " UPDATE phonelog_stat SET log_count = log_count+1 WHERE log_type=new.log_type AND sim_id=new.sim_id; "
+ " INSERT INTO phonelog_stat SELECT new.log_type, 1, new.sim_id WHERE NOT EXISTS (SELECT * FROM phonelog_stat WHERE log_type=new.log_type AND sim_id=new.sim_id); "
+ " END;",
+ NULL, 0, &errmsg);
+ if (SQLITE_OK != ret) {
+ ERR("create trigger trg_phonelogs_insert Fail(%d) : %s", ret, errmsg);
+ sqlite3_free(errmsg);
+ }
+
+ old_version = 103;
+ }
+
snprintf(query, sizeof(query),
"PRAGMA user_version = %d", CTSVC_SCHEMA_VERSION);
ret = sqlite3_exec(__db, query, NULL, 0, &errmsg);
"property id(%d)", filter->property_id);
#ifdef _CONTACTS_IPC_SERVER
- if (filter->property_id == CTSVC_PROPERTY_PHONELOG_SIM_SLOT_NO) {
+ if (CTSVC_PROPERTY_PHONELOG_SIM_SLOT_NO == filter->property_id ||
+ CTSVC_PROPERTY_PHONELOG_STAT_SIM_SLOT_NO == filter->property_id) {
/* get real sim info id by SIM slot number 0/1 */
int sim_info_id = ctsvc_server_sim_get_info_id_by_sim_slot_no(filter->value.i);
if (0 < sim_info_id) {