コード例 #1
0
void SmtpSyncOutboxCommand::UpdateAccountWatchActivity()
{
	MojLogInfo(m_log, "UpdatingAccountWatchActivity");
	
	try {
		// accoundId json object
		MojString accountIdJson;
		MojErr err = m_accountId.toJson(accountIdJson);
		ErrorToException(err);

		SmtpActivityFactory factory;
		ActivityBuilder ab;

		factory.BuildSmtpConfigWatch(ab, m_accountId, m_accountRev);

		bool updating = m_accountWatchActivity.get();

		// and either update and complete the updated activity if we had adopted it, or re-create it.
		
		if ( updating ) {
			
			MojLogInfo(m_log, "updating account watch activity");
	
			m_accountWatchActivity->SetSlots(m_accountActivityUpdatedSlot, m_accountActivityErrorSlot);
	
			m_accountWatchActivity->UpdateAndComplete(m_client, ab.GetActivityObject());
			
		} else {
			// Create payload
			MojObject payload;
			err = payload.put("activity", ab.GetActivityObject());
			ErrorToException(err);
			err = payload.put("start", true);
			ErrorToException(err);
			err = payload.put("replace", true);
			ErrorToException(err);
				
			MojLogInfo(m_log, "creating account watch activity");
							
			m_client.SendRequest(m_createAccountWatchActivityResponseSlot, "com.palm.activitymanager", "create", payload);
		}

	} catch (std::exception & e) {
		HandleException(e, __func__);
	} catch (...) {
		HandleException(__func__);
	}
}
コード例 #2
0
void ScheduleRetryCommand::ScheduleRetry()
{
	ActivityBuilder ab;

	// Get current retry interval from account
	EmailAccount::RetryStatus retryStatus = m_client.GetAccount()->GetRetry();

	int interval = retryStatus.GetInterval();

	if(interval <= INITIAL_RETRY_SECONDS) {
		interval = INITIAL_RETRY_SECONDS;
	} else if(interval >= MAX_RETRY_SECONDS) {
		interval = MAX_RETRY_SECONDS;
	} else {
		// TODO: only update this on actual retry?
		interval *= RETRY_MULTIPLIER;
	}

	// Update account just in case it wasn't within the limit
	retryStatus.SetInterval(interval);
	m_client.GetAccount()->SetRetry(retryStatus);

	m_client.GetActivityBuilderFactory()->BuildFolderRetrySync(ab, m_folderId, interval);

	MojErr err;
	MojObject payload;
	err = payload.put("activity", ab.GetActivityObject());
	ErrorToException(err);
	err = payload.put("start", true);
	ErrorToException(err);
	err = payload.put("replace", true);

	MojLogInfo(m_log, "Creating retry activity in activity manager: %s", AsJsonString(payload).c_str());
	m_client.SendRequest(m_scheduleRetrySlot, "com.palm.activitymanager", "create", payload);
}
コード例 #3
0
MojErr MovePopEmailsCommand::EmailsMovedResponse(MojObject& response, MojErr err)
{
	try {
		ErrorToException(err);

		ActivityBuilder ab;
		m_client.GetActivityBuilderFactory()->BuildMoveEmailsWatch(ab);
		m_activity->UpdateAndComplete(m_client, ab.GetActivityObject());

		m_msg->replySuccess();

		if (m_inboxEmailsMoved.size() > 0) {
			// add the list of UIDs into UidCache
			GetUidCache();
		} else {
			Complete();
		}
	} catch (const std::exception& ex) {
		m_msg->replyError(MojErrInternal, ex.what());
		Failure(ex);
	} catch (...) {
		m_msg->replyError(MojErrInternal);
		Failure(MailException("unknown exception", __FILE__, __LINE__));
	}

	return MojErrNone;
}
コード例 #4
0
void PopAccountUpdateCommand::UpdateAccountWatchActivity()
{
	CommandTraceFunction();

	try {
		MojObject revPop;
		MojErr err = m_transportObj.getRequired("_revPop", revPop);
		ErrorToException(err);

		ActivityBuilder ab;
		m_activityBuilderFactory->BuildAccountPrefsWatch(ab, revPop);

		MojObject payload;
		err = payload.put("activity", ab.GetActivityObject());
		ErrorToException(err);
		err = payload.put("start", true);
		ErrorToException(err);
		err = payload.put("replace", true);
		ErrorToException(err);

		m_client.SendRequest(m_createActivitySlot, "com.palm.activitymanager", "create", payload);
	} catch (const std::exception& ex) {
		Failure(ex);
	} catch (...) {
		Failure(MailException("unknown exception", __FILE__, __LINE__));
	}
}
コード例 #5
0
ファイル: SyncSession.cpp プロジェクト: hatsada1/app-services
void SyncSession::UpdateScheduledSyncActivity()
{
	MojLogInfo(m_log, "updating scheduled sync activity on folder %s", AsJsonString(m_folderId).c_str());

	PopClient::AccountPtr account = m_client.GetAccount();
	MojObject accountId = account->GetAccountId();
	ActivityBuilder ab;

	if(!account->IsManualSync()) {
		int interval = account->GetSyncFrequencyMins();

		MojLogInfo(m_log, "setting sync interval to %d minutes", interval);

		m_builderFactory->BuildScheduledSync(ab, interval);

		MojObject actObj = ab.GetActivityObject();;
		MojLogInfo(m_log, "Replacing scheduled activity: %s", AsJsonString(actObj).c_str());

		m_activities->ReplaceActivity(ab.GetName(), actObj);
	} else {
		MojString scheduledActName;
		m_builderFactory->GetScheduledSyncActivityName(scheduledActName);

		// Remove activity
		ActivityPtr activity = m_activities->GetOrCreateActivity(scheduledActName);
		activity->SetEndAction(Activity::EndAction_Cancel);
	}
}
コード例 #6
0
void ScheduleRetryCommand::ScheduleRetry()
{
	CommandTraceFunction();

	ImapActivityFactory factory;
	ActivityBuilder ab;

	// Get current retry interval from account
	EmailAccount::RetryStatus retryStatus = m_client.GetAccount().GetRetry();

	int interval = retryStatus.GetInterval();

	if(interval < INITIAL_RETRY_SECONDS) {
		interval = INITIAL_RETRY_SECONDS;
	} else if(interval < SECOND_RETRY_SECONDS) {
		interval = SECOND_RETRY_SECONDS;
	} else if(interval >= MAX_RETRY_SECONDS) {
		interval = MAX_RETRY_SECONDS;
	} else {
		// TODO: only update this on actual retry?
		interval *= RETRY_MULTIPLIER;
	}

	// Update account just in case it wasn't within the limit
	retryStatus.SetInterval(interval);
	retryStatus.SetCount(retryStatus.GetCount() + 1);
	m_client.GetAccount().SetRetry(retryStatus);

	factory.BuildSyncRetry(ab, m_client.GetAccountId(), m_folderId, interval, m_reason);

	MojErr err;
	MojObject payload;
	err = payload.put("activity", ab.GetActivityObject());
	ErrorToException(err);
	err = payload.put("start", true);
	ErrorToException(err);
	err = payload.put("replace", true);

	MojLogInfo(m_log, "scheduling retry in %.1f minutes for account %s", float(interval) / 60, m_client.GetAccountIdString().c_str());

	m_client.SendRequest(m_scheduleRetrySlot, "com.palm.activitymanager", "create", payload);
}
コード例 #7
0
void SmtpAccountEnableCommand::CreateSmtpConfigWatch()
{
	SmtpActivityFactory factory;
	ActivityBuilder ab;

	factory.BuildSmtpConfigWatch(ab, m_client.GetAccountId(), m_accountRev);

	// Create payload
	MojObject payload;
	MojErr err;

	err = payload.put("activity", ab.GetActivityObject());
	ErrorToException(err);
	err = payload.put("start", true);
	ErrorToException(err);
	err = payload.put("replace", true);
	ErrorToException(err);

	m_client.SendRequest(m_createSmtpConfigWatchSlot, "com.palm.activitymanager", "create", payload);
}
コード例 #8
0
void UpdateAccountCommand::UpdatePreferencesWatchActivity(MojInt64 rev)
{
	CommandTraceFunction();

	ImapActivityFactory factory;
	ActivityBuilder ab;

	MojLogInfo(m_log, "account %s preferences watch updated; rev=%lld", AsJsonString(m_accountId).c_str(), rev);

	if(rev > 0) {
		factory.BuildPreferencesWatch(ab, m_accountId, rev);

		m_activitySet->ReplaceActivity(ab.GetName(), ab.GetActivityObject());
	} else {
		MojLogCritical(m_log, "unknown preferences rev (couldn't load account?); can't create watch");

		m_activitySet->SetEndAction(Activity::EndAction_Complete);
	}

	m_activitySet->EndActivities(m_endActivitiesSlot);
}
コード例 #9
0
ファイル: ImapSession.cpp プロジェクト: Garfonso/app-services
void ImapSession::CommandComplete(Command* command)
{
	m_commandManager->CommandComplete(command);

	if(m_reconnectRequested && m_state == State_OkToSync && m_commandManager->GetActiveCommandCount() == 0 && m_commandManager->GetPendingCommandCount() > 0) {
		// If requested (and no active commands), disconnect from the server after finishing this command
		MojLogInfo(m_log, "disconnecting and reconnecting to server");

		Logout();
	} else if(m_state == State_OkToSync && m_commandManager->GetPendingCommandCount() == 0
			&& m_commandManager->GetActiveCommandCount() == 0) {
		MojLogInfo(m_log, "no commands active or pending");

		// Either disconnect or run IDLE command
		// TODO also check account settings

		if(IsValidId(m_folderId) && IsPushEnabled(m_folderId)) {
			m_shouldPush = CheckNetworkHealthForPush();
		} else {
			m_shouldPush = false;
		}

		if(m_shouldPush) {
			//MojLogInfo(m_log, "running idle command for folderId %s", AsJsonString(m_folderId).c_str());
			if(m_account->IsYahoo()) {
				m_idleCommand.reset(new IdleYahooCommand(*this, m_folderId));
				m_idleMode = IdleMode_YahooPush;
			} else {
				m_idleCommand.reset(new IdleCommand(*this, m_folderId));
				m_idleMode = IdleMode_IDLE;
			}

			// Create activity to maintain idle.
			// If the device is rebooted or IMAP crashes, the callback will restart idle.
			// The activity will get cancelled if the connection goes into retry mode.
			if(true) {
				ImapActivityFactory factory;
				ActivityBuilder ab;

				factory.BuildStartIdle(ab, m_client->GetAccountId(), m_folderId);

				// Create new activity only if one doesn't already exist
				if(GetActivitySet()->FindActivityByName(ab.GetName()).get() == NULL) {
					ActivityPtr activity = Activity::PrepareNewActivity(ab, true, true);
					activity->SetName(ab.GetName());

					activity->SetEndAction(Activity::EndAction_Complete);
					activity->SetEndOrder(Activity::EndOrder_Last);
					GetActivitySet()->AddActivity(activity);

					// Start activity right away
					activity->Create(*m_client);
				}
			}

			m_idleStartTime = 0;

			SetState(State_PreparingToIdle);
			m_commandManager->RunCommand(m_idleCommand);
		} else if(GetNoopIdleTimeout() > 0) {
			// TODO: this code is currently disabled
			MojLogInfo(m_log, "running NOOP idle command");
			m_idleCommand.reset(new NoopIdleCommand(*this, m_folderId, GetNoopIdleTimeout()));

			m_idleMode = IdleMode_NOOP;
			m_idleStartTime = 0;

			// Reset flag
			m_recentUserInteraction = false;

			SetState(State_PreparingToIdle);
			m_commandManager->RunCommand(m_idleCommand);

		} else {
			if(IsPushRequested(m_folderId) && !m_shouldPush) {
				MojLogInfo(m_log, "setting up scheduled sync instead of push");

				// If we can't push, set up a scheduled sync
				ImapActivityFactory factory;
				ActivityBuilder ab;

				factory.BuildScheduledSync(ab, m_client->GetAccountId(), m_folderId, FALLBACK_SYNC_INTERVAL, false);

				GetActivitySet()->ReplaceActivity(ab.GetName(), ab.GetActivityObject());
			} else {
				MojLogInfo(m_log, "nothing left to do; disconnecting");
			}

			Logout();
		}
	} else if(m_state == State_Disconnecting && m_commandManager->GetActiveCommandCount() == 0) {
		Disconnected();
	}
}