+++ /dev/null
-/*
- * Copyright (c) 2011 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 roaming_agent.cpp
- * @author Pawel Sikorski (p.sikorski@samsung.com)
- * @author Lukasz Marek (l.marek@samsung.com)
- * @version 1.0
- * @brief roaming agent
- */
-
-#include "roaming_agent.h"
-#include <PopupInvoker.h>
-#include <global_logic.h>
-#include <global_model.h>
-#include <dpl/singleton_impl.h>
-#include <dpl/log/log.h>
-#include <dpl/utils/wrt_global_settings.h>
-#include <vconf.h>
-
-IMPLEMENT_SINGLETON(RoamingAgent)
-
-namespace {
-const char* CONNECTING_ROAMING_NETWORK = "Connecting to Roaming Network";
-const char* CONNECTING_HOME_NETWORK = "Connecting to Home Network";
-const char* CONNECTION_WARNING =
- "Your terminal is going online.<br>"
- "Be aware that data charges might apply!<br>"
- "Do you want to continue?";
-
-const char* KEEP_CONNECTION_WARNING =
- "Notwork type changed.<br>"
- "Do you want to keep active connections?";
-} // anonymous
-
-RoamingAgent::RoamingAgent()
-{
- if (GlobalSettings::RoamingTestModeEnabled()) {
- return;
- }
- //setting say if we are using roaming network or home network
- int result = 0;
- if (vconf_get_int(VCONFKEY_TELEPHONY_SVC_ROAM, &result) != 0) {
- LogError("Cannot get current roaming status");
- } else {
- bool type = (result == VCONFKEY_TELEPHONY_SVC_ROAM_ON);
- m_networkType = type ? ROAMING : HOME;
- LogInfo("Network type is " << (type ? "ROAMING" : "HOME"));
- }
- //setting says if roaming is enabled at all
- if (vconf_get_bool(VCONFKEY_SETAPPL_STATE_DATA_ROAMING_BOOL,
- &result) == -1) {
- LogError("Cannot get current network setting");
- } else {
- m_roamingNetworkEnabled = result;
- LogInfo("Roaming is " << (result ? "ENABLED" : "DISABLED"));
- }
-
- GlobalModel *globalModel =
- GlobalLogicSingleton::Instance().GetGlobalModel();
-
- //read current home network access setting
- SaveNetworkAccessMode(HOME, globalModel->HomeNetworkAccess.Get());
- //read current roaming network access setting
- SaveNetworkAccessMode(ROAMING, globalModel->RoamingNetworkAccess.Get());
-
- LogInfo("Roaming network setting " << m_networkOption.Option(ROAMING));
- LogInfo("Home network network setting " << m_networkOption.Option(HOME));
-
- globalModel->HomeNetworkAccess.AddListener(DPL::MakeDelegate(this,
- &RoamingAgent
- ::
- OnHomeNetworkAccessModeChanged));
- globalModel->RoamingNetworkAccess.AddListener(DPL::MakeDelegate(this,
- &
- RoamingAgent
- ::
- OnRoamingNetworkAccessModeChanged));
-
- // current network is roaming or local
- if (vconf_notify_key_changed(
- VCONFKEY_SETAPPL_STATE_DATA_ROAMING_BOOL,
- vConfChagedCallback, this) < 0)
- {
- LogError("Cannot add vconf callback [" <<
- VCONFKEY_SETAPPL_STATE_DATA_ROAMING_BOOL << "]");
- }
-
- if (vconf_notify_key_changed(
- VCONFKEY_TELEPHONY_SVC_ROAM,
- vConfChagedCallback, this) < 0)
- {
- LogError("Cannot add vconf callback [" <<
- VCONFKEY_TELEPHONY_SVC_ROAM << "]");
- }
-
- if (vconf_notify_key_changed(
- VCONFKEY_NETWORK_WIFI_STATE,
- vConfChagedCallback, this) < 0)
- {
- LogError("Cannot add vconf callback [" <<
- VCONFKEY_NETWORK_WIFI_STATE << "]");
- }
-}
-
-RoamingAgent::~RoamingAgent()
-{
- if (GlobalSettings::RoamingTestModeEnabled()) {
- return;
- }
-
- GlobalModel *globalModel =
- GlobalLogicSingleton::Instance().GetGlobalModel();
- globalModel->HomeNetworkAccess.RemoveListener(DPL::MakeDelegate(this,
- &
- RoamingAgent
- ::
- OnHomeNetworkAccessModeChanged));
- globalModel->RoamingNetworkAccess.RemoveListener(DPL::MakeDelegate(this,
- &
- RoamingAgent
- ::
- OnRoamingNetworkAccessModeChanged));
-}
-
-bool RoamingAgent::CheckAccess()
-{
- if (GlobalSettings::RoamingTestModeEnabled()) {
- return true;
- }
-
- //Don't allow to use network when global phone setting doesn't allow it
- if (m_networkType == ROAMING && !m_roamingNetworkEnabled) {
- LogInfo("global phone setting turned off roaming usage");
- return false;
- }
-
- return AskUser(CONNECTION_WARNING);
-}
-
-bool RoamingAgent::AskUser(const std::string &label)
-{
- // If current network uses wifi, pass the roaming check
- int wifiState = VCONFKEY_NETWORK_WIFI_OFF;
- if (vconf_get_int(VCONFKEY_NETWORK_WIFI_STATE, &wifiState) < 0) {
- LogError("Fail to get wifi state");
- } else {
- if (VCONFKEY_NETWORK_WIFI_CONNECTED == wifiState) {
- LogInfo("Current network uses WIFI");
- return true;
- }
- }
-
- NetworkOptionType &option = m_networkOption.Option(m_networkType);
-
- switch (option) {
- case NEVER_CONNECT:
- LogInfo("Network option: never connect");
- return false;
- case CONNECT_AUTO:
- LogInfo("Network option: connect automatically");
- return true;
- case ALWAYS_ASK:
- LogInfo("Network option: always ask");
- if (!(m_userAnswer.Answer(m_networkType).IsNull())) {
- return *m_userAnswer.Answer(m_networkType);
- }
- //create popup and ask user
- {
- std::string title(m_networkType == ROAMING ?
- CONNECTING_ROAMING_NETWORK :
- CONNECTING_HOME_NETWORK);
-
- bool response = Wrt::PopupInvoker().askYesNo(title, label);
-
- LogDebug("Answer: " << response);
-
- m_userAnswer.Answer(m_networkType) = response;
- return response;
- }
- }
- return false;
-}
-
-void RoamingAgent::Disconnect()
-{
- if (m_optionalDisconnectCallback.IsNull()) {
- LogWarning("No disconnect callback set. Ignoring...");
- } else {
- LogInfo("disconnecting connections");
- (*m_optionalDisconnectCallback)();
- }
-}
-
-void RoamingAgent::HandleDisconnection()
-{
- if (!AskUser(KEEP_CONNECTION_WARNING)) {
- Disconnect();
- }
-}
-
-void RoamingAgent::NetworkAccessModeChanged(NetworkType networkType,
- GlobalModel::NetworkAccessMode mode)
-{
- if (GlobalSettings::RoamingTestModeEnabled()) {
- return;
- }
- SaveNetworkAccessMode(networkType, mode);
- HandleDisconnection();
-}
-
-void RoamingAgent::vConfChagedCallback(keynode_t *keyNode, void *data)
-{
- LogInfo("vConfChagedCallback ");
- RoamingAgent *roamAgent = static_cast<RoamingAgent *>(data);
- if (GlobalSettings::RoamingTestModeEnabled()) {
- return;
- }
-
- char *key = vconf_keynode_get_name(keyNode);
- if (NULL == key) {
- LogWarning("vconf key is null.");
- return;
- }
- std::string keyString = key;
-
- // current network is roaming or local
- if (VCONFKEY_SETAPPL_STATE_DATA_ROAMING_BOOL == keyString) {
- int value = vconf_keynode_get_bool(keyNode);
-
- LogInfo("Network is now " << (value ? "ENABLED" : "DISABLED"));
- if (roamAgent->m_roamingNetworkEnabled != value) {
- roamAgent->m_roamingNetworkEnabled = value;
- roamAgent->HandleDisconnection();
- }
- return;
- }
-
- // allow data connection in the roaming network
- if (VCONFKEY_TELEPHONY_SVC_ROAM == keyString) {
- int isRoaming = VCONFKEY_TELEPHONY_SVC_ROAM_OFF;
- if(vconf_get_int(VCONFKEY_TELEPHONY_SVC_ROAM, &isRoaming) != 0) {
- LogPedantic("Cannot get current roaming status");
- return;
- } else {
- NetworkType networkType =
- (isRoaming == VCONFKEY_TELEPHONY_SVC_ROAM_ON) ? ROAMING : HOME;
-
- if (networkType != roamAgent->m_networkType) {
- roamAgent->m_networkType = networkType;
- LogInfo("Network type changed into " <<
- (isRoaming ? "Roaming" : "Home network"));
- roamAgent->HandleDisconnection();
- }
- }
- return;
- }
-
- // wifi setting
- if (VCONFKEY_NETWORK_WIFI_STATE == keyString) {
- roamAgent->HandleDisconnection();
- }
-
- Assert("Unknown key callback is called");
- return;
-}
-
-void RoamingAgent::SaveNetworkAccessMode(NetworkType networkType,
- GlobalModel::NetworkAccessMode mode)
-{
- LogDebug("SaveNetworkAccessMode");
- switch (mode) {
- case GlobalModel::NEVER_CONNECT:
- m_networkOption.Option(networkType) = NEVER_CONNECT;
- break;
- case GlobalModel::CONNECT_AUTOMATICALLY:
- m_networkOption.Option(networkType) = CONNECT_AUTO;
- break;
- case GlobalModel::ALWAYS_ASK:
- m_networkOption.Option(networkType) = ALWAYS_ASK;
- break;
- default:
- LogWarning("Invalid network access, using default");
- m_networkOption.Option(networkType) = ALWAYS_ASK;
- break;
- }
-}
-
-void RoamingAgent::OnHomeNetworkAccessModeChanged(
- const DPL::Event::PropertyEvent<GlobalModel::NetworkAccessMode> &event)
-{
- LogInfo("home network access type: " << event.value);
- NetworkAccessModeChanged(HOME, event.value);
-}
-
-void RoamingAgent::OnRoamingNetworkAccessModeChanged(
- const DPL::Event::PropertyEvent<GlobalModel::NetworkAccessMode> &event)
-{
- LogInfo("roaming network access type: " << event.value);
- NetworkAccessModeChanged(ROAMING, event.value);
-}
+++ /dev/null
-/*
- * Copyright (c) 2011 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 roaming_agent.h
- * @author Pawel Sikorski (p.sikorski@samsung.com)
- * @version 1.0
- * @brief roaming agent
- */
-
-#ifndef ROAMING_AGENT_H_
-#define ROAMING_AGENT_H_
-
-#include <string>
-#include <dpl/fast_delegate.h>
-#include <dpl/optional.h>
-#include <dpl/optional_typedefs.h>
-#include <global_model.h>
-#include <vconf.h>
-
-class RoamingAgent
-{
- public:
- typedef DPL::FastDelegate0<void> DisconnectCallback;
-
- bool CheckAccess();
- bool IsRoamingOn() const
- {
- return m_networkType == ROAMING;
- }
- void setDisconnectCallback(DisconnectCallback cb)
- {
- m_optionalDisconnectCallback = cb;
- }
- void unsetDisconnectCallback()
- {
- m_optionalDisconnectCallback = OptionalDisconnectCallback::Null;
- }
-
- private:
- enum NetworkType {ROAMING, HOME};
- enum NetworkOptionType {NEVER_CONNECT, ALWAYS_ASK, CONNECT_AUTO};
-
- typedef DPL::Optional<DisconnectCallback> OptionalDisconnectCallback;
-
- NetworkType m_networkType;
- bool m_roamingNetworkEnabled;
- OptionalDisconnectCallback m_optionalDisconnectCallback;
-
- class NetworkOption
- {
- public:
- NetworkOption() :
- m_roaming(ALWAYS_ASK),
- m_home(ALWAYS_ASK)
- {
- }
-
- NetworkOption(NetworkOptionType aroaming,
- NetworkOptionType ahome) :
- m_roaming(aroaming),
- m_home(ahome)
- {
- }
-
- ~NetworkOption()
- {
- }
-
- NetworkOptionType &Option(NetworkType astate)
- {
- return astate == ROAMING ? m_roaming : m_home;
- }
-
- private:
- NetworkOptionType m_roaming;
- NetworkOptionType m_home;
- };
-
- class UserAnswer
- {
- public:
- UserAnswer() :
- m_roaming(DPL::OptionalBool::Null),
- m_home(DPL::OptionalBool::Null)
- {
- }
-
- UserAnswer(bool aroam,
- bool ahome) :
- m_roaming(aroam),
- m_home(ahome)
- {
- }
-
- ~UserAnswer()
- {
- }
-
- DPL::OptionalBool &Answer(NetworkType astate)
- {
- return astate == ROAMING ? m_roaming : m_home;
- }
-
- void ResetAnswer(NetworkType astate)
- {
- DPL::OptionalBool &answer = astate == ROAMING ? m_roaming : m_home;
- answer = DPL::OptionalBool::Null;
- }
-
- private:
- DPL::OptionalBool m_roaming;
- DPL::OptionalBool m_home;
- };
-
- NetworkOption m_networkOption;
-
- UserAnswer m_userAnswer;
-
- RoamingAgent();
- virtual ~RoamingAgent();
-
- bool AskUser(const std::string &label);
- void Disconnect();
- void HandleDisconnection();
- void SaveNetworkAccessMode(NetworkType networkType,
- GlobalModel::NetworkAccessMode mode);
- void NetworkAccessModeChanged(NetworkType networkType,
- GlobalModel::NetworkAccessMode mode);
- static void vConfChagedCallback(keynode_t *keyNode, void *userParam);
- virtual void OnHomeNetworkAccessModeChanged(
- const DPL::Event::PropertyEvent<GlobalModel::NetworkAccessMode> &event);
- virtual void OnRoamingNetworkAccessModeChanged(
- const DPL::Event::PropertyEvent<GlobalModel::NetworkAccessMode> &event);
-
- friend class DPL::Singleton<RoamingAgent>;
-};
-
-typedef DPL::Singleton<RoamingAgent> RoamingAgentSingleton;
-
-#endif /* ROAMING_AGENT_H_ */