--- a/cmmanager/cppacketdataapplugin/src/cppacketdataapadvancedview.cpp Thu May 13 23:17:48 2010 +0300
+++ b/cmmanager/cppacketdataapplugin/src/cppacketdataapadvancedview.cpp Fri May 14 10:52:16 2010 +0300
@@ -17,14 +17,31 @@
*/
// System includes
+#include <QHostAddress>
+#include <HbCheckBox>
+#include <HbLineEdit>
+#include <HbDataFormViewItem>
+#include <HbWidget>
+#include <HbEditorInterface>
+#include <HbUrlFilter>
+#include <HbInputDialog>
#include <HbDataForm>
#include <HbDataFormModel>
+#include <cmconnectionmethod_shim.h>
+#include <cmmanagerdefines_shim.h>
#include <cpsettingformitemdata.h>
-#include <cmconnectionmethod_shim.h>
+#include <etelpckt.h>
// User includes
+#include "cpipv4filter.h"
+#include "cpipv6filter.h"
#include "cppacketdataapadvancedview.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "cppacketdataapadvancedviewTraces.h"
+#endif
+
/*!
\class CpPacketDataApAdvancedView
\brief Implements the advanced settings view for packet data bearer
@@ -48,16 +65,39 @@
CpBaseSettingView(0, parent),
mForm(0),
mModel(0),
- mCmConnectionMethod(cmConnectionMethod)
+ mCmConnectionMethod(cmConnectionMethod),
+ mIpGroup(0),
+ mNetworkType(0),
+ mIpv4Automatic(0),
+ mIpv4Address(0),
+ mIpv4DnsAutomatic(0),
+ mIpv4DnsAddress1(0),
+ mIpv4DnsAddress2(0),
+ mIpv6DnsAutomatic(0),
+ mIpv6DnsAddress1(0),
+ mIpv6DnsAddress2(0),
+ mProxyGroup(0),
+ mProxyServer(0),
+ mProxyPort(0),
+ mMessageBox(0),
+ mIpv6Supported(false),
+ mCurrentNetworkType(NetworkTypeIpv4)
{
- // Construct packet data AP settings UI
+ OstTraceFunctionEntry0(CPPACKETDATAAPADVANCEDVIEW_CPPACKETDATAAPADVANCEDVIEW_ENTRY);
+
+ // Construct packet data AP advanced settings UI
mForm = new HbDataForm();
this->setWidget(mForm);
mModel = new HbDataFormModel(mForm);
mForm->setModel(mModel);
-
+
+ mIpv6Supported = mCmConnectionMethod->getBoolAttribute(
+ CMManagerShim::CmIPv6Supported);
+
// Add advanced settings groups
createAdvancedSettings();
+
+ OstTraceFunctionExit0(CPPACKETDATAAPADVANCEDVIEW_CPPACKETDATAAPADVANCEDVIEW_EXIT);
}
/*!
@@ -65,12 +105,1104 @@
*/
CpPacketDataApAdvancedView::~CpPacketDataApAdvancedView()
{
+ OstTraceFunctionEntry0(DUP1_CPPACKETDATAAPADVANCEDVIEW_CPPACKETDATAAPADVANCEDVIEW_ENTRY);
+
+ OstTraceFunctionExit0(DUP1_CPPACKETDATAAPADVANCEDVIEW_CPPACKETDATAAPADVANCEDVIEW_EXIT);
+}
+
+/*!
+ Creates all advanced settings groups.
+*/
+void CpPacketDataApAdvancedView::createAdvancedSettings()
+{
+ OstTraceFunctionEntry0(CPPACKETDATAAPADVANCEDVIEW_CREATEADVANCEDSETTINGS_ENTRY);
+
+ // Create settings groups
+ createIpGroup();
+ createProxyGroup();
+
+ // Read values and update UI
+ updateIpGroup();
+ updateProxyGroup();
+
+ // Connect signal to initialize settings item widgets
+ bool status = connect(
+ mForm,
+ SIGNAL(itemShown(const QModelIndex)),
+ this,
+ SLOT(setEditorPreferences(const QModelIndex)));
+ Q_ASSERT(status);
+
+ OstTraceFunctionExit0(CPPACKETDATAAPADVANCEDVIEW_CREATEADVANCEDSETTINGS_EXIT);
+}
+
+/*!
+ Creates the IP settings group.
+*/
+void CpPacketDataApAdvancedView::createIpGroup()
+{
+ OstTraceFunctionEntry0(CPPACKETDATAAPADVANCEDVIEW_CREATEIPGROUP_ENTRY);
+
+ // IP settings group
+ mIpGroup = new CpSettingFormItemData(
+ HbDataFormModelItem::GroupItem,
+ hbTrId("txt_occ_subhead_ip_settings"));
+ mModel->appendDataFormItem(mIpGroup);
+
+ if (mIpv6Supported) {
+ // IPv6 supported
+ // Network type
+ mNetworkType = new CpSettingFormItemData(
+ HbDataFormModelItem::ComboBoxItem,
+ hbTrId("txt_occ_setlabel_network_type"));
+ QStringList networkTypeList;
+ networkTypeList
+ << hbTrId("txt_occ_setlabel_network_type_val_ipv4")
+ << hbTrId("txt_occ_setlabel_network_type_val_ipv6");
+ mNetworkType->setContentWidgetData("items", networkTypeList);
+ mForm->addConnection(
+ mNetworkType,
+ SIGNAL(currentIndexChanged(int)),
+ this,
+ SLOT(changeNetworkType(int)));
+ mIpGroup->appendChild(mNetworkType);
+
+ mCurrentNetworkType = getNetworkType();
+ if (mCurrentNetworkType == NetworkTypeIpv4) {
+ // IPv4
+ createIpv4SettingItems();
+ } else {
+ // IPv6
+ createIpv6SettingItems();
+ }
+ } else {
+ // IPv6 not supported, create IPv4 settings items
+ createIpv4SettingItems();
+ }
+
+ OstTraceFunctionExit0(CPPACKETDATAAPADVANCEDVIEW_CREATEIPGROUP_EXIT);
+}
+
+/*!
+ Reads attribute values and updates the IP settings group.
+*/
+void CpPacketDataApAdvancedView::updateIpGroup()
+{
+ OstTraceFunctionEntry0(CPPACKETDATAAPADVANCEDVIEW_UPDATEIPGROUP_ENTRY);
+
+ // Network type
+ if (mNetworkType) {
+ // Every time update is called we check if network type (IPv4/IPv6)
+ // has changed and update items on UI if necessary.
+
+ // Get network type from CommsDat
+ NetworkType newNetworkType = getNetworkType();
+ if (newNetworkType != mCurrentNetworkType) {
+ // Network type has changed, update UI
+ if (newNetworkType == NetworkTypeIpv6) {
+ // IPv4 -> IPv6
+ deleteIpv4SettingItems();
+ createIpv6SettingItems();
+ } else {
+ // IPv6 -> IPv4
+ deleteIpv6SettingItems();
+ createIpv4SettingItems();
+ }
+ mCurrentNetworkType = newNetworkType;
+ }
+ mNetworkType->setContentWidgetData("currentIndex", newNetworkType);
+ }
+
+ // Phone IP address (IPv4)
+ // "Automatic" checkbox
+ if (mIpv4Automatic) {
+ bool ipAddressFromServer = mCmConnectionMethod->getBoolAttribute(
+ CMManagerShim::PacketDataIPAddrFromServer);
+ Qt::CheckState state = Qt::Unchecked;
+ if (ipAddressFromServer) {
+ state = Qt::Checked;
+ }
+ mIpv4Automatic->setContentWidgetData("checkState", state);
+
+ // Enable/disable user defined IP address fields
+ enableIpv4AddressFields(state);
+ }
+
+ // Phone IP address (IPv4)
+ if (mIpv4Address) {
+ QString string = getIpAddress(CMManagerShim::CmIPAddress);
+ mIpv4Address->setContentWidgetData("text", string);
+ }
+
+ // IPv4 DNS addresses
+ // "Automatic" checkbox
+ if (mIpv4DnsAutomatic) {
+ Qt::CheckState state = Qt::Unchecked;
+ if (mCmConnectionMethod->getBoolAttribute(
+ CMManagerShim::CmIPDNSAddrFromServer)) {
+ state = Qt::Checked;
+ }
+ mIpv4DnsAutomatic->setContentWidgetData("checkState", state);
+
+ // Enable/disable user defined DNS address fields
+ enableIpv4DnsFields(state);
+ }
+
+ // IPv4 primary DNS address
+ if (mIpv4DnsAddress1) {
+ QString string = getIpAddress(CMManagerShim::CmIPNameServer1);
+ mIpv4DnsAddress1->setContentWidgetData("text", string);
+ }
+
+ // IPv4 secondary DNS address
+ if (mIpv4DnsAddress2) {
+ QString string = getIpAddress(CMManagerShim::CmIPNameServer2);
+ mIpv4DnsAddress2->setContentWidgetData("text", string);
+ }
+
+ // IPv6 DNS addresses
+ // Automatic/well-known/user defined combobox
+ if (mIpv6DnsAutomatic) {
+ uint type = getIpv6DnsType();
+ mIpv6DnsAutomatic->setContentWidgetData("currentIndex", type);
+
+ // Enable/disable user defined DNS address fields
+ enableIpv6DnsFields(type);
+ }
+
+ // IPv6 primary DNS address
+ if (mIpv6DnsAddress1) {
+ QString string = getIpAddress(CMManagerShim::CmIP6NameServer1);
+ mIpv6DnsAddress1->setContentWidgetData("text", string);
+ }
+
+ // IPv6 secondary DNS address
+ if (mIpv6DnsAddress2) {
+ QString string = getIpAddress(CMManagerShim::CmIP6NameServer2);
+ mIpv6DnsAddress2->setContentWidgetData("text", string);
+ }
+
+ OstTraceFunctionExit0(CPPACKETDATAAPADVANCEDVIEW_UPDATEIPGROUP_EXIT);
+}
+
+/*!
+ Creates the IPv4 setting items.
+*/
+void CpPacketDataApAdvancedView::createIpv4SettingItems()
+{
+ OstTraceFunctionEntry0(CPPACKETDATAAPADVANCEDVIEW_CREATEIPV4SETTINGITEMS_ENTRY);
+
+ // Phone IP address
+ // "Automatic" checkbox
+ mIpv4Automatic = new CpSettingFormItemData(
+ HbDataFormModelItem::CheckBoxItem,
+ hbTrId("txt_occ_setlabel_phone_ip_address"));
+ mIpv4Automatic->setContentWidgetData(
+ "text",
+ hbTrId("txt_occ_setlabel_val_automatic"));
+ mForm->addConnection(
+ mIpv4Automatic,
+ SIGNAL(stateChanged(int)),
+ this,
+ SLOT(changeIpv4AddressMode(int)));
+ mIpGroup->appendChild(mIpv4Automatic);
+
+ // Phone IP address
+ mIpv4Address = new CpSettingFormItemData(
+ HbDataFormModelItem::TextItem,
+ hbTrId("txt_occ_setlabel_phone_ip_address"));
+ mForm->addConnection(
+ mIpv4Address,
+ SIGNAL(editingFinished()),
+ this,
+ SLOT(changeIpv4Address()));
+ mIpGroup->appendChild(mIpv4Address);
+
+ // DNS addresses
+ // "Automatic" checkbox
+ mIpv4DnsAutomatic = new CpSettingFormItemData(
+ HbDataFormModelItem::CheckBoxItem,
+ hbTrId("txt_occ_setlabel_dns_addresses"));
+ mIpv4DnsAutomatic->setContentWidgetData(
+ "text",
+ hbTrId("txt_occ_setlabel_val_automatic"));
+ mForm->addConnection(
+ mIpv4DnsAutomatic,
+ SIGNAL(stateChanged(int)),
+ this,
+ SLOT(changeIpv4DnsMode(int)));
+ mIpGroup->appendChild(mIpv4DnsAutomatic);
+
+ // Primary DNS address
+ mIpv4DnsAddress1 = new CpSettingFormItemData(
+ HbDataFormModelItem::TextItem,
+ hbTrId("txt_occ_setlabel_primary_name_server"));
+ mForm->addConnection(
+ mIpv4DnsAddress1,
+ SIGNAL(editingFinished()),
+ this,
+ SLOT(changeIpv4PrimaryDnsAddress()));
+ mIpGroup->appendChild(mIpv4DnsAddress1);
+
+ // Secondary DNS address
+ mIpv4DnsAddress2 = new CpSettingFormItemData(
+ HbDataFormModelItem::TextItem,
+ hbTrId("txt_occ_setlabel_secondary_name_server"));
+ mForm->addConnection(
+ mIpv4DnsAddress2,
+ SIGNAL(editingFinished()),
+ this,
+ SLOT(changeIpv4SecondaryDnsAddress()));
+ mIpGroup->appendChild(mIpv4DnsAddress2);
+
+ OstTraceFunctionExit0(CPPACKETDATAAPADVANCEDVIEW_CREATEIPV4SETTINGITEMS_EXIT);
+}
+
+/*!
+ Deletes the IPv4 setting items.
+*/
+void CpPacketDataApAdvancedView::deleteIpv4SettingItems()
+{
+ OstTraceFunctionEntry0(CPPACKETDATAAPADVANCEDVIEW_DELETEIPV4SETTINGITEMS_ENTRY);
+
+ // Phone IP address
+ // "Automatic" checkbox
+ if (mIpv4Automatic) {
+ mIpGroup->removeChild(mIpGroup->indexOf(mIpv4Automatic));
+ mIpv4Automatic = NULL;
+ }
+
+ // Phone IP address
+ if (mIpv4Address) {
+ mIpGroup->removeChild(mIpGroup->indexOf(mIpv4Address));
+ mIpv4Address = NULL;
+ }
+
+ // DNS addresses
+ // "Automatic" checkbox
+ if (mIpv4DnsAutomatic) {
+ mIpGroup->removeChild(mIpGroup->indexOf(mIpv4DnsAutomatic));
+ mIpv4DnsAutomatic = NULL;
+ }
+
+ // Primary DNS address
+ if (mIpv4DnsAddress1) {
+ mIpGroup->removeChild(mIpGroup->indexOf(mIpv4DnsAddress1));
+ mIpv4DnsAddress1 = NULL;
+ }
+
+ // Secondary DNS address
+ if (mIpv4DnsAddress2) {
+ mIpGroup->removeChild(mIpGroup->indexOf(mIpv4DnsAddress2));
+ mIpv4DnsAddress2 = NULL;
+ }
+
+ OstTraceFunctionExit0(CPPACKETDATAAPADVANCEDVIEW_DELETEIPV4SETTINGITEMS_EXIT);
+}
+
+/*!
+ Creates the IPv6 setting items.
+*/
+void CpPacketDataApAdvancedView::createIpv6SettingItems()
+{
+ OstTraceFunctionEntry0(CPPACKETDATAAPADVANCEDVIEW_CREATEIPV6SETTINGITEMS_ENTRY);
+
+ // DNS addresses
+ // Automatic/well-known/user defined combobox
+ mIpv6DnsAutomatic = new CpSettingFormItemData(
+ HbDataFormModelItem::ComboBoxItem,
+ hbTrId("txt_occ_setlabel_dns_addresses"));
+ QStringList dnsModeList;
+ // Order of the list must match the Ipv6DnsType enum
+ dnsModeList
+ << hbTrId("txt_occ_setlabel_val_automatic")
+ << hbTrId("txt_occ_setlabel_dns_addresses_val_wellknown")
+ << hbTrId("txt_occ_setlabel_dns_addresses_val_user_defined");
+ mIpv6DnsAutomatic->setContentWidgetData("items", dnsModeList);
+ mForm->addConnection(
+ mIpv6DnsAutomatic,
+ SIGNAL(currentIndexChanged(int)),
+ this,
+ SLOT(changeIpv6DnsMode(int)));
+ mIpGroup->appendChild(mIpv6DnsAutomatic);
+
+ // Primary DNS address
+ mIpv6DnsAddress1 = new CpSettingFormItemData(
+ HbDataFormModelItem::TextItem,
+ hbTrId("txt_occ_setlabel_primary_name_server"));
+ mForm->addConnection(
+ mIpv6DnsAddress1,
+ SIGNAL(editingFinished()),
+ this,
+ SLOT(changeIpv6PrimaryDnsAddress()));
+ mIpGroup->appendChild(mIpv6DnsAddress1);
+
+ // Secondary DNS address
+ mIpv6DnsAddress2 = new CpSettingFormItemData(
+ HbDataFormModelItem::TextItem,
+ hbTrId("txt_occ_setlabel_secondary_name_server"));
+ mForm->addConnection(
+ mIpv6DnsAddress2,
+ SIGNAL(editingFinished()),
+ this,
+ SLOT(changeIpv6SecondaryDnsAddress()));
+ mIpGroup->appendChild(mIpv6DnsAddress2);
+
+ OstTraceFunctionExit0(CPPACKETDATAAPADVANCEDVIEW_CREATEIPV6SETTINGITEMS_EXIT);
+}
+
+/*!
+ Deletes the IPv6 setting items.
+*/
+void CpPacketDataApAdvancedView::deleteIpv6SettingItems()
+{
+ OstTraceFunctionEntry0(CPPACKETDATAAPADVANCEDVIEW_DELETEIPV6SETTINGITEMS_ENTRY);
+
+ // DNS addresses
+ // Automatic/well-known/user defined combobox
+ if (mIpv6DnsAutomatic) {
+ mIpGroup->removeChild(mIpGroup->indexOf(mIpv6DnsAutomatic));
+ mIpv6DnsAutomatic = NULL;
+ }
+
+ // Primary DNS address
+ if (mIpv6DnsAddress1) {
+ mIpGroup->removeChild(mIpGroup->indexOf(mIpv6DnsAddress1));
+ mIpv6DnsAddress1 = NULL;
+ }
+
+ // Secondary DNS address
+ if (mIpv6DnsAddress2) {
+ mIpGroup->removeChild(mIpGroup->indexOf(mIpv6DnsAddress2));
+ mIpv6DnsAddress2 = NULL;
+ }
+
+ OstTraceFunctionExit0(CPPACKETDATAAPADVANCEDVIEW_DELETEIPV6SETTINGITEMS_EXIT);
+}
+
+/*!
+ Creates the proxy settings group.
+*/
+void CpPacketDataApAdvancedView::createProxyGroup()
+{
+ OstTraceFunctionEntry0(CPPACKETDATAAPADVANCEDVIEW_CREATEPROXYGROUP_ENTRY);
+
+ // Proxy settings group
+ mProxyGroup = new CpSettingFormItemData(
+ HbDataFormModelItem::GroupItem,
+ hbTrId("txt_occ_subhead_proxy_settings"));
+ mModel->appendDataFormItem(mProxyGroup);
+
+ // Proxy server address
+ mProxyServer = new CpSettingFormItemData(
+ HbDataFormModelItem::TextItem,
+ hbTrId("txt_occ_setlabel_proxy_server_address"));
+ mForm->addConnection(
+ mProxyServer,
+ SIGNAL(editingFinished()),
+ this,
+ SLOT(changeProxyServer()));
+ mProxyGroup->appendChild(mProxyServer);
+
+ // Proxy port number
+ mProxyPort = new CpSettingFormItemData(
+ HbDataFormModelItem::TextItem,
+ hbTrId("txt_occ_setlabel_proxy_port_number"));
+ mForm->addConnection(
+ mProxyPort,
+ SIGNAL(editingFinished()),
+ this,
+ SLOT(changeProxyPort()));
+ mProxyGroup->appendChild(mProxyPort);
+
+ OstTraceFunctionExit0(CPPACKETDATAAPADVANCEDVIEW_CREATEPROXYGROUP_EXIT);
+}
+
+/*!
+ Reads attribute values and updates the proxy settings group.
+*/
+void CpPacketDataApAdvancedView::updateProxyGroup()
+{
+ OstTraceFunctionEntry0(CPPACKETDATAAPADVANCEDVIEW_UPDATEPROXYGROUP_ENTRY);
+
+ // Proxy server address
+ QString serverAddress = mCmConnectionMethod->getStringAttribute(
+ CMManagerShim::CmProxyServerName);
+ mProxyServer->setContentWidgetData("text", serverAddress);
+
+ // Proxy port number
+ uint portNumber = mCmConnectionMethod->getIntAttribute(
+ CMManagerShim::CmProxyPortNumber);
+ if (portNumber > 0) {
+ mProxyPort->setContentWidgetData("text", QVariant(portNumber));
+ } else {
+ mProxyPort->setContentWidgetData("text", "");
+ }
+
+ OstTraceFunctionExit0(CPPACKETDATAAPADVANCEDVIEW_UPDATEPROXYGROUP_EXIT);
+}
+
+/*!
+ Reads network type (IPv4/IPv6) from CommsDat.
+*/
+CpPacketDataApAdvancedView::NetworkType CpPacketDataApAdvancedView::getNetworkType()
+{
+ OstTraceFunctionEntry0(CPPACKETDATAAPADVANCEDVIEW_GETNETWORKTYPE_ENTRY);
+
+ uint networkType = mCmConnectionMethod->getIntAttribute(
+ CMManagerShim::PacketDataPDPType);
+
+ if (networkType == RPacketContext::EPdpTypeIPv6) {
+ OstTraceFunctionExit0(DUP1_CPPACKETDATAAPADVANCEDVIEW_GETNETWORKTYPE_EXIT);
+ return NetworkTypeIpv6;
+ }
+
+ OstTraceFunctionExit0(CPPACKETDATAAPADVANCEDVIEW_GETNETWORKTYPE_EXIT);
+ return NetworkTypeIpv4;
+}
+
+/*!
+ Reads an IP address from CommsDat with given attribute. If string is
+ empty, a zero address (0.0.0.0 or 0:0:0:0:0:0:0:0) is returned.
+*/
+QString CpPacketDataApAdvancedView::getIpAddress(
+ CMManagerShim::ConnectionMethodAttribute attribute)
+{
+ OstTraceFunctionEntry0(CPPACKETDATAAPADVANCEDVIEW_GETIPADDRESS_ENTRY);
+
+ QString ipAddress = mCmConnectionMethod->getStringAttribute(attribute);
+
+ if (ipAddress.isEmpty()) {
+ // String is empty, return a zero address instead
+ switch (attribute) {
+ case CMManagerShim::CmIPAddress:
+ case CMManagerShim::CmIPNameServer1:
+ case CMManagerShim::CmIPNameServer2:
+ // IPv4 address
+ ipAddress = CMManagerShim::UnspecifiedIpv4Address;
+ break;
+
+ case CMManagerShim::CmIP6NameServer1:
+ case CMManagerShim::CmIP6NameServer2:
+ // IPv6 address
+ ipAddress = CMManagerShim::DynamicIpv6Address;
+ break;
+ }
+ }
+
+ OstTraceFunctionExit0(CPPACKETDATAAPADVANCEDVIEW_GETIPADDRESS_EXIT);
+ return ipAddress;
+}
+
+/*!
+ Resolves IPv6 DNS address type.
+*/
+CpPacketDataApAdvancedView::Ipv6DnsType CpPacketDataApAdvancedView::getIpv6DnsType()
+{
+ OstTraceFunctionEntry0(CPPACKETDATAAPADVANCEDVIEW_GETIPV6DNSTYPE_ENTRY);
+
+ // Read "DNS address from server" flag
+ bool dnsAddressFromServer = mCmConnectionMethod->getBoolAttribute(
+ CMManagerShim::CmIP6DNSAddrFromServer);
+
+ // Read IPv6 DNS addresses from CommsDat
+ QString primaryAddress = mCmConnectionMethod->getStringAttribute(
+ CMManagerShim::CmIP6NameServer1);
+ QString secondaryAddress = mCmConnectionMethod->getStringAttribute(
+ CMManagerShim::CmIP6NameServer2);
+
+ // Resolve IPv6 DNS address type
+ Ipv6DnsType type = Ipv6DnsTypeUserDefined;
+ if (dnsAddressFromServer) {
+ // Automatic
+ type = Ipv6DnsTypeAutomatic;
+ } else if (primaryAddress.toLower() == CMManagerShim::KnownIpv6NameServer1
+ && secondaryAddress.toLower() == CMManagerShim::KnownIpv6NameServer2) {
+ // Well-known IPv6 DNS addresses
+ type = Ipv6DnsTypeWellKnown;
+ }
+
+ OstTraceFunctionExit0(CPPACKETDATAAPADVANCEDVIEW_GETIPV6DNSTYPE_EXIT);
+ return type;
+}
+
+/*!
+ Sets IPv4 address field enabled/disabled.
+*/
+void CpPacketDataApAdvancedView::enableIpv4AddressFields(int state)
+{
+ OstTraceFunctionEntry0(CPPACKETDATAAPADVANCEDVIEW_ENABLEIPV4ADDRESSFIELDS_ENTRY);
+
+ if (state == Qt::Checked) {
+ // Automatic, disable text field
+ if (mIpv4Address) {
+ mIpv4Address->setEnabled(false);
+ }
+ } else {
+ // User defined, enable text field
+ if (mIpv4Address) {
+ mIpv4Address->setEnabled(true);
+ }
+ }
+
+ OstTraceFunctionExit0(CPPACKETDATAAPADVANCEDVIEW_ENABLEIPV4ADDRESSFIELDS_EXIT);
}
/*!
- Adds settings items to the model.
+ Sets IPv4 DNS address fields enabled/disabled.
+*/
+void CpPacketDataApAdvancedView::enableIpv4DnsFields(int state)
+{
+ OstTraceFunctionEntry0(CPPACKETDATAAPADVANCEDVIEW_ENABLEIPV4DNSFIELDS_ENTRY);
+
+ if (state == Qt::Checked) {
+ // Automatic, disable text fields
+ if (mIpv4DnsAddress1) {
+ mIpv4DnsAddress1->setEnabled(false);
+ }
+ if (mIpv4DnsAddress2) {
+ mIpv4DnsAddress2->setEnabled(false);
+ }
+ } else {
+ // User defined, enable text fields
+ if (mIpv4DnsAddress1) {
+ mIpv4DnsAddress1->setEnabled(true);
+ }
+ if (mIpv4DnsAddress2) {
+ mIpv4DnsAddress2->setEnabled(true);
+ }
+ }
+
+ OstTraceFunctionExit0(CPPACKETDATAAPADVANCEDVIEW_ENABLEIPV4DNSFIELDS_EXIT);
+}
+
+/*!
+ Sets IPv6 DNS address fields enabled/disabled.
+*/
+void CpPacketDataApAdvancedView::enableIpv6DnsFields(int selectionIndex)
+{
+ OstTraceFunctionEntry0(CPPACKETDATAAPADVANCEDVIEW_ENABLEIPV6DNSFIELDS_ENTRY);
+
+ // Check combobox value
+ if (selectionIndex == Ipv6DnsTypeUserDefined) {
+ // User-defined, enable text fields
+ if (mIpv6DnsAddress1) {
+ mIpv6DnsAddress1->setEnabled(true);
+ }
+ if (mIpv6DnsAddress2) {
+ mIpv6DnsAddress2->setEnabled(true);
+ }
+ } else {
+ // Automatic or well-known, disable text fields
+ if (mIpv6DnsAddress1) {
+ mIpv6DnsAddress1->setEnabled(false);
+ }
+ if (mIpv6DnsAddress2) {
+ mIpv6DnsAddress2->setEnabled(false);
+ }
+ }
+
+ OstTraceFunctionExit0(CPPACKETDATAAPADVANCEDVIEW_ENABLEIPV6DNSFIELDS_EXIT);
+}
+
+/*!
+ Validates an IP address and saves it to CommsDat in case it was a valid
+ address or an empty string. In case the address is not valid, an error
+ note is shown to the user and previous setting is restored to the UI.
+*/
+bool CpPacketDataApAdvancedView::validateAndSaveIpAddress(
+ HbDataFormModelItem *item,
+ CMManagerShim::ConnectionMethodAttribute attribute,
+ QAbstractSocket::NetworkLayerProtocol protocol)
+{
+ OstTraceFunctionEntry0(CPPACKETDATAAPADVANCEDVIEW_VALIDATEANDSAVEIPADDRESS_ENTRY);
+
+ bool success = false;
+
+ // Check address
+ QString address = item->contentWidgetData("text").toString();
+ QHostAddress hostAddress;
+ if (hostAddress.setAddress(address)
+ && hostAddress.protocol() == protocol) {
+ // Proper address, convert to lower case (IPv6)
+ address = hostAddress.toString().toLower();
+ } else if (address.isEmpty()) {
+ // Empty string, replace with 0.0.0.0 or 0:0:0:0:0:0:0:0
+ if (protocol == QAbstractSocket::IPv4Protocol) {
+ address = CMManagerShim::UnspecifiedIpv4Address;
+ } else {
+ address = CMManagerShim::DynamicIpv6Address;
+ }
+ } else {
+ // Invalid address
+ address.clear();
+ }
+
+ if (!address.isEmpty()) {
+ // Save to CommsDat
+ mCmConnectionMethod->setStringAttribute(attribute, address);
+ if (tryUpdate()) {
+ success = true;
+ item->setContentWidgetData("text", address);
+ }
+ } else {
+ // Inform user of invalid name
+ showMessageBox(
+ HbMessageBox::MessageTypeInformation,
+ hbTrId("txt_occ_info_invalid_input"));
+ // Restore previous setting
+ address = getIpAddress(attribute);
+ item->setContentWidgetData("text", address);
+ }
+
+ OstTraceFunctionExit0(CPPACKETDATAAPADVANCEDVIEW_VALIDATEANDSAVEIPADDRESS_EXIT);
+ return success;
+}
+
+/*!
+ Shows message box with "OK" button using given text.
+*/
+void CpPacketDataApAdvancedView::showMessageBox(
+ HbMessageBox::MessageBoxType type,
+ const QString &text)
+{
+ OstTraceFunctionEntry0(CPPACKETDATAAPADVANCEDVIEW_SHOWMESSAGEBOX_ENTRY);
+
+ // Create a message box
+ mMessageBox = QSharedPointer<HbMessageBox>(new HbMessageBox(type));
+ mMessageBox->setText(text);
+ mMessageBox->setModal(true);
+ mMessageBox->setTimeout(HbPopup::NoTimeout);
+ mMessageBox->open();
+
+ OstTraceFunctionExit0(CPPACKETDATAAPADVANCEDVIEW_SHOWMESSAGEBOX_EXIT);
+}
+
+/*!
+ Tries to update connection method changes to CommsDat.
+ Returns "true" if success, "false" if some error happened.
+*/
+bool CpPacketDataApAdvancedView::tryUpdate()
+{
+ OstTraceFunctionEntry0(CPPACKETDATAAPADVANCEDVIEW_TRYUPDATE_ENTRY);
+
+ // Try update
+ try {
+ mCmConnectionMethod->update();
+ }
+ catch (const std::exception&) {
+ // Handle error
+ handleUpdateError();
+
+ OstTraceFunctionExit0(CPPACKETDATAAPADVANCEDVIEW_TRYUPDATE_EXIT);
+ return false;
+ }
+
+ OstTraceFunctionExit0(DUP1_CPPACKETDATAAPADVANCEDVIEW_TRYUPDATE_EXIT);
+ return true;
+}
+
+/*!
+ Handles failed CommsDat update.
+ */
+void CpPacketDataApAdvancedView::handleUpdateError()
+{
+ OstTraceFunctionEntry0(CPPACKETDATAAPADVANCEDVIEW_HANDLEUPDATEERROR_ENTRY);
+
+ // Show error note to user
+ showMessageBox(
+ HbMessageBox::MessageTypeWarning,
+ hbTrId("txt_occ_info_unable_to_save_setting"));
+ // Reload settings from CommsDat and update UI
+ try {
+ mCmConnectionMethod->refresh();
+ }
+ catch (const std::exception&) {
+ // Ignore error from refresh. Most likely this will not happen, but
+ // if it does, there isn't very much we can do.
+ OstTrace0(
+ TRACE_ERROR,
+ CPPACKETDATAAPPADVANCEDVIEW_HANDLEUPDATEERROR,
+ "Refresh failed");
+ };
+ updateIpGroup();
+ updateProxyGroup();
+
+ OstTraceFunctionExit0(CPPACKETDATAAPADVANCEDVIEW_HANDLEUPDATEERROR_EXIT);
+}
+
+/*!
+ Initializes all settings groups.
+*/
+void CpPacketDataApAdvancedView::setEditorPreferences(const QModelIndex index)
+{
+ OstTraceFunctionEntry0(CPPACKETDATAAPADVANCEDVIEW_SETEDITORPREFERENCES_ENTRY);
+
+ HbDataFormViewItem *viewItem = qobject_cast<HbDataFormViewItem *>
+ (mForm->itemByIndex(index));
+ HbDataFormModelItem *modelItem = mModel->itemFromIndex(index);
+
+ if (modelItem == mIpv4Address
+ || modelItem == mIpv4DnsAddress1
+ || modelItem == mIpv4DnsAddress2
+ || modelItem == mIpv6DnsAddress1
+ || modelItem == mIpv6DnsAddress2
+ || modelItem == mProxyServer
+ || modelItem == mProxyPort) {
+ // HbLineEdit items, get editor and editor interface
+ HbLineEdit *edit = qobject_cast<HbLineEdit *>
+ (viewItem->dataItemContentWidget());
+ HbEditorInterface editorInterface(edit);
+
+ if (modelItem == mIpv4Address
+ || modelItem == mIpv4DnsAddress1
+ || modelItem == mIpv4DnsAddress2) {
+ // IPv4 IP address
+ editorInterface.setMode(HbInputModeNumeric);
+ editorInterface.setFilter(CpIpv4Filter::instance());
+ edit->setMaxLength(CMManagerShim::CmIP4AddressLength);
+ } else if (modelItem == mIpv6DnsAddress1
+ || modelItem == mIpv6DnsAddress2) {
+ // IPv6 IP address
+ editorInterface.setInputConstraints(
+ HbEditorConstraintLatinAlphabetOnly);
+ editorInterface.setFilter(CpIpv6Filter::instance());
+ edit->setInputMethodHints(
+ Qt::ImhNoPredictiveText
+ | Qt::ImhPreferLowercase);
+ edit->setMaxLength(CMManagerShim::CmIP6NameServerLength);
+ } else if (modelItem == mProxyServer) {
+ // Proxy server address
+ editorInterface.setMode(HbInputModeNone);
+ editorInterface.setInputConstraints(
+ HbEditorConstraintLatinAlphabetOnly);
+ editorInterface.setFilter(HbUrlFilter::instance());
+ editorInterface.setEditorClass(HbInputEditorClassUrl);
+ editorInterface.setDigitType(HbDigitTypeNone);
+ edit->setInputMethodHints(
+ Qt::ImhNoPredictiveText
+ | Qt::ImhPreferLowercase);
+ edit->setMaxLength(CMManagerShim::CmProxyServerNameLength);
+ } else { /* mProxyPort */
+ // Proxy port number
+ editorInterface.setMode(HbInputModeNumeric);
+ edit->setInputMethodHints(Qt::ImhDigitsOnly);
+ edit->setMaxLength(CMManagerShim::CmProxyPortNumberLength);
+ }
+ }
+
+ OstTraceFunctionExit0(CPPACKETDATAAPADVANCEDVIEW_SETEDITORPREFERENCES_EXIT);
+}
+
+/*!
+ Handles change to network type (IPv4/IPv6).
+*/
+void CpPacketDataApAdvancedView::changeNetworkType(int type)
+{
+ OstTraceFunctionEntry0(CPPACKETDATAAPADVANCEDVIEW_CHANGENETWORKTYPE_ENTRY);
+
+ // Save network type to CommsDat
+ int pdpType;
+ if (type == NetworkTypeIpv6) {
+ pdpType = RPacketContext::EPdpTypeIPv6;
+ } else {
+ pdpType = RPacketContext::EPdpTypeIPv4;
+ }
+ mCmConnectionMethod->setIntAttribute(
+ CMManagerShim::PacketDataPDPType,
+ pdpType);
+ if (tryUpdate())
+ {
+ // This will handle updating the UI with correct setting items
+ updateIpGroup();
+ }
+
+ OstTraceFunctionExit0(CPPACKETDATAAPADVANCEDVIEW_CHANGENETWORKTYPE_EXIT);
+}
+
+/*!
+ Handles change to IPv4 address mode (automatic/user defined).
*/
-void CpPacketDataApAdvancedView::createAdvancedSettings()
+void CpPacketDataApAdvancedView::changeIpv4AddressMode(int state)
+{
+ OstTraceFunctionEntry0(CPPACKETDATAAPADVANCEDVIEW_CHANGEIPV4ADDRESSMODE_ENTRY);
+
+ bool ipv4AddressFromServer;
+ if (state == Qt::Checked) {
+ ipv4AddressFromServer = true;
+ } else {
+ ipv4AddressFromServer = false;
+ }
+
+ if (!ipv4AddressFromServer
+ && getIpAddress(CMManagerShim::CmIPAddress) ==
+ CMManagerShim::UnspecifiedIpv4Address) {
+ // User defined IP address selected, but no valid address is stored.
+ // Just enable the UI IP editors, because CMManager will update the
+ // "IP address from server" flag by itself when a valid IP address
+ // is stored.
+ enableIpv4AddressFields(state);
+ } else {
+ // Save setting to CommsDat
+ mCmConnectionMethod->setBoolAttribute(
+ CMManagerShim::CmIPAddrFromServer,
+ ipv4AddressFromServer);
+ if (tryUpdate()) {
+ enableIpv4AddressFields(state);
+ }
+ }
+
+ OstTraceFunctionExit0(CPPACKETDATAAPADVANCEDVIEW_CHANGEIPV4ADDRESSMODE_EXIT);
+}
+
+/*!
+ Saves IPv4 address to CommsDat.
+*/
+void CpPacketDataApAdvancedView::changeIpv4Address()
+{
+ OstTraceFunctionEntry0(CPPACKETDATAAPADVANCEDVIEW_CHANGEIPV4ADDRESS_ENTRY);
+
+ if (validateAndSaveIpAddress(
+ mIpv4Address,
+ CMManagerShim::CmIPAddress,
+ QAbstractSocket::IPv4Protocol)) {
+ // In case the IP address is empty or 0.0.0.0, CMManager changes the
+ // "IP address from server" flag to true. We need to refresh the UI to
+ // make sure we are in sync.
+ updateIpGroup();
+ }
+
+ OstTraceFunctionExit0(CPPACKETDATAAPADVANCEDVIEW_CHANGEIPV4ADDRESS_EXIT);
+}
+
+/*!
+ Handles change to IPv4 DNS mode (automatic/user defined).
+*/
+void CpPacketDataApAdvancedView::changeIpv4DnsMode(int state)
+{
+ OstTraceFunctionEntry0(CPPACKETDATAAPADVANCEDVIEW_CHANGEIPV4DNSMODE_ENTRY);
+
+ bool dnsAddressFromServer;
+ if (state == Qt::Checked) {
+ dnsAddressFromServer = true;
+ } else {
+ dnsAddressFromServer = false;
+ }
+ // Save setting to CommsDat
+ mCmConnectionMethod->setBoolAttribute(
+ CMManagerShim::CmIPDNSAddrFromServer,
+ dnsAddressFromServer);
+ if (tryUpdate()) {
+ enableIpv4DnsFields(state);
+ }
+
+ OstTraceFunctionExit0(CPPACKETDATAAPADVANCEDVIEW_CHANGEIPV4DNSMODE_EXIT);
+}
+
+/*!
+ Saves IPv4 primary DNS address to CommsDat.
+*/
+void CpPacketDataApAdvancedView::changeIpv4PrimaryDnsAddress()
+{
+ OstTraceFunctionEntry0(CPPACKETDATAAPADVANCEDVIEW_CHANGEIPV4PRIMARYDNSADDRESS_ENTRY);
+
+ if (validateAndSaveIpAddress(
+ mIpv4DnsAddress1,
+ CMManagerShim::CmIPNameServer1,
+ QAbstractSocket::IPv4Protocol)) {
+ // Address saved successfully, update "DNS address from server" flag
+ mCmConnectionMethod->setBoolAttribute(
+ CMManagerShim::CmIPDNSAddrFromServer,
+ false);
+ if (tryUpdate()) {
+ // In case primary DNS address is empty or 0.0.0.0, CMManager will
+ // check secondary DNS address and in case it is a valid address,
+ // move it to the primary DNS address. We need to refresh the
+ // UI to make sure we are in sync. If tryUpdate() fails it does
+ // the refresh automatically, so only success case is handled
+ // here.
+ updateIpGroup();
+ }
+ }
+
+ OstTraceFunctionExit0(CPPACKETDATAAPADVANCEDVIEW_CHANGEIPV4PRIMARYDNSADDRESS_EXIT);
+}
+
+/*!
+ Saves IPv4 secondary DNS address to CommsDat.
+*/
+void CpPacketDataApAdvancedView::changeIpv4SecondaryDnsAddress()
+{
+ OstTraceFunctionEntry0(CPPACKETDATAAPADVANCEDVIEW_CHANGEIPV4SECONDARYDNSADDRESS_ENTRY);
+
+ if (validateAndSaveIpAddress(
+ mIpv4DnsAddress2,
+ CMManagerShim::CmIPNameServer2,
+ QAbstractSocket::IPv4Protocol)) {
+ // Address saved successfully, update "DNS address from server" flag
+ mCmConnectionMethod->setBoolAttribute(
+ CMManagerShim::CmIPDNSAddrFromServer,
+ false);
+ if (tryUpdate()) {
+ // In case primary DNS address is empty or 0.0.0.0, CMManager will
+ // write the address there instead of secondary DNS address, so we
+ // need to refresh the UI to make sure we are in sync. If
+ // tryUpdate() fails it does the refresh automatically, so only
+ // success case is handled here.
+ updateIpGroup();
+ }
+ }
+
+ OstTraceFunctionExit0(CPPACKETDATAAPADVANCEDVIEW_CHANGEIPV4SECONDARYDNSADDRESS_EXIT);
+}
+
+/*!
+ Handles change to IPv6 DNS mode (automatic/well-known/user defined).
+*/
+void CpPacketDataApAdvancedView::changeIpv6DnsMode(int state)
{
- // TODO: Implement the advanced settings view.
+ OstTraceFunctionEntry0(CPPACKETDATAAPADVANCEDVIEW_CHANGEIPV6DNSMODE_ENTRY);
+
+ // Update "DNS address from server" flag
+ if (state == Ipv6DnsTypeAutomatic) {
+ // Automatic
+ mCmConnectionMethod->setBoolAttribute(
+ CMManagerShim::CmIP6DNSAddrFromServer,
+ true);
+ } else {
+ // User defined or well-known address
+ mCmConnectionMethod->setBoolAttribute(
+ CMManagerShim::CmIP6DNSAddrFromServer,
+ false);
+
+ if (state == Ipv6DnsTypeWellKnown) {
+ // Well-known address, set DNS addresses and update UI
+ mCmConnectionMethod->setStringAttribute(
+ CMManagerShim::CmIP6NameServer1,
+ CMManagerShim::KnownIpv6NameServer1);
+ mIpv6DnsAddress1->setContentWidgetData(
+ "text",
+ CMManagerShim::KnownIpv6NameServer1);
+ mCmConnectionMethod->setStringAttribute(
+ CMManagerShim::CmIP6NameServer2,
+ CMManagerShim::KnownIpv6NameServer2);
+ mIpv6DnsAddress2->setContentWidgetData(
+ "text",
+ CMManagerShim::KnownIpv6NameServer2);
+ }
+ }
+
+ if (tryUpdate()) {
+ enableIpv6DnsFields(state);
+ }
+
+ OstTraceFunctionExit0(CPPACKETDATAAPADVANCEDVIEW_CHANGEIPV6DNSMODE_EXIT);
+}
+
+/*!
+ Saves IPv6 primary DNS address to CommsDat.
+*/
+void CpPacketDataApAdvancedView::changeIpv6PrimaryDnsAddress()
+{
+ OstTraceFunctionEntry0(CPPACKETDATAAPADVANCEDVIEW_CHANGEIPV6PRIMARYDNSADDRESS_ENTRY);
+
+ if (validateAndSaveIpAddress(
+ mIpv6DnsAddress1,
+ CMManagerShim::CmIP6NameServer1,
+ QAbstractSocket::IPv6Protocol)) {
+ // Address saved successfully, update "DNS address from server" flag
+ mCmConnectionMethod->setBoolAttribute(
+ CMManagerShim::CmIP6DNSAddrFromServer,
+ false);
+ if (tryUpdate()) {
+ // In case primary DNS address is empty or 0:0:0:0:0:0:0:0,
+ // CMManager will check secondary DNS address and in case it is a
+ // valid address, move it to the primary DNS address. We need to
+ // refresh the UI to make sure we are in sync. If tryUpdate()
+ // fails it does the refresh automatically, so only success case
+ // is handled here.
+ updateIpGroup();
+ }
+ }
+
+ OstTraceFunctionExit0(CPPACKETDATAAPADVANCEDVIEW_CHANGEIPV6PRIMARYDNSADDRESS_EXIT);
}
+
+/*!
+ Saves IPv6 secondary DNS address to CommsDat.
+*/
+void CpPacketDataApAdvancedView::changeIpv6SecondaryDnsAddress()
+{
+ OstTraceFunctionEntry0(CPPACKETDATAAPADVANCEDVIEW_CHANGEIPV6SECONDARYDNSADDRESS_ENTRY);
+
+ if (validateAndSaveIpAddress(
+ mIpv6DnsAddress2,
+ CMManagerShim::CmIP6NameServer2,
+ QAbstractSocket::IPv6Protocol)) {
+ // Address saved successfully, update "DNS address from server" flag
+ mCmConnectionMethod->setBoolAttribute(
+ CMManagerShim::CmIP6DNSAddrFromServer,
+ false);
+ if (tryUpdate()) {
+ // In case primary DNS address is empty or 0:0:0:0:0:0:0:0,
+ // CMManager will write the address there instead of secondary DNS
+ // address, so we need to refresh the UI to make sure we are in
+ // sync. If tryUpdate() fails it does the refresh automatically,
+ // so only success case is handled here.
+ updateIpGroup();
+ }
+ }
+
+ OstTraceFunctionExit0(CPPACKETDATAAPADVANCEDVIEW_CHANGEIPV6SECONDARYDNSADDRESS_EXIT);
+}
+
+/*!
+ Saves proxy server address to CommsDat.
+*/
+void CpPacketDataApAdvancedView::changeProxyServer()
+{
+ OstTraceFunctionEntry0(CPPACKETDATAAPADVANCEDVIEW_CHANGEPROXYSERVER_ENTRY);
+
+ QString proxyServer = mProxyServer->contentWidgetData("text").toString();
+ mCmConnectionMethod->setStringAttribute(
+ CMManagerShim::CmProxyServerName,
+ proxyServer);
+ (void)tryUpdate();
+
+ OstTraceFunctionExit0(CPPACKETDATAAPADVANCEDVIEW_CHANGEPROXYSERVER_EXIT);
+}
+
+/*!
+ Saves proxy port to CommsDat.
+*/
+void CpPacketDataApAdvancedView::changeProxyPort()
+{
+ OstTraceFunctionEntry0(CPPACKETDATAAPADVANCEDVIEW_CHANGEPROXYPORT_ENTRY);
+
+ uint proxyPort = mProxyPort->contentWidgetData("text").toInt();
+ if (proxyPort <= 65535) {
+ if (proxyPort == 0) {
+ // Don't show zero
+ mProxyPort->setContentWidgetData("text", "");
+ }
+ mCmConnectionMethod->setIntAttribute(
+ CMManagerShim::CmProxyPortNumber,
+ proxyPort);
+ (void)tryUpdate();
+ } else {
+ // Inform user of invalid value
+ showMessageBox(
+ HbMessageBox::MessageTypeInformation,
+ hbTrId("txt_occ_info_invalid_input"));
+ // Restore previous setting
+ proxyPort = mCmConnectionMethod->getIntAttribute(
+ CMManagerShim::CmProxyPortNumber);
+ if (proxyPort > 0) {
+ mProxyPort->setContentWidgetData("text", QVariant(proxyPort));
+ } else {
+ mProxyPort->setContentWidgetData("text", "");
+ }
+ }
+
+ OstTraceFunctionExit0(CPPACKETDATAAPADVANCEDVIEW_CHANGEPROXYPORT_EXIT);
+}