void PowerdProxy::Enable()
{
	LOG_TRACE("Entering function %s", __FUNCTION__);
	LOG_DEBUG("Enabling battery and charging signals");

	EnableChargerSignals();
	EnableBatterySignals();
}
void PowerdProxy::Enable()
{
	MojLogTrace(s_log);
	MojLogInfo(s_log, _T("Enabling battery and charging signals"));

	EnableChargerSignals();
	EnableBatterySignals();
}
void PowerdProxy::BatteryStatusSignal(MojServiceMessage *msg,
	const MojObject& response, MojErr err)
{
	LOG_TRACE("Entering function %s", __FUNCTION__);
	LOG_DEBUG("Received battery status signal: %s",
		MojoObjectJson(response).c_str());

	if (err != MojErrNone) {
		m_batteryStatusSubscribed = false;

		if (MojoCall::IsPermanentFailure(msg, response, err)) {
			LOG_WARNING(MSGID_BATTERY_STATUS_SIG_FAIL,0,
				"Subscription to battery status signal experienced an uncorrectable failure: %s",
				MojoObjectJson(response).c_str());
			m_batteryStatus.reset();
		} else {
			LOG_WARNING(MSGID_BATTERY_SIG_ENABLE,0,
				"Subscription to battery status signal failed, resubscribing: %s",
				MojoObjectJson(response).c_str());
			EnableBatterySignals();
		}
		return;
	}

	if (!m_batteryStatusSubscribed) {
		m_batteryStatusSubscribed = true;
		TriggerBatteryStatus();
	}

	MojInt64 batteryPercent;
	bool found = response.get(_T("percent"), batteryPercent);
	if (found) {
		MojInt64 oldBatteryPercent = m_batteryPercent;

		/* Set battery percent first, because as the requirements become met,
		 * Activities may start and events might be generated which include
		 * the state of the associated battery requirement. */
		m_batteryPercent = batteryPercent;

		if (batteryPercent < oldBatteryPercent) {
			BatteryRequirement::MultiTable::iterator newWatermark =
				m_batteryRequirements.upper_bound(batteryPercent,
					BatteryRequirement::KeyComp());

			/* Currently met requirements may wish to generate updates.
			 * Some of those requirements are about to be unmet due to
			 * battery drain.  Do not generate separate udpates. */
			std::for_each(m_batteryRequirements.begin(), newWatermark,
				boost::mem_fn(&Requirement::Updated));

			std::for_each(newWatermark,
				m_batteryRequirements.upper_bound(oldBatteryPercent,
					BatteryRequirement::KeyComp()),
				boost::mem_fn(&Requirement::Unmet));
		} else if (batteryPercent > oldBatteryPercent) {
			BatteryRequirement::MultiTable::iterator oldWatermark =
				m_batteryRequirements.upper_bound(oldBatteryPercent,
					BatteryRequirement::KeyComp());

			/* Some unmet requirements are about to be met.  For the
			 * currently met ones, just generate an update */
			std::for_each(m_batteryRequirements.begin(), oldWatermark,
				boost::mem_fn(&Requirement::Updated));
			std::for_each(oldWatermark,
				m_batteryRequirements.upper_bound(batteryPercent,
					BatteryRequirement::KeyComp()),
				boost::mem_fn(&Requirement::Met));
		}
	}
}