Stabalize wireless setup connection

This commit is contained in:
Simon Stürz 2018-05-12 19:31:17 +02:00 committed by Michael Zanetti
parent 51aee3352e
commit 396a548a09
10 changed files with 280 additions and 139 deletions

View File

@ -79,7 +79,7 @@ void NymeaConnection::sendData(const QByteArray &data)
void NymeaConnection::onSslErrors(const QList<QSslError> &errors)
{
qDebug() << "ssl errors";
qDebug() << "Connection: SSL errors:" << errors;
QList<QSslError> ignoredErrors;
foreach (const QSslError &error, errors) {
if (error.error() == QSslError::HostNameMismatch) {
@ -119,7 +119,7 @@ void NymeaConnection::onSslErrors(const QList<QSslError> &errors)
}
} else {
// Reject the connection on all other errors...
qDebug() << "error:" << error.errorString() << error.certificate();
qDebug() << "SSL Error:" << error.errorString() << error.certificate();
}
}
m_currentInterface->ignoreSslErrors(ignoredErrors);
@ -127,7 +127,7 @@ void NymeaConnection::onSslErrors(const QList<QSslError> &errors)
void NymeaConnection::onError(QAbstractSocket::SocketError error)
{
qWarning() << "socket error" << error;
qWarning() << "Socket error" << error;
emit connectionError();
}

View File

@ -12,6 +12,8 @@ TcpSocketInterface::TcpSocketInterface(QObject *parent) : NymeaInterface(parent)
QObject::connect(&m_socket, &QSslSocket::readyRead, this, &TcpSocketInterface::socketReadyRead);
typedef void (QSslSocket:: *errorSignal)(QAbstractSocket::SocketError);
QObject::connect(&m_socket, static_cast<errorSignal>(&QSslSocket::error), this, &TcpSocketInterface::error);
QObject::connect(&m_socket, &QSslSocket::stateChanged, this, &TcpSocketInterface::onSocketStateChanged);
}
QStringList TcpSocketInterface::supportedSchemes() const
@ -47,12 +49,12 @@ void TcpSocketInterface::connect(const QUrl &url)
{
m_url = url;
if (url.scheme() == "nymeas") {
qDebug() << "connecting to" << url.host() << url.port();
qDebug() << "TCP socket connecting to" << url.host() << url.port();
m_socket.connectToHostEncrypted(url.host(), url.port());
} else if (url.scheme() == "nymea") {
m_socket.connectToHost(url.host(), url.port());
} else {
qWarning() << "Unsupported scheme";
qWarning() << "TCP socket: Unsupported scheme";
}
}
@ -71,3 +73,8 @@ void TcpSocketInterface::socketReadyRead()
QByteArray data = m_socket.readAll();
emit dataReady(data);
}
void TcpSocketInterface::onSocketStateChanged(const QAbstractSocket::SocketState &state)
{
qDebug() << "Socket state changed -->" << state;
}

View File

@ -25,6 +25,7 @@ private slots:
void onConnected();
void onEncrypted();
void socketReadyRead();
void onSocketStateChanged(const QAbstractSocket::SocketState &state);
private:
QSslSocket m_socket;

View File

@ -1,6 +1,7 @@
import QtQuick 2.4
import QtQuick.Controls 2.1
import QtQuick.Layouts 1.2
import QtQuick.Controls.Material 2.1
import "components"
import Mea 1.0
@ -40,6 +41,13 @@ Page {
errorDialog.errorText = errorMessage
errorDialog.open()
}
onWirelessStatusChanged: {
switch(networkManger.manager.wirelessStatus) {
case WirelessSetupManager.WirelessStatusDisconnected:
networkManger.manager.accessPoints.setSelectedNetwork("", "")
}
}
}
ColumnLayout {
@ -48,15 +56,27 @@ Page {
Label {
wrapMode: Text.WordWrap
Layout.fillWidth: true
text: qsTr("Network status: ") + networkManger.manager.networkStatus
}
Label {
wrapMode: Text.WordWrap
Layout.fillWidth: true
text: qsTr("Wireless status: ") + networkManger.manager.wirelessStatus
Layout.alignment: Qt.AlignHCenter
text:{
switch (networkManger.manager.networkStatus) {
case WirelessSetupManager.NetworkStatusUnknown:
return qsTr("Unknown status.");
case WirelessSetupManager.NetworkStatusAsleep:
return qsTr("Asleep.");
case WirelessSetupManager.NetworkStatusDisconnected:
return qsTr("Disconnected.");
case WirelessSetupManager.NetworkStatusDisconnecting:
return qsTr("Disconnecting...");
case WirelessSetupManager.NetworkStatusConnecting:
return qsTr("Connecting...");
case WirelessSetupManager.NetworkStatusLocal:
return qsTr("Connected local.");
case WirelessSetupManager.NetworkStatusConnectedSite:
return qsTr("Connected site.");
case WirelessSetupManager.NetworkStatusGlobal:
return qsTr("Online.");
}
}
}
BusyIndicator {
@ -75,7 +95,13 @@ Page {
delegate: ItemDelegate {
width: parent.width
height: app.delegateHeight
height: model.selectedNetwork ? app.delegateHeight * 1.5 : app.delegateHeight
Rectangle {
anchors.fill: parent
color: guhAccent
visible: model.selectedNetwork
}
RowLayout {
anchors.verticalCenter: parent.verticalCenter
@ -83,7 +109,7 @@ Page {
anchors.right: parent.right
Item {
Layout.fillHeight: true
Layout.preferredHeight: app.delegateHeight
Layout.preferredWidth: height
ColorIcon {
@ -130,7 +156,7 @@ Page {
ColumnLayout {
Layout.fillWidth: true
Layout.alignment: Qt.AlignVCenter
Label {
text: model.ssid
}
@ -139,6 +165,48 @@ Page {
text: model.macAddress
font.pixelSize: app.smallFont
}
Label {
text: {
switch (networkManger.manager.wirelessStatus) {
case WirelessSetupManager.WirelessStatusUnknown:
return qsTr("Unknown status.");
case WirelessSetupManager.WirelessStatusUnmanaged:
return qsTr("Network unmanaged.");
case WirelessSetupManager.WirelessStatusUnavailable:
return qsTr("Network unavailable.");
case WirelessSetupManager.WirelessStatusDisconnected:
return qsTr("Disconnected.");
case WirelessSetupManager.WirelessStatusPrepare:
return qsTr("Prepare connection...");
case WirelessSetupManager.WirelessStatusConfig:
return qsTr("Configure network...");
case WirelessSetupManager.WirelessStatusNeedAuth:
return qsTr("Authentication needed");
case WirelessSetupManager.WirelessStatusIpConfig:
return qsTr("Configuration IP...");
case WirelessSetupManager.WirelessStatusIpCheck:
return qsTr("Check IP...");
case WirelessSetupManager.WirelessStatusSecondaries:
return qsTr("Secondaries...");
case WirelessSetupManager.WirelessStatusActivated:
return qsTr("Network connected.");
case WirelessSetupManager.WirelessStatusDeactivating:
return qsTr("Network disconnecting...");
case WirelessSetupManager.WirelessStatusFailed:
return qsTr("Network connection failed.");
}
}
font.pixelSize: app.smallFont
visible: model.selectedNetwork
}
}
Button {
text: qsTr("Disconnect")
visible: model.selectedNetwork && networkManger.manager.wirelessStatus === WirelessSetupManager.WirelessStatusActivated
onClicked: networkManger.manager.disconnectWirelessNetwork()
}
}
@ -181,10 +249,27 @@ Page {
text: qsTr("Please enter the password for the Wifi network.")
}
TextField {
RowLayout {
Layout.fillWidth: true
id: passwordTextField
echoMode: TextInput.Password
TextField {
id: passwordTextField
Layout.fillWidth: true
echoMode: TextInput.Password
}
Button {
text: qsTr("Show password")
onClicked: {
if (passwordTextField.echoMode === TextInput.Normal) {
text = qsTr("Show password")
passwordTextField.echoMode = TextInput.Password
} else {
text = qsTr("Hide password")
passwordTextField.echoMode = TextInput.Normal
}
}
}
}
Button {
@ -192,6 +277,7 @@ Page {
text: qsTr("Connect")
onPressed: {
networkManger.manager.connectWirelessNetwork(ssid, passwordTextField.text)
networkManger.manager.accessPoints.setSelectedNetwork(ssid, macAddress)
pageStack.pop()
}
}
@ -229,7 +315,7 @@ Page {
Page {
id: root
header: GuhHeader {
text: qsTr("Network manager settings")
text: qsTr("Network settings")
onBackPressed: pageStack.pop()
}

View File

@ -67,3 +67,13 @@ void WirelessAccessPoint::setProtected(const bool &isProtected)
{
m_isProtected = isProtected;
}
bool WirelessAccessPoint::selectedNetwork() const
{
return m_selectedNetwork;
}
void WirelessAccessPoint::setSelectedNetwork(bool selected)
{
m_selectedNetwork = selected;
}

View File

@ -45,11 +45,15 @@ public:
bool isProtected() const;
void setProtected(const bool &isProtected);
bool selectedNetwork() const;
void setSelectedNetwork(bool selected);
private:
QString m_ssid;
QString m_macAddress;
int m_signalStrength;
bool m_isProtected;
bool m_selectedNetwork;
};

View File

@ -21,6 +21,7 @@
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include "wirelessaccesspoints.h"
#include <QDebug>
WirelessAccesspoints::WirelessAccesspoints(QObject *parent) : QAbstractListModel(parent)
{
@ -66,6 +67,8 @@ QVariant WirelessAccesspoints::data(const QModelIndex &index, int role) const
return accessPoint->signalStrength();
} else if (role == WirelessAccesspointRoleProtected) {
return accessPoint->isProtected();
} else if (role == WirelessAccesspointRoleSelectedNetwork) {
return accessPoint->selectedNetwork();
}
return QVariant();
@ -94,8 +97,34 @@ void WirelessAccesspoints::clearModel()
endResetModel();
}
void WirelessAccesspoints::setSelectedNetwork(const QString &ssid, const QString &macAdderss)
{
beginResetModel();
foreach (WirelessAccessPoint *accessPoint, m_wirelessAccessPoints) {
if (accessPoint->ssid() == ssid && accessPoint->macAddress() == macAdderss) {
qDebug() << "Set selected network:" << ssid << macAdderss;
accessPoint->setSelectedNetwork(true);
} else {
accessPoint->setSelectedNetwork(false);
}
}
// FIXME: find a better way to update network selected and resort the list
QList<WirelessAccessPoint *> wirelessAccessPoints = m_wirelessAccessPoints;
qSort(wirelessAccessPoints.begin(), wirelessAccessPoints.end(), signalStrengthLessThan);
m_wirelessAccessPoints = wirelessAccessPoints;
endResetModel();
}
bool WirelessAccesspoints::signalStrengthLessThan(const WirelessAccessPoint *a, const WirelessAccessPoint *b)
{
// Keep the selected network on top
if (a->selectedNetwork())
return true;
return a->signalStrength() > b->signalStrength();
}
@ -106,6 +135,7 @@ QHash<int, QByteArray> WirelessAccesspoints::roleNames() const
roles[WirelessAccesspointRoleMacAddress] = "macAddress";
roles[WirelessAccesspointRoleSignalStrength] = "signalStrength";
roles[WirelessAccesspointRoleProtected] = "protected";
roles[WirelessAccesspointRoleSelectedNetwork] = "selectedNetwork";
return roles;
}

View File

@ -36,7 +36,8 @@ public:
WirelessAccesspointRoleSsid = Qt::DisplayRole,
WirelessAccesspointRoleMacAddress,
WirelessAccesspointRoleSignalStrength,
WirelessAccesspointRoleProtected
WirelessAccesspointRoleProtected,
WirelessAccesspointRoleSelectedNetwork
};
explicit WirelessAccesspoints(QObject *parent = 0);
@ -52,6 +53,8 @@ public:
void clearModel();
Q_INVOKABLE void setSelectedNetwork(const QString &ssid, const QString &macAdderss);
static bool signalStrengthLessThan(const WirelessAccessPoint *a, const WirelessAccessPoint *b);
protected:

View File

@ -90,12 +90,12 @@ bool WirelessSetupManager::working() const
return m_working;
}
QString WirelessSetupManager::networkStatus() const
WirelessSetupManager::NetworkStatus WirelessSetupManager::networkStatus() const
{
return m_networkStatus;
}
QString WirelessSetupManager::wirelessStatus() const
WirelessSetupManager::WirelessStatus WirelessSetupManager::wirelessStatus() const
{
return m_wirelessStatus;
}
@ -115,6 +115,11 @@ WirelessAccesspoints *WirelessSetupManager::accessPoints()
return m_accessPoints;
}
void WirelessSetupManager::reloadData()
{
loadNetworks();
}
void WirelessSetupManager::loadNetworks()
{
qDebug() << "WifiSetupManager: Start loading wifi networks";
@ -310,10 +315,20 @@ void WirelessSetupManager::pressPushButton()
void WirelessSetupManager::checkInitialized()
{
setInitialized(m_deviceInformationService->state() == QLowEnergyService::ServiceDiscovered
&& m_netwokService->state() == QLowEnergyService::ServiceDiscovered
&& m_wifiService->state() == QLowEnergyService::ServiceDiscovered
&& m_systemService->state() == QLowEnergyService::ServiceDiscovered);
bool initialized = false;
if (m_systemService) {
initialized = m_deviceInformationService->state() == QLowEnergyService::ServiceDiscovered
&& m_netwokService->state() == QLowEnergyService::ServiceDiscovered
&& m_wifiService->state() == QLowEnergyService::ServiceDiscovered
&& m_systemService->state() == QLowEnergyService::ServiceDiscovered;
} else {
initialized = m_deviceInformationService->state() == QLowEnergyService::ServiceDiscovered
&& m_netwokService->state() == QLowEnergyService::ServiceDiscovered
&& m_wifiService->state() == QLowEnergyService::ServiceDiscovered;
}
setInitialized(initialized);
}
void WirelessSetupManager::setModelNumber(const QString &modelNumber)
@ -381,36 +396,8 @@ void WirelessSetupManager::setNetworkStatus(int networkStatus)
if (m_networkStatus == networkStatus)
return;
switch (networkStatus) {
case 0:
m_networkStatus = tr("Unknown");
break;
case 1:
m_networkStatus = tr("Asleep");
break;
case 2:
m_networkStatus = tr("Disconnected");
break;
case 3:
m_networkStatus = tr("Disconnecting...");
break;
case 4:
m_networkStatus = tr("Connecting...");
break;
case 5:
m_networkStatus = tr("Connected local.");
break;
case 6:
m_networkStatus = tr("Connected site.");
break;
case 7:
m_networkStatus = tr("Connected global.");
break;
default:
m_networkStatus = tr("-");
break;
}
m_networkStatus = static_cast<NetworkStatus>(networkStatus);
qDebug() << "-->" << m_networkStatus;
emit networkStatusChanged();
}
@ -419,51 +406,8 @@ void WirelessSetupManager::setWirelessStatus(int wirelessStatus)
if (m_wirelessStatus == wirelessStatus)
return;
switch (wirelessStatus) {
case 0:
m_wirelessStatus = tr("Unknown");
break;
case 1:
m_wirelessStatus = tr("Unmanaged");
break;
case 2:
m_wirelessStatus = tr("Unavailable");
break;
case 3:
m_wirelessStatus = tr("Disconnected");
break;
case 4:
m_wirelessStatus = tr("Prepare");
break;
case 5:
m_wirelessStatus = tr("Configure");
break;
case 6:
m_wirelessStatus = tr("Authentication needed");
break;
case 7:
m_wirelessStatus = tr("IP configuration");
break;
case 8:
m_wirelessStatus = tr("IP check");
break;
case 9:
m_wirelessStatus = tr("Secondaries");
break;
case 10:
m_wirelessStatus = tr("Connected");
break;
case 11:
m_wirelessStatus = tr("Deactivating");
break;
case 12:
m_wirelessStatus = tr("failed");
break;
default:
m_wirelessStatus = tr("-");
break;
}
m_wirelessStatus = static_cast<WirelessStatus>(wirelessStatus);
qDebug() << "-->" << m_wirelessStatus;
emit wirelessStatusChanged();
}
@ -512,18 +456,33 @@ void WirelessSetupManager::streamData(const QVariantMap &request)
void WirelessSetupManager::processNetworkResponse(const QVariantMap &response)
{
setWorking(false);
if (!response.contains("c") || !response.contains("r")) {
qWarning() << "WifiSetupManager: Got invalid response map.";
return;
}
WirelessServiceCommand command = (WirelessServiceCommand)response.value("c").toInt();
WirelessServiceResponse responseCode = (WirelessServiceResponse)response.value("r").toInt();
NetworkServiceCommand command = (NetworkServiceCommand)response.value("c").toInt();
NetworkServiceResponse responseCode = (NetworkServiceResponse)response.value("r").toInt();
if (responseCode != WirelessServiceResponseSuccess) {
if (responseCode != NetworkServiceResponseSuccess) {
qWarning() << "WifiSetupManager: Got error for command" << command << responseCode;
switch (responseCode) {
case NetworkServiceResponseIvalidValue:
emit errorOccured(tr("Invalid value."));
break;
case NetworkServiceResponseNetworkManagerNotAvailable:
emit errorOccured(tr("There is no networkmanager available on the device."));
break;
case NetworkServiceResponseWirelessNotAvailable:
emit errorOccured(tr("There is no wireless device available on the device."));
break;
default:
emit errorOccured("Unknown error occured.");
break;
}
return;
}
@ -579,19 +538,9 @@ void WirelessSetupManager::processWifiResponse(const QVariantMap &response)
return;
}
QList<WirelessAccessPoint *> accessPointsList;
QVariantList accessPointsVariantList = response.value("p").toList();
foreach (const QVariant &accessPointVariant, accessPointsVariantList) {
QVariantMap accessPointVariantMap = accessPointVariant.toMap();
WirelessAccessPoint *accessPoint = new WirelessAccessPoint(this);
accessPoint->setSsid(accessPointVariantMap.value("e").toString());
accessPoint->setMacAddress(accessPointVariantMap.value("m").toString());
accessPoint->setSignalStrength(accessPointVariantMap.value("s").toInt());
accessPoint->setProtected(accessPointVariantMap.value("p").toBool());
accessPointsList.append(accessPoint);
}
m_accessPointsVariantList = response.value("p").toList();
loadCurrentConnection();
m_accessPoints->setWirelessAccessPoints(accessPointsList);
break;
}
case WirelessServiceCommandConnect:
@ -603,9 +552,26 @@ void WirelessSetupManager::processWifiResponse(const QVariantMap &response)
case WirelessServiceCommandDisconnect:
break;
case WirelessServiceCommandGetCurrentConnection:
case WirelessServiceCommandGetCurrentConnection: {
qDebug() << "Current network connection" << response;
QVariantMap currentConnection = response.value("p").toMap();;
QList<WirelessAccessPoint *> accessPointsList;
foreach (const QVariant &accessPointVariant, m_accessPointsVariantList) {
QVariantMap accessPointVariantMap = accessPointVariant.toMap();
WirelessAccessPoint *accessPoint = new WirelessAccessPoint(this);
accessPoint->setSsid(accessPointVariantMap.value("e").toString());
accessPoint->setMacAddress(accessPointVariantMap.value("m").toString());
accessPoint->setSignalStrength(accessPointVariantMap.value("s").toInt());
accessPoint->setProtected(accessPointVariantMap.value("p").toBool());
accessPointsList.append(accessPoint);
}
m_accessPoints->setWirelessAccessPoints(accessPointsList);
m_accessPoints->setSelectedNetwork(currentConnection.value("e").toString(), currentConnection.value("m").toString());
break;
}
default:
break;
}
@ -639,7 +605,9 @@ void WirelessSetupManager::onConnectedChanged()
m_deviceInformationService->deleteLater();
m_netwokService->deleteLater();
m_wifiService->deleteLater();
m_systemService->deleteLater();
if (m_systemService)
m_systemService->deleteLater();
m_deviceInformationService = nullptr;
m_netwokService = nullptr;
@ -744,18 +712,17 @@ void WirelessSetupManager::onServiceDiscoveryFinished()
if (!m_systemService) {
m_systemService = controller()->createServiceObject(systemServiceUuid, this);
if (!m_systemService) {
qWarning() << "WifiSetupManager: Could not create system service.";
controller()->disconnectFromDevice();
return;
qWarning() << "WifiSetupManager: Could not create system service. Looks like this networkmanager has not implemented that.";
//controller()->disconnectFromDevice();
} else {
connect(m_systemService, &QLowEnergyService::stateChanged, this, &WirelessSetupManager::onWifiServiceStateChanged);
connect(m_systemService, &QLowEnergyService::characteristicChanged, this, &WirelessSetupManager::onWifiServiceCharacteristicChanged);
connect(m_systemService, &QLowEnergyService::characteristicRead, this, &WirelessSetupManager::onWifiServiceReadFinished);
if (m_systemService->state() == QLowEnergyService::DiscoveryRequired)
m_systemService->discoverDetails();
}
connect(m_systemService, &QLowEnergyService::stateChanged, this, &WirelessSetupManager::onWifiServiceStateChanged);
connect(m_systemService, &QLowEnergyService::characteristicChanged, this, &WirelessSetupManager::onWifiServiceCharacteristicChanged);
connect(m_systemService, &QLowEnergyService::characteristicRead, this, &WirelessSetupManager::onWifiServiceReadFinished);
if (m_systemService->state() == QLowEnergyService::DiscoveryRequired)
m_systemService->discoverDetails();
}
}

View File

@ -44,8 +44,8 @@ class WirelessSetupManager : public BluetoothDevice
Q_PROPERTY(QString firmwareRevision READ firmwareRevision NOTIFY firmwareRevisionChanged)
Q_PROPERTY(QString hardwareRevision READ hardwareRevision NOTIFY hardwareRevisionChanged)
Q_PROPERTY(QString networkStatus READ networkStatus NOTIFY networkStatusChanged)
Q_PROPERTY(QString wirelessStatus READ wirelessStatus NOTIFY wirelessStatusChanged)
Q_PROPERTY(NetworkStatus networkStatus READ networkStatus NOTIFY networkStatusChanged)
Q_PROPERTY(WirelessStatus wirelessStatus READ wirelessStatus NOTIFY wirelessStatusChanged)
Q_PROPERTY(bool networkingEnabled READ networkingEnabled NOTIFY networkingEnabledChanged)
Q_PROPERTY(bool wirelessEnabled READ wirelessEnabled NOTIFY wirelessEnabledChanged)
@ -107,6 +107,35 @@ public:
};
Q_ENUM(SystemServiceResponse)
enum NetworkStatus {
NetworkStatusUnknown = 0x00,
NetworkStatusAsleep = 0x01,
NetworkStatusDisconnected = 0x02,
NetworkStatusDisconnecting = 0x03,
NetworkStatusConnecting = 0x04,
NetworkStatusLocal = 0x05,
NetworkStatusConnectedSite = 0x06,
NetworkStatusGlobal = 0x07
};
Q_ENUM(NetworkStatus)
enum WirelessStatus {
WirelessStatusUnknown = 0x00,
WirelessStatusUnmanaged = 0x01,
WirelessStatusUnavailable = 0x02,
WirelessStatusDisconnected = 0x03,
WirelessStatusPrepare = 0x04,
WirelessStatusConfig = 0x05,
WirelessStatusNeedAuth = 0x06,
WirelessStatusIpConfig = 0x07,
WirelessStatusIpCheck = 0x08,
WirelessStatusSecondaries = 0x09,
WirelessStatusActivated = 0x0A,
WirelessStatusDeactivating = 0x0B,
WirelessStatusFailed = 0x0C
};
Q_ENUM(WirelessStatus)
explicit WirelessSetupManager(const QBluetoothDeviceInfo &deviceInfo, QObject *parent = nullptr);
QString modelNumber() const;
@ -119,14 +148,16 @@ public:
bool initializing() const;
bool working() const;
QString networkStatus() const;
QString wirelessStatus() const;
NetworkStatus networkStatus() const;
WirelessSetupManager::WirelessStatus wirelessStatus() const;
bool networkingEnabled() const;
bool wirelessEnabled() const;
WirelessAccesspoints *accessPoints();
void reloadData();
// Wireless commands
Q_INVOKABLE void loadNetworks();
Q_INVOKABLE void loadCurrentConnection();
@ -158,8 +189,8 @@ private:
bool m_initialized = false;
bool m_initializing = false;
QString m_networkStatus;
QString m_wirelessStatus;
NetworkStatus m_networkStatus;
WirelessStatus m_wirelessStatus;
bool m_readingResponse;
QByteArray m_inputDataStream;
@ -167,6 +198,8 @@ private:
QString m_ssid;
QString m_password;
QVariantList m_accessPointsVariantList;
void checkInitialized();
// Private set methods for read only properties