#include <sqlite3.h>
#include <memory>
#include <string>
+#include <unistd.h>
#include <db-util.h>
#define TryCatchLogReturn(condition, expr, r, logFormat) if (!(condition)) { \
{\
/*int res = sqlite3_open_v2(dbpath, &pHandler##Temp, mode , NULL);*/\
int res = db_util_open_with_options(dbpath, &pHandler##Temp, mode, NULL);\
- TryCatchResLogReturn( res == SQLITE_OK, , PRIV_MGR_ERROR_DB_ERROR, "db_util_open_with_options : %d", res);\
+ TryCatchResLogReturn(res == SQLITE_OK, , PRIV_MGR_ERROR_DB_ERROR, "db_util_open_with_options : %d", res);\
}\
setDbToUniquePtr(pHandler, pHandler##Temp);\
-
+
+static const int MAX_DATABASE_RETRY_COUNT = 5;
+static const int SLEEP_TIME = 50000;
#define prepareDb(pHandler, sql, pStmt) sqlite3_stmt* pStmt##Temp;\
{\
- int res = sqlite3_prepare_v2(pHandler.get(), sql, -1, & pStmt##Temp, NULL);\
- TryCatchResLogReturn( res == SQLITE_OK, , PRIV_MGR_ERROR_DB_ERROR, "sqlite3_prepare_v2 : %d", res);\
+ int res = SQLITE_OK;\
+ for (int dbRetryCount = 0; dbRetryCount < MAX_DATABASE_RETRY_COUNT; dbRetryCount++)\
+ {\
+ res = sqlite3_prepare_v2(pHandler.get(), sql, -1, & pStmt##Temp, NULL);\
+ if (res != SQLITE_BUSY)\
+ {\
+ break;\
+ }\
+ else\
+ {\
+ LOGE("[DbRetryCount][%d]: Database is busy!", dbRetryCount); \
+ usleep(SLEEP_TIME);\
+ }\
+ }\
+ TryCatchResLogReturn(res == SQLITE_OK, , PRIV_MGR_ERROR_DB_ERROR, "sqlite3_prepare_v2 : %d", res);\
}\
setStmtToUniquePtr(pStmt, pStmt##Temp);
#include <set>
#include <Utils.h>
#include <libintl.h>
+#include <system_info.h>
-std::map <std::string, std::string> PrivacyIdInfo::m_privilegeToPrivacyMap;
+std::map< std::string, std::string > PrivacyIdInfo::m_privilegeToPrivacyMap;
bool PrivacyIdInfo:: m_isInitialized;
int
PrivacyIdInfo::initialize(void)
{
static const std::string sqlPrivilege("SELECT PRIVILEGE_ID, PRIVACY_ID from PrivilegeToPrivacyTable");
+ static const std::string sqlPrivacyInfo("SELECT FEATURE FROM PrivacyInfo where PRIVACY_ID=?");
openDb(PRIVACY_INFO_DB_PATH.c_str(), pDbHandler, SQLITE_OPEN_READONLY);
prepareDb(pDbHandler, sqlPrivilege.c_str(), pStmtPrivilege);
int res;
- while ( (res = sqlite3_step(pStmtPrivilege.get())) == SQLITE_ROW )
+ while ((res = sqlite3_step(pStmtPrivilege.get())) == SQLITE_ROW)
{
const char* privilegeId = reinterpret_cast < const char* > (sqlite3_column_text(pStmtPrivilege.get(), 0));
const char* privacyId = reinterpret_cast < const char* > (sqlite3_column_text(pStmtPrivilege.get(), 1));
- m_privilegeToPrivacyMap.insert(std::map < std::string, std::string >::value_type(std::string(privilegeId), std::string(privacyId)));
+
+ prepareDb(pDbHandler, sqlPrivacyInfo.c_str(), pStmtPrivacyInfo);
+ res = sqlite3_bind_text(pStmtPrivacyInfo.get(), 1, privacyId, -1, SQLITE_TRANSIENT);
+ TryReturn(res == SQLITE_OK, PRIV_MGR_ERROR_DB_ERROR, , "sqlite3_bind_text : %d", res);
+ res = sqlite3_step(pStmtPrivacyInfo.get());
+ LOGD("privacy id : %s", privacyId);
+ TryReturn(res == SQLITE_DONE || res == SQLITE_ROW, PRIV_MGR_ERROR_DB_ERROR, , "sqlite3_step : %d", res);
+
+ const char* feature = reinterpret_cast < const char* > (sqlite3_column_text(pStmtPrivacyInfo.get(), 0));
+ if (feature != NULL)
+ {
+ bool isSupported = false;
+
+ res = isFeatureEnabled(feature, isSupported);
+ TryReturn(res == PRIV_MGR_ERROR_SUCCESS, res, , "isFeatureEnabled : %d", res);
+
+ if (!isSupported)
+ {
+ continue;
+ }
+ }
+
+ m_privilegeToPrivacyMap.insert(std::map< std::string, std::string >::value_type(std::string(privilegeId), std::string(privacyId)));
}
m_isInitialized = true;
PrivacyIdInfo::getPrivacyIdFromPrivilege(const std::string privilege, std::string& privacyId)
{
if (!m_isInitialized)
+ {
initialize();
- std::map < std::string, std::string >::iterator iter = m_privilegeToPrivacyMap.find(privilege);
+ }
+
+ std::map< std::string, std::string >::iterator iter = m_privilegeToPrivacyMap.find(privilege);
if (iter == m_privilegeToPrivacyMap.end())
+ {
return PRIV_MGR_ERROR_NO_DATA;
- privacyId = iter->second;
+ }
+ privacyId = iter->second;
return PRIV_MGR_ERROR_SUCCESS;
}
int
-PrivacyIdInfo::getPrivacyIdListFromPrivilegeList(const std::list < std::string> privilegeList, std::list < std::string> & privacyIdList)
+PrivacyIdInfo::getPrivilegeListFromPrivacyId(const std::string privacyId, std::list< std::string >& privilegeList)
{
if (!m_isInitialized)
+ {
initialize();
+ }
+
+ privilegeList.clear();
+ for (std::map< std::string, std::string >::iterator iter = m_privilegeToPrivacyMap.begin(); iter != m_privilegeToPrivacyMap.end(); ++iter)
+ {
+ if (privacyId.compare((iter->second)) == 0)
+ {
+ privilegeList.push_back(iter->first);
+ }
+ }
+
+ if (privilegeList.size() == 0)
+ {
+ LOGE("PrivilegeList of %s privacy is empty!", privacyId.c_str());
+ return PRIV_MGR_ERROR_NO_DATA;
+ }
+
+ return PRIV_MGR_ERROR_SUCCESS;
+}
+
+int
+PrivacyIdInfo::getPrivacyIdListFromPrivilegeList(const std::list< std::string > privilegeList, std::list< std::string >& privacyIdList)
+{
+ if (!m_isInitialized)
+ {
+ initialize();
+ }
privacyIdList.clear();
- std::set <std::string> privacyIdSet;
+ std::set< std::string > privacyIdSet;
- for (std::list < std::string > ::const_iterator iter = privilegeList.begin(); iter != privilegeList.end(); ++iter)
+ for (std::list< std::string >::const_iterator iter = privilegeList.begin(); iter != privilegeList.end(); ++iter)
{
std::string privacyId;
int res = getPrivacyIdFromPrivilege(*iter, privacyId);
if (res == PRIV_MGR_ERROR_SUCCESS)
+ {
privacyIdSet.insert(privacyId);
+ }
}
-
- for (std::set < std::string >::iterator iter = privacyIdSet.begin(); iter != privacyIdSet.end(); ++iter)
+
+ for (std::set< std::string >::iterator iter = privacyIdSet.begin(); iter != privacyIdSet.end(); ++iter)
{
privacyIdList.push_back(*iter);
}
}
int
-PrivacyIdInfo::getAllPrivacyId(std::list < std::string >& privacyIdList)
+PrivacyIdInfo::getAllPrivacyId(std::list< std::string >& privacyIdList)
{
- static const std::string sql("SELECT PRIVACY_ID from PrivacyInfo");
+ static const std::string sql("SELECT PRIVACY_ID, FEATURE from PrivacyInfo");
if (!m_isInitialized)
+ {
initialize();
-
+ }
+
openDb(PRIVACY_INFO_DB_PATH.c_str(), pDbHandler, SQLITE_OPEN_READONLY);
prepareDb(pDbHandler, sql.c_str(), pStmt);
int res;
- while ( (res = sqlite3_step(pStmt.get())) == SQLITE_ROW )
+ while ((res = sqlite3_step(pStmt.get())) == SQLITE_ROW)
{
- const char* privacyId = reinterpret_cast < const char* > (sqlite3_column_text(pStmt.get(), 0));
+ const char* privacyId = reinterpret_cast < const char* > (sqlite3_column_text(pStmt.get(), 0));
+ const char* feature = reinterpret_cast < const char* > (sqlite3_column_text(pStmt.get(), 1));
+ LOGD("privacy: %s, feature: %s", privacyId, feature);
+
+ if (feature != NULL)
+ {
+ bool isSupported = false;
+ res = isFeatureEnabled(feature, isSupported);
+ TryReturn(res == PRIV_MGR_ERROR_SUCCESS, res, , "isFeatureEnabled : %d", res);
+ if (!isSupported)
+ {
+ continue;
+ }
+ }
+
privacyIdList.push_back(std::string(privacyId));
SECURE_LOGD(" privacy Id : %s", privacyId);
}
PrivacyIdInfo::getPrivaycDisplayName(const std::string privacyId, std::string& displayName)
{
if (!m_isInitialized)
+ {
initialize();
+ }
std::string sql = std::string("SELECT STR_MODULE_ID, STR_NAME_ID from PrivacyInfo where PRIVACY_ID=?");
prepareDb(pDbHandler, sql.c_str(), pStmt);
int res = sqlite3_bind_text(pStmt.get(), 1, privacyId.c_str(), -1, SQLITE_TRANSIENT);
- TryReturn( res == SQLITE_OK, PRIV_MGR_ERROR_DB_ERROR, , "sqlite3_bind_text : %d", res);
+ TryReturn(res == SQLITE_OK, PRIV_MGR_ERROR_DB_ERROR, , "sqlite3_bind_text : %d", res);
- if ( sqlite3_step(pStmt.get()) == SQLITE_ROW )
+ if (sqlite3_step(pStmt.get()) == SQLITE_ROW)
{
const char* pModuleId = reinterpret_cast < const char* > (sqlite3_column_text(pStmt.get(), 0));
const char* pNameId = reinterpret_cast < const char* > (sqlite3_column_text(pStmt.get(), 1));
if (pNameId == NULL)
+ {
displayName = privacyId;
+ }
else
+ {
displayName = std::string(dgettext(pModuleId, pNameId));
+ }
}
else
{
PrivacyIdInfo::getPrivaycDescription(const std::string privacyId, std::string& displayName)
{
if (!m_isInitialized)
+ {
initialize();
+ }
std::string sql = std::string("SELECT STR_MODULE_ID, STR_NAME_ID from PrivacyInfo where PRIVACY_ID=?");
prepareDb(pDbHandler, sql.c_str(), pStmt);
int res = sqlite3_bind_text(pStmt.get(), 1, privacyId.c_str(), -1, SQLITE_TRANSIENT);
- TryReturn( res == SQLITE_OK, PRIV_MGR_ERROR_DB_ERROR, , "sqlite3_bind_text : %d", res);
+ TryReturn(res == SQLITE_OK, PRIV_MGR_ERROR_DB_ERROR, , "sqlite3_bind_text : %d", res);
- if ( sqlite3_step(pStmt.get()) == SQLITE_ROW )
+ if (sqlite3_step(pStmt.get()) == SQLITE_ROW)
{
const char* pModuleId = reinterpret_cast < const char* > (sqlite3_column_text(pStmt.get(), 0));
- const char* pNameId = reinterpret_cast < const char* > (sqlite3_column_text(pStmt.get(), 0));
+ const char* pNameId = reinterpret_cast < const char* > (sqlite3_column_text(pStmt.get(), 1));
displayName = std::string(dgettext(pModuleId, pNameId));
}
return PRIV_MGR_ERROR_SUCCESS;
}
+
+int
+PrivacyIdInfo::isFeatureEnabled(const char* feature, bool& enabled)
+{
+ int res = PRIV_MGR_ERROR_SUCCESS;
+
+ if (feature == NULL)
+ {
+ enabled = true;
+ return res;
+ }
+
+ res = system_info_get_platform_bool(feature, &enabled);
+ TryReturn(res == PRIV_MGR_ERROR_SUCCESS, PRIV_MGR_ERROR_SYSTEM_ERROR, , "system_info_get_platform_bool : %d", res);
+
+ return PRIV_MGR_ERROR_SUCCESS;
+}