--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/javaextensions/mobinfo/src.s60/javamobinfo.cpp Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,1094 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: javamobinfo implementation
+ *
+*/
+
+
+#include <e32base.h>
+#include <etelmm.h>
+#include <mmtsy_names.h> // TSY and Phone name
+#include <commsdattypesv1_1.h>
+#include <cdblen.h>
+#include <commdb.h>
+#include <rconnmon.h>
+
+#include <cmmanager.h>
+#include <cmconnectionmethoddef.h>
+#include <cmpluginpacketdatadef.h>
+#include <cmpluginwlandef.h>
+#include <cmpluginhscsddef.h>
+using namespace CMManager;
+
+#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <es_sock.h>
+#include <es_enum.h>
+#else
+#include <es_enum_internal.h>
+#include <es_sock_partner.h>
+#endif
+
+#include "logger.h"
+#include "s60commonutils.h"
+
+#include "com_nokia_mj_impl_properties_mobinfo_MobileInfoProperties.h"
+#include "mobinfoconstants.h"
+
+#include "javauids.h"
+
+using namespace std;
+using namespace CommsDat;
+
+_LIT(KNetworkAvailable, "available");
+_LIT(KNetworkUnavailable, "unavailable");
+
+_LIT(KNetworkAccessPdLAN, "lan"); // Local Area Network
+_LIT(KNetworkAccessPdGSM, "pd"); // Packet data in GSM network
+_LIT(KNetworkAccessPdEDGE, "pd.EDGE"); // Packet data in EDGE network
+_LIT(KNetworkAccessPd3G, "pd.3G"); // Packet data in 3G network
+_LIT(KNetworkAccessHSPDA, "pd.HSPDA"); // High speed downlink packet access for 3G networks
+_LIT(KNetworkAccessCSD, "csd"); // Circuit switched data, for example GSM CSD/HSCSD data call
+_LIT(KNetworkAccessBtPan, "bt_pan"); // Bluetooth PAN network
+_LIT(KNetworkAccessWLAN, "wlan"); // Wireless network, for example 802.11b, 802.11G or WiMaX
+_LIT(KNetworkAccessNa, "na"); // Not applicable, the implementation can’t determine the type
+
+_LIT(KNetworkStatusHome, "home"); // Home operator
+_LIT(KNetworkStatusRoaming, "roaming"); // Roaming
+_LIT(KNetworkStatusUnknown, "unknown"); // Unknown operator
+
+_LIT(KMSISDNSeparator, " "); // separator MSISDN numbers
+
+const TInt KMaxPropertySize = 50;
+const TInt KJVMProcessUid = KJavaMidp;
+
+// ---------------------------------------------------------------------------
+// forward declarations
+// ---------------------------------------------------------------------------
+HBufC* GetProperty(const TInt aProperty, const TUint32 aAppDefaultApn);
+HBufC* GetTelephonyPropertyL(const TInt aProperty);
+HBufC* GetDateTimePropertyL(const TInt aProperty);
+HBufC* GetNetworkAccessL(const TUint32 aAppDefaultApn);
+TUint32 GetUsedIapL();
+HBufC* GetBearerTypeL(TUint32 aIapId);
+HBufC* TranslateBearerInfoToNetworkAccessL(TConnMonBearerInfo aBearerInfo);
+HBufC* GetDefIapBearerTypeL(TUint32 aMidSuiteId);
+
+/*
+ * Class: com_nokia_mj_impl_properties_mobinfo_MobileInfoProperties
+ * Method: _getProperty
+ * Signature: (I)Ljava/lang/String;
+ */
+
+// ---------------------------------------------------------------------------
+// JNI function called from java side from MobileInfoProperties class.
+// Each mobinfo java property implementation calls the getPropertyMsid()
+// function of the MobileInfoProperties class.
+// @param aProperty name of the actual property
+// @param aAppDefaultApn Application default apn
+// -----------------------------------------------------------------------------
+JNIEXPORT jstring JNICALL
+Java_com_nokia_mj_impl_properties_mobinfo_MobileInfoProperties__1getPropertyApn
+(JNIEnv* aJni, jclass, jint aProperty, jint aAppDefaultApn)
+{
+ LOG1(ESOCKET, EInfo, "MOBINFO + getPropertyMsid(), msid: %D", aAppDefaultApn);
+ HBufC* property = NULL;
+ jstring str = NULL;
+ property = GetProperty(aProperty, aAppDefaultApn);
+ if (NULL != property)
+ {
+ LOG(ESOCKET,EInfo,"_getPropertyApn, property is not null");
+ str = java::util::S60CommonUtils::NativeToJavaString(*aJni, property->Des());
+ LOG(ESOCKET, EInfo,"MOBINFO - after nativetojavastring");
+ //LOG1( ESOCKET, EInfo,"MOBINFO returning value: %S", property->Des());
+ delete property;
+ }
+ LOG(ESOCKET, EInfo, "MOBINFO - getPropertyMsid()");
+ return str;
+}
+
+JNIEXPORT jstring JNICALL Java_com_nokia_mj_impl_properties_mobinfo_MobileInfoProperties__1getProperty
+(JNIEnv *aJni, jobject, jint aKey)
+{
+ LOG1(ESOCKET, EInfo, "MOBINFO Key: %d", aKey);
+ HBufC* property = NULL;
+ jstring str = NULL;
+
+ property = GetProperty(aKey,NULL);
+ if (NULL != property)
+ {
+ TPtrC data(property->Des());
+ str = java::util::S60CommonUtils::NativeToJavaString(*aJni, data);
+ delete property;
+ }
+ return str;
+}
+
+HBufC* GetProperty(const TInt aProperty, const TUint32 aAppDefaultApn)
+{
+ JELOG2(ESOCKET);
+ LOG(ESOCKET, EInfo, "MOBINFO + GetProperty()");
+ HBufC* property = NULL;
+ TInt err;
+
+ switch (aProperty)
+ {
+ case DATEFORMAT:
+ case TIMEFORMAT:
+ TRAP(err, property = GetDateTimePropertyL(aProperty));
+ break;
+ case NETWORK_ACCESS:
+ TRAP(err, property = GetNetworkAccessL(aAppDefaultApn));
+ LOG(ESOCKET, EInfo,"after GetNetworkAccessL");
+ break;
+
+ default:
+ TRAP(err, property = GetTelephonyPropertyL(aProperty));
+ break;
+ }
+ return property;
+}
+
+// ---------------------------------------------------------------------------
+// Finds the default TSY module name from the CommDB. The GlobalSettings
+// table contains a field: ModemForPhoneServicesAndSMS, this field point to
+// a record in the ModemBearer table. The function reads the TsyName from
+// this linked table.
+// @param aTsyName TSY name to be initialized
+// -----------------------------------------------------------------------------
+void GetDefaultTSYL(TDes& aTsyName)
+{
+ JELOG2(ESOCKET);
+
+ CMDBSession* db = CMDBSession::NewL(KCDVersion1_1);
+ CleanupStack::PushL(db);
+
+ // Load Global Settings record (there is always only 1 record in it)
+ CCDGlobalSettingsRecord
+ * ptrSingleGlSettingRecord =
+ static_cast<CCDGlobalSettingsRecord*>(CCDRecordBase::RecordFactoryL(
+ KCDTIdGlobalSettingsRecord));
+ CleanupStack::PushL(ptrSingleGlSettingRecord);
+
+ ptrSingleGlSettingRecord->iRecordTag.SetL(1);
+ if (ptrSingleGlSettingRecord->FindL(*db))
+ {
+ // Find record by RecordTag
+ CCDModemBearerRecord
+ * ptrModemRecord =
+ static_cast<CCDModemBearerRecord*>(CCDRecordBase::RecordFactoryL(
+ KCDTIdModemBearerRecord));
+ CleanupStack::PushL(ptrModemRecord);
+
+ ptrModemRecord->iRecordTag.SetL(
+ ptrSingleGlSettingRecord->iModemForPhoneServicesAndSMS);
+ if (ptrModemRecord->FindL(*db))
+ {
+ aTsyName.Copy(ptrModemRecord->iTsyName);
+ }
+
+ CleanupStack::PopAndDestroy(ptrModemRecord);
+ }
+
+ CleanupStack::PopAndDestroy(ptrSingleGlSettingRecord);
+ CleanupStack::PopAndDestroy(db);
+}
+
+// ---------------------------------------------------------------------------
+// Initializes the given RTelServer with the default TSY (GetDefaultTSYL)
+// module and opens the corresponding RMobilePhone. The searching of the
+// correct phone is based on the TSY name.
+// @param aMobilePhone RMobilePhone to be opened
+// @param aTelServer RTelServer instance to be initialized
+// -----------------------------------------------------------------------------
+void GetDefaultPhoneL(RMobilePhone& aMobilePhone, RTelServer& aTelServer)
+{
+ JELOG2(ESOCKET);
+
+ HBufC* tsyName = HBufC16::NewLC(KCommsDbSvrMaxFieldLength);
+ TPtr tsyPtr(tsyName->Des());
+ GetDefaultTSYL(tsyPtr);
+ //LOG1(ESOCKET, EInfo, "MOBINFO Default Tsy = %S", tsyPtr);
+
+ User::LeaveIfError(aTelServer.LoadPhoneModule(*tsyName));
+ LOG(ESOCKET, EInfo, "MOBINFO TSY loaded...");
+
+ // Get the name of the first phone
+ TInt numPhones = 0;
+ User::LeaveIfError(aTelServer.EnumeratePhones(numPhones));
+ LOG1(ESOCKET, EInfo, "MOBINFO - Phone count %D", numPhones);
+
+ // Iterate through the phones until we find the correct one
+ while (numPhones > 0)
+ {
+ // The GetTsyName function requires the index of the phone
+ // so we must decrease the number here
+ --numPhones;
+ TName phoneTsy;
+ User::LeaveIfError(aTelServer.GetTsyName(numPhones, phoneTsy));
+ //LOG1(ESOCKET, EInfo, "MOBINFO Available phone...%S", phoneTsy);
+ if (phoneTsy.CompareF(*tsyName) == KErrNone)
+ {
+ // Get the phone info
+ RTelServer::TPhoneInfo info;
+ User::LeaveIfError(aTelServer.GetPhoneInfo(numPhones, info));
+
+ //LOG1(ESOCKET, EInfo, "MOBINFO Opening phone...%S", info.iName);
+
+ TInt error = aMobilePhone.Open(aTelServer, info.iName);
+ LOG1(ESOCKET, EInfo, "MOBINFO Phone status %D", error);
+ User::LeaveIfError(error);
+
+ // We can finish the search here
+ numPhones = 0;
+ }
+ }
+
+ CleanupStack::PopAndDestroy(tsyName);
+}
+
+// ---------------------------------------------------------------------------
+// Retrieves the IMEI or IMSI number.
+// @param aMobilePhone initialized RMobilePhone instance.
+// @param aProperty the name of the actual property
+// @return percentage of battery charge level
+// -----------------------------------------------------------------------------
+HBufC* GetIdentityPropertyL(RMobilePhone& aMobilePhone, const TInt aProperty)
+{
+ JELOG2(ESOCKET);
+
+ TUint32 identityCaps = 0;
+ HBufC* telephonyProperty = NULL;
+ TRequestStatus status;
+
+ LOG(ESOCKET, EInfo, "MOBINFO + GetIdentityPropertyL()");
+ LOG(ESOCKET, EInfo, "MOBINFO Checking phone identitycaps");
+
+ TInt identityStatus = aMobilePhone.GetIdentityCaps(identityCaps);
+ LOG1(ESOCKET, EInfo, "MOBINFO Checking identity caps status=%D", identityStatus);
+
+ if ((identityCaps & RMobilePhone::KCapsGetSubscriberId)
+ && (aProperty == IMSI))
+ {
+ LOG(ESOCKET, EInfo, "MOBINFO retrieving IMSI");
+
+ // initialise a variable to hold IMSI
+ RMobilePhone::TMobilePhoneSubscriberId imsi;
+
+ // put values into variable
+ aMobilePhone.GetSubscriberId(status, imsi);
+ User::WaitForRequest(status);
+ User::LeaveIfError(status.Int());
+ LOG(ESOCKET, EInfo, "MOBINFO returning property IMSI");
+ telephonyProperty = imsi.AllocL();
+ }
+
+ if ((identityCaps & RMobilePhone::KCapsGetSerialNumber)
+ && (aProperty == IMEI))
+ {
+ LOG(ESOCKET, EInfo, "MOBINFO retrieving IMEI");
+
+ RMobilePhone::TMobilePhoneIdentityV1 phoneId;
+ aMobilePhone.GetPhoneId(status, phoneId);
+ User::WaitForRequest(status);
+ User::LeaveIfError(status.Int());
+ LOG(ESOCKET, EInfo, "MOBINFO returning property IMEI");
+ telephonyProperty = (phoneId.iSerialNumber).AllocL();
+ }
+
+ return telephonyProperty;
+}
+
+// ---------------------------------------------------------------------------
+// Retrieves the battery charge level in percentage.
+// @param aMobilePhone initialized RMobilePhone instance.
+// @return percentage of battery charge level
+// -----------------------------------------------------------------------------
+HBufC* GetBatteryPropertyL(RMobilePhone& aMobilePhone)
+{
+ JELOG2(ESOCKET);
+
+ HBufC* telephonyProperty = NULL;
+ LOG(ESOCKET, EInfo, "MOBINFO + GetBatteryPropertyL()");
+
+ // Check BatteryCaps
+ TUint32 batteryCaps;
+ LOG(ESOCKET, EInfo, "MOBINFO Checking phone BatteryCaps");
+
+ TInt batteryCapsStatus = aMobilePhone.GetBatteryCaps(batteryCaps);
+ LOG1(ESOCKET, EInfo, "MOBINFO Checking Battery caps status=%D",
+ batteryCapsStatus);
+
+ if (batteryCapsStatus == KErrNone)
+ {
+ TRequestStatus status;
+
+ LOG(ESOCKET, EInfo, "MOBINFO retrieving battery charge level");
+ RMobilePhone::TMobilePhoneBatteryInfoV1 info;
+ aMobilePhone.GetBatteryInfo(status, info);
+ User::WaitForRequest(status);
+ User::LeaveIfError(status.Int());
+ LOG(ESOCKET, EInfo, "MOBINFO returning property Battery charge level");
+
+ TBuf<KMaxPropertySize> buf; // percentage of battery charge level
+ buf.Num(info.iChargeLevel);
+ telephonyProperty = buf.AllocL();
+ }
+
+ LOG(ESOCKET, EInfo, "MOBINFO - GetBatteryPropertyL()");
+ return telephonyProperty;
+}
+
+// ---------------------------------------------------------------------------
+// Retrieves the network related properties.
+// @param aMobilePhone initialized RMobilePhone instance.
+// @param aProperty name of the actual property
+// @return property value
+// -----------------------------------------------------------------------------
+HBufC* GetNetworkPropertyL(RMobilePhone& aMobilePhone, const TInt aProperty)
+{
+ JELOG2(ESOCKET);
+
+ HBufC* telephonyProperty = NULL;
+ LOG(ESOCKET, EInfo, "MOBINFO + GetNetworkPropertyL()");
+
+ if ((aProperty == NETWORK_ID) || (aProperty == COUNTRY_CODE) || (aProperty
+ == CELLID))
+ {
+ // Check NetworkCaps
+ TUint32 networkCaps;
+ LOG(ESOCKET, EInfo, "MOBINFO Checking phone NetworkCaps");
+
+ TInt networkCapsStatus = aMobilePhone.GetNetworkCaps(networkCaps);
+ LOG1(ESOCKET, EInfo, "MOBINFO Checking network caps status=%D",
+ networkCapsStatus);
+ if (networkCapsStatus == KErrNone)
+ {
+ TRequestStatus status;
+
+ if ((networkCaps & RMobilePhone::KCapsGetCurrentNetwork)
+ && (aProperty == NETWORK_ID))
+ {
+ LOG(ESOCKET, EInfo, "MOBINFO retrieving NetworkId");
+
+ RMobilePhone::TMobilePhoneOPlmnV3 locInfo;
+ RMobilePhone::TMobilePhoneOPlmnV3Pckg pckgLocInfo(locInfo);
+
+ RMobilePhone::TMobilePhoneNetworkNameV3 networkName;
+ RMobilePhone::TMobilePhoneNetworkNameV3Pckg pckgNetworkName(
+ networkName);
+ aMobilePhone.GetCurrentNetworkName(status, pckgNetworkName,
+ pckgLocInfo);
+ User::WaitForRequest(status);
+ User::LeaveIfError(status.Int());
+ LOG(ESOCKET, EInfo, "MOBINFO returning property NetworkId");
+ _LIT(KStringFormat, "%S (%S)");
+
+ // 8 is the max length of MNC, + 3 chars needed for the
+ // formatting chars like space, "(" and ")"
+ TBuf<KMaxPropertySize + RMobilePhone::KMaxNetworkNameFieldSize>
+ disp;
+ disp.Format(KStringFormat, &locInfo.iNetworkId,
+ &networkName.iShortName);
+ telephonyProperty = disp.AllocL();
+ }
+ else if ((networkCaps & RMobilePhone::KCapsGetCurrentNetwork)
+ && (aProperty == CELLID))
+ {
+ LOG(ESOCKET, EInfo, "MOBINFO retrieving CellId");
+
+ RMobilePhone::TMobilePhoneNetworkInfoV1 networkInfo;
+ RMobilePhone::TMobilePhoneNetworkInfoV1Pckg networkInfoPckg(
+ networkInfo);
+ RMobilePhone::TMobilePhoneLocationAreaV1 locationArea;
+ aMobilePhone.GetCurrentNetwork(status, networkInfoPckg,
+ locationArea);
+
+ User::WaitForRequest(status);
+ User::LeaveIfError(status.Int());
+
+ LOG(ESOCKET, EInfo, "MOBINFO returning property CellId");
+
+ TBuf<KMaxPropertySize> disp;
+ disp.Num(locationArea.iCellId, EDecimal);
+ telephonyProperty = disp.AllocL();
+ }
+ else // COUNTRY_CODE
+ {
+ LOG(ESOCKET, EInfo, "MOBINFO retrieving CountryCode");
+
+ RMobilePhone::TMobilePhoneOPlmnV3 locInfo;
+ RMobilePhone::TMobilePhoneOPlmnV3Pckg pckgLocInfo(locInfo);
+
+ RMobilePhone::TMobilePhoneNetworkNameV3 networkName;
+ RMobilePhone::TMobilePhoneNetworkNameV3Pckg pckgNetworkName(
+ networkName);
+ aMobilePhone.GetCurrentNetworkName(status, pckgNetworkName,
+ pckgLocInfo);
+ User::WaitForRequest(status);
+ User::LeaveIfError(status.Int());
+ LOG(ESOCKET, EInfo, "MOBINFO returning property CountryCode");
+ telephonyProperty = (locInfo.iCountryCode).AllocL();
+ }
+ }
+ }
+ else if (aProperty == NETWORK_SIGNAL)
+ {
+ // Check Signal related Caps
+ TUint32 signalCaps;
+ LOG(ESOCKET, EInfo, "MOBINFO Checking phone SignalCaps");
+
+ TInt signalCapsStatus = aMobilePhone.GetSignalCaps(signalCaps);
+ LOG1(ESOCKET, EInfo, "MOBINFO Checking signal caps status=%D",
+ signalCapsStatus);
+ if (signalCapsStatus == KErrNone)
+ {
+ TRequestStatus status;
+
+ if (signalCaps & RMobilePhone::KCapsGetSignalStrength)
+ {
+ LOG(ESOCKET, EInfo, "MOBINFO retrieving SignalStrength");
+
+ TInt32 signalStrength;
+ TInt8 bar;
+ aMobilePhone.GetSignalStrength(status, signalStrength, bar);
+ User::WaitForRequest(status);
+ User::LeaveIfError(status.Int());
+ LOG(ESOCKET, EInfo,
+ "MOBINFO returning property SignalStrength");
+ _LIT(KStringFormat, "%d (%d dBm)");
+
+ TBuf<KMaxPropertySize> disp;
+ disp.Format(KStringFormat, bar, signalStrength);
+ telephonyProperty = disp.AllocL();
+ }
+ }
+ }
+ else if (aProperty == NETWORKSTATUS)
+ {
+ // Check network status
+ LOG(ESOCKET, EInfo, "MOBINFO Checking network status");
+
+ // Check NetworkCaps
+ TUint32 networkCaps;
+ TInt networkCapsStatus = aMobilePhone.GetNetworkCaps(networkCaps);
+ LOG1(ESOCKET, EInfo, "MOBINFO Checking network caps status=%D",
+ networkCapsStatus);
+ if (networkCapsStatus == KErrNone)
+ {
+ TRequestStatus status;
+ RMobilePhone::TMobilePhoneRegistrationStatus networkStatus;
+
+ aMobilePhone.GetNetworkRegistrationStatus(status, networkStatus);
+ User::WaitForRequest(status);
+ User::LeaveIfError(status.Int());
+
+ switch (networkStatus)
+ {
+ case RMobilePhone::ERegisteredOnHomeNetwork:
+ case RMobilePhone::ERegisteredBusy:
+ telephonyProperty = KNetworkStatusHome().AllocL();
+ break;
+
+ case RMobilePhone::ERegisteredRoaming:
+ telephonyProperty = KNetworkStatusRoaming().AllocL();
+ break;
+
+ default:
+ telephonyProperty = KNetworkStatusUnknown().AllocL();
+ break;
+ }
+ }
+ LOG(ESOCKET, EInfo, "MOBINFO returning property NetworkStatus");
+ }
+ else // NETWORK_AVAILABILITY
+ {
+ // Check NetworkAvailability related Caps
+ TUint32 indCaps;
+ TUint32 actionCaps;
+ LOG(ESOCKET, EInfo, "MOBINFO Checking phone IndicatorCaps");
+
+ TInt indicatorCapsStatus = aMobilePhone.GetIndicatorCaps(actionCaps,
+ indCaps);
+ LOG1(ESOCKET, EInfo, "MOBINFO Checking IndicatorCaps status=%D",
+ indicatorCapsStatus);
+ if (indicatorCapsStatus == KErrNone)
+ {
+ TRequestStatus status;
+
+ if (indCaps & RMobilePhone::KCapsGetIndicator)
+ {
+ LOG(ESOCKET, EInfo, "MOBINFO retrieving Network Availability");
+
+ TUint32 indicator;
+ aMobilePhone.GetIndicator(status, indicator);
+ User::WaitForRequest(status);
+ User::LeaveIfError(status.Int());
+ LOG(ESOCKET, EInfo,
+ "MOBINFO returning property NetworkAvailability");
+ if (indicator & RMobilePhone::KIndNetworkAvailable)
+ {
+ telephonyProperty = HBufC::NewL(KMaxPropertySize);
+ telephonyProperty->Des().Append(KNetworkAvailable);
+ }
+ else
+ {
+ telephonyProperty = HBufC::NewL(KMaxPropertySize);
+ telephonyProperty->Des().Append(KNetworkUnavailable);
+ }
+ }
+ }
+ }
+
+ LOG(ESOCKET, EInfo, "MOBINFO - GetNetworkPropertyL()");
+ return telephonyProperty;
+}
+
+// ---------------------------------------------------------------------------
+// Retrieves the date and time format related properties.
+// @param aProperty name of the actual property
+// @return error code
+// -----------------------------------------------------------------------------
+HBufC* GetDateTimePropertyL(const TInt aProperty)
+{
+ JELOG2(ESOCKET);
+
+ HBufC* property = HBufC::NewMax(KMaxPropertySize);
+ TLocale locale;
+ TDateFormat dformat;
+ TChar dseparator;
+ TTimeFormat tformat;
+ TChar separator;
+
+ switch (aProperty)
+ {
+ case DATEFORMAT:
+ dformat = locale.DateFormat();
+ dseparator = locale.DateSeparator(1);
+
+ switch (dformat)
+ {
+ case EDateAmerican:
+ property->Des().Copy(_L("MM"));
+ property->Des().Append(dseparator);
+ property->Des().Append(_L("dd"));
+ property->Des().Append(dseparator);
+ property->Des().Append(_L("yyyy"));
+ break;
+
+ case EDateEuropean:
+ property->Des().Copy(_L("dd"));
+ property->Des().Append(dseparator);
+ property->Des().Append(_L("MM"));
+ property->Des().Append(dseparator);
+ property->Des().Append(_L("yyyy"));
+ break;
+
+ case EDateJapanese:
+ property->Des().Copy(_L("yyyy"));
+ property->Des().Append(dseparator);
+ property->Des().Append(_L("MM"));
+ property->Des().Append(dseparator);
+ property->Des().Append(_L("dd"));
+ break;
+ }
+ break;
+
+ case TIMEFORMAT:
+ tformat = locale.TimeFormat();
+ separator = locale.TimeSeparator(1);
+
+ switch (tformat)
+ {
+ case ETime12:
+ property->Des().Copy(_L("hh"));
+ property->Des().Append(separator);
+ property->Des().Append(_L("mm a"));
+ break;
+
+ case ETime24:
+ property->Des().Copy(_L("HH"));
+ property->Des().Append(separator);
+ property->Des().Append(_L("mm"));
+ break;
+ }
+ }
+ return property;
+}
+
+// ---------------------------------------------------------------------------
+// Retrieves the network related properties.
+// @param aMobilePhone initialized RMobilePhone instance.
+// @param aTelServer initialized RTelServer instance.
+// @return property value
+// ---------------------------------------------------------------------------
+HBufC* GetMSISDNPropertyL(RMobilePhone& aMobilePhone, RTelServer& aTelServer)
+{
+ JELOG2(ESOCKET);
+ LOG(ESOCKET, EInfo, "MOBINFO + GetMSISDNPropertyL()");
+
+ HBufC* property = NULL;
+
+ // get default TSY name
+ HBufC* tsyName = HBufC16::NewLC(KCommsDbSvrMaxFieldLength);
+ TPtr tsyPtr(tsyName->Des());
+ GetDefaultTSYL(tsyPtr); // used in GetDefaultPhone()
+
+ LOG(ESOCKET, EInfo, "MOBINFO Retrieving info about for own number store");
+
+ TBool supported;
+ User::LeaveIfError(aTelServer.IsSupportedByModule(tsyPtr,
+ KETelFuncMobileOwnNumberStore, supported));
+
+ LOG1(
+ ESOCKET,
+ EInfo,
+ "MOBINFO Checking own number store suppport by TSY, supported = %D: ",
+ (TInt) supported);
+ CleanupStack::PopAndDestroy(tsyName);
+
+ if (supported)
+ {
+ RMobileONStore ownNumberStore;
+ User::LeaveIfError(ownNumberStore.Open(aMobilePhone));
+ CleanupClosePushL(ownNumberStore);
+
+ RMobileONStore::TMobileONStoreInfoV1 ownStoreInfo;
+ RMobileONStore::TMobileONStoreInfoV1Pckg ownStoreInfoPckg(ownStoreInfo);
+
+ TRequestStatus status;
+ ownNumberStore.GetInfo(status, ownStoreInfoPckg);
+ User::WaitForRequest(status);
+
+ LOG1(ESOCKET, EInfo,
+ "MOBINFO Checking getting own number store info status = %D ",
+ status.Int());
+ User::LeaveIfError(status.Int());
+
+ TInt ownStoreInfoUsedEntries = ownStoreInfo.iUsedEntries;
+ LOG1(ESOCKET, EInfo,
+ "MOBINFO Entries stored in own number store: %D ",
+ ownStoreInfoUsedEntries);
+
+ if (ownStoreInfoUsedEntries >= 1)
+ {
+ // calculate length for property
+ TInt size = ownStoreInfoUsedEntries
+ * RMobileONStore::KOwnNumberTextSize;
+ // take into account separators if more than one entry stored
+ size = size + ((ownStoreInfoUsedEntries - 1)
+ * KMSISDNSeparator().Length());
+ property = HBufC::NewL(size);
+
+ for (TInt index = 1; index <= ownStoreInfoUsedEntries; index++)
+ {
+ LOG(ESOCKET, EInfo, "MOBINFO Retrieving property MSISDN ");
+ RMobileONStore::TMobileONEntryV1 ownNumberEntry;
+ ownNumberEntry.iIndex = index; // = index
+ RMobileONStore::TMobileONEntryV1Pckg ownNumberEntryPckg(
+ ownNumberEntry);
+
+ status = KRequestPending;
+ ownNumberStore.Read(status, ownNumberEntryPckg);
+ User::WaitForRequest(status);
+
+ LOG1(ESOCKET, EInfo,
+ "MOBINFO Checking reading entry status = ",
+ status.Int());
+ User::LeaveIfError(status.Int());
+
+ LOG(ESOCKET, EInfo, "MOBINFO Returning property MSISDN");
+
+ property->Des().Append(ownNumberEntry.iNumber.iTelNumber);
+
+ if (index < ownStoreInfoUsedEntries)
+ {
+ property->Des().Append(KMSISDNSeparator);
+ }
+ }
+ }
+ CleanupStack::PopAndDestroy(&ownNumberStore);
+ }
+
+ LOG(ESOCKET, EInfo, "MOBINFO - GetMSISDNPropertyL()");
+ return property;
+}
+
+// ---------------------------------------------------------------------------
+// The funtion used for "Telephony related" properties which are requires an
+// initialized RTel server and RMobilePhone.
+// @param aProperty name of the actual property
+// @return property value
+// -----------------------------------------------------------------------------
+HBufC* GetTelephonyPropertyL(const TInt aProperty)
+{
+ JELOG2(ESOCKET);
+ LOG(ESOCKET, EInfo, "MOBINFO + GetTelephonyPropertyL");
+
+ // Construct a connection to the RTel server
+ RTelServer telServer;
+ User::LeaveIfError(telServer.Connect());
+ LOG(ESOCKET, EInfo,
+ "MOBINFO GetTelephonyPropertyL: connected to the RTel server");
+ CleanupClosePushL(telServer);
+
+ RMobilePhone mobilePhone;
+ CleanupClosePushL(mobilePhone);
+ GetDefaultPhoneL(mobilePhone, telServer);
+ LOG(ESOCKET, EInfo,
+ "MOBINFO GetTelephonyPropertyL: after get default phoneconnected to the RTel server");
+
+ HBufC* telephonyProperty = NULL;
+
+ switch (aProperty)
+ {
+ case IMSI:
+ case IMEI:
+ telephonyProperty = GetIdentityPropertyL(mobilePhone, aProperty);
+ break;
+
+ case MSISDN:
+ telephonyProperty = GetMSISDNPropertyL(mobilePhone, telServer);
+ break;
+
+ case BATTERY_LEVEL:
+ telephonyProperty = GetBatteryPropertyL(mobilePhone);
+ break;
+
+ case NETWORK_ID:
+ case NETWORK_SIGNAL:
+ case NETWORK_AVAILABILITY:
+ case COUNTRY_CODE:
+ case CELLID:
+ case NETWORKSTATUS:
+ telephonyProperty = GetNetworkPropertyL(mobilePhone, aProperty);
+ break;
+ }
+
+ CleanupStack::PopAndDestroy(&mobilePhone);
+ CleanupStack::PopAndDestroy(&telServer);
+ LOG(ESOCKET, EInfo, "MOBINFO - GetTelephonyPropertyL()");
+ return telephonyProperty;
+}
+
+// ---------------------------------------------------------------------------
+// Get type network access of currently used active connection
+// @return network access, ownership hand over
+// ---------------------------------------------------------------------------
+HBufC* GetNetworkAccessL(TUint32 aAppDefaultApn)
+{
+ LOG(ESOCKET, EInfo, "MOBINFO + GetNetworkAccessL");
+ HBufC* bearerType = NULL;
+ TUint32 iapId = GetUsedIapL();
+ if (iapId == 0)
+ {
+ bearerType = GetDefIapBearerTypeL(aAppDefaultApn);
+ }
+ else
+ {
+ bearerType = GetBearerTypeL(iapId);
+ }
+ LOG(ESOCKET, EInfo, "MOBINFO - GetNetworkAccessL");
+ return bearerType;
+}
+
+//// ---------------------------------------------------------------------------
+//// Get currently used Access point ID
+//// @return currently used Acess point ID
+//// ---------------------------------------------------------------------------
+TUint32 GetUsedIapL()
+{
+ LOG(ESOCKET, EInfo, "MOBINFO + GetUsedIapL()");
+
+ RSocketServ socketServer;
+ RConnection connection;
+ TConnEnumArgBuf enumArgBuf;
+ TConnGetClientInfoArgBuf clientInfoBuf;
+ TUint connectionCount(0);
+ TConnectionInfoBuf connInfoBuf;
+ TUint32 iapId(0);
+
+ // Get MIDlet process ID
+ RProcess process;
+ RThread thread;
+ TProcessId currProcessId(process.Id());
+ TThreadId currThreadId(thread.Id());
+ //LOG1( ESOCKET, EInfo, "MOBINFO Current process ID: %D", currProcessId );
+ //LOG1( ESOCKET, EInfo, "MOBINFO Current thread ID: %D", currThreadId );
+
+ // Connect to socket server and use system global pool (-1)
+ // for message slots.
+ LOG(ESOCKET, EInfo, "MOBINFO Connecting to socket server");
+ User::LeaveIfError(socketServer.Connect(static_cast< TUint >(-1)));
+ CleanupClosePushL(socketServer);
+ LOG(ESOCKET, EInfo, "MOBINFO Connected to socket server");
+
+ // Open RConnection,
+ // this object is not attached to any connection
+ LOG(ESOCKET, EInfo, "MOBINFO Opening connection");
+ User::LeaveIfError(connection.Open(socketServer));
+ CleanupClosePushL(connection);
+ LOG(ESOCKET, EInfo, "MOBINFO Connection opened");
+
+ // Get count of current active connections.
+ LOG(ESOCKET, EInfo, "MOBINFO Getting count of current active connections");
+ User::LeaveIfError(connection.EnumerateConnections(connectionCount));
+ LOG1(ESOCKET, EInfo, "MOBINFO Count of active connections %D", connectionCount);
+
+ // Go through all active connections
+ for (TUint connIdx = 1; connIdx <= connectionCount && iapId == 0; connIdx++)
+ {
+ enumArgBuf().iIndex = connIdx;
+
+ // Get the number of clients
+ LOG1(ESOCKET, EInfo, "MOBINFO Getting number of clients for active connection %D.", connIdx);
+ User::LeaveIfError(connection.Control
+ (
+ KCOLConnection,
+ KCoEnumerateConnectionClients,
+ enumArgBuf
+ )
+ );
+ LOG1(ESOCKET, EInfo, "MOBINFO Number of clients: %D", enumArgBuf().iCount);
+
+ // Go through all clients
+ for (TUint clientIdx = 1;
+ clientIdx <= enumArgBuf().iCount && iapId == 0; clientIdx++)
+ {
+ clientInfoBuf().iIndex = clientIdx;
+ LOG1(ESOCKET, EInfo, "MOBINFO Retreiving client %D. info", clientIdx);
+ User::LeaveIfError(connection.Control
+ (
+ KCOLConnection,
+ KCoGetConnectionClientInfo,
+ clientInfoBuf
+ )
+ );
+ LOG(ESOCKET, EInfo, "MOBINFO Client info retreived: ");
+
+ TUid uid(clientInfoBuf().iClientInfo.iUid);
+ TProcessId processId(clientInfoBuf().iClientInfo.iProcessId);
+ TThreadId threadId(clientInfoBuf().iClientInfo.iThreadId);
+ LOG1(ESOCKET, EInfo, "MOBINFO Client UID: %D", uid.iUid);
+ //LOG1( ESOCKET, EInfo, "MOBINFO Client process ID: %D", processId );
+ //LOG1( ESOCKET, EInfo, "MOBINFO Client thread ID: %D", threadId );
+
+ // MIDlet's active connection found
+ if (uid.iUid == KJVMProcessUid && currProcessId == processId)
+ {
+ LOG(ESOCKET, EInfo, "MOBINFO Active connection of current MIDlet found");
+ TConnectionInfoBuf connInfoBuf;
+
+ LOG1(ESOCKET, EInfo, "MOBINFO Getting connection info %D", clientIdx);
+ User::LeaveIfError(
+ connection.GetConnectionInfo(connIdx, connInfoBuf)
+ );
+ LOG(ESOCKET, EInfo, "MOBINFO Connection info gotten");
+ iapId = connInfoBuf().iIapId;
+ LOG1(ESOCKET, EInfo, "MOBINFO currently used IAP ID found: %D", iapId);
+ }
+ }
+ }
+
+ LOG1(ESOCKET, EInfo, "MOBINFO currently used IAP ID: %D", iapId);
+ CleanupStack::PopAndDestroy(&connection);
+ CleanupStack::PopAndDestroy(&socketServer);
+ LOG(ESOCKET, EInfo, "MOBINFO - GetUsedIapL()");
+ return iapId;
+}
+
+// ---------------------------------------------------------------------------
+// Get IAP's bearer type
+// @param aIapId IAP ID
+// @return bearer type, ownership handed over
+// "LAN" Local area network
+// 'pd.GSM" Packet data in GSM network
+// "pd.EDGE" Packet data in EDGE network
+// "pd.3G" Packet data in 3G network
+// "csd" Circuit switched data, for example GSM CSD/HSCSD data call
+// "bt_pan" Bluetooth PAN network
+// "wlan" Wireless network, for example 802.11b, 802.11G or WiMaX
+// "hspda" High speed downlink packet access for 3G networks
+// "na" Not applicable, the implementation can’t determine the type
+// ---------------------------------------------------------------------------
+HBufC* GetBearerTypeL(TUint32 aIapId)
+{
+ LOG(ESOCKET, EInfo, "MOBINFO + GetBearerTypeL()");
+ RConnectionMonitor monitor;
+ TUint connectionCount(0);
+ TUint iapId(0);
+ TRequestStatus status(KErrNone);
+ HBufC* bearerType(NULL);
+ TUint connectionId(0);
+ TUint subConnectionCount(0);
+ TConnMonBearerInfo bearerInfo(EBearerInfoUnknown);
+
+ LOG(ESOCKET, EInfo, "MOBINFO Connecting to Connection Monitor");
+ User::LeaveIfError(monitor.ConnectL());
+ CleanupClosePushL(monitor);
+ LOG(ESOCKET, EInfo, "MOBINFO Connected to Connection Monitor");
+
+ LOG(ESOCKET, EInfo, "MOBINFO Getting count of active connections");
+ status = KRequestPending;
+ monitor.GetConnectionCount(connectionCount, status);
+ User::WaitForRequest(status);
+ User::LeaveIfError(status.Int());
+ LOG1(ESOCKET, EInfo, "MOBINFO Count of active connections: %D", connectionCount);
+
+ // Go through all connections
+ for (TUint connIdx = 1; connIdx <= connectionCount && iapId == 0;
+ ++connIdx)
+ {
+ connectionId = 0;
+ subConnectionCount = 0;
+
+ // Get connection ID
+ LOG1(ESOCKET, EInfo, "MOBINFO Getting connection info %D", connIdx);
+ monitor.GetConnectionInfo(connIdx, connectionId, subConnectionCount);
+ User::LeaveIfError(connectionId);
+ LOG(ESOCKET, EInfo, "MOBINFO Connection info gotten");
+
+ // Get connection IAP ID
+ LOG1(ESOCKET, EInfo, "MOBINFO Getting connection %D IAP ID", connIdx);
+ status = KRequestPending;
+ monitor.GetUintAttribute(connectionId, 0, KIAPId, iapId, status);
+ User::WaitForRequest(status);
+ User::LeaveIfError(status.Int());
+ LOG1(ESOCKET, EInfo, "MOBINFO Connection 's IAP ID found: %D", iapId);
+
+ if (iapId == aIapId)
+ {
+ // MIDlet's IAP found
+ LOG(ESOCKET, EInfo, "MOBINFO Midlet's IAP found");
+
+ // Get bearer type
+ LOG(ESOCKET, EInfo, "MOBINFO Getting bearer type");
+ status = KRequestPending;
+ monitor.GetIntAttribute(connectionId,
+ 0,
+ KBearerInfo,
+ (TInt&)bearerInfo,
+ status);
+ User::WaitForRequest(status);
+ User::LeaveIfError(status.Int());
+ LOG1(ESOCKET, EInfo, "MOBINFO Bearer type found: %D", bearerInfo);
+ }
+ }
+
+ // Translate bearer type to type of network access
+ bearerType = TranslateBearerInfoToNetworkAccessL(bearerInfo);
+
+ CleanupStack::PopAndDestroy(&monitor);
+ LOG(ESOCKET, EInfo, "MOBINFO - GetBearerTypeL()");
+ return bearerType;
+}
+
+// ---------------------------------------------------------------------------
+// Translate bearer info to type of network access
+// @param aBearerInfo bearer info
+// @return type of network access, ownership hand over
+HBufC* TranslateBearerInfoToNetworkAccessL(TConnMonBearerInfo aBearerInfo)
+{
+ LOG(ESOCKET, EInfo, "MOBINFO + TranslateBearerInfoToNetworkAccessL()");
+ HBufC* bearerType(NULL);
+ switch (aBearerInfo)
+ {
+ case EBearerInfoLAN:
+ bearerType = KNetworkAccessPdLAN().AllocL();
+ break;
+ case EBearerInfoGPRS:
+ bearerType = KNetworkAccessPdGSM().AllocL();
+ break;
+ case EBearerInfoEdgeGPRS:
+ bearerType = KNetworkAccessPdEDGE().AllocL();
+ break;
+ case EBearerInfoWCDMA:
+ bearerType = KNetworkAccessPd3G().AllocL();
+ break;
+ case EBearerInfoCSD:
+ case EBearerInfoHSCSD:
+ case EBearerInfoWcdmaCSD:
+ bearerType = KNetworkAccessCSD().AllocL();
+ break;
+ case EBearerInfoBluetooth:
+ bearerType = KNetworkAccessBtPan().AllocL();
+ break;
+ case EBearerInfoWLAN:
+ bearerType = KNetworkAccessWLAN().AllocL();
+ break;
+ case EBearerInfoHSDPA:
+ case EBearerInfoHSUPA:
+ case EBearerInfoHSxPA:
+ bearerType = KNetworkAccessHSPDA().AllocL();
+ break;
+ case EBearerInfoUnknown:
+ case EBearerInfoCDMA2000:
+ case EBearerInfoVirtual:
+ case EBearerInfoVirtualVPN:
+ default:
+ bearerType = KNetworkAccessNa().AllocL();
+ break;
+ }
+ LOG(ESOCKET, EInfo, "MOBINFO - TranslateBearerInfoToNetworkAccessL()");
+ return bearerType;
+}
+
+
+
+// --------------------------------------------------------------------
+// Get network access type of default access point set in MIDlet settings
+// @param aAppDefaultApn MIDlet suite ID
+// @return network access type, ownership hand over
+HBufC* GetDefIapBearerTypeL(TUint32 aAppDefaultApn)
+{
+ LOG(ESOCKET, EInfo, "MOBINFO + GetDefIapBearerTypeL");
+ ELOG1(ESOCKET, "GetDefIapBearerTypeL %d", aAppDefaultApn);
+ HBufC* bearerType(NULL);
+ // MAPNSettings* apnTable = GetAPNSettingsLC(KAPNSettingsVersion);
+ //TUint32 apn = apnTable->GetAPNIdL( aMidSuiteId );
+ //CleanupStack::PopAndDestroy(); //apnTable
+ LOG1(ESOCKET, EInfo, "MIDlet specific IAP ID gotten: %D", aAppDefaultApn);
+ if (aAppDefaultApn == 0 || aAppDefaultApn == (TUint32)-1)
+ {
+ bearerType = KNetworkAccessNa().AllocL();
+ }
+ else
+ {
+ RCmManager localCmManager;
+ localCmManager.OpenL();
+ TUint32 tmpval = localCmManager.GetConnectionMethodInfoIntL(aAppDefaultApn,ECmBearerType);
+ ELOG1(ESOCKET, "GetConnectionMethodInfoIntL: %d", tmpval);
+ switch (tmpval)
+ {
+ case KUidHSCSDBearerType:
+ bearerType = KNetworkAccessCSD().AllocL();
+ break;
+ case KUidPacketDataBearerType:
+ bearerType = KNetworkAccessPdGSM().AllocL();
+ break;
+ case KUidWlanBearerType :
+ bearerType = KNetworkAccessWLAN().AllocL();
+ break;
+
+ /* Bearer type LAN,LANModem currently not supported by cmmanager */
+ default :
+ bearerType = KNetworkAccessNa().AllocL();
+ break;
+
+
+ }
+
+ }
+ LOG(ESOCKET, EInfo, "MOBINFO - GetDefIapBearerTypeL");
+ return bearerType;
+}