diff options
author | Jaekyu Park <jk7744.park@samsung.com> | 2016-05-27 17:06:14 +0900 |
---|---|---|
committer | Jaekyu Park <jk7744.park@samsung.com> | 2016-05-27 17:06:14 +0900 |
commit | cd19eb84d75b9b10642a6adc9cb3c26029e96b5c (patch) | |
tree | 345811e4005c4fc26e6ae7aa7d3545fe293ec29e | |
parent | c7ab0e0f4283d3ef4c5f3d215f3e4f7275017e6d (diff) | |
download | sync-manager-tizen_2.4.tar.gz sync-manager-tizen_2.4.tar.bz2 sync-manager-tizen_2.4.zip |
Tizen 2.4 SDK Rev6 Releasesubmit/tizen_2.4/20160530.023103accepted/tizen/2.4/mobile/20160530.220140tizen_2.4accepted/tizen_2.4_mobile
32 files changed, 670 insertions, 77 deletions
diff --git a/include/sync-error.h b/include/sync-error.h index d9f3cb9..32afb2e 100644 --- a/include/sync-error.h +++ b/include/sync-error.h @@ -56,7 +56,7 @@ typedef enum SYNC_ERROR_QUOTA_EXCEEDED = TIZEN_ERROR_QUOTA_EXCEEDED, /**< Quota exceeded */ SYNC_ERROR_UNKNOWN = TIZEN_ERROR_UNKNOWN, /**< Unknown Error */ SYNC_ERROR_SYSTEM = TIZEN_ERROR_SYNC_MANAGER | 0x01, /**< System error */ - SYNC_ERROR_SYNC_ADAPTER_NOT_FOUND = TIZEN_ERROR_SYNC_MANAGER | 0x02 /**< Sync adater is not registered */ + SYNC_ERROR_SYNC_ADAPTER_NOT_FOUND = TIZEN_ERROR_SYNC_MANAGER | 0x02 /**< Sync adapter is not registered */ } sync_error_e; diff --git a/packaging/org.tizen.sync.service b/packaging/org.tizen.sync.service new file mode 100644 index 0000000..2d1b728 --- /dev/null +++ b/packaging/org.tizen.sync.service @@ -0,0 +1,5 @@ +[D-BUS Service] +Name=org.tizen.sync +Exec=/usr/bin/false +SystemdService=sync-manager.service +User=system diff --git a/packaging/sync-manager.service b/packaging/sync-manager.service index dea79b0..a173d1c 100644 --- a/packaging/sync-manager.service +++ b/packaging/sync-manager.service @@ -7,10 +7,9 @@ Requires=tizen-runtime.target User=system Group=system SmackProcessLabel=sync-service -Type=simple +Type=dbus +BusName=org.tizen.sync ExecStart=/usr/bin/sync-service -Restart=always -RestartSec=1 [Install] WantedBy=multi-user.target diff --git a/packaging/sync-manager.spec b/packaging/sync-manager.spec index 38a93b9..86e8420 100644 --- a/packaging/sync-manager.spec +++ b/packaging/sync-manager.spec @@ -1,10 +1,11 @@ Name: sync-service -Version: 0.0.8 +Version: 0.0.9 Release: 1 License: Apache-2.0 Summary: A Samsung sync framework library in SLP C API Group: Social & Content/API Source0: %{name}-%{version}.tar.gz +Source1: org.tizen.sync.service %if "%{?tizen_profile_name}" == "wearable" ExcludeArch: %{arm} %ix86 x86_64 @@ -67,6 +68,7 @@ sync client provides sync adapter functionality to register sync adapters and to %prep %setup -q +cp %{SOURCE1} . _CONTAINER_ENABLE=ON @@ -86,6 +88,9 @@ mkdir -p %{buildroot}/opt/usr/data/sync-manager mkdir -p %{buildroot}/usr/share/license cp %{_builddir}/%{name}-%{version}/LICENSE.APLv2 %{buildroot}/usr/share/license/%{name} +mkdir -p %{buildroot}/usr/share/dbus-1/system-services +install -m 0644 %{SOURCE1} %{buildroot}/usr/share/dbus-1/system-services/org.tizen.sync.service + %clean rm -rf %{buildroot} @@ -103,14 +108,18 @@ systemctl start sync-manager.service %{_bindir}/* %{_systemd_dir}/* /opt/usr/data/sync-manager/ +/usr/share/dbus-1/system-services/*.service +%attr(0644,system,system) %{_datadir}/dbus-1/system-services/org.tizen.sync.service %files -n libcore-sync-client %manifest libcore-sync-client.manifest /usr/share/license/%{name} %{_libdir}/libcore-sync-client.so* +%attr(0644,system,system) %{_datadir}/dbus-1/system-services/org.tizen.sync.service %files -n libcore-sync-client-devel %manifest libcore-sync-client.manifest %{_includedir}/*sync*.h %{_libdir}/pkgconfig/*.pc %{_libdir}/libcore-sync-client.so +%attr(0644,system,system) %{_datadir}/dbus-1/system-services/org.tizen.sync.service diff --git a/src/sync-client/sync_manager.c b/src/sync-client/sync_manager.c index e08f8d5..8c185d5 100644 --- a/src/sync-client/sync_manager.c +++ b/src/sync-client/sync_manager.c @@ -288,9 +288,9 @@ int sync_manager_add_periodic_sync_job(account_h account, const char *sync_job_n LOG_LOGC("sync client: account_get_account_id failure"); return SYNC_ERROR_SYSTEM; } - LOG_LOGC("appid [%s] accid [%d] sync_job_name [%s] ", g_sync_manager->appid, id, sync_job_name); + LOG_LOGC("appid [%s] accid [%d] sync_job_name [%s]", g_sync_manager->appid, id, sync_job_name); } else - LOG_LOGC("appid [%s] sync_job_name [%s] ", g_sync_manager->appid, sync_job_name); + LOG_LOGC("appid [%s] sync_job_name [%s]", g_sync_manager->appid, sync_job_name); int sync_interval = get_interval(sync_period); diff --git a/src/sync-service/CMakeLists.txt b/src/sync-service/CMakeLists.txt index f8c1105..f8a6446 100644 --- a/src/sync-service/CMakeLists.txt +++ b/src/sync-service/CMakeLists.txt @@ -61,7 +61,8 @@ SET(SRCS SyncManager_SyncAdapterAggregator.cpp SyncManager_SyncJobsAggregator.cpp SyncManager_SyncJobsInfo.cpp - SyncManager_DataSyncJob.cpp) + SyncManager_DataSyncJob.cpp + SyncManager_ManageIdleState.cpp) IF(_SEC_FEATURE_CONTAINER_ENABLE) diff --git a/src/sync-service/SyncManager_CurrentSyncContext.cpp b/src/sync-service/SyncManager_CurrentSyncContext.cpp index 307568e..38c1a64 100644 --- a/src/sync-service/SyncManager_CurrentSyncContext.cpp +++ b/src/sync-service/SyncManager_CurrentSyncContext.cpp @@ -32,6 +32,8 @@ CurrentSyncContext::CurrentSyncContext(SyncJob* pSyncJob) { __pCurrentSyncJob = pSyncJob; + __startTime = 0; + __timerId = -1; } diff --git a/src/sync-service/SyncManager_CurrentSyncJobQueue.cpp b/src/sync-service/SyncManager_CurrentSyncJobQueue.cpp index 9c08065..4caa6a4 100644 --- a/src/sync-service/SyncManager_CurrentSyncJobQueue.cpp +++ b/src/sync-service/SyncManager_CurrentSyncJobQueue.cpp @@ -68,8 +68,18 @@ CurrentSyncJobQueue::AddSyncJobToCurrentSyncQueue(SyncJob* syncJob) LOG_LOGD("Failed to construct CurrentSyncContext instance"); return SYNC_ERROR_OUT_OF_MEMORY; } - //adding timeout of 30 seconds - pCurrentSyncContext->SetTimerId(g_timeout_add (300000, CurrentSyncJobQueue::OnTimerExpired, pCurrentSyncContext)); + + if (syncJob->GetSyncType() == SYNC_TYPE_PERIODIC) { + SyncJobsAggregator* pSyncJobsAggregator = SyncManager::GetInstance()->GetSyncJobsAggregator(); + LOG_LOGD("pSyncJobsAggregator->GetMinPeriod() [%d]", pSyncJobsAggregator->GetMinPeriod()); + LOG_LOGD("pSyncJobsAggregator->GetLimitTime() [%d]", pSyncJobsAggregator->GetLimitTime()); + + guint interval = (guint)(pSyncJobsAggregator->GetLimitTime() * 60 * 1000); + + pCurrentSyncContext->SetTimerId(g_timeout_add(interval, CurrentSyncJobQueue::OnTimerExpired, pCurrentSyncContext)); + LOG_LOGD("Sync operation time limit is set as [%d]", (int)interval); + } + pair<map<const string, CurrentSyncContext*>::iterator,bool> ret; ret = __currentSyncJobQueue.insert(pair<const string, CurrentSyncContext*>(syncJob->__key, pCurrentSyncContext)); if (ret.second == false) @@ -106,7 +116,7 @@ CurrentSyncJobQueue::OnTimerExpired(void* data) } else { - LOG_LOGD(" context null"); + LOG_LOGD("context null"); } LOG_LOGD("CurrentSyncJobQueue::onTimerExpired Ends"); diff --git a/src/sync-service/SyncManager_CurrentSyncJobQueue.h b/src/sync-service/SyncManager_CurrentSyncJobQueue.h index 5034673..70d1425 100644 --- a/src/sync-service/SyncManager_CurrentSyncJobQueue.h +++ b/src/sync-service/SyncManager_CurrentSyncJobQueue.h @@ -28,6 +28,7 @@ #include <map> #include <queue> #include "SyncManager_CurrentSyncContext.h" +#include "SyncManager_SyncJobsAggregator.h" /*namespace _SyncManager { diff --git a/src/sync-service/SyncManager_ISyncJob.h b/src/sync-service/SyncManager_ISyncJob.h index 380b2f4..7f88255 100644 --- a/src/sync-service/SyncManager_ISyncJob.h +++ b/src/sync-service/SyncManager_ISyncJob.h @@ -47,6 +47,7 @@ class ISyncJob public: ISyncJob() : __syncJobId(-1) + , __syncType(SYNC_TYPE_UNKNOWN) { } diff --git a/src/sync-service/SyncManager_ManageIdleState.cpp b/src/sync-service/SyncManager_ManageIdleState.cpp new file mode 100644 index 0000000..9a0556f --- /dev/null +++ b/src/sync-service/SyncManager_ManageIdleState.cpp @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * 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. + */ + +/** + * @file SyncManager_ManageIdleState.cpp + * @brief This is the implementation file for the ManageIdleState class. + */ + +#include <stdlib.h> +#include "SyncManager_ManageIdleState.h" +#include "SyncManager_SyncService.h" +#include "SyncManager_SyncDefines.h" +#include "SyncManager_SyncManager.h" +#include "sync-log.h" + +#define SYNC_TERM_SEC 10 + +/*namespace _SyncManager +{*/ + + +ManageIdleState::ManageIdleState(void) +{ + __termTimerId = -1; +} + + +ManageIdleState::~ManageIdleState(void) +{ +} + + +void terminate_service(void); + +int +ManageIdleState::OnTermTimerExpired(gpointer) +{ + LOG_LOGD("Sync service auto-termination timer is expired"); + terminate_service(); + + return 0; +} + + +void +ManageIdleState::SetTermTimerId(long timerId) +{ + __termTimerId = timerId; +} + + +long +ManageIdleState::GetTermTimerId() const +{ + return __termTimerId; +} + + +void +ManageIdleState::SetTermTimer() +{ + guint termTimer = SYNC_TERM_SEC * 1000; + SetTermTimerId(g_timeout_add(termTimer, ManageIdleState::OnTermTimerExpired, NULL)); + LOG_LOGD("Sync service auto-termination timer is Set as [%d] sec", SYNC_TERM_SEC); +} + + +void +ManageIdleState::UnsetTermTimer() +{ + LOG_LOGD("Sync service auto-termination timer is Unset"); + g_source_remove((guint)GetTermTimerId()); +} + + +void +ManageIdleState::ResetTermTimer() +{ + LOG_LOGD("Sync service auto-termination timer is Reset"); + g_source_remove((guint)GetTermTimerId()); + SetTermTimer(); +} + diff --git a/src/sync-service/SyncManager_ManageIdleState.h b/src/sync-service/SyncManager_ManageIdleState.h new file mode 100644 index 0000000..034ddfc --- /dev/null +++ b/src/sync-service/SyncManager_ManageIdleState.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved + * + * 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. + */ + +/** + * @file SyncManager_ManageIdleState.h + * @brief This is the header file for the ManageIdleState class. + */ + +#ifndef SYNC_SERVICE_MANAGE_IDLE_STATE_H +#define SYNC_SERVICE_MANAGE_IDLE_STATE_H + +#include <glib.h> + +/*namespace _SyncManager +{ +*/ + +using namespace std; + +class ManageIdleState +{ +public: + ManageIdleState(void); + + ~ManageIdleState(void); + + static int OnTermTimerExpired(gpointer); + + void SetTermTimerId(long timerId); + + long GetTermTimerId() const; + + void SetTermTimer(void); + + void UnsetTermTimer(void); + + void ResetTermTimer(void); + +private: + long __termTimerId; +}; + +//}//_SyncManager +#endif // SYNC_SERVICE_MANAGE_IDLE_STATE_H diff --git a/src/sync-service/SyncManager_PeriodicSyncJob.cpp b/src/sync-service/SyncManager_PeriodicSyncJob.cpp index 7ad91eb..5dec349 100644 --- a/src/sync-service/SyncManager_PeriodicSyncJob.cpp +++ b/src/sync-service/SyncManager_PeriodicSyncJob.cpp @@ -42,6 +42,7 @@ PeriodicSyncJob::PeriodicSyncJob(const string appId, const string syncJobName, i PeriodicSyncJob::PeriodicSyncJob(const PeriodicSyncJob& other) : SyncJob(other) + , __period(other.__period) { /* this->__accountHandle = other.__accountHandle; this->__capability = other.__capability; @@ -139,7 +140,7 @@ void PeriodicSyncJob::Reset(int accountId, bundle* pUserData, int syncOption, long frequency) { SyncJob::Reset(accountId, pUserData, syncOption); - __period = frequency; + __period = frequency/60; } //}//_SyncManager diff --git a/src/sync-service/SyncManager_PeriodicSyncScheduler.cpp b/src/sync-service/SyncManager_PeriodicSyncScheduler.cpp index b5cf94f..4554cd7 100644 --- a/src/sync-service/SyncManager_PeriodicSyncScheduler.cpp +++ b/src/sync-service/SyncManager_PeriodicSyncScheduler.cpp @@ -89,11 +89,12 @@ PeriodicSyncScheduler::SchedulePeriodicSyncJob(PeriodicSyncJob* periodicSyncJob) { string jobKey = periodicSyncJob->__key; - /// Remove previous alarms, if set already + //Remove previous alarms, if set already int ret = RemoveAlarmForPeriodicSyncJob(periodicSyncJob); SYNC_LOGE_RET_RES(ret == SYNC_ERROR_NONE, SYNC_ERROR_SYSTEM, "Failed to remove previous alarm for [%s], [%d]", jobKey.c_str(), ret); alarm_id_t alarm_id; + ret = alarmmgr_add_periodic_alarm_withcb(periodicSyncJob->__period, QUANTUMIZE, PeriodicSyncScheduler::OnAlarmExpired, this, &alarm_id); if (ret == ALARMMGR_RESULT_SUCCESS) { diff --git a/src/sync-service/SyncManager_RepositoryEngine.cpp b/src/sync-service/SyncManager_RepositoryEngine.cpp index 938325a..2668c88 100644 --- a/src/sync-service/SyncManager_RepositoryEngine.cpp +++ b/src/sync-service/SyncManager_RepositoryEngine.cpp @@ -37,7 +37,6 @@ #include "sync-log.h" #include "sync-error.h" - /*namespace _SyncManager { */ @@ -72,7 +71,7 @@ static const xmlChar XML_ATTR_CAPABILITY[] = "capability"; static const xmlChar XML_ATTR_SYNCABLE[] = "syncable"; static const xmlChar XML_NODE_PERIODIC_SYNC[] = "periodicSync"; -static const xmlChar XML_ATTR_PERIODIC_SYNC_PEIOD[] = "period"; +static const xmlChar XML_ATTR_PERIODIC_SYNC_PERIOD[] = "period"; static const xmlChar XML_ATTR_PERIODIC_SYNC_FLEX[] = "flex"; static const xmlChar XML_NODE_SYNC_EXTRA[] = "extra"; @@ -153,6 +152,7 @@ RepositoryEngine::OnBooting() ReadSyncJobsData(); } + //Test method /* static void @@ -162,10 +162,52 @@ bndl_iterator_test(const char* pKey, const char* pVal, void* pData) } */ + +bool +RepositoryEngine::CheckSyncJobsData(void) +{ + char* pDocName; + xmlDocPtr doc = NULL; + xmlNodePtr cur = NULL; + + pDocName = PATH_SYNCJOBS; + doc = xmlParseFile(pDocName); + + if (doc == NULL) + { + LOG_LOGD("Failed to parse syncjobs.xml."); + return false; + } + + cur = xmlDocGetRootElement(doc); + if (cur == NULL) { + LOG_LOGD("Found empty document while parsing syncjobs.xml."); + xmlFreeDoc(doc); + return false; + } + + if (xmlStrcmp(cur->name, XML_NODE_JOBS)) { + LOG_LOGD("Found empty document while parsing syncjobs.xml."); + xmlFreeDoc(doc); + return false; + } else { + xmlChar* pTotalJobsCount = xmlGetProp(cur, XML_ATTR_JOBS_COUNT); + int totalcount = (pTotalJobsCount == NULL) ? 0 : atoi((char*)pTotalJobsCount); + LOG_LOGD("Total Sync jobs [%d]", totalcount); + + if (totalcount == 0) { + return false; + } + + return true; + } +} + + void RepositoryEngine::ReadSyncJobsData(void) { - LOG_LOGD("Read Sync jobs"); + LOG_LOGD("Reading Sync jobs"); //Parse the Xml file char* pDocName; @@ -202,6 +244,11 @@ RepositoryEngine::ReadSyncJobsData(void) int totalcount = (pTotalJobsCount == NULL) ? 0 : atoi((char*)pTotalJobsCount); LOG_LOGD("Total Sync jobs [%d]", totalcount); + if (totalcount == 0) { + ManageIdleState* pManageIdleState = SyncManager::GetInstance()->GetManageIdleState(); + pManageIdleState->SetTermTimer(); + } + cur = cur->xmlChildrenNode; while (cur != NULL) { @@ -253,8 +300,11 @@ RepositoryEngine::ReadSyncJobsData(void) } */ //Till here + + LOG_LOGD("sync jobs are figured out"); } + void RepositoryEngine::ReadSyncAdapters(void) { @@ -332,11 +382,10 @@ bndl_iterator(const char* pKey, const char* pVal, void* pData) } - void RepositoryEngine::WriteSyncJobsData(void) { - LOG_LOGD("Starts"); + LOG_LOGD("Writing sync jobs"); xmlDocPtr doc; xmlNodePtr rootNode, jobNode; @@ -420,7 +469,7 @@ RepositoryEngine::WriteSyncJobsData(void) continue; } ss<<(int)pPeriodJob->__period; - xmlNewProp(jobNode, XML_ATTR_PERIODIC_SYNC_PEIOD, (const xmlChar*)ss.str().c_str()); + xmlNewProp(jobNode, XML_ATTR_PERIODIC_SYNC_PERIOD, (const xmlChar*)ss.str().c_str()); ss.str(string()); } } @@ -443,7 +492,7 @@ RepositoryEngine::WriteSyncJobsData(void) void RepositoryEngine::WriteSyncAdapters(void) { - LOG_LOGD(" Starts"); + LOG_LOGD("Writing sync adapters"); xmlDocPtr doc; xmlNodePtr rootNode, saNode; @@ -509,7 +558,6 @@ RepositoryEngine::ParseExtras(xmlNodePtr cur, bundle* pExtra) void RepositoryEngine::ParseSyncJobsN(xmlNodePtr cur, xmlChar* pPackage) { - xmlChar* pAppId = xmlGetProp(cur, XML_ATTR_JOB_APP_ID); xmlChar* pAccId = xmlGetProp(cur, XML_ATTR_JOB_ACCOUNT_ID); xmlChar* pJobId = xmlGetProp(cur, XML_ATTR_JOB_ID); @@ -518,13 +566,16 @@ RepositoryEngine::ParseSyncJobsN(xmlNodePtr cur, xmlChar* pPackage) xmlChar* pJobExpedit = xmlGetProp(cur, XML_ATTR_JOB_OPTION_EXPEDIT); xmlChar* pJobType = xmlGetProp(cur, XML_ATTR_JOB_TYPE); + xmlChar* pPeriod = xmlGetProp(cur, XML_ATTR_PERIODIC_SYNC_PERIOD); + int period = (pPeriod == NULL)? 1800 : atoi((char*)pPeriod) * 60; + SyncType type = (pJobType == NULL) ? SYNC_TYPE_UNKNOWN : (SyncType)atoi((char*)pJobType); bool noretry = (pJobNoRetry == NULL) ? false : atoi((char*)pJobNoRetry); bool expedit = (pJobExpedit == NULL) ? false : atoi((char*)pJobExpedit); int acountId = (pAccId == NULL) ? -1 : atoi((char*)pAccId); int jobId = (pJobId == NULL) ? -1 : atoi((char*)pJobId); - int syncOption = (noretry) ? 0x00 : 0x02; - syncOption |= (expedit) ? 0x00 : 0x01; + int syncOption = (noretry) ? 0x02 : 0x00; + syncOption |= (expedit) ? 0x01 : 0x00; bundle* pExtra = NULL; cur = cur->xmlChildrenNode; @@ -549,8 +600,10 @@ RepositoryEngine::ParseSyncJobsN(xmlNodePtr cur, xmlChar* pPackage) } case SYNC_TYPE_PERIODIC: { - xmlChar* pPeriod = xmlGetProp(cur, XML_ATTR_PERIODIC_SYNC_PEIOD); - int period = (pPeriod == NULL)? 1800 : atoi((char*) pPeriod); + SyncJobsAggregator* pSyncJobsAggregator = SyncManager::GetInstance()->GetSyncJobsAggregator(); + + pSyncJobsAggregator->SetMinPeriod(period/60); + pSyncJobsAggregator->SetLimitTime(pSyncJobsAggregator->GetMinPeriod()); SyncManager::GetInstance()->AddPeriodicSyncJob((char*)pPackage, (char*)pJobName, acountId, pExtra, syncOption, jobId, period); break; @@ -576,5 +629,25 @@ RepositoryEngine::SaveCurrentState(void) } +void +RepositoryEngine::SaveCurrentSyncAdapter(void) +{ + LOG_LOGD("saving states after adding sync adapter"); + pthread_mutex_lock(&__capabilityInfoMutex); + WriteSyncAdapters(); + pthread_mutex_unlock(&__capabilityInfoMutex); +} + + +void +RepositoryEngine::SaveCurrentSyncJob(void) +{ + LOG_LOGD("saving states of current sync job"); + pthread_mutex_lock(&__capabilityInfoMutex); + WriteSyncJobsData(); + pthread_mutex_unlock(&__capabilityInfoMutex); +} + + //}//_SyncManager diff --git a/src/sync-service/SyncManager_RepositoryEngine.h b/src/sync-service/SyncManager_RepositoryEngine.h index 7994ca0..00fefa0 100644 --- a/src/sync-service/SyncManager_RepositoryEngine.h +++ b/src/sync-service/SyncManager_RepositoryEngine.h @@ -33,6 +33,7 @@ #include <list> #include <map> #include "SyncManager_CapabilityInfo.h" +#include "SyncManager_ManageIdleState.h" #include "SyncManager_SyncStatusInfo.h" #include "SyncManager_SyncJob.h" #include "SyncManager_PeriodicSyncJob.h" @@ -62,11 +63,16 @@ public: void SaveCurrentState(void); + void SaveCurrentSyncAdapter(void); + + void SaveCurrentSyncJob(void); + + bool CheckSyncJobsData(void); + public: static const long NOT_IN_BACKOFF_MODE; private: - RepositoryEngine(void); RepositoryEngine(const RepositoryEngine&); @@ -99,8 +105,6 @@ private: map<string, map<string, SyncJob*> > __Aggr; // Data sync job list to be scheduled map<int, SyncStatusInfo*> __syncStatus; - int PENDING_FINISH_TO_WRITE; - static RepositoryEngine* __pInstance; static const long DEFAULT_PERIOD_SEC; diff --git a/src/sync-service/SyncManager_SyncAdapterAggregator.cpp b/src/sync-service/SyncManager_SyncAdapterAggregator.cpp index 48c0b3f..7b20eeb 100644 --- a/src/sync-service/SyncManager_SyncAdapterAggregator.cpp +++ b/src/sync-service/SyncManager_SyncAdapterAggregator.cpp @@ -54,12 +54,9 @@ SyncAdapterAggregator::~SyncAdapterAggregator(void) void SyncAdapterAggregator::AddSyncAdapter(const char* pPackageId, const char* pServiceAppId) { - if (HasSyncAdapter(pPackageId)) - { + if (HasSyncAdapter(pPackageId)) { LOG_LOGD("Sync adapter already registered for package [%s]", pPackageId); - } - else - { + } else { LOG_LOGD("Registering sync-adapter [%s] for package [%s]", pServiceAppId, pPackageId); __syncAdapterList.insert(std::pair<string, string> (pPackageId, pServiceAppId)); } diff --git a/src/sync-service/SyncManager_SyncDefines.h b/src/sync-service/SyncManager_SyncDefines.h index 7a7bbeb..a2cbcc4 100644 --- a/src/sync-service/SyncManager_SyncDefines.h +++ b/src/sync-service/SyncManager_SyncDefines.h @@ -226,6 +226,7 @@ struct Message acc = NULL; pSyncJob = NULL; res = SYNC_STATUS_UNKNOWN; + type = SYNC_CHECK_ALARM; } SyncDispatchMessage type; diff --git a/src/sync-service/SyncManager_SyncJob.cpp b/src/sync-service/SyncManager_SyncJob.cpp index ce81762..e5b38b9 100644 --- a/src/sync-service/SyncManager_SyncJob.cpp +++ b/src/sync-service/SyncManager_SyncJob.cpp @@ -94,6 +94,9 @@ SyncJob::SyncJob(const string appId, const string syncJobName, int account, bund , __isExpedited(syncOption & SYNC_OPTION_EXPEDITED) , __noRetry(syncOption & SYNC_OPTION_NO_RETRY) { + LOG_LOGD("syncOption: %d", syncOption); + LOG_LOGD("__isExpedited: %d", __isExpedited); + if (pExtras) { __pExtras = bundle_dup(pExtras); diff --git a/src/sync-service/SyncManager_SyncJob.h b/src/sync-service/SyncManager_SyncJob.h index a22134c..778e033 100644 --- a/src/sync-service/SyncManager_SyncJob.h +++ b/src/sync-service/SyncManager_SyncJob.h @@ -75,8 +75,8 @@ public: public: string __appId; int __accountId; - SyncReason __reason; - SyncSource __syncSource; + //SyncReason __reason; + //SyncSource __syncSource; bundle* __pExtras; string __syncJobName; string __key; diff --git a/src/sync-service/SyncManager_SyncJobDispatcher.cpp b/src/sync-service/SyncManager_SyncJobDispatcher.cpp index 1e19a1a..34ea7ac 100644 --- a/src/sync-service/SyncManager_SyncJobDispatcher.cpp +++ b/src/sync-service/SyncManager_SyncJobDispatcher.cpp @@ -212,9 +212,20 @@ SyncJobDispatcher::TryStartingNextJobLocked() pthread_mutex_lock(&(SyncManager::GetInstance()->__syncJobQueueMutex)); SyncJobQueue* pSyncJobQueue = SyncManager::GetInstance()->GetSyncJobQueue(); + if (pSyncJobQueue == NULL) { + LOG_LOGD("pSyncJobQueue is null"); + return; + } list< SyncJob* >& jobQueue = pSyncJobQueue->GetSyncJobQueue(); + if (jobQueue.empty()) { + LOG_LOGD("jobQueue is empty"); + } + list< SyncJob* >& priorityJobQueue = pSyncJobQueue->GetPrioritySyncJobQueue(); + if (priorityJobQueue.empty()) { + LOG_LOGD("priorityJobQueue is empty"); + } if (jobQueue.empty() && priorityJobQueue.empty()) { @@ -227,6 +238,7 @@ SyncJobDispatcher::TryStartingNextJobLocked() if (!jobQueue.empty()) { + LOG_LOGD("jobQueue is filled"); SyncJob* nonPrioritySyncJob = jobQueue.front(); if (nonPrioritySyncJob->__waitCounter > NON_PRIORITY_SYNC_WAIT_LIMIT) { @@ -246,21 +258,25 @@ SyncJobDispatcher::TryStartingNextJobLocked() if (syncJobToRun == NULL && !jobQueue.empty()) { LOG_LOGD("Non priority job found."); + LOG_LOGD("Non priority size : %d", jobQueue.size()); syncJobToRun = jobQueue.front(); jobQueue.pop_front(); - LOG_LOGD("Non priority size.%d", jobQueue.size()); + LOG_LOGD("Non priority size : %d", jobQueue.size()); + if (syncJobToRun == NULL) + LOG_LOGD("syncJobToRun is null"); + } + pthread_mutex_unlock(&(SyncManager::GetInstance()->__syncJobQueueMutex)); if (syncJobToRun != NULL) { int ret = DispatchSyncJob(syncJobToRun); if (ret != SYNC_ERROR_NONE) { - SyncManager::GetInstance()->ScheduleSyncJob(syncJobToRun, false); LOG_LOGD("Failed to dispatch sync job. Adding it back to job queue"); + SyncManager::GetInstance()->ScheduleSyncJob(syncJobToRun, false); } } - pthread_mutex_unlock(&(SyncManager::GetInstance()->__syncJobQueueMutex)); } //}//_SyncManager diff --git a/src/sync-service/SyncManager_SyncJobQueue.cpp b/src/sync-service/SyncManager_SyncJobQueue.cpp index b464c2e..ecc956e 100644 --- a/src/sync-service/SyncManager_SyncJobQueue.cpp +++ b/src/sync-service/SyncManager_SyncJobQueue.cpp @@ -42,6 +42,7 @@ extern "C" SyncJobQueue::SyncJobQueue(void) + : __pSyncRepositoryEngine(NULL) { //Empty } diff --git a/src/sync-service/SyncManager_SyncJobsAggregator.cpp b/src/sync-service/SyncManager_SyncJobsAggregator.cpp index 3593ebf..e0e21d8 100644 --- a/src/sync-service/SyncManager_SyncJobsAggregator.cpp +++ b/src/sync-service/SyncManager_SyncJobsAggregator.cpp @@ -31,6 +31,7 @@ #include "SyncManager_CurrentSyncJobQueue.h" #include "SyncManager_SyncDefines.h" +#define MAX_COUNT 12 /*namespace _SyncManager { @@ -38,6 +39,8 @@ SyncJobsAggregator::SyncJobsAggregator(void) + : min_period(0) + , limit_time(0) { } @@ -243,10 +246,49 @@ SyncJobsAggregator::GetSyncJobsInfo(const char* pPackageId) return NULL; } + map<string, SyncJobsInfo*>& SyncJobsAggregator::GetAllSyncJobs() { return __syncJobsContainer; } + +void +SyncJobsAggregator::SetMinPeriod(int min_period) +{ + this->min_period = min_period; + LOG_LOGD("Minimum period is set as [%d]", this->min_period); +} + + +void +SyncJobsAggregator::SetLimitTime(int min_period) +{ + int idx = 1; + int limit_time = idx; + + for (idx; idx < MAX_COUNT; idx++) { + limit_time *= 2; + if (min_period < limit_time) { + this->limit_time = limit_time; + LOG_LOGD("Limit time is set as [%d]", this->limit_time); + return; + } + } +} + + +int +SyncJobsAggregator::GetMinPeriod() { + return min_period; +} + + +int +SyncJobsAggregator::GetLimitTime() { + return limit_time; +} + + //}//_SyncManager diff --git a/src/sync-service/SyncManager_SyncJobsAggregator.h b/src/sync-service/SyncManager_SyncJobsAggregator.h index 1c42529..92fc2ca 100644 --- a/src/sync-service/SyncManager_SyncJobsAggregator.h +++ b/src/sync-service/SyncManager_SyncJobsAggregator.h @@ -68,6 +68,14 @@ public: map<string, SyncJobsInfo*>& GetAllSyncJobs(); + void SetMinPeriod(int min_period); + + void SetLimitTime(int min_period); + + int GetMinPeriod(void); + + int GetLimitTime(void); + protected: SyncJobsAggregator(void); @@ -99,6 +107,9 @@ private: private: map<string, SyncJobsInfo*> __syncJobsContainer; + int min_period; + int limit_time; + friend class SyncManager; friend class RepositoryEngine; }; diff --git a/src/sync-service/SyncManager_SyncManager.cpp b/src/sync-service/SyncManager_SyncManager.cpp index b94c71f..29921ad 100644 --- a/src/sync-service/SyncManager_SyncManager.cpp +++ b/src/sync-service/SyncManager_SyncManager.cpp @@ -72,7 +72,6 @@ Singleton< SyncManager >::GetInstance() } } return __pInstance; - } @@ -139,7 +138,6 @@ SyncManager::AddPeriodicSyncJob(string pPackageId, const char* syncJobName, int if (period < 1800) { LOG_LOGD("Requested period %d is less than minimum, rounding up to 30 mins", period); - period = 1800; } @@ -160,7 +158,10 @@ SyncManager::AddPeriodicSyncJob(string pPackageId, const char* syncJobName, int __pPeriodicSyncScheduler->SchedulePeriodicSyncJob(pRequestedJob); if (pRequestedJob->IsExpedited()) { + LOG_LOGD("The sync job has priority"); ScheduleSyncJob(pRequestedJob); + } else { + LOG_LOGD("It's non-priority sync job"); } return SYNC_ERROR_NONE; @@ -395,8 +396,6 @@ SyncManager::OnBatteryStatusChanged(int value) } - - static int OnPackageUninstalled(int reqId, const char* pPkgType, const char* pPkgId, const char* pKey, const char* pVal, const void* pMsg, void* pData) { @@ -681,6 +680,7 @@ SyncManager::SyncManager(void) , __isSimDataConnectionPresent(false) , __isUPSModeEnabled(false) , __isSyncPermitted(true) + , __pManageIdleState(NULL) , __pNetworkChangeListener(NULL) , __pStorageListener(NULL) , __pBatteryStatusListener(NULL) @@ -713,6 +713,9 @@ SyncManager::Construct(void) LOG_LOGE_BOOL(ret == VCONF_OK, "vconf_get_int failed %d", ret); __isUPSModeEnabled = (upsMode == SETTING_PSMODE_EMERGENCY) ? true : false; + __pManageIdleState = new (std::nothrow) ManageIdleState(); + LOG_LOGE_BOOL(__pManageIdleState, "Failed to construct ManageIdleState"); + __pNetworkChangeListener = new (std::nothrow) NetworkChangeListener(); LOG_LOGE_BOOL(__pNetworkChangeListener, "Failed to construct NetworkChangeListener"); @@ -783,8 +786,8 @@ SyncManager::Construct(void) Initialize(); + //__pSyncRepositoryEngine->OnBooting(); - __pSyncRepositoryEngine->OnBooting(); return true; } @@ -893,6 +896,14 @@ SyncManager::GetSyncJobsAggregator() return __pSyncJobsAggregator; } + +ManageIdleState* +SyncManager::GetManageIdleState() +{ + return __pManageIdleState; +} + + void SyncManager::HandleShutdown(void) { @@ -902,6 +913,24 @@ SyncManager::HandleShutdown(void) } +void +SyncManager::RecordSyncAdapter(void) +{ + pthread_mutex_lock(&__syncJobQueueMutex); + __pSyncRepositoryEngine->SaveCurrentSyncAdapter(); + pthread_mutex_unlock(&__syncJobQueueMutex); +} + + +void +SyncManager::RecordSyncJob(void) +{ + pthread_mutex_lock(&__syncJobQueueMutex); + __pSyncRepositoryEngine->SaveCurrentSyncJob(); + pthread_mutex_unlock(&__syncJobQueueMutex); +} + + bool SyncManager::GetSyncSupport(int accountId) { @@ -924,6 +953,8 @@ SyncManager::GetSyncSupport(int accountId) return false; } + LOG_LOGD("The account supports sync"); + return true; } @@ -1015,7 +1046,7 @@ SyncManager::SendSyncAlarmMessage() void SyncManager::SendSyncCheckAlarmMessage() { - LOG_LOGD("Fire SYNC_CHECK_ALARM "); + LOG_LOGD("Fire SYNC_CHECK_ALARM"); Message msg; msg.type = SYNC_CHECK_ALARM; //TO DO: Implement code to remove all the pending messages from queue before firing a new one @@ -1060,7 +1091,7 @@ SyncManager::ScheduleSyncJob(SyncJob* pJob, bool fireCheckAlarm) { if(fireCheckAlarm) { - LOG_LOGD("Added sync job [%s] to Main queue, Intiating dispatch sequence", pJob->__key.c_str()); + LOG_LOGD("Added sync job [%s] to Main queue, Initiating dispatch sequence", pJob->__key.c_str()); SendSyncCheckAlarmMessage(); } } diff --git a/src/sync-service/SyncManager_SyncManager.h b/src/sync-service/SyncManager_SyncManager.h index b1f5b44..acd970b 100644 --- a/src/sync-service/SyncManager_SyncManager.h +++ b/src/sync-service/SyncManager_SyncManager.h @@ -43,6 +43,7 @@ #include "SyncManager_Singleton.h" #include "SyncManager_CurrentSyncJobQueue.h" #include "SyncManager_SyncDefines.h" +#include "SyncManager_ManageIdleState.h" /*namespace _SyncManager @@ -104,6 +105,8 @@ public: SyncJobsAggregator* GetSyncJobsAggregator(); + ManageIdleState* GetManageIdleState(); + void AddSyncAdapter(string packageId, string svcAppId); void AddRunningAccount(int account_id, int pid); @@ -126,6 +129,10 @@ public: void HandleShutdown(void); + void RecordSyncAdapter(void); + + void RecordSyncJob(void); + void CloseCurrentSyncContext(CurrentSyncContext *activeSyncContext); protected: @@ -204,6 +211,7 @@ private: SyncAdapterAggregator* __pSyncAdapterAggregator; SyncJobsAggregator* __pSyncJobsAggregator; + ManageIdleState* __pManageIdleState; CurrentSyncJobQueue* __pCurrentSyncJobQueue; account_subscribe_h __accountSubscriptionHandle; map<int, int> __runningAccounts; diff --git a/src/sync-service/SyncManager_SyncService.cpp b/src/sync-service/SyncManager_SyncService.cpp index 7c97c51..10ee3b4 100644 --- a/src/sync-service/SyncManager_SyncService.cpp +++ b/src/sync-service/SyncManager_SyncService.cpp @@ -43,7 +43,11 @@ #include "SyncManager_SyncAdapterAggregator.h" #include "SyncManager_SyncJobsAggregator.h" +#define SYNC_MANAGER_DBUS_SERVICE "org.tizen.sync" + static GDBusConnection* gdbusConnection = NULL; +static bool check_jobs = false; +//static pid_t pInvocationId; /*namespace _SyncManager {*/ @@ -83,8 +87,8 @@ void convert_to_path(char app_id[]) int SyncService::StartService() { - __pSyncMangerIntacnce = SyncManager::GetInstance(); - if (__pSyncMangerIntacnce == NULL) + __pSyncManagerInstance = SyncManager::GetInstance(); + if (__pSyncManagerInstance == NULL) { LOG_LOGD("Failed to initialize sync manager"); return -1; @@ -167,6 +171,9 @@ _check_privilege_by_pid(const char *label, const char *access_perm, bool check_r } +gboolean sync_adapter_handle_send_result(TizenSyncAdapter* pObject, GDBusMethodInvocation* pInvocation, gint sync_result, const gchar* sync_job_name); + + int SyncService::TriggerStartSync(const char* appId, int accountId, const char* syncJobName, bool isDataSync, bundle* pExtras) { @@ -180,7 +187,7 @@ SyncService::TriggerStartSync(const char* appId, int accountId, const char* sync { LOG_LOGD("app is not running, launch the app and wait for signal"); ret = app_control_create(&app_control); - SYNC_LOGE_RET_RES(ret == APP_CONTROL_ERROR_NONE, SYNC_ERROR_SYSTEM,"app control create failed %d", ret); + SYNC_LOGE_RET_RES(ret == APP_CONTROL_ERROR_NONE, SYNC_ERROR_SYSTEM, "app control create failed %d", ret); ret = app_control_set_app_id(app_control, appId); if (ret != APP_CONTROL_ERROR_NONE) @@ -193,26 +200,62 @@ SyncService::TriggerStartSync(const char* appId, int accountId, const char* sync sa_app_id.clear(); ret = app_control_send_launch_request(app_control, NULL, NULL); SYNC_LOGE_RET_RES(ret == APP_CONTROL_ERROR_NONE, SYNC_ERROR_SYSTEM, "app control launch request failed %d", ret); + + return SYNC_ERROR_SYSTEM; } else { LOG_LOGD("app is already running"); - } + TizenSyncAdapter* pSyncAdapter = (TizenSyncAdapter*) g_hash_table_lookup(g_hash_table, appId); - TizenSyncAdapter* pSyncAdapter = (TizenSyncAdapter*) g_hash_table_lookup(g_hash_table, appId); - if (pSyncAdapter) - { + if (!pSyncAdapter) + { + LOG_LOGD("Sync adapter entry not found. Preparing sync adapter object"); + + app_context_h app_context = NULL; + pid_t pid; + + int ret = app_manager_get_app_context(appId, &app_context); + SYNC_LOGE_RET_RES(ret == APP_MANAGER_ERROR_NONE, SYNC_ERROR_SYSTEM, "getting app_context is failed"); + + ret = app_context_get_pid(app_context, &pid); + SYNC_LOGE_RET_RES(ret == APP_MANAGER_ERROR_NONE, SYNC_ERROR_SYSTEM, "getting pid from app_context is failed"); + + GError* error = NULL; + char obj_path[50]; + snprintf(obj_path, 50, "%s%d", SYNC_ADAPTER_DBUS_PATH, pid); + + GVariant* pBundle = marshal_bundle(pExtras); + GDBusInterfaceSkeleton* interface = NULL; + pSyncAdapter = tizen_sync_adapter_skeleton_new(); + + if (pSyncAdapter != NULL) + { + interface = G_DBUS_INTERFACE_SKELETON(pSyncAdapter); + if (g_dbus_interface_skeleton_export(interface, gdbusConnection, obj_path, &error)) + { + g_signal_connect(pSyncAdapter, "handle-send-result", G_CALLBACK(sync_adapter_handle_send_result), NULL); + + LOG_LOGD("inserting sync adapter ipc %s %x", appId, pSyncAdapter); + g_hash_table_insert(g_hash_table, strdup(appId), pSyncAdapter); + } + else + { + LOG_LOGD("export failed %s", error->message); + return SYNC_ERROR_SYSTEM; + } + } + else + { + LOG_LOGD("Remote object creation failed"); + return SYNC_ERROR_SYSTEM; + } + } GVariant* pBundle = marshal_bundle(pExtras); tizen_sync_adapter_emit_start_sync(pSyncAdapter, accountId, syncJobName, isDataSync, pBundle); } - else - { - LOG_LOGD("Sync adapter entry not found"); - return SYNC_ERROR_SYSTEM; - } return SYNC_ERROR_NONE; - } @@ -239,7 +282,7 @@ SyncService::RequestOnDemandSync(const char* pPackageId, const char* pSyncJobNam { int ret = SYNC_ERROR_NONE; int syncJobId = -1; - SyncJobsAggregator* pSyncJobsAggregator = __pSyncMangerIntacnce->GetSyncJobsAggregator(); + SyncJobsAggregator* pSyncJobsAggregator = __pSyncManagerInstance->GetSyncJobsAggregator(); ISyncJob* pSyncJob = pSyncJobsAggregator->GetSyncJob(pPackageId, pSyncJobName); if (pSyncJob) @@ -259,7 +302,7 @@ SyncService::RequestOnDemandSync(const char* pPackageId, const char* pSyncJobNam SYNC_LOGE_RET_RES(syncJobId <= SYNC_JOB_LIMIT, SYNC_ERROR_QUOTA_EXCEEDED, "Sync job quota exceeded"); LOG_LOGD("New sync request. Adding sync job with Sync job name [%s] Sync job id [%d]", pSyncJobName, syncJobId); - ret = __pSyncMangerIntacnce->AddOnDemandSync(pPackageId, pSyncJobName, accountId, pExtras, syncOption, syncJobId); + ret = __pSyncManagerInstance->AddOnDemandSync(pPackageId, pSyncJobName, accountId, pExtras, syncOption, syncJobId); } if (ret == SYNC_ERROR_NONE) @@ -275,20 +318,28 @@ int SyncService::RequestPeriodicSync(const char* pPackageId, const char* pSyncJobName, int accountId, bundle* pExtras, int syncOption, unsigned long pollFrequency, int* pSyncJobId) { int ret = SYNC_ERROR_NONE; - SyncJobsAggregator* pSyncJobsAggregator = __pSyncMangerIntacnce->GetSyncJobsAggregator(); int syncJobId = -1; + SyncJobsAggregator* pSyncJobsAggregator = __pSyncManagerInstance->GetSyncJobsAggregator(); + + pSyncJobsAggregator->SetMinPeriod((int)pollFrequency/60); + pSyncJobsAggregator->SetLimitTime(pSyncJobsAggregator->GetMinPeriod()); ISyncJob* pSyncJob = pSyncJobsAggregator->GetSyncJob(pPackageId, pSyncJobName); if (pSyncJob) { PeriodicSyncJob* pSyncJobEntry = dynamic_cast< PeriodicSyncJob* > (pSyncJob); - SYNC_LOGE_RET_RES(pSyncJobEntry != NULL, SYNC_ERROR_SYSTEM, "Failed to get syn job"); + SYNC_LOGE_RET_RES(pSyncJobEntry != NULL, SYNC_ERROR_SYSTEM, "Failed to get sync job"); syncJobId = pSyncJobEntry->GetSyncJobId(); LOG_LOGD("Sync request with job name [%s] already found. Sync job id [%d]", pSyncJobName, syncJobId); pSyncJobEntry->Reset(accountId, pExtras, syncOption, pollFrequency); - LOG_LOGD("sync parameters are updated with new parameters", pSyncJobName); + LOG_LOGD("sync parameters are updated with new parameters"); + + if (pSyncJobEntry->IsExpedited()) { + LOG_LOGD("sync request with priority. Adding sync job with Sync job name [%s] Sync job id [%d]", pSyncJobName, syncJobId); + SyncManager::GetInstance()->ScheduleSyncJob(pSyncJobEntry); + } } else { @@ -296,13 +347,14 @@ SyncService::RequestPeriodicSync(const char* pPackageId, const char* pSyncJobNam SYNC_LOGE_RET_RES(syncJobId <= SYNC_JOB_LIMIT, SYNC_ERROR_QUOTA_EXCEEDED, "Sync job quota exceeded"); LOG_LOGD("New sync request. Adding sync job with Sync job name [%s] Sync job id [%d]", pSyncJobName, syncJobId); - ret = __pSyncMangerIntacnce->AddPeriodicSyncJob(pPackageId, pSyncJobName, accountId, pExtras, syncOption, syncJobId, pollFrequency); + ret = __pSyncManagerInstance->AddPeriodicSyncJob(pPackageId, pSyncJobName, accountId, pExtras, syncOption, syncJobId, pollFrequency); } if (ret == SYNC_ERROR_NONE) { *pSyncJobId = syncJobId; } + return ret; } @@ -311,20 +363,25 @@ int SyncService::RequestDataSync(const char* pPackageId, const char* pSyncJobName, int accountId, bundle* pExtras, int syncOption, const char* pCapability, int* pSyncJobId) { int ret = SYNC_ERROR_NONE; - SyncJobsAggregator* pSyncJobsAggregator = __pSyncMangerIntacnce->GetSyncJobsAggregator(); + SyncJobsAggregator* pSyncJobsAggregator = __pSyncManagerInstance->GetSyncJobsAggregator(); int syncJobId = -1; ISyncJob* pSyncJob = pSyncJobsAggregator->GetSyncJob(pPackageId, pSyncJobName); if (pSyncJob) { DataSyncJob* pSyncJobEntry = dynamic_cast< DataSyncJob* > (pSyncJob); - SYNC_LOGE_RET_RES(pSyncJobEntry != NULL, SYNC_ERROR_SYSTEM, "Failed to get syn job"); + SYNC_LOGE_RET_RES(pSyncJobEntry != NULL, SYNC_ERROR_SYSTEM, "Failed to get sync job"); syncJobId = pSyncJobEntry->GetSyncJobId(); LOG_LOGD("Sync request with job name [%s] already found. Sync job id [%d]", pSyncJobName, syncJobId); pSyncJobEntry->Reset(accountId, pExtras, syncOption, pCapability); - LOG_LOGD("sync parameters are updated with new parameters", pSyncJobName); + LOG_LOGD("sync job is updated with new parameters"); + + if (pSyncJobEntry->IsExpedited()) { + LOG_LOGD("sync request with priority. Adding sync job with Sync job name [%s] Sync job id [%d]", pSyncJobName, syncJobId); + SyncManager::GetInstance()->ScheduleSyncJob(pSyncJobEntry); + } } else { @@ -332,7 +389,7 @@ SyncService::RequestDataSync(const char* pPackageId, const char* pSyncJobName, i SYNC_LOGE_RET_RES(syncJobId <= SYNC_JOB_LIMIT, SYNC_ERROR_QUOTA_EXCEEDED, "Sync job quota exceeded"); LOG_LOGD("New sync request. Adding sync job with Sync job name [%s] Sync job id [%d]", pSyncJobName, syncJobId); - ret = __pSyncMangerIntacnce->AddDataSyncJob(pPackageId, pSyncJobName, accountId, pExtras, syncOption, syncJobId, pCapability); + ret = __pSyncManagerInstance->AddDataSyncJob(pPackageId, pSyncJobName, accountId, pExtras, syncOption, syncJobId, pCapability); } if (ret == SYNC_ERROR_NONE) @@ -393,7 +450,7 @@ get_caller_pid(GDBusMethodInvocation* pMethodInvocation) * org.tizen.sync.adapter interface methods */ gboolean -sync_adapter_handle_send_result( TizenSyncAdapter* pObject, GDBusMethodInvocation* pInvocation, +sync_adapter_handle_send_result(TizenSyncAdapter* pObject, GDBusMethodInvocation* pInvocation, gint sync_result, const gchar* sync_job_name) { @@ -509,6 +566,12 @@ sync_manager_add_on_demand_sync_job(TizenSyncManager* pObject, GDBusMethodInvoca else tizen_sync_manager_complete_add_on_demand_sync_job(pObject, pInvocation, sync_job_id); + RepositoryEngine* pRepositoryEngine = SyncManager::GetInstance()->GetSyncRepositoryEngine(); + ManageIdleState* pManageIdleState = SyncManager::GetInstance()->GetManageIdleState(); + + if (!pRepositoryEngine->CheckSyncJobsData()) + pManageIdleState->ResetTermTimer(); + LOG_LOGD("End of On-Demand Sync request"); return true; @@ -551,7 +614,17 @@ sync_manager_remove_sync_job(TizenSyncManager* pObject, GDBusMethodInvocation* p else tizen_sync_manager_complete_remove_sync_job(pObject, pInvocation); + LOG_LOGD("sync service: recoding the change of registered sync job"); + SyncManager::GetInstance()->RecordSyncJob(); + + RepositoryEngine* pRepositoryEngine = SyncManager::GetInstance()->GetSyncRepositoryEngine(); + ManageIdleState* pManageIdleState = SyncManager::GetInstance()->GetManageIdleState(); + + if (!pRepositoryEngine->CheckSyncJobsData()) + pManageIdleState->SetTermTimer(); + LOG_LOGD("sync service: remove sync job ends"); + return true; } @@ -611,7 +684,17 @@ sync_manager_add_periodic_sync_job(TizenSyncManager* pObject, GDBusMethodInvocat else tizen_sync_manager_complete_add_periodic_sync_job(pObject, pInvocation, sync_job_id); + RepositoryEngine* pRepositoryEngine = SyncManager::GetInstance()->GetSyncRepositoryEngine(); + ManageIdleState* pManageIdleState = SyncManager::GetInstance()->GetManageIdleState(); + + if (!pRepositoryEngine->CheckSyncJobsData()) + pManageIdleState->UnsetTermTimer(); + + LOG_LOGD("sync service: recoding the change of registered sync job"); + SyncManager::GetInstance()->RecordSyncJob(); + LOG_LOGD("sync service: add periodic sync job ends"); + return true; } @@ -678,7 +761,69 @@ sync_manager_add_data_change_sync_job(TizenSyncManager* pObject, GDBusMethodInvo else tizen_sync_manager_complete_add_data_change_sync_job(pObject, pInvocation, sync_job_id); + RepositoryEngine* pRepositoryEngine = SyncManager::GetInstance()->GetSyncRepositoryEngine(); + ManageIdleState* pManageIdleState = SyncManager::GetInstance()->GetManageIdleState(); + + if (!pRepositoryEngine->CheckSyncJobsData()) + pManageIdleState->UnsetTermTimer(); + + LOG_LOGD("sync service: recoding the change of registered sync job"); + SyncManager::GetInstance()->RecordSyncJob(); + LOG_LOGD("sync service: add data sync job ends"); + + return true; +} + + +static bool +is_service_app(pid_t pid) +{ + char *current_app_id = NULL; + int ret = app_manager_get_app_id(pid, ¤t_app_id); + if (ret != APP_MANAGER_ERROR_NONE) + { + LOG_LOGD("Getting current app id is failed : %d, %s", ret, get_error_message(ret)); + return false; + } + + pkgmgrinfo_appinfo_h current_app_info = NULL; + + ret = pkgmgrinfo_appinfo_get_appinfo(current_app_id, ¤t_app_info); + if (ret != PMINFO_R_OK) + { + LOG_LOGD("Current app info handle creation error : %d, %s", ret, get_error_message(ret)); + free(current_app_id); + return false; + } + char *current_app_type = NULL; + ret = pkgmgrinfo_appinfo_get_component_type(current_app_info, ¤t_app_type); + if (ret != PMINFO_R_OK) + { + LOG_LOGD("Current app info getting app type error : %d, %s", ret, get_error_message(ret)); + + pkgmgrinfo_appinfo_destroy_appinfo(current_app_info); + free(current_app_id); + return false; + } + else + { + if (!strcmp(current_app_type, "svcapp")) + { + LOG_LOGD("Current application type : %s", current_app_type); + pkgmgrinfo_appinfo_destroy_appinfo(current_app_info); + } + else + { + LOG_LOGD("Current app is not a service application : %s", current_app_type); + pkgmgrinfo_appinfo_destroy_appinfo(current_app_info); + free(current_app_id); + return false; + } + } + + free(current_app_id); + return true; } @@ -719,6 +864,15 @@ sync_manager_add_sync_adapter(TizenSyncManager* pObject, GDBusMethodInvocation* int ret = SYNC_ERROR_SYSTEM; string pkgIdStr; guint pid = get_caller_pid(pInvocation); + + if (!is_service_app(pid)) + { + GError* error = g_error_new (_sync_error_quark(), SYNC_ERROR_INVALID_OPERATION, "App not supported"); + g_dbus_method_invocation_return_gerror(pInvocation, error); + g_clear_error(&error); + return false; + } + char* pAppId; ret = app_manager_get_app_id(pid, &pAppId); if (ret == APP_MANAGER_ERROR_NONE) @@ -735,6 +889,26 @@ sync_manager_add_sync_adapter(TizenSyncManager* pObject, GDBusMethodInvocation* if(!pkgIdStr.empty()) { + SyncAdapterAggregator* pAggregator = SyncManager::GetInstance()->GetSyncAdapterAggregator(); + if (pAggregator == NULL) { + LOG_LOGD("sync adapter aggregator is NULL"); + tizen_sync_manager_complete_add_sync_adapter(pObject, pInvocation); + return true; + } + if (pAggregator->HasSyncAdapter(pkgIdStr.c_str())) { + const char *registered_app_id = pAggregator->GetSyncAdapter(pkgIdStr.c_str()); + LOG_LOGD("registered appId is [%s]", registered_app_id); + LOG_LOGD("caller appId is [%s]", pAppId); + if (strcmp(pAppId, registered_app_id)) { + GError* error = g_error_new(_sync_error_quark(), SYNC_ERROR_QUOTA_EXCEEDED, "Sync adapter already registered"); + g_dbus_method_invocation_return_gerror(pInvocation, error); + g_clear_error(&error); + return false; + } else { + check_jobs = true; + } + } + char object_path[50]; snprintf(object_path, 50, "%s%d", SYNC_ADAPTER_DBUS_PATH, pid); @@ -754,6 +928,7 @@ sync_manager_add_sync_adapter(TizenSyncManager* pObject, GDBusMethodInvocation* LOG_LOGD("inserting sync adapter ipc %s", pAppId); g_hash_table_insert(g_hash_table, strdup(pAppId), syncAdapterObj); + ret = SYNC_ERROR_NONE; } else @@ -780,7 +955,13 @@ sync_manager_add_sync_adapter(TizenSyncManager* pObject, GDBusMethodInvocation* else tizen_sync_manager_complete_add_sync_adapter(pObject, pInvocation); - LOG_LOGD("End"); + if (check_jobs) { + SyncManager::GetInstance()->AlertForChange(); + } + + SyncManager::GetInstance()->RecordSyncAdapter(); + + LOG_LOGD("sync service: adding sync adapter ends"); return true; } @@ -791,6 +972,14 @@ sync_manager_remove_sync_adapter(TizenSyncManager* pObject, GDBusMethodInvocatio { LOG_LOGD("Request to remove sync adapter"); guint pid = get_caller_pid(pInvocation); + if (!is_service_app(pid)) + { + GError* error = g_error_new (_sync_error_quark(), SYNC_ERROR_INVALID_OPERATION, "App not supported"); + g_dbus_method_invocation_return_gerror(pInvocation, error); + g_clear_error(&error); + return false; + } + string pkgIdStr; char* pAppId; int ret = app_manager_get_app_id(pid, &pAppId); @@ -828,7 +1017,9 @@ sync_manager_remove_sync_adapter(TizenSyncManager* pObject, GDBusMethodInvocatio tizen_sync_manager_complete_remove_sync_adapter(pObject, pInvocation); - LOG_LOGD("End"); + SyncManager::GetInstance()->RecordSyncAdapter(); + + LOG_LOGD("sync service: removing sync adapter ends"); return true; } @@ -933,6 +1124,12 @@ sync_manager_get_all_sync_jobs(TizenSyncManager* pObject, GDBusMethodInvocation* tizen_sync_manager_complete_get_all_sync_jobs(pObject, pInvocation, outSyncJobList); } + RepositoryEngine* pRepositoryEngine = SyncManager::GetInstance()->GetSyncRepositoryEngine(); + ManageIdleState* pManageIdleState = SyncManager::GetInstance()->GetManageIdleState(); + + if (!pRepositoryEngine->CheckSyncJobsData()) + pManageIdleState->ResetTermTimer(); + LOG_LOGD("End"); return true; @@ -980,6 +1177,12 @@ OnBusAcquired (GDBusConnection* pConnection, const gchar* pName, gpointer userDa gdbusConnection = pConnection; LOG_LOGD("Sync Service started [%s]", pName); + RepositoryEngine* __pSyncRepositoryEngine; + __pSyncRepositoryEngine = RepositoryEngine::GetInstance(); + if (__pSyncRepositoryEngine == NULL) + LOG_LOGD("Failed to construct RepositoryEngine"); + else + __pSyncRepositoryEngine->OnBooting(); //g_dbus_object_manager_server_set_connection(pServerManager, connection); } @@ -1039,6 +1242,7 @@ SyncService::InitializeDbus(void) * DBus related initialization done */ SyncService::SyncService(void) + : __pSyncManagerInstance(NULL) { LOG_LOGD("Sync service initialization starts"); diff --git a/src/sync-service/SyncManager_SyncService.h b/src/sync-service/SyncManager_SyncService.h index 8a4cf6d..9e492d4 100644 --- a/src/sync-service/SyncManager_SyncService.h +++ b/src/sync-service/SyncManager_SyncService.h @@ -72,7 +72,7 @@ private: void InitializeDbus(); private: - SyncManager* __pSyncMangerIntacnce; + SyncManager* __pSyncManagerInstance; }; //}//_SyncManager #endif //SYNC_SERVICE_SYNC_SERVICE_H diff --git a/src/sync-service/SyncManager_SyncStatusInfo.cpp b/src/sync-service/SyncManager_SyncStatusInfo.cpp index 1cc48a5..595f3f1 100644 --- a/src/sync-service/SyncManager_SyncStatusInfo.cpp +++ b/src/sync-service/SyncManager_SyncStatusInfo.cpp @@ -62,6 +62,7 @@ SyncStatusInfo::operator =(SyncStatusInfo& other) } SyncStatusInfo::SyncStatusInfo(string statusInfo) + : capabilityId(-1) { if (statusInfo.empty()) { diff --git a/src/sync-service/SyncManager_SyncWorker.cpp b/src/sync-service/SyncManager_SyncWorker.cpp index 49b7a4e..ad1753c 100644 --- a/src/sync-service/SyncManager_SyncWorker.cpp +++ b/src/sync-service/SyncManager_SyncWorker.cpp @@ -29,6 +29,13 @@ {*/ SyncWorker::SyncWorker(void) + : __pendingRequestsMutex(PTHREAD_MUTEX_INITIALIZER) + , __message(SYNC_CHECK_ALARM) + , __pContext(NULL) + , __pLoop(NULL) + , __pChannel(NULL) + , __pSource(NULL) + , __pThread(NULL) { } @@ -176,7 +183,7 @@ SyncWorker::OnEventReceived(GIOChannel* pChannel, GIOCondition condition, gpoint SyncWorker* pSyncWorker = static_cast<SyncWorker*>(data); - if ((condition & G_IO_IN) && pSyncWorker != NULL) + if ((condition & G_IO_IN) != 0) { uint64_t tmp = 0; gsize readSize = 0; @@ -223,7 +230,7 @@ SyncWorker::OnEventReceived(GIOChannel* pChannel, GIOCondition condition, gpoint gpointer SyncWorker::ThreadLoop(gpointer data) { - LOG_LOGD("Sync worker thread entered"); + LOG_LOGD("Sync worker thread entered"); GMainLoop* pLoop = static_cast<GMainLoop*>(data); if (pLoop != NULL) diff --git a/src/sync-service/main.cpp b/src/sync-service/main.cpp index 077112b..50d3907 100644 --- a/src/sync-service/main.cpp +++ b/src/sync-service/main.cpp @@ -53,20 +53,30 @@ DbusSignalHandler(DBusConnection* pConnection, DBusMessage* pMsg, void* pUserDat } -static void -signal_handler(int signo) +void +terminate_service(void) { - LOG_LOGD("MainLoop OnTerminate"); + LOG_LOGD("Sync service will be terminated"); if (ShutdownInitiated == false) { ShutdownInitiated = true; sync_service_finalise(); } + g_main_loop_quit(mainloop); } +static void +signal_handler(int signo) +{ + LOG_LOGD("Received signal"); + + terminate_service(); +} + + int main(int argc, char **argv) { diff --git a/sync-service.manifest b/sync-service.manifest index 77f4be3..3af9cb0 100644 --- a/sync-service.manifest +++ b/sync-service.manifest @@ -40,6 +40,7 @@ <assign> <filesystem path="/opt/usr/data/sync-manager/" label="sync-service::db" /> <filesystem path="/usr/lib/systemd/system/sync-manager.service" label="_" /> + <filesystem path="/usr/share/dbus-1/system-services/org.tizen.sync.service" label="_" /> </assign> <request> <domain name="sync-service" /> |