phonebookengines/simutility/src/simutility.cpp
changeset 27 de1630741fbe
parent 25 76a2435edfd4
child 31 2a11b5b00470
--- a/phonebookengines/simutility/src/simutility.cpp	Fri Apr 16 14:53:18 2010 +0300
+++ b/phonebookengines/simutility/src/simutility.cpp	Mon May 03 12:24:20 2010 +0300
@@ -16,10 +16,14 @@
 */
 #include "simutility.h"
 #include <mmtsy_names.h>
+#include <startupdomainpskeys.h>
+#include <e32property.h>
 
 SimUtility::SimUtility(StoreType type, int& error, QObject *parent)
     : QObject(parent),
-    m_etelStoreInfoPckg( m_etelStoreInfo )
+    m_etelStoreInfoPckg(m_etelStoreInfo),
+    m_serviceTablePckg(m_serviceTable),
+    m_activeRequest(ENoActiveRequest)
 {
     error = m_etelServer.Connect();
     if (error == KErrNone) {
@@ -47,6 +51,14 @@
             error = KErrNotSupported;
         }
     }
+    
+    if (error == KErrNone) {
+        TRAP(error, 
+                m_asyncWorker = new (ELeave)AsyncWorker(this);
+                TSecUi::InitializeLibL();
+                m_securitySettings = CSecuritySettings::NewL();
+            );
+    }
 }
 
 SimUtility::~SimUtility()
@@ -54,6 +66,10 @@
     m_etelStore.Close();
     m_etelPhone.Close();
     m_etelServer.Close();
+
+    delete m_asyncWorker;
+    delete m_securitySettings;
+    TSecUi::UnInitializeLib();
 }
 
 SimUtility::SimInfo SimUtility::getSimInfo(int& error)
@@ -81,3 +97,196 @@
     }
     return results;
 }
+
+SimUtility::AvailableStores SimUtility::getAvailableStores(int& error)
+{
+    AvailableStores availableStores;
+    if (!isSimInserted()) {
+        error = KErrNone;
+        return availableStores;
+    }
+    
+    m_serviceTableType = RMobilePhone::ESIMServiceTable;
+    unsigned long int iccCaps;
+    TRequestStatus requestStatus;
+    
+    int result = m_etelPhone.GetIccAccessCaps(iccCaps);
+    if (result == KErrNone && (iccCaps & RMobilePhone::KCapsUSimAccessSupported)) {
+        m_serviceTableType = RMobilePhone::EUSIMServiceTable;
+    }
+
+    m_etelPhone.GetServiceTable(requestStatus, m_serviceTableType, m_serviceTablePckg);
+    User::WaitForRequest(requestStatus);
+    error = requestStatus.Int();
+    
+    if (error == KErrNone) {
+        //parse service table to find what stores are supported
+         ParseServiceTable(&availableStores);
+    }
+    return availableStores;
+}
+
+bool SimUtility::verifyPin2Code()
+{
+    bool verified = false;
+    TRAP_IGNORE(verified = m_securitySettings->AskPin2L(););
+    return verified;
+}
+
+bool SimUtility::isFdnActive()
+{
+    RMobilePhone::TMobilePhoneFdnStatus fdnStatus;
+    (void)m_etelPhone.GetFdnStatus(fdnStatus);
+    if (fdnStatus == RMobilePhone::EFdnActive ||
+        fdnStatus == RMobilePhone::EFdnPermanentlyActive) {
+        return true;
+        }
+    return false;
+}
+
+int SimUtility::setFdnStatus(bool activated)
+{
+    RMobilePhone::TMobilePhoneFdnSetting fdnStatus = RMobilePhone::EFdnSetOff;
+    if (activated) {
+        fdnStatus = RMobilePhone::EFdnSetOn;
+    }
+    TRequestStatus status;
+    m_etelPhone.SetFdnSetting(status, fdnStatus);
+    User::WaitForRequest(status);
+    return status.Int();
+}
+
+bool SimUtility::startGetSimInfo()
+{
+    if(m_asyncWorker->IsActive()) {
+        return false;
+    }
+    
+    m_etelStore.GetInfo(m_asyncWorker->iStatus, (TDes8&)m_etelStoreInfoPckg);
+    m_asyncWorker->SetActive();
+    m_activeRequest = EGetInfo;
+    return true;
+}
+
+bool SimUtility::startGetAvailableStores()
+{
+    if(m_asyncWorker->IsActive()) {
+        return false;
+    }
+    
+    if (!isSimInserted()) {
+        AvailableStores availableStores;
+        emit availableStoresReady(availableStores, KErrNone);
+        return true;
+    }
+    
+    m_serviceTableType = RMobilePhone::ESIMServiceTable;
+    unsigned long int iccCaps;
+    TRequestStatus requestStatus;
+    
+    int result = m_etelPhone.GetIccAccessCaps(iccCaps);
+    if (result == KErrNone && (iccCaps & RMobilePhone::KCapsUSimAccessSupported)) {
+        m_serviceTableType = RMobilePhone::EUSIMServiceTable;
+    }
+    m_etelPhone.GetServiceTable(m_asyncWorker->iStatus, m_serviceTableType, m_serviceTablePckg);
+    m_asyncWorker->SetActive();
+    m_activeRequest = EGetAvailableStores;
+    return true;
+}
+
+void SimUtility::RequestCompleted(int error)
+{
+    if (m_activeRequest == EGetInfo) {
+        SimInfo results;
+        if (error == KErrNone) {
+            results.totalEntries = m_etelStoreInfo.iTotalEntries;
+            results.usedEntries = m_etelStoreInfo.iUsedEntries;
+            results.maxNumLength = m_etelStoreInfo.iMaxNumLength;
+            results.maxTextLength = m_etelStoreInfo.iMaxTextLength;
+            results.maxSecondNames = m_etelStoreInfo.iMaxSecondNames;
+            results.maxTextLengthSecondName = m_etelStoreInfo.iMaxTextLengthSecondName;
+            results.maxAdditionalNumbers = m_etelStoreInfo.iMaxAdditionalNumbers;
+            results.maxNumLengthAdditionalNumber = m_etelStoreInfo.iMaxNumLengthAdditionalNumber;
+            results.maxTextLengthAdditionalNumber = m_etelStoreInfo.iMaxTextLengthAdditionalNumber;
+            results.maxGroupNames = m_etelStoreInfo.iMaxGroupNames;
+            results.maxTextLengthGroupName = m_etelStoreInfo.iMaxTextLengthGroupName;
+            results.maxEmailAddr = m_etelStoreInfo.iMaxEmailAddr;
+            results.maxTextLengthEmailAddr = m_etelStoreInfo.iMaxTextLengthEmailAddr;
+        }
+        emit simInfoReady(results, error);
+    }//EGetInfo
+    else if (m_activeRequest == EGetAvailableStores) {
+        AvailableStores availableStores;
+        if (error == KErrNone) {
+            //parse service table to find what stores are supported
+             ParseServiceTable(&availableStores);
+        }
+        emit availableStoresReady(availableStores, error);
+    }//EGetAvailableStores
+    
+    m_activeRequest = ENoActiveRequest;
+}
+
+void SimUtility::ParseServiceTable(AvailableStores* availableStores) const
+{
+    if (m_serviceTableType == RMobilePhone::EUSIMServiceTable) {
+        if (m_serviceTable.iServices1To8 & RMobilePhone::KUstLocalPhBk ) {
+            availableStores->AdnStorePresent = true;
+        }
+        else {
+            availableStores->AdnStorePresent = false;
+        }
+        
+        if (m_serviceTable.iServices1To8 & RMobilePhone::KUstSDN ) {
+            availableStores->SdnStorePresent = true;
+        }
+        else {
+            availableStores->SdnStorePresent = false;
+        }
+        
+        if (m_serviceTable.iServices1To8 & RMobilePhone::KUstFDN) {
+            availableStores->FdnStorePresent = true;
+        }
+        else {
+            availableStores->FdnStorePresent = false;
+        }
+    }
+    else if (m_serviceTableType == RMobilePhone::ESIMServiceTable) {
+        if (m_serviceTable.iServices1To8 & RMobilePhone::KSstADN ) {
+            availableStores->AdnStorePresent = true;
+        }
+        else {
+            availableStores->AdnStorePresent = false;
+        }
+        
+        if (m_serviceTable.iServices17To24 & RMobilePhone::KSstSDN) {
+            availableStores->SdnStorePresent = true;
+        }
+        else {
+            availableStores->SdnStorePresent = false;
+        }
+        
+        if (m_serviceTable.iServices1To8 & RMobilePhone::KSstFDN) {
+            availableStores->FdnStorePresent = true;
+        }
+        else {
+            availableStores->FdnStorePresent = false;
+        }
+    }
+}
+    
+bool SimUtility::isSimInserted() const
+{
+    bool result = false;
+    
+    RProperty property;   
+    int simStatus = KErrNotFound;
+    
+    int ret = property.Get(KPSUidStartup, KPSSimStatus, simStatus);
+    if (simStatus == ESimUsable && ret == KErrNone) {
+        result = true;
+        }
+    
+    property.Close();
+    return result;
+}