Revision: 201015 RCL_3 PDK_3.0.i
authorDremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 27 Apr 2010 16:49:44 +0300
branchRCL_3
changeset 16 b23265fb36da
parent 14 f7fbeaeb166a
child 20 2f88a7d66f50
Revision: 201015 Kit: 201017
bluetoothengine/bteng/inc/btengserver.h
bluetoothengine/bteng/inc/btengsrvbbconnectionmgr.h
bluetoothengine/bteng/inc/btengsrvkeywatcher.h
bluetoothengine/bteng/src/btengserver.cpp
bluetoothengine/bteng/src/btengsrvbbconnectionmgr.cpp
bluetoothengine/bteng/src/btengsrvkeywatcher.cpp
bluetoothengine/bteng/src/btengsrvpluginmgr.cpp
bluetoothengine/bteng/src/btengsrvsettingsmgr.cpp
bluetoothengine/bthid/common/inc/bthidPsKey.h
bluetoothengine/bthid/common/src/bthidpskeywatcher.cpp
bluetoothengine/bthid/keyboard/inc/keyboard.h
bluetoothengine/bthid/keyboard/src/keyboard.cpp
bluetoothengine/bthid/mouse/PaintCursor/inc/paintcursorappview.h
bluetoothengine/bthid/mouse/PaintCursor/src/paintcursorappui.cpp
bluetoothengine/bthid/mouse/PaintCursor/src/paintcursorappview.cpp
bluetoothengine/bthid/mouse/Sesame_client/inc/pointmsgqueue.h
bluetoothengine/bthid/mouse/Sesame_client/src/clientimagecommander.cpp
bluetoothengine/bthid/mouse/Sesame_server/inc/mousecursorimage.h
bluetoothengine/bthid/mouse/Sesame_server/src/mousecursorimage.cpp
bluetoothengine/bthid/mouse/hidmousedriver/inc/mouse.h
bluetoothengine/bthid/mouse/hidmousedriver/src/mouse.cpp
bluetoothengine/btsac/inc/btsacStreamerController.h
bluetoothengine/btsac/src/btsacStreamerController.cpp
bluetoothengine/btui/Ecom/src/BTUIPairedDevicesView.cpp
cbsatplugin/atmisccmdplugin/data/2002C3BA.rss
cbsatplugin/atmisccmdplugin/group/atmisccmdplugin.mmp
cbsatplugin/atmisccmdplugin/group/bld.inf
cbsatplugin/atmisccmdplugin/inc/atcommandparser.h
cbsatplugin/atmisccmdplugin/inc/atmisccmdplugin.h
cbsatplugin/atmisccmdplugin/inc/atmisccmdpluginconsts.h
cbsatplugin/atmisccmdplugin/inc/atmisccmdpluginuids.hrh
cbsatplugin/atmisccmdplugin/inc/cbccommandhandler.h
cbsatplugin/atmisccmdplugin/inc/cbsettinghandler.h
cbsatplugin/atmisccmdplugin/inc/cfuncommandhandler.h
cbsatplugin/atmisccmdplugin/inc/clckcommandhandler.h
cbsatplugin/atmisccmdplugin/inc/cmeerror.h
cbsatplugin/atmisccmdplugin/inc/cnumcommandhandler.h
cbsatplugin/atmisccmdplugin/inc/cpincommandhandler.h
cbsatplugin/atmisccmdplugin/inc/cpwdcommandhandler.h
cbsatplugin/atmisccmdplugin/inc/cusdcommandhandler.h
cbsatplugin/atmisccmdplugin/inc/cusdreadwriteimp.h
cbsatplugin/atmisccmdplugin/inc/debug.h
cbsatplugin/atmisccmdplugin/inc/securitycodeverifier.h
cbsatplugin/atmisccmdplugin/inc/securityeventhandler.h
cbsatplugin/atmisccmdplugin/readme.txt
cbsatplugin/atmisccmdplugin/rom/atmisccmdplugin.iby
cbsatplugin/atmisccmdplugin/src/atcommandparser.cpp
cbsatplugin/atmisccmdplugin/src/atmisccmdplugin.cpp
cbsatplugin/atmisccmdplugin/src/atmisccmdpluginbase.cpp
cbsatplugin/atmisccmdplugin/src/cbccommandhandler.cpp
cbsatplugin/atmisccmdplugin/src/cbsettinghandler.cpp
cbsatplugin/atmisccmdplugin/src/cfuncommandhandler.cpp
cbsatplugin/atmisccmdplugin/src/clckcommandhandler.cpp
cbsatplugin/atmisccmdplugin/src/cnumcommandhandler.cpp
cbsatplugin/atmisccmdplugin/src/cpincommandhandler.cpp
cbsatplugin/atmisccmdplugin/src/cpwdcommandhandler.cpp
cbsatplugin/atmisccmdplugin/src/cusdcommandhandler.cpp
cbsatplugin/atmisccmdplugin/src/cusdreadwriteimp.cpp
cbsatplugin/atmisccmdplugin/src/main.cpp
cbsatplugin/atmisccmdplugin/src/securitycodeverifier.cpp
cbsatplugin/atmisccmdplugin/src/securityeventhandler.cpp
cbsatplugin/group/bld.inf
group/bld.inf
--- a/bluetoothengine/bteng/inc/btengserver.h	Wed Apr 14 16:09:00 2010 +0300
+++ b/bluetoothengine/bteng/inc/btengserver.h	Tue Apr 27 16:49:44 2010 +0300
@@ -203,8 +203,8 @@
      * @since S60 v3.2
      * @param ?arg1 ?description
      */
-    void DisconnectAllL();
-
+    void DisconnectAllForPowerOffL();
+    
     /**
      * ?description
      *
--- a/bluetoothengine/bteng/inc/btengsrvbbconnectionmgr.h	Wed Apr 14 16:09:00 2010 +0300
+++ b/bluetoothengine/bteng/inc/btengsrvbbconnectionmgr.h	Tue Apr 27 16:49:44 2010 +0300
@@ -26,7 +26,7 @@
 
 #include "btengactive.h"
 
-class CBTEngActive;
+class CBTEngServer;
 
 /**  ?description */
 //const ?type ?constant_var = ?constant;
@@ -50,7 +50,7 @@
     /**
      * Two-phase constructor
      */
-    static CBTEngSrvBBConnMgr* NewL(RSocketServ& aSockServ);
+    static CBTEngSrvBBConnMgr* NewL(CBTEngServer* aServer, RSocketServ& aSockServ);
 
     /**
      * Destructor
@@ -99,6 +99,9 @@
      */
     void DisconnectAllLinksL( TCallBack& aCallBack );
 
+    void DisconnectAllLinksForPowerOffL( TCallBack& aCallBack );
+
+    
     /**
      * Indicate to turn off BT when idle.
      *
@@ -169,7 +172,7 @@
     /**
      * C++ default constructor
      */
-    CBTEngSrvBBConnMgr(RSocketServ& aSockServ);
+    CBTEngSrvBBConnMgr(CBTEngServer* aServer, RSocketServ& aSockServ);
 
     /**
      * Symbian 2nd-phase constructor
@@ -234,7 +237,13 @@
      * Not own.
      */
     TCallBack iCallBack;
-
+    
+    /**
+     * Pointer to our parent.
+     * Not own.
+     */
+    CBTEngServer* iServer;
+    
     };
 
 
--- a/bluetoothengine/bteng/inc/btengsrvkeywatcher.h	Wed Apr 14 16:09:00 2010 +0300
+++ b/bluetoothengine/bteng/inc/btengsrvkeywatcher.h	Tue Apr 27 16:49:44 2010 +0300
@@ -112,12 +112,6 @@
     RProperty iSystemStateKey;
     
      /**
-     * Property containing count of physical BT connections.
-     * When physical connections exists, specific BT UI indicator is shown.
-     */
-    RProperty iPHYCountKey;
-    
-     /**
      * Property containing the BT connecting status.
      * When connecting, specific BT UI indicator is shown.
      */
@@ -178,12 +172,6 @@
     CBTEngActive* iSystemStateWatcher;
     
     /**
-     * Active object for subscribing to PHYCount property changes.
-     * Own.
-     */    
-    CBTEngActive* iPHYCountWatcher;
-    
-    /**
      * Active object for subscribing to BT connection property changes.
      * Own.
      */    
--- a/bluetoothengine/bteng/src/btengserver.cpp	Wed Apr 14 16:09:00 2010 +0300
+++ b/bluetoothengine/bteng/src/btengserver.cpp	Tue Apr 27 16:49:44 2010 +0300
@@ -165,7 +165,7 @@
     iWatcher = CBTEngSrvKeyWatcher::NewL( this );
     iSettingsMgr = CBTEngSrvSettingsMgr::NewL( this );
     iPluginMgr = CBTEngSrvPluginMgr::NewL( this );
-    iBBConnMgr = CBTEngSrvBBConnMgr::NewL( iSocketServ );
+    iBBConnMgr = CBTEngSrvBBConnMgr::NewL( this, iSocketServ );
 
     User::LeaveIfError( iBTRegServ.Connect() );
     iPairMan = CBTEngPairMan::NewL( *this );
@@ -256,12 +256,11 @@
 // ?implementation_description
 // ---------------------------------------------------------------------------
 //
-void CBTEngServer::DisconnectAllL()
+void CBTEngServer::DisconnectAllForPowerOffL()
     {
     TRACE_FUNC_ENTRY
-    iPluginMgr->DisconnectAllPlugins();
     TCallBack cb( DisconnectAllCallBack, this );
-    iBBConnMgr->DisconnectAllLinksL( cb );
+    iBBConnMgr->DisconnectAllLinksForPowerOffL( cb );
     }
 
 
--- a/bluetoothengine/bteng/src/btengsrvbbconnectionmgr.cpp	Wed Apr 14 16:09:00 2010 +0300
+++ b/bluetoothengine/bteng/src/btengsrvbbconnectionmgr.cpp	Tue Apr 27 16:49:44 2010 +0300
@@ -22,6 +22,8 @@
 #include <featmgr.h>
 
 #include "btengsrvbbconnectionmgr.h"
+#include "btengserver.h"
+#include "btengsrvsettingsmgr.h"
 #include "debug.h"
 
 /**  ?description */
@@ -38,8 +40,8 @@
 // C++ default constructor
 // ---------------------------------------------------------------------------
 //
-CBTEngSrvBBConnMgr::CBTEngSrvBBConnMgr(RSocketServ& aSockServ)
-    : iSockServ(aSockServ)
+CBTEngSrvBBConnMgr::CBTEngSrvBBConnMgr(CBTEngServer* aServer, RSocketServ& aSockServ)
+    : iSockServ(aSockServ), iServer(aServer)
     {
     }
 
@@ -73,9 +75,10 @@
 // NewL
 // ---------------------------------------------------------------------------
 //
-CBTEngSrvBBConnMgr* CBTEngSrvBBConnMgr::NewL(RSocketServ& aSockServ)
+CBTEngSrvBBConnMgr* CBTEngSrvBBConnMgr::NewL(CBTEngServer* aServer,
+                                             RSocketServ& aSockServ)
     {
-    CBTEngSrvBBConnMgr* self = new( ELeave ) CBTEngSrvBBConnMgr(aSockServ);
+    CBTEngSrvBBConnMgr* self = new( ELeave ) CBTEngSrvBBConnMgr(aServer, aSockServ);
     CleanupStack::PushL( self );
     self->ConstructL();
     CleanupStack::Pop( self );
@@ -266,6 +269,37 @@
     TRACE_FUNC_EXIT
     }
 
+// ---------------------------------------------------------------------------
+// Request to disconnect all Bluetooth baseband connections with Power off reason code.
+// ---------------------------------------------------------------------------
+//
+void CBTEngSrvBBConnMgr::DisconnectAllLinksForPowerOffL( TCallBack& aCallBack )
+    {
+    TRACE_FUNC_ENTRY
+    iCallBack = aCallBack;
+    RBTDevAddrArray addrArray;
+    GetConnectedAddressesL( addrArray );
+    TInt err = KErrNone;
+    if( addrArray.Count() > 0 )
+        {
+        err = iPhyLinks->DisconnectAll();
+        // @todo Once fix is in stack, call this API instead
+        // err = iPhyLinks->DisconnectAllForPowerOff();
+        }
+    else
+        {
+        err = KErrNotFound;
+        }
+    addrArray.Close();
+    if( err && err != KErrInUse )
+        {
+            // No connections, or something went wrong; just clean up 
+            // and inform our client.
+        HandleDisconnectAllCompleteL( err );
+        }
+    TRACE_FUNC_EXIT
+    }
+
 
 // ---------------------------------------------------------------------------
 // Request to disconnect all Bluetooth baseband connections.
@@ -345,6 +379,11 @@
         }
     (void) ManageTopology( EFalse );    // Ignore result; nothing to do 
                                         // about it here.
+    if( aId == KBTEngSrvBBConnId )
+        {
+        TRACE_INFO( ( _L( "[BTENG] PHY count key changed, update UI connection status" ) ) )
+        iServer->SettingsManager()->SetUiIndicatorsL();
+        }    
     TRACE_FUNC_EXIT
     }
 
--- a/bluetoothengine/bteng/src/btengsrvkeywatcher.cpp	Wed Apr 14 16:09:00 2010 +0300
+++ b/bluetoothengine/bteng/src/btengsrvkeywatcher.cpp	Tue Apr 27 16:49:44 2010 +0300
@@ -39,8 +39,6 @@
 /**  Identification for active object */
 const TInt KBTEngSysWatcher = 17;
 /**  Identification for active object */
-const TInt KBTEngPHYCountWatcher = 18;
-/**  Identification for active object */
 const TInt KBTEngBtConnectionWatcher = 19;
 /**  Identification for active object */
 const TInt KBTEngScanningWatcher = 20;
@@ -103,16 +101,7 @@
                                                    CActive::EPriorityStandard );
         iSystemStateKey.Subscribe( iSystemStateWatcher->RequestStatus() );
         iSystemStateWatcher->GoActive();
-        }
-        
-    err = iPHYCountKey.Attach( KPropertyUidBluetoothCategory, KPropertyKeyBluetoothPHYCount );
-    if( !err )
-        {
-        iPHYCountWatcher = CBTEngActive::NewL( *this, KBTEngPHYCountWatcher, 
-                                               CActive::EPriorityStandard );
-        iPHYCountKey.Subscribe( iPHYCountWatcher->RequestStatus() );
-        iPHYCountWatcher->GoActive();
-        }
+        }        
         
     err = iBtConnectionKey.Attach( KPropertyUidBluetoothCategory, KPropertyKeyBluetoothConnecting );
     if( !err )
@@ -224,14 +213,7 @@
         iSystemStateKey.Cancel();
         }
     delete iSystemStateWatcher;
-    iSystemStateKey.Close();
-    
-    if( iPHYCountKey.Handle() )
-        {
-        iPHYCountKey.Cancel();
-        }
-    delete iPHYCountWatcher;
-    iPHYCountKey.Close();
+    iSystemStateKey.Close();    
      
     if( iBtConnectionKey.Handle() )
         {
@@ -332,17 +314,9 @@
                  val == ESwStateShuttingDown )
                 {
                 iServer->SettingsManager()->SetVisibilityModeL( EBTVisibilityModeNoScans , 0 );
-                iServer->DisconnectAllL();   
+                iServer->DisconnectAllForPowerOffL();   
                 }
             }
-            break;   
-        case KBTEngPHYCountWatcher:
-            {
-            TRACE_INFO( ( _L( "PHY count key changed" ) ) )
-            iPHYCountKey.Subscribe( aActive->RequestStatus() );
-            aActive->GoActive();
-            iServer->SettingsManager()->SetUiIndicatorsL();
-            }
             break;
         case KBTEngBtConnectionWatcher:
             {
--- a/bluetoothengine/bteng/src/btengsrvpluginmgr.cpp	Wed Apr 14 16:09:00 2010 +0300
+++ b/bluetoothengine/bteng/src/btengsrvpluginmgr.cpp	Tue Apr 27 16:49:44 2010 +0300
@@ -485,9 +485,17 @@
     TInt err = KErrNotFound;
     for( TInt i = 0; i < iPluginArray.Count(); i++ )
         {
-            // Should be ignored if the plug-in does not have 
-            // a connection to the address.
-        err = iPluginArray[ i ]->Disconnect( aAddr, aDiscType );
+        // Should be ignored if the plug-in does not have 
+        // a connection to the address.
+        TBTEngConnectionStatus status = iPluginArray[ i ]->IsConnected( aAddr );
+        if( status == EBTEngConnecting || status == EBTEngConnected )
+            {            
+            err = iPluginArray[ i ]->Disconnect( aAddr, aDiscType );
+            if( err )
+                {
+                TRACE_INFO( ( _L( "[BTENG]  ERR! Disconnect failed, plugin index %d with err %d" ), i, err ) )
+                }
+            }
         }
     TRACE_FUNC_RES( ( _L( "result: %d" ), err ) )
     return err;
--- a/bluetoothengine/bteng/src/btengsrvsettingsmgr.cpp	Wed Apr 14 16:09:00 2010 +0300
+++ b/bluetoothengine/bteng/src/btengsrvsettingsmgr.cpp	Tue Apr 27 16:49:44 2010 +0300
@@ -148,6 +148,13 @@
         iPowerState = EBTOff;
 #endif  //__WINS__
         } 
+    
+#ifdef __WINS__
+    TRequestStatus* status = &(iActive->RequestStatus());
+    iActive->GoActive();
+    User::RequestComplete(status,KErrNone);
+#endif  //__WINS__
+    
     TRACE_FUNC_RES( ( _L( "result: %d" ), err ) )
     return err;
     }
--- a/bluetoothengine/bthid/common/inc/bthidPsKey.h	Wed Apr 14 16:09:00 2010 +0300
+++ b/bluetoothengine/bthid/common/inc/bthidPsKey.h	Tue Apr 27 16:49:44 2010 +0300
@@ -28,7 +28,9 @@
     {
     ECursorNotInitialized = 0, 
     ECursorShow = 1, 
-    ECursorHide = 2
+    ECursorHide = 2,
+    ECursorRedraw = 3,
+    ECursorReset = 4
     };
 
 #endif /* BTHIDPSKEY_H_ */
--- a/bluetoothengine/bthid/common/src/bthidpskeywatcher.cpp	Wed Apr 14 16:09:00 2010 +0300
+++ b/bluetoothengine/bthid/common/src/bthidpskeywatcher.cpp	Tue Apr 27 16:49:44 2010 +0300
@@ -30,7 +30,7 @@
 // CBTMouseCursorStatusObserver::CBTMouseCursorStatusObserver()
 //----------------------------------------------------------
 //
-CBTMouseCursorStatusObserver::CBTMouseCursorStatusObserver(): CActive(CActive::EPriorityStandard)
+CBTMouseCursorStatusObserver::CBTMouseCursorStatusObserver(): CActive(CActive::EPriorityStandard) 
     {                                
     CActiveScheduler::Add( this );
     }
--- a/bluetoothengine/bthid/keyboard/inc/keyboard.h	Wed Apr 14 16:09:00 2010 +0300
+++ b/bluetoothengine/bthid/keyboard/inc/keyboard.h	Tue Apr 27 16:49:44 2010 +0300
@@ -310,6 +310,9 @@
     TBool IsSpecialHandleKey(TInt aUniCode);
 
     void LaunchApplicationL(const TDesC& aName);
+    
+    //Redraw cursor
+    void CursorRedraw();
 private:
 
     TKeyboardDriverState iDriverState;
--- a/bluetoothengine/bthid/keyboard/src/keyboard.cpp	Wed Apr 14 16:09:00 2010 +0300
+++ b/bluetoothengine/bthid/keyboard/src/keyboard.cpp	Tue Apr 27 16:49:44 2010 +0300
@@ -140,7 +140,7 @@
 
     if (iComboDevice)
         {
-        RProperty::Set( KPSUidBthidSrv, KBTMouseCursorState, ECursorHide );
+        RProperty::Set( KPSUidBthidSrv, KBTMouseCursorState, ECursorNotInitialized );
         }
 
     if (iSettings)
@@ -288,7 +288,7 @@
     CancelAllKeys();
     if (iComboDevice)
         {
-        RProperty::Set( KPSUidBthidSrv, KBTMouseCursorState, ECursorHide );
+        RProperty::Set( KPSUidBthidSrv, KBTMouseCursorState, ECursorNotInitialized );
         }
     }
 
@@ -343,10 +343,16 @@
                     {
                     TInt mouseStatus;
                     TInt err = RProperty::Get( KPSUidBthidSrv, KBTMouseCursorState, mouseStatus );
-                    if ( !err && (static_cast<THidMouseCursorState>(mouseStatus) == ECursorHide) )
+                    if ( !err &&
+                        ((static_cast<THidMouseCursorState>(mouseStatus) == ECursorRedraw)|| 
+                         (static_cast<THidMouseCursorState>(mouseStatus) == ECursorReset)) )
                         {
                         err = RProperty::Set( KPSUidBthidSrv, KBTMouseCursorState, ECursorShow );
+                        DBG(RDebug::Print(
+                                 _L("[BTHID]\tCHidKeyboardDriver::DataIn() ECursorRedraw ||ECursorReset ")) );
                         }
+
+                    CursorRedraw();
                     }
                 InterruptData(aPayload);
                 }
@@ -462,6 +468,7 @@
             iButton2Down = ETrue;
             TRawEvent rawEvent;
             rawEvent.Set(TRawEvent::EKeyDown, EStdKeyApplication0);
+            CursorRedraw();
             UserSvr::AddEvent(rawEvent);
             }
         }
@@ -472,6 +479,7 @@
             iButton2Down = EFalse;
             TRawEvent rawEvent;
             rawEvent.Set(TRawEvent::EKeyUp, EStdKeyApplication0);
+            CursorRedraw();
             UserSvr::AddEvent(rawEvent);
             }
         }
@@ -1929,4 +1937,18 @@
     CancelAllKeys();
     }
 
+void CHidKeyboardDriver::CursorRedraw()
+    {
+    TInt mouseStatus;
+
+    TInt err = RProperty::Get( KPSUidBthidSrv, KBTMouseCursorState, mouseStatus );
+    if ( !err )
+        {
+        err = RProperty::Set( KPSUidBthidSrv, KBTMouseCursorState, ECursorRedraw );
+        DBG(RDebug::Print(
+             _L("[BTHID]\tCHidKeyboardDriver::CursorRedraw() X->ECursorRedraw") ) );
+        }
+    }
+
+// ----------------------------------------------------------------------
 // End of file
--- a/bluetoothengine/bthid/mouse/PaintCursor/inc/paintcursorappview.h	Wed Apr 14 16:09:00 2010 +0300
+++ b/bluetoothengine/bthid/mouse/PaintCursor/inc/paintcursorappview.h	Tue Apr 27 16:49:44 2010 +0300
@@ -60,7 +60,13 @@
     void HideCursor();
 
     void ShowCursor();
-	
+    
+	//Repaint the cursor at last used point 
+    void RedrawCursor();
+    
+	//Repaint the cursor at TPoint(0,0) during orientation change
+    void ResetCursor();
+
 public:
     // from CCoeControl
 
--- a/bluetoothengine/bthid/mouse/PaintCursor/src/paintcursorappui.cpp	Wed Apr 14 16:09:00 2010 +0300
+++ b/bluetoothengine/bthid/mouse/PaintCursor/src/paintcursorappui.cpp	Tue Apr 27 16:49:44 2010 +0300
@@ -31,7 +31,7 @@
 
 void CPaintCursorAppUi::ConstructL()
     {
-    TRACE_INFO(_L("[PaintCursor]\t CPaintCursorAppUi::ConstructL()"));
+    TRACE_INFO(_L("[BTHID]\t CPaintCursorAppUi::ConstructL()"));
     BaseConstructL();
 
     iAppView = CPaintCursorAppView::NewL(ClientRect());
@@ -83,7 +83,7 @@
 
 void CPaintCursorAppUi::HandleCommandL(TInt aCommand)
     {
-    TRACE_INFO((_L("[PaintCursor]\t CPaintCursorAppUi::HandleCommandL(%d)"),aCommand));
+    TRACE_INFO((_L("[BTHID]\tCPaintCursorAppUi::HandleCommandL(%d)"),aCommand));
     switch ( aCommand )
         {
         case EEikCmdExit :
@@ -121,7 +121,7 @@
 
 void CPaintCursorAppUi::MouseCursorStatusChangedL(TInt aStatus)
     {
-    
+    TRACE_INFO((_L("[BTHID]\tCPaintCursorAppUi::MouseCursorStatusChangedL(%d)"),aStatus));
     switch (aStatus)
         {
         case ECursorShow:
@@ -132,12 +132,23 @@
         case ECursorHide:
             {
             iAppView->HideCursor();
-            EndTask();
             break;
             }
         case ECursorNotInitialized:
             {
+            iAppView->HideCursor();
             EndTask();
+            break;
+            }
+        case ECursorRedraw:
+            {
+            iAppView->RedrawCursor();
+            break;
+            }
+        case ECursorReset:
+            {
+            iAppView->ResetCursor();
+            break;
             }
         default:
             {
--- a/bluetoothengine/bthid/mouse/PaintCursor/src/paintcursorappview.cpp	Wed Apr 14 16:09:00 2010 +0300
+++ b/bluetoothengine/bthid/mouse/PaintCursor/src/paintcursorappview.cpp	Tue Apr 27 16:49:44 2010 +0300
@@ -155,19 +155,33 @@
     iMouseInitialized = ETrue;
     }
 
+void CPaintCursorAppView::RedrawCursor()
+    {
+    TRect mainPaneRect;
+    AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, mainPaneRect );
+    SetRect( mainPaneRect );
+    DrawNow();
+    iClientCommander.ImageCommand( KRedrawBTCursorAnim );
+    iMouseInitialized = ETrue;
+    }
+ 
+ 
+void CPaintCursorAppView::ResetCursor()
+    {   
+    TRect mainPaneRect;
+    AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, mainPaneRect );
+    SetRect( mainPaneRect );
+    DrawNow();
+    iClientCommander.ImageCommand( KResetBTCursorAnim );
+    iMouseInitialized = ETrue;
+    }
+
 void CPaintCursorAppView::HandleResourceChange( TInt aType )
     {
     CCoeControl::HandleResourceChange( aType );
     if ( aType == KEikDynamicLayoutVariantSwitch )
         {
-        TRect mainPaneRect;
-        AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, mainPaneRect );
-        SetRect( mainPaneRect );
-        DrawNow();
-        if (iMouseInitialized)
-            {
-            iClientCommander.ImageCommand( KRedrawBTCursorAnim );
-            }
+        ResetCursor();
         }
     }
 
--- a/bluetoothengine/bthid/mouse/Sesame_client/inc/pointmsgqueue.h	Wed Apr 14 16:09:00 2010 +0300
+++ b/bluetoothengine/bthid/mouse/Sesame_client/inc/pointmsgqueue.h	Tue Apr 27 16:49:44 2010 +0300
@@ -40,7 +40,8 @@
     KStopBTCursorAnim = 2,
     KChangeCursor = 3,
     KSendRawEvent = 4,
-    KRedrawBTCursorAnim = 5
+    KRedrawBTCursorAnim = 5,
+    KResetBTCursorAnim = 6
     };
 
 class TPointBuffer
--- a/bluetoothengine/bthid/mouse/Sesame_client/src/clientimagecommander.cpp	Wed Apr 14 16:09:00 2010 +0300
+++ b/bluetoothengine/bthid/mouse/Sesame_client/src/clientimagecommander.cpp	Tue Apr 27 16:49:44 2010 +0300
@@ -175,7 +175,7 @@
     {
     // Could optionally decode the commands here
     DBG(RDebug::Print(_L("RImageCommander::ImageCommand %d"), aCommand));
-    if ( aCommand == KRedrawBTCursorAnim ) 
+    if ( aCommand == KResetBTCursorAnim ) 
         {
         //reset the current location to avoid sudden jumping 
         iCurrentPoint.SetXY(0,0);
--- a/bluetoothengine/bthid/mouse/Sesame_server/inc/mousecursorimage.h	Wed Apr 14 16:09:00 2010 +0300
+++ b/bluetoothengine/bthid/mouse/Sesame_server/inc/mousecursorimage.h	Tue Apr 27 16:49:44 2010 +0300
@@ -124,6 +124,7 @@
     CFbsBitGc* iSpriteGc;
     CFbsBitmap* iCursorBitmap;
     CFbsBitmap* iCursorBitmapMask;
+    TPoint    iLastUsedPoint;
     };
 
 #endif // __MOUSECURSORIMAGE_H__
--- a/bluetoothengine/bthid/mouse/Sesame_server/src/mousecursorimage.cpp	Wed Apr 14 16:09:00 2010 +0300
+++ b/bluetoothengine/bthid/mouse/Sesame_server/src/mousecursorimage.cpp	Tue Apr 27 16:49:44 2010 +0300
@@ -84,7 +84,7 @@
     iSpriteGc->Reset();
     iSpriteFunctions->SetPosition(TPoint());
     iSpriteFunctions->SizeChangedL();
-
+    iLastUsedPoint = TPoint(0,0);
     // Set the screen visible
     // We are using a timer, not the built in synchronising, so turn it off
     iFunctions->SetSync( MAnimGeneralFunctions::ESyncNone );
@@ -155,13 +155,13 @@
         DBG(RDebug::Print(_L(" CImage::DrawCursor iBitmapMaskDevice")));
         // Draw mask
         iSpriteGc->Activate(iBitmapMaskDevice);
-        iSpriteGc->BitBlt(TPoint(0,0), iCursorBitmapMask);
+        iSpriteGc->BitBlt(iLastUsedPoint, iCursorBitmapMask);
 
         DBG(RDebug::Print(_L(" CImage::DrawCursor iBitmapMaskDevice")));
 
         // Draw bitmap
         iSpriteGc->Activate(iBitmapDevice);
-        iSpriteGc->BitBlt(TPoint(0,0), iCursorBitmap);
+        iSpriteGc->BitBlt(iLastUsedPoint, iCursorBitmap);
         }
     DBG(RDebug::Print(_L(" CImage::DrawCursor END")));
     }
@@ -180,7 +180,6 @@
         case KStartBTCursorAnim:
             {
             iSpriteFunctions->Activate(ETrue);
-            DrawCursor();
             }
         break;
 
@@ -194,23 +193,42 @@
             {
             iSpriteFunctions->Activate(EFalse);
             iSpriteGc->Reset();
-            iSpriteFunctions->SetPosition(TPoint());
+            DBG(RDebug::Print(
+                _L("[BTHID]\tCImage::Command iLastUsedPoint (%d, %d)"), iLastUsedPoint.iX, iLastUsedPoint.iY));
+            iSpriteFunctions->SetPosition(iLastUsedPoint);
             iSpriteFunctions->SizeChangedL();
             iSpriteFunctions->Activate(ETrue);
-            DrawCursor();
+            }
+        break;
+        
+        case KResetBTCursorAnim:
+            {
+            iSpriteFunctions->Activate(EFalse);
+            iSpriteGc->Reset();
+            DBG(RDebug::Print(_L("[BTHID]\tCImage::Command KResetBTCursorAnim") ));
+            iLastUsedPoint.iX = 0;
+            iLastUsedPoint.iY = 0;
+            iSpriteFunctions->SetPosition(iLastUsedPoint);
+            iSpriteFunctions->SizeChangedL();
+            iSpriteFunctions->Activate(ETrue);
             }
         break;
         
         case KChangeCursor:
             {
-            TPoint pos = *(TPoint *)aArgs;
-            iSpriteFunctions->SetPosition(pos);
+            iLastUsedPoint = *(TPoint *)aArgs;
+            DBG(RDebug::Print(
+                _L("[BTHID]\tCImage::Command KChangeCursor *(TPoint *)aArgs (%d, %d)"), iLastUsedPoint.iX, iLastUsedPoint.iY));
+            iSpriteFunctions->SetPosition(iLastUsedPoint);
             }
         break;
         case KSendRawEvent:
             {
             TRawEvent rawEvent = *(TRawEvent *)aArgs;
-            iSpriteFunctions->SetPosition(rawEvent.Pos());
+            iLastUsedPoint = rawEvent.Pos();
+            DBG(RDebug::Print(
+                _L("[BTHID]\tCImage::Command KSendRawEvent rawEvent.Pos() (%d, %d)"), iLastUsedPoint.iX, iLastUsedPoint.iY));
+            iSpriteFunctions->SetPosition(iLastUsedPoint);
             iFunctions->PostRawEvent( rawEvent );
             }
         break;
--- a/bluetoothengine/bthid/mouse/hidmousedriver/inc/mouse.h	Wed Apr 14 16:09:00 2010 +0300
+++ b/bluetoothengine/bthid/mouse/hidmousedriver/inc/mouse.h	Tue Apr 27 16:49:44 2010 +0300
@@ -136,6 +136,9 @@
      */
     virtual void SetInputHandlingReg(CHidInputDataHandlingReg* aHandlingReg);
 
+    //redraw cursor
+    void CursorRedraw();
+
 private:
     // Constructor taking a pointer to the HID layer requesting the driver
     // instance
--- a/bluetoothengine/bthid/mouse/hidmousedriver/src/mouse.cpp	Wed Apr 14 16:09:00 2010 +0300
+++ b/bluetoothengine/bthid/mouse/hidmousedriver/src/mouse.cpp	Tue Apr 27 16:49:44 2010 +0300
@@ -96,9 +96,6 @@
     User::LeaveIfError(iWsSession.Connect());
     }
 
-
-
-
 CHidMouseDriver::~CHidMouseDriver()
     {
     DBG(RDebug::Print(_L("[HID]\t~CHidMouseDriver() 0x%08x"), this));
@@ -107,7 +104,7 @@
 
     if (iDriverState == EInitialised || iDriverState == EDisabled )
         {
-        RProperty::Set( KPSUidBthidSrv, KBTMouseCursorState, ECursorHide );
+        RProperty::Set( KPSUidBthidSrv, KBTMouseCursorState, ECursorNotInitialized );
         }
 
     iWsSession.Close();
@@ -176,7 +173,7 @@
 void CHidMouseDriver::Stop()
     {
     iDriverState = EDisabled;
-    RProperty::Set( KPSUidBthidSrv, KBTMouseCursorState, ECursorHide );
+    RProperty::Set( KPSUidBthidSrv, KBTMouseCursorState, ECursorNotInitialized );
     }
 
 //----------------------------------------------------------------------------
@@ -225,10 +222,18 @@
             {
             TInt mouseStatus;
             TInt err = RProperty::Get( KPSUidBthidSrv, KBTMouseCursorState, mouseStatus );
-            if ( !err && (static_cast<THidMouseCursorState>(mouseStatus) == ECursorHide) )
+            if ( !err &&
+                ((static_cast<THidMouseCursorState>(mouseStatus) == ECursorRedraw)|| 
+                 (static_cast<THidMouseCursorState>(mouseStatus) == ECursorReset)) )
                 {
                 err = RProperty::Set( KPSUidBthidSrv, KBTMouseCursorState, ECursorShow );
+                DBG(RDebug::Print(
+                         _L("[BTHID]\tCHidMouseDriver::DataIn() ECursorRedraw ||ECursorReset ")) );
                 }
+
+
+            CursorRedraw();
+
             InterruptData(aPayload);
             }
         break;
@@ -381,6 +386,7 @@
             iButton2Down = ETrue;
             TRawEvent rawEvent;
             rawEvent.Set(TRawEvent::EKeyDown, EStdKeyApplication0);
+            CursorRedraw();
             UserSvr::AddEvent(rawEvent);
             }
         }
@@ -391,6 +397,7 @@
             iButton2Down = EFalse;
             TRawEvent rawEvent;
             rawEvent.Set(TRawEvent::EKeyUp, EStdKeyApplication0);
+            CursorRedraw();
             UserSvr::AddEvent(rawEvent);
             }
         }
@@ -476,4 +483,17 @@
     {
     iInputHandlingReg = aHandlingReg;
     }
+
+void CHidMouseDriver::CursorRedraw()
+    {
+    TInt mouseStatus;
+
+    TInt err = RProperty::Get( KPSUidBthidSrv, KBTMouseCursorState, mouseStatus );
+    if ( !err )
+        {
+        err = RProperty::Set( KPSUidBthidSrv, KBTMouseCursorState, ECursorRedraw );
+        DBG(RDebug::Print(
+             _L("[BTHID]\tCHidMouseDriver::ForegroundEventL() X->ECursorRedraw") ) );
+        }
+    }
 // ----------------------------------------------------------------------
--- a/bluetoothengine/btsac/inc/btsacStreamerController.h	Wed Apr 14 16:09:00 2010 +0300
+++ b/bluetoothengine/btsac/inc/btsacStreamerController.h	Tue Apr 27 16:49:44 2010 +0300
@@ -249,6 +249,7 @@
 		TInt iPacketDropDeviation;
 		RArray<TBitpoolData> iBitpoolData;
 		TBitpoolData* iCurrentBitpoolData;
+		TBool iRemoteSupportsOnlyOneValue;
     };
 
 
--- a/bluetoothengine/btsac/src/btsacStreamerController.cpp	Wed Apr 14 16:09:00 2010 +0300
+++ b/bluetoothengine/btsac/src/btsacStreamerController.cpp	Tue Apr 27 16:49:44 2010 +0300
@@ -940,10 +940,23 @@
 	{
 	// Define max bitpool
 	TInt MaxBP = 0;
+	TInt minBitpool = aCap.MinBitpoolValue();
+	TInt maxBitpool = aCap.MaxBitpoolValue();	
 	TBool ProperMaxBitpoolFound = EFalse;
+	
+	if( minBitpool == maxBitpool )
+	    {
+        // Remote supports only one bitpool value
+        iRemoteSupportsOnlyOneValue = ETrue;
+        TRACE_INFO((_L("CBTSACStreamerController::SetBitpoolValues(), remote supports only one bitpool value")))
+        TRACE_INFO((_L("CBTSACStreamerController::SetBitpoolValues(), Max Bitpool: %d"), maxBitpool))
+        TRACE_INFO((_L("CBTSACStreamerController::SetBitpoolValues(), Min Bitpool: %d"), minBitpool))
+        return;
+	    }
+	
 	for(TInt i = 0 ; i < KNumOfBitpoolValues ; i++)
 		{
-		if(aCap.MaxBitpoolValue() >= KMaxBitpoolValues[i])
+		if(maxBitpool >= KMaxBitpoolValues[i])
 			{
 			MaxBP = KMaxBitpoolValues[i];
 			ProperMaxBitpoolFound = ETrue;
@@ -954,11 +967,11 @@
 		{
 		// None of our proposed max bitpool values weren't suitable for accessory.
 		// Let's use the one which was proposed by the accessory.
-		MaxBP = aCap.MaxBitpoolValue();
+		MaxBP = maxBitpool;
 		}
 	
 	// Define min bitpool. This bitpool value is negotiated with sink.
-	TInt MinBP = (iLocalCap.MinBitpoolValue() < aCap.MinBitpoolValue()) ? aCap.MinBitpoolValue() : iLocalCap.MinBitpoolValue();
+	TInt MinBP = (iLocalCap.MinBitpoolValue() < minBitpool) ? minBitpool : iLocalCap.MinBitpoolValue();
 	
 	// Define bitpool which is used for medium quality streaming (when streaming is interfered for some reason).
 	// This is real lowest bitpool value which is used for streaming.
@@ -975,8 +988,8 @@
 		iBitpoolData[iBitpoolData.Count()-1].iMaxBitpoolValue = MinBP;
 		}
 	
-	TRACE_INFO((_L("CBTSACStreamerController::SetBitpoolValues(), Remote Max Bitpool: %d"), aCap.MaxBitpoolValue()))
-	TRACE_INFO((_L("CBTSACStreamerController::SetBitpoolValues(), Remote Min Bitpool: %d"), aCap.MinBitpoolValue()))
+	TRACE_INFO((_L("CBTSACStreamerController::SetBitpoolValues(), Remote Max Bitpool: %d"), maxBitpool))
+	TRACE_INFO((_L("CBTSACStreamerController::SetBitpoolValues(), Remote Min Bitpool: %d"), minBitpool))
 	
 	aCap.SetMaxBitpoolValue(MaxBP);
 	TRACE_INFO((_L("CBTSACStreamerController::SetBitpoolValues(), Max Bitpool: %d"), MaxBP))
@@ -1263,6 +1276,7 @@
 void CBTSACStreamerController::InitializeBitpoolDataL()
 	{
 	TRACE_FUNC
+	iRemoteSupportsOnlyOneValue = EFalse;
 	TBitpoolData data;
 	iBitpoolData.Reset();
 	for(TInt i = 0 ; i < KNumOfBitpoolValues ; i++)
@@ -1294,38 +1308,70 @@
 // -----------------------------------------------------------------------------
 //
 void CBTSACStreamerController::ReorganizeBitpoolTable(TInt aNegotiatedMaxBitpool)
-	{
-	TRACE_INFO((_L("CBTSACStreamerController::ReorganizeBitpoolTable(), Negotiated Max Bitpool %d"), aNegotiatedMaxBitpool))
-	// Start checking from the lowest possible bitpool value	
-	for(TInt i = (KNumOfBitpoolValues - 1) ; i > 0 ; i--)
-		{
-		if(aNegotiatedMaxBitpool <= KMaxBitpoolValues[i])
-			{
-			TInt ii;
-			for(ii = 0 ; ii < i ; ii++)
-				{
-				iBitpoolData.Remove(0);				
-				}
-			TRACE_INFO((_L("CBTSACStreamerController::ReorganizeBitpoolTable(), Tables removed: %d"), ii))
-			for(TInt j = 0 ; j < iBitpoolData.Count() ; j++)
-				{
-				if(j == 0)
-					{
-					iBitpoolData[j].iMaxBitpoolValue = aNegotiatedMaxBitpool;
-					}
-				iBitpoolData[j].iIndex = j;
-				iBitpoolData[j].iUpBitpoolIndex = (j == 0) ? j : j - 1;
-				iBitpoolData[j].iDownBitpoolIndex = (j == iBitpoolData.Count() - 1) ? j : j + 1;
-				}
-			break;
-			}
-		}
-	TRACE_INFO((_L("CBTSACStreamerController::ReorganizeBitpoolTable(), Tables left: %d"), iBitpoolData.Count()))
-	for(TInt k = 0 ; k < iBitpoolData.Count() ; k++)
-		{
-		TRACE_INFO((_L("CBTSACStreamerController::ReorganizeBitpoolTable(), Table[%d] MaxBP: %d"), k, iBitpoolData[k].iMaxBitpoolValue))
-		}
-	}
+    {
+    TRACE_INFO((_L("CBTSACStreamerController::ReorganizeBitpoolTable(), Negotiated Max Bitpool %d"), aNegotiatedMaxBitpool))
+            
+    TInt tablesToBeRemoved;
+    if( iRemoteSupportsOnlyOneValue )
+        {
+        // Remote supports only one bitpool value, so we need only one table, remove rest. 
+        tablesToBeRemoved = KNumOfBitpoolValues - 1;
+        }
+    else
+        {
+        // Find proper bitpool value, start checking from the lowest possible bitpool value
+        for(tablesToBeRemoved = (KNumOfBitpoolValues - 1) ; tablesToBeRemoved > 0 ; tablesToBeRemoved--)
+            {
+            if(aNegotiatedMaxBitpool <= KMaxBitpoolValues[tablesToBeRemoved])
+                {            
+                break;
+                }
+            }
+        }
+    if( tablesToBeRemoved >= iBitpoolData.Count() )
+        {
+        // This should never happen.
+        TRACE_INFO((_L("CBTSACStreamerController::ReorganizeBitpoolTable(), Index error!")))
+        tablesToBeRemoved = 0;
+        TRAPD(err, InitializeBitpoolDataL())
+        if(err)
+            {
+            return;
+            }
+        }
+    
+    // Remove tables we don't need
+    TInt idx;
+    for( idx = 0 ; idx < tablesToBeRemoved ; idx++)
+        {
+        iBitpoolData.Remove(0);             
+        }    
+    TRACE_INFO((_L("CBTSACStreamerController::ReorganizeBitpoolTable(), Tables removed: %d"), tablesToBeRemoved))
+    
+    if( tablesToBeRemoved )
+        {
+        for( idx = 0 ; idx < iBitpoolData.Count() ; idx++)
+            {
+            if( idx == 0 )
+                {
+                // Index zero has the highest matching/negotiated bitpool value, update it.
+                // Rest values remains to be according to default table.
+                iBitpoolData[idx].iMaxBitpoolValue = aNegotiatedMaxBitpool;
+                }
+            // Update indexing.
+            iBitpoolData[idx].iIndex = idx;
+            iBitpoolData[idx].iUpBitpoolIndex = (idx == 0) ? idx : idx - 1;
+            iBitpoolData[idx].iDownBitpoolIndex = (idx == iBitpoolData.Count() - 1) ? idx : idx + 1;
+            iBitpoolData[idx].iMinimumMaxBitpool = (idx == iBitpoolData.Count() - 1) ? ETrue : EFalse;
+            }
+        }
+    
+    TRACE_INFO((_L("CBTSACStreamerController::ReorganizeBitpoolTable(), Tables left: %d"), iBitpoolData.Count()))
+    for( idx = 0 ; idx < iBitpoolData.Count() ; idx++)
+        {
+        TRACE_INFO((_L("CBTSACStreamerController::ReorganizeBitpoolTable(), Table[%d] MaxBP: %d"), idx, iBitpoolData[idx].iMaxBitpoolValue))
+        }
+    }
 
 // -----------------------------------------------------------------------------
 // CBTSACStreamerController::DoSelfComplete
--- a/bluetoothengine/btui/Ecom/src/BTUIPairedDevicesView.cpp	Wed Apr 14 16:09:00 2010 +0300
+++ b/bluetoothengine/btui/Ecom/src/BTUIPairedDevicesView.cpp	Tue Apr 27 16:49:44 2010 +0300
@@ -1725,7 +1725,7 @@
 			    TRACE_INFO(_L("Device status changed, update menupane"));
 			    iMenuDevice = device;
 			    iActiveMenuPane->Close();
-			    TRAP_IGNORE( this->ProcessCommandL(EAknSoftkeyOptions) );
+			    TRAP_IGNORE( this->ProcessCommandL(EAknSoftkeyContextOptions) );
 			    }
 		    }
 	    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsatplugin/atmisccmdplugin/data/2002C3BA.rss	Tue Apr 27 16:49:44 2010 +0300
@@ -0,0 +1,42 @@
+// Copyright (c) 2010 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:
+//
+
+#include "../inc/atmisccmdpluginuids.hrh"
+#include <ecom/registryinfo.rh>
+#include <atext_interfaceuid.h>
+    
+RESOURCE REGISTRY_INFO theInfo
+	{
+	// UID for the DLL
+	dll_uid = 0x2002C3BA;//KUidATCFunEcomDll; 
+	// Declare array of interface info
+	interfaces =
+		{
+		INTERFACE_INFO
+			{
+			// UID of interface that is implemented
+			interface_uid = 0x2001CBEE; // ATEXT_INTERFACE_DUN_UID; 
+			implementations =
+				{
+                IMPLEMENTATION_INFO
+	                {
+	                implementation_uid = 0x2002DC6B;// KUidATMiscCmdEcomImpl;
+	                version_no = 1;
+	                display_name = "Miscellaneous AT commands Implementation";
+	                default_data = "MAT+CLCK|MAT+CPWD|MAT+CUSD|MAT+CPIN|MAT+CNUM|MAT+CFUN|MAT+CBC";
+	                opaque_data = "";
+	                }
+				};
+			}
+		};
+	}
+
+// End of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsatplugin/atmisccmdplugin/group/atmisccmdplugin.mmp	Tue Apr 27 16:49:44 2010 +0300
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2010 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 :
+ *
+ */
+
+#include <platform_paths.hrh>
+#include <data_caging_paths.hrh>
+#include "../inc/atmisccmdpluginuids.hrh"
+
+CAPABILITY 	    CAP_ECOM_PLUGIN 
+VENDORID        VID_DEFAULT
+TARGET          atmisccmdplugin.dll
+TARGETTYPE	    PLUGIN
+UID             0x10009D8D 0x2002C3BA
+
+SOURCEPATH      ../src
+SOURCE          main.cpp
+SOURCE          atmisccmdplugin.cpp 
+SOURCE          atmisccmdpluginbase.cpp 
+SOURCE          atcommandparser.cpp
+SOURCE          clckcommandhandler.cpp 
+SOURCE          securitycodeverifier.cpp
+SOURCE          securityeventhandler.cpp
+SOURCE          cbsettinghandler.cpp
+SOURCE          cpwdcommandhandler.cpp
+SOURCE          cpincommandhandler.cpp
+SOURCE          cusdcommandhandler.cpp 
+SOURCE          cnumcommandhandler.cpp
+SOURCE          cfuncommandhandler.cpp 
+SOURCE          cbccommandhandler.cpp
+SOURCE          cusdreadwriteimp.cpp
+
+USERINCLUDE     ../inc
+
+MW_LAYER_SYSTEMINCLUDE
+
+START RESOURCE  ../data/2002C3BA.rss
+TARGET          atmisccmdplugin.rsc
+END
+
+LIBRARY	        ecom.lib
+LIBRARY         euser.lib
+LIBRARY         atextpluginbase.lib
+LIBRARY         bafl.lib
+LIBRARY         etelmm.lib
+LIBRARY         etel.lib
+LIBRARY         hash.lib
+
+LIBRARY         ProfileEng.lib
+LIBRARY         StarterClient.lib 
+
+DEBUGLIBRARY    flogger.lib
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsatplugin/atmisccmdplugin/group/bld.inf	Tue Apr 27 16:49:44 2010 +0300
@@ -0,0 +1,34 @@
+
+/*
+ * Copyright (c) 2008-2009 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 :This file provides the information required for building the
+ *              atcmdpluginecom.dll
+ *
+ */
+
+
+#include <platform_paths.hrh>
+
+PRJ_PLATFORMS
+
+PRJ_EXPORTS
+../rom/atmisccmdplugin.iby   CORE_MW_LAYER_IBY_EXPORT_PATH(atmisccmdplugin.iby)
+
+PRJ_TESTEXPORTS
+
+PRJ_MMPFILES
+atmisccmdplugin.mmp
+
+PRJ_TESTMMPFILES
+
+// End of File
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsatplugin/atmisccmdplugin/inc/atcommandparser.h	Tue Apr 27 16:49:44 2010 +0300
@@ -0,0 +1,120 @@
+// Copyright (c) 2010 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:
+// This file contains the implementation of the AT command parser and common utilities
+// 
+//
+
+#ifndef ATCOMMANDPARSER_H
+#define ATCOMMANDPARSER_H
+
+#include <e32std.h>
+
+
+/**
+ *  This class parses a given AT command into command type, command handler type and parameters.
+ * 
+ */
+NONSHARABLE_CLASS(TAtCommandParser)
+    {
+public:
+    /**
+     * AT command handler type which determines how the command is interpreted.
+     */
+    enum TCommandHandlerType
+        {
+        ECmdHandlerTypeUndefined = KErrNotFound,
+        ECmdHandlerTypeBase      = 0x01,  // For command "AT+COMMAND"
+        ECmdHandlerTypeSet       = 0x02,  // For command "AT+COMMAND="
+        ECmdHandlerTypeRead      = 0x04,  // For command "AT+COMMAND?"
+        ECmdHandlerTypeTest      = 0x08,  // For command "AT+COMMAND=?"
+        };
+    
+    /**
+     * Extended AT commands supported by this parser.
+     */
+    enum TCommandType
+        {
+        EUnknown = KErrNotFound,
+        ECmdAtCfun = 0,
+        ECmdAtCbc,
+        ECmdAtClck,
+        ECmdAtCpwd,
+        ECmdAtCpin,
+        ECmdAtCusd,
+        ECmdAtCnum
+        };
+public:
+    TAtCommandParser();
+    
+    /**
+     * @param aCmd AT command to be parsed
+     */
+    TAtCommandParser(const TDesC8& aCmd);
+    
+    /**
+     * Parse a new AT command. Previously parsed AT command is lost.
+     * @param aCmd AT command to be parsed
+     */
+    void ParseAtCommand(const TDesC8& aCmd);
+    
+    /**
+     * @return AT command type @see CAtCommandParser::TCommandType 
+     */
+    TCommandType Command() const;
+    
+    /**
+     * @return AT Command handler type @see CAtCommandParser::TCommandHandlerType
+     */
+    TCommandHandlerType CommandHandlerType() const;
+    
+    /**
+     * @return Next available parameter. KNullDesC8 if no more parameters.
+     */
+    TPtrC8 NextParam();
+    
+    /**
+     * Gets the integer value of the next parameter.
+     * 
+     * @param aValue the integer value of the parameter
+     * @return Symbian system wide error codes
+     */
+    TInt NextIntParam(TInt& aValue);
+    
+    /**
+     * Get the next text string without quote.
+     * This function validate the parameter is a valid string.
+     * if the parameter is absent, it returns KErrNotFound.
+     * if the parameter is an invalid string such as not in a pair of double quotes, it returns KErrArgument
+     * @param aError return the error code. 
+     * @return Next text parameter when aError is not KErrNone; 
+     */
+    TPtrC8 NextTextParam(TInt& aError);
+
+    /**
+     * Get ISA hash code for security code
+     * Phone lock code is encoded by using ISA hash. This hash algorithm is implemented in remotemgmt component
+     * This function is copied and modified from CSCPServer::HashISACode()
+     * @param aPasscode passcode to be encoded
+     * @param aHashCode encoded output
+     * @return Symbian system wide error codes
+     */
+    TInt HashSecurityCode(const TDesC8& aPasscode, TDes8& aHashCode);
+    
+private:
+    TLex8 iCmd;
+    TCommandType iCmdType;
+    TCommandHandlerType iCmdHandlerType;
+    };
+
+#endif // ATCOMMANDPARSER_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsatplugin/atmisccmdplugin/inc/atmisccmdplugin.h	Tue Apr 27 16:49:44 2010 +0300
@@ -0,0 +1,223 @@
+/*
+* Copyright (c) 2010 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:  Main handler for incoming requests
+*
+*/
+
+#ifndef ATMISCCMDPLUGIN_H
+#define ATMISCCMDPLUGIN_H
+
+#include <atextpluginbase.h>
+#include <etelmm.h>
+
+#include "atcommandparser.h"
+
+/** Character types: carriage return, line feed or backspace */
+enum TCharacterTypes
+    {
+    ECharTypeCR,  // Carriage return
+    ECharTypeLF,  // Line feed
+    ECharTypeBS   // Backspace
+    };
+
+/** Type of modes (quiet, verbose) */
+enum TModeTypes
+    {
+    EModeTypeQuiet,   // Quiet mode
+    EModeTypeVerbose  // Verbose mode
+    };
+
+
+class MATMiscCmdPlugin;
+
+
+/**
+ *  Class for common AT command handler interface
+ */
+NONSHARABLE_CLASS( CATCmdAsyncBase ) : public CActive 
+    {
+public:
+    virtual ~CATCmdAsyncBase() {};
+    CATCmdAsyncBase(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone);
+
+    /**
+     * @see CATExtPluginBase::HandleCommand
+     */
+    virtual void HandleCommand( const TDesC8& aCmd,
+                                RBuf8& aReply,
+                                TBool aReplyNeeded ) = 0;
+
+    /**
+     * @see CATExtPluginBase::HandleCommandCancel
+     */
+    virtual void HandleCommandCancel() = 0;
+
+protected:
+    MATMiscCmdPlugin* iCallback;
+    TAtCommandParser& iATCmdParser;
+    RMobilePhone& iPhone;
+    };
+
+/**
+ *  Class for accessing plugin information and common functionality
+ */
+NONSHARABLE_CLASS( MATMiscCmdPlugin )
+    {
+public:
+    /**
+     * Creates an AT command reply based on the reply type and completes the
+     * request to ATEXT.
+     *
+     * @param aReplyType Type of reply
+     * @param aSrcBuffer Source buffer; used only if aReplyType is EReplyTypeOther
+     * @param aError Completion code. If not KErrNone then other arguments are
+     *               ignored and the request is completed to ATEXT with
+     *               EReplyTypeUndefined.
+     * @return Symbian error code on error, KErrNone otherwise
+     */
+    virtual TInt CreateReplyAndComplete( TATExtensionReplyType aReplyType,
+                                         const TDesC8& aSrcBuffer=KNullDesC8,
+                                         TInt aError=KErrNone ) = 0;
+
+    /**
+     * Creates a buffer for "OK" or "ERROR" reply based on the line settings
+     *
+     * @param aReplyBuffer Destination buffer for the created reply
+     * @param aOkReply ETrue if "OK" reply needed,
+     *                 EFalse if "ERROR" reply needed
+     * @return Symbian error code on error, KErrNone otherwise
+     */
+    virtual TInt CreateOkOrErrorReply( RBuf8& aReplyBuffer,
+                                       TBool aOkReply ) = 0;
+
+    /*
+     * Complete the AT command request with AT CME error code according to given Symbian error code
+     * @param aError Symbian error code 
+     */
+    virtual void CreateCMEReplyAndComplete(TInt aError) = 0;
+
+    /**
+     * Returns plugin's character value settings (from CATExtPluginBase)
+     *
+     * @param aCharType Character's type
+     * @param aChar Character's value matching aCharType
+     * @return Symbian error code on error, KErrNone otherwise
+     */
+    virtual TInt GetCharacterValue( TCharacterTypes aCharType, TChar& aChar ) = 0;
+
+    /**
+     * Returns plugin's mode value settings (from CATExtPluginBase)
+     *
+     * @param aModeType Mode type
+     * @param aMode Mode value matching aModeType
+     * @return Symbian error code on error, KErrNone otherwise
+     */
+    virtual TInt GetModeValue( TModeTypes aModeType, TBool& aMode ) = 0;
+    
+    /**
+     * Returns plugin's response to an unsolicited request
+     *
+     * @param aAT the response to display to the user from unsolicited event
+     * @return Symbian error code on error, KErrNone otherwise
+     */  
+    virtual TInt HandleUnsolicitedRequest(const TDesC8& aAT ) = 0;
+    };
+
+/**
+ *  Class for selecting handlers for different AT commands
+ */
+NONSHARABLE_CLASS( CATMiscCmdPlugin ) : public CATExtPluginBase,
+                                       public MATMiscCmdPlugin
+    {
+public:
+    static CATMiscCmdPlugin* NewL();
+    virtual ~CATMiscCmdPlugin();
+
+private: // methods from base class CATExtPluginBase
+    void ReportConnectionName( const TDesC8& aName );
+    TBool IsCommandSupported( const TDesC8& aCmd );
+    void HandleCommand( const TDesC8& aCmd, RBuf8& aReply, TBool aReplyNeeded );
+    void HandleCommandCancel();
+    TInt NextReplyPartLength();
+    TInt GetNextPartOfReply( RBuf8& aNextReply );
+    void ReceiveUnsolicitedResult();
+    void ReceiveUnsolicitedResultCancel();
+    void ReportNvramStatusChange( const TDesC8& aNvram );
+    void ReportExternalHandleCommandError();
+    
+private: // methods from base class MATMiscCmdPlugin
+    virtual TInt CreateReplyAndComplete( TATExtensionReplyType aReplyType,
+                                 const TDesC8& aSrcBuffer=KNullDesC8,
+                                 TInt aError=KErrNone );
+
+    virtual TInt CreateOkOrErrorReply( RBuf8& aReplyBuffer,
+                               TBool aOkReply );
+    virtual void CreateCMEReplyAndComplete(TInt aError);
+    virtual TInt GetCharacterValue( TCharacterTypes aCharType, TChar& aChar );
+    virtual TInt GetModeValue( TModeTypes aModeType, TBool& aMode );    
+    virtual TInt HandleUnsolicitedRequest(const TDesC8& aAT );
+    
+private:    
+    CATMiscCmdPlugin();
+    void ConstructL();
+    
+    TInt CreatePartOfReply( RBuf8& aBuffer );
+    
+    /*
+     * Utility function that connect to Etel server and establish a subsession to RMobilePhone
+     * Caller must close session and subsession after use.
+     * @param aTelServer returns session to ETel
+     * @param aPhone returns RMobilePhone subsession
+     */
+    void ConnectToEtelL(RTelServer& aTelServer, RMobilePhone& aPhone);
+
+
+private:
+    TAtCommandParser iCommandParser;
+    RTelServer iTelServer;
+    RMobilePhone iPhone;
+    /**
+     * Current AT command handler in.
+     * Used when IsCommandSupported() detects a matching handler class.
+     */
+    CATCmdAsyncBase* iCurrentHandler;
+    
+    CATCmdAsyncBase* iCLCKHandler;
+    CATCmdAsyncBase* iCPWDHandler;
+    CATCmdAsyncBase* iCPINHandler;
+    CATCmdAsyncBase* iCUSDHandler;
+    CATCmdAsyncBase* iCNUMHandler;
+    CATCmdAsyncBase* iCFUNHandler;
+    CATCmdAsyncBase* iCBCHandler;
+    
+    /**
+     * Buffer for handle command's command
+     * Not own.
+     */
+    const TDesC8* iHcCmd;
+
+    /**
+     * Buffer for handle command reply
+     * Not own.
+     */
+    RBuf8* iHcReply;
+
+    /**
+     * Global reply buffer for the AT command replies
+     */
+    RBuf8 iReplyBuffer;
+    };
+
+#endif  // ATMISCCMDPLUGIN_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsatplugin/atmisccmdplugin/inc/atmisccmdpluginconsts.h	Tue Apr 27 16:49:44 2010 +0300
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2010 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 :
+ *
+ */
+
+#ifndef ATMISCCMDPLUGINCONSTS_H
+#define ATMISCCMDPLUGINCONSTS_H
+
+#include <e32def.h>
+
+_LIT8(KCRLF, "\r\n");
+_LIT8(KOKCRLF, "\r\n\r\nOK\r\n");
+
+_LIT8(KAtCLCK, "+CLCK: ");
+_LIT8(KAtCFUN, "+CFUN: ");
+_LIT8(KAtCBC, "+CBC: ");
+_LIT8(KAtCUSD, "+CUSD: ");
+
+_LIT8(KCLCKSupportedCmdsList, "+CLCK: (\"PS\",\"SC\",\"AO\",\"OI\",\"OX\",\"AI\",\"IR\",\"AB\",\"AG\",\"AC\")\r\n\r\nOK\r\n");
+_LIT8(KCFUNSupportedCmdsList, "+CFUN: (0,1,4),(0,1)\r\n\r\nOK\r\n");
+_LIT8(KCBCSupportedCmdsList, "+CBC: (0,1,2,3),(1...100)\r\n\r\nOK\r\n");
+_LIT8(KCUSDSupportedCmdsList, "+CUSD: (0,1)\r\n\r\nOK\r\n");
+
+
+_LIT8(KATCLCKPS, "PS");
+_LIT8(KATCLCKSC, "SC");
+_LIT8(KATCLCKAO, "AO");
+_LIT8(KATCLCKOI, "OI");
+_LIT8(KATCLCKOX, "OX");
+_LIT8(KATCLCKAI, "AI");
+_LIT8(KATCLCKIR, "IR");
+_LIT8(KATCLCKAB, "AB");
+_LIT8(KATCLCKAG, "AG");
+_LIT8(KATCLCKAC, "AC");
+
+#endif // ATMISCCMDPLUGINCONSTS_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsatplugin/atmisccmdplugin/inc/atmisccmdpluginuids.hrh	Tue Apr 27 16:49:44 2010 +0300
@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 2010 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: Collection of uid's
+ *
+ */
+
+#ifndef ATMISCCMDPLUGINUIDS_HRH
+#define ATMISCCMDPLUGINUIDS_HRH
+
+#define KUidATMiscCmdEcomDll   0x2002C3BA
+#define KUidATMiscCmdEcomImpl 0x2002DC6B
+
+#endif // ATMISCCMDPLUGINUIDS_HRH
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsatplugin/atmisccmdplugin/inc/cbccommandhandler.h	Tue Apr 27 16:49:44 2010 +0300
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2010 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 :
+ * 
+ * CCBCCommandHandler class declaration for AT+CBC command
+ * 
+ */
+
+#ifndef CBCCOMMANDHANDLER_H
+#define CBCCOMMANDHANDLER_H
+
+#include "atmisccmdplugin.h"
+
+/**
+ *  AT+CBC command handler implementation class
+ */
+NONSHARABLE_CLASS( CCBCCommandHandler ) : public CATCmdAsyncBase
+    {
+public:
+    static CCBCCommandHandler* NewL(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone);
+    ~CCBCCommandHandler();
+    
+private: // methods from CActive
+    virtual void RunL();
+    virtual void DoCancel();
+    // RunError not needed as RunL does not leave
+
+private: // methods from CATCmdAsyncBase    
+    virtual void HandleCommand( const TDesC8& aCmd, RBuf8& aReply, TBool aReplyNeeded );
+    virtual void HandleCommandCancel();
+    
+private:
+    CCBCCommandHandler(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone);
+    void ConstructL();
+    
+private:
+    RBuf8 iReply;
+    
+    RMobilePhone::TMobilePhoneBatteryInfoV1 iBatteryInfo;
+    };
+
+#endif /* CBCCOMMANDHANDLER_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsatplugin/atmisccmdplugin/inc/cbsettinghandler.h	Tue Apr 27 16:49:44 2010 +0300
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2010 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 :
+ *
+ */
+
+#ifndef CBSETTTINGHANDLER_H
+#define CBSETTTINGHANDLER_H
+
+#include <etelmm.h>
+
+class CCLCKCommandHandler;
+
+/**
+ * AO class handling Call Barring setting
+ */
+NONSHARABLE_CLASS(CCBSettingHandler) : public CActive
+    {
+public:
+    static CCBSettingHandler* NewL(RMobilePhone& aPhone);
+    ~CCBSettingHandler();
+    void Start(TRequestStatus& aReqStatus, TInt aInfoClass, RMobilePhone::TMobilePhoneCBCondition aCondition, 
+            RMobilePhone::TMobilePhoneCBChangeV1* aCBInfo);
+    void SetCBForServiceGroup();
+
+private: // methods from CActive
+    virtual void RunL();
+    virtual void DoCancel();
+    // RunError not needed as RunL does not leave
+    
+private:
+    CCBSettingHandler(RMobilePhone& aPhone);
+    void ConstructL();
+    void Complete(TInt aError);
+    
+private:
+    RMobilePhone& iPhone;
+    RArray<RMobilePhone::TMobileService> iClassArray;
+    RMobilePhone::TMobilePhoneCBCondition iCondition;
+    RMobilePhone::TMobilePhoneCBChangeV1* iCBInfo;
+    
+    TRequestStatus* iQueuedStatus;
+    };
+
+#endif // CBSETTTINGHANDLER_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsatplugin/atmisccmdplugin/inc/cfuncommandhandler.h	Tue Apr 27 16:49:44 2010 +0300
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2010 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 :
+ * 
+ * CCFUNCommandHandler class declaration for AT+CFUN command
+ * 
+ */
+
+#ifndef CFUNCOMMANDHANDLER_H
+#define CFUNCOMMANDHANDLER_H
+
+#include "atmisccmdplugin.h"
+
+const TInt KGeneralProfileId = 0;
+const TInt KOfflineProfileId = 5;
+
+class MProfileEngine;
+
+/**
+ *  AT+CFUN command handler implementation class
+ */
+NONSHARABLE_CLASS( CCFUNCommandHandler ) : public CATCmdAsyncBase
+    {
+public:
+    static CCFUNCommandHandler* NewL(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone);
+    ~CCFUNCommandHandler();
+    
+private: // methods from CActive
+    virtual void RunL();
+    virtual void DoCancel();
+    // RunError not needed as RunL does not leave
+
+private: // methods from CATCmdAsyncBase    
+    virtual void HandleCommand( const TDesC8& aCmd, RBuf8& aReply, TBool aReplyNeeded );
+    virtual void HandleCommandCancel();
+    
+private:
+    CCFUNCommandHandler(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone);
+    void ConstructL();
+    
+    TInt ActivateProfile(TInt aFunc, TInt aReset);
+    TInt SetActiveProfile(TInt aProfileId);
+    TInt RestartDevice();
+    
+private:
+    RBuf8 iReply;
+    
+    MProfileEngine* iProfileEngine;
+    };
+
+#endif /* CFUNCOMMANDHANDLER_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsatplugin/atmisccmdplugin/inc/clckcommandhandler.h	Tue Apr 27 16:49:44 2010 +0300
@@ -0,0 +1,123 @@
+/*
+ * Copyright (c) 2010 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 :
+ * CCLCKCommandHandler class declaration for AT+CLCK command
+ */
+
+#ifndef CLCKCOMMANDHANDLER_H
+#define CLCKCOMMANDHANDLER_H
+
+#include <mmretrieve.h>
+
+#include "atmisccmdplugin.h"
+
+class CSecurityCodeVerifier;
+class CSecurityEventHandler;
+class CCBSettingHandler;
+
+enum TInfoClassMask
+    {
+    EInfoClassVoice      = 1,   // voice (telephony) 
+    EInfoClassData       = 2,   // data (refers to all bearer services; with <mode>=2
+                                // this may refer only to some bearer service if TA does
+                                // not support values 16, 32, 64 and 128)
+    EInfoClassFax        = 4,   // fax (facsimile services)
+    EInfoClassSMS        = 8,   // short message service
+    EInfoClassSyncData   = 16,  // data circuit sync
+    EInfoClassASyncData  = 32,  // data circuit async
+    EInfoClassPacketData = 64,  // dedicated packet access
+    EInfoClassPadAccess  = 128  // dedicated PAD access
+    };
+
+/**
+ *  AT+CLCK command handler implementation class
+ */
+NONSHARABLE_CLASS( CCLCKCommandHandler ) : public CATCmdAsyncBase
+    {
+public:
+    static CCLCKCommandHandler* NewL(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone);
+    ~CCLCKCommandHandler();
+    
+    // Callback methods for helper objects
+    void HandlePasswordVerification(TInt aError);
+    void HandleSecurityEvent(TInt aError, RMobilePhone::TMobilePhoneSecurityEvent aSecurityEvent);
+    
+private:
+    /**
+     * States for lock setting
+     */
+    enum TLockSettingState
+        {
+        ELockSettingIdle = 0x01,
+        ELockSettingRequested = 0x02,
+        ELockSettingPasswordRequested = 0x03
+        };
+    
+    enum TCLCKCommand
+        {
+        ECLCKUndefined  = KErrNotFound,
+        ECLCKLockSet    = 0x01,
+        ECLCKLockGet    = 0x02,
+        ECLCKBarringSet = 0x03,
+        ECLCKBarringGet = 0x04
+        };
+    
+    enum TCmdFacilityType
+        {
+        ECmdFacilityTypeUnknown = 0,
+        ECmdFacilityTypeLock,
+        ECmdFacilityTypeBarring,
+        ECmdFacilityTypeAllBarring
+        };
+    
+private: // methods from CActive
+    virtual void RunL();
+    virtual void DoCancel();
+    // RunError not needed as RunL does not leave
+
+private: // methods from CATCmdAsyncBase    
+    virtual void HandleCommand( const TDesC8& aCmd, RBuf8& aReply, TBool aReplyNeeded );
+    virtual void HandleCommandCancel();
+    
+private:
+    CCLCKCommandHandler(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone);
+    void ConstructL();
+    
+    TInt ParseCCLCKCommand();
+    void IssueCLCKCommand();
+    TInt ReceiveCBList();
+
+private:
+    CCBSettingHandler* iCBSettingHandler;
+    CSecurityEventHandler* iSecurityEventHandler;
+    CSecurityCodeVerifier* iSecurityCodeVerifier; 
+    CRetrieveMobilePhoneCBList* iCBRetrieve;
+
+    RBuf8 iReply;
+
+    TCLCKCommand iCLCKCommandType;
+    RBuf8 iPassword;
+    TInt iInfoClass;
+    
+    TLockSettingState iLockSettingState;
+    RMobilePhone::TMobilePhoneLock iLockType;
+    RMobilePhone::TMobilePhoneLockSetting iLockChange;
+    RMobilePhone::TMobilePhoneSecurityCode iSecurityCode;
+    
+    RMobilePhone::TMobilePhoneLockInfoV1 iLockInfo;
+    RMobilePhone::TMobilePhoneLockInfoV1Pckg iLockInfoPckg;
+    
+    RMobilePhone::TMobilePhoneCBCondition iCondition;
+    RMobilePhone::TMobilePhoneCBChangeV1 iCBInfo;
+    };
+
+#endif // CLCKCOMMANDHANDLER_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsatplugin/atmisccmdplugin/inc/cmeerror.h	Tue Apr 27 16:49:44 2010 +0300
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2010 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 : define all +CME Error code.
+ * Reference:
+ *    3GPP TS 27.007 version 6.9.0 Release 6 118 ETSI TS 127 007 V6.9.0 (2007-06)
+ *
+ */
+
+#ifndef CMEERROR_H_
+#define CMEERROR_H_
+
+enum TATCMEError
+    {
+    EATCmeNoError       = -1,   // No errors, only for internal use
+    EATCmePhoneFailure  =0,     // 0 phone failure
+    EATCmeNoConnection,         // 1 no connection to phone
+    EATCmeAdaptorLinkReserved,  // 2 phone-adaptor link reserved
+    EATCmeNotAllowed,           // 3 operation not allowed
+    EATCmeNotSupported,         // 4 operation not supported
+    EATCmePhSimPinRequired,     // 5 PH-SIM PIN required
+    EATCmePhFsimPinRequired,    // 6 PH-FSIM PIN required
+    EATCmePhFsimPukRequired,    // 7 PH-FSIM PUK required
+    EATCmeSimNotInserted,       // 10 SIM not inserted
+    EATCmeSimPinRequired,       // 11 SIM PIN required
+    EATCmeSimPukRequired,       // 12 SIM PUK required
+    EATCmeSimFailure,           // 13 SIM failure
+    EATCmeSimBusy,              // 14 SIM busy
+    EATCmeSimWrong,             // 15 SIM wrong
+    EATCmeIncorrectPassword,    // 16 incorrect password
+    EATCmeSimPin2Required,      // 17 SIM PIN2 required
+    EATCmeSimPuk2Required,      // 18 SIM PUK2 required
+    EATCmeMemoryFull,           // 20 memory full
+    EATCmeInvalidIndex,         // 21 invalid index
+    EATCmeNotFound,             // 22 not found
+    EATCmeMemoryFailure,        // 23 memory failure
+    EATCmeTextTooLong,          // 24 text string too long
+    EATCmeInvalidChar,          // 25 invalid characters in text string
+    EATCmeDialStringTooLong,    // 26 dial string too long
+    EATCmeInvalidDialString,    // 27 invalid characters in dial string
+    EATCmeNoNetworkService,     // 30 no network service
+    EATCmeNetworkTimeout,       // 31 network timeout
+    EATCmeNetworkNotAllowed,    // 32 network not allowed - emergency calls only
+    EATCmeNetPerPinRequired,    // 40 network personalization PIN required
+    EATCmeNetPerPukRequired,    // 41 network personalization PUK required
+    EATCmeNetSubPerPinRequired, // 42 network subset personalization PIN required
+    EATCmeNetSubPerPukRequired, // 43 network subset personalization PUK required
+    EATCmeSPPerPinRequired,     // 44 service provider personalization PIN required
+    EATCmeSPPerPukRequired,     // 45 service provider personalization PUK required
+    EATCmeCorpPerPinRequired,   // 46 corporate personalization PIN required
+    EATCmeCorpPerPukRequired,   // 47 corporate personalization PUK required
+    EATCmeHiddenKeyRequired,    // 48 hidden key required (NOTE: This key is required when accessing hidden phonebook entries.)
+    EATCmeEAPNotSupported,      // 49 EAP method not supported
+    EATCmeIncorrectParams,      // 50 Incorrect parameters
+    EATCmeUnknown = 100         // 100 unknown
+    };
+
+#endif /* CMEERROR_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsatplugin/atmisccmdplugin/inc/cnumcommandhandler.h	Tue Apr 27 16:49:44 2010 +0300
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2010 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 : CCNUMCommandHandler class declaration for AT+CNUM command 
+ *
+ */
+
+#ifndef CNUMCOMMANDHANDLER_H
+#define CNUMCOMMANDHANDLER_H
+
+#include "atmisccmdplugin.h"
+
+/**
+ *  This class implements an AO for AT+CPIN command using ATExt plugin framework.
+ */
+NONSHARABLE_CLASS( CCNUMCommandHandler ) : public CATCmdAsyncBase
+{
+public:
+    /**
+     * @param aCallback is used to notfiy ATExt server to complete the AT command request.
+     */
+    static CCNUMCommandHandler* NewL(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser,
+                                    RMobilePhone& aPhone, RTelServer& aTelServer);
+    ~CCNUMCommandHandler();
+
+private:
+    // methods inherited from CActive
+    virtual void RunL();
+    virtual void DoCancel();
+    // RunError is not required because RunL doesn't leave.
+
+    // inherited from CATCmdAsyncBase
+    /**
+     *  @see CATCmdAsyncBase::HandleCommand
+     */
+    virtual void HandleCommand( const TDesC8& aCmd, RBuf8& aReply, TBool aReplyNeeded );
+    /**
+     *  @see CATCmdAsyncBase::HandleCommandCancel
+     */
+    virtual void HandleCommandCancel();
+
+    CCNUMCommandHandler(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser,
+                       RMobilePhone& aPhone, RTelServer& aTelServer);
+    void ConstructL();
+
+private:
+    enum TATNumState
+        {
+        EATNumGetStoreInfo,
+        EATNumReadNumber
+        };
+    
+    RTelServer& iTelServer;
+    TInt iPendingEvent;
+    
+    RMobileONStore iOwnNumberStore;
+    RMobileONStore::TMobileONStoreInfoV1 iOwnStoreInfo;
+    RMobileONStore::TMobileONStoreInfoV1Pckg iOwnStoreInfoPckg;
+    RMobileONStore::TMobileONEntryV1 iOwnNumberEntry;
+    RMobileONStore::TMobileONEntryV1Pckg iOwnNumberEntryPckg;
+    RBuf8 iReplyBuffer;
+};
+
+#endif /* CNUMCOMMANDHANDLER_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsatplugin/atmisccmdplugin/inc/cpincommandhandler.h	Tue Apr 27 16:49:44 2010 +0300
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2010 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 : CCPIMCommandHandler class declaration for AT+CPIN command 
+ *
+ */
+
+#ifndef CPINCOMMANDHANDLER_H
+#define CPINCOMMANDHANDLER_H
+
+#include "atmisccmdplugin.h"
+
+/**
+ *  This class implements an AO for AT+CPIN command using ATExt plugin framework.
+ */
+NONSHARABLE_CLASS( CCPINCommandHandler ) : public CATCmdAsyncBase
+{
+public:
+    /**
+     * @param aCallback is used to notfiy ATExt server to complete the AT command request.
+     */
+    static CCPINCommandHandler* NewL(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone);
+    ~CCPINCommandHandler();
+
+private:
+    // Methods inherited from CActive
+    virtual void RunL();
+    virtual void DoCancel();
+    // RunError is not required because RunL doesn't leave.
+
+    /**
+     *  @see CATCmdAsyncBase::HandleCommand
+     */
+    virtual void HandleCommand( const TDesC8& aCmd, RBuf8& aReply, TBool aReplyNeeded );
+    /**
+     *  @see CATCmdAsyncBase::HandleCommandCancel
+     */
+    virtual void HandleCommandCancel();
+
+    CCPINCommandHandler(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone);
+    void ConstructL();
+
+    /**
+     * Handle status change event for RMobilePhone::GetLockInfo method
+     */
+    void HandleGetLockInfo();
+    /**
+     * Handle status change event for RMobilePhone::HandleVerifySecurityCode method
+     */
+    void HandleVerifySecurityCode();
+    /**
+     * Change SIM PIN with PUK code 
+     */
+    void ChangePassword();
+    
+private:
+
+    RMobilePhone::TMobilePhoneLockInfoV1 iLockInfo;
+    RMobilePhone::TMobilePhoneLockInfoV1Pckg iLockInfoPckg;
+    
+    TInt iPendingEvent;
+};
+
+
+#endif /* CPINCOMMANDHANDLER_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsatplugin/atmisccmdplugin/inc/cpwdcommandhandler.h	Tue Apr 27 16:49:44 2010 +0300
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2010 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 : CPwdCommandHandler class declaration for AT+CPWD command 
+ *
+ */
+
+
+#ifndef CPWDCOMMANDHANDLER_H
+#define CPWDCOMMANDHANDLER_H
+#include <e32base.h>
+#include <etelmm.h>
+
+#include "atmisccmdplugin.h"
+
+/**
+ *  This class implements an AO for AT+CPWD command using ATExt plugin framework.
+ */
+NONSHARABLE_CLASS( CCPWDCommandHandler ) : public CATCmdAsyncBase
+{
+public:
+    /**
+     * @param aCallback is used to notfiy ATExt server to complete the AT command request.
+     */
+    static CCPWDCommandHandler* NewL(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone);
+    ~CCPWDCommandHandler();
+
+private:
+    // methods inherited from CActive
+    virtual void RunL();
+    virtual void DoCancel();
+    // RunError is not required because RunL doesn't leave.
+    
+    /**
+     * @see CATCmdAsyncBase::HandleCommand
+     */
+    virtual void HandleCommand( const TDesC8& aCmd, RBuf8& aReply, TBool aReplyNeeded );
+    /**
+     * @see CATCmdAsyncBase::HandleCommandCancel
+     */
+    virtual void HandleCommandCancel();
+    
+    CCPWDCommandHandler(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone);
+    void ConstructL();
+    
+    /**
+     *  Change password according to AT command arguments
+     */
+    void ChangePassword();
+    
+    /**
+     * request Etel server to change password and active the AO
+     * @param aType type of password to be changed
+     * @param aOldPassword old password
+     * @param aNewPassword new password
+     */
+    void ChangeSecurityCode(RMobilePhone::TMobilePhoneSecurityCode aType, TDesC8& aOldPassword, TDesC8& aNewPassword);
+    
+private:
+    TInt iPendingEvent;
+};
+
+#endif /* CPWDCOMMANDHANDLER_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsatplugin/atmisccmdplugin/inc/cusdcommandhandler.h	Tue Apr 27 16:49:44 2010 +0300
@@ -0,0 +1,99 @@
+/* Copyright (c) 2010 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 :
+ *
+ */
+
+#ifndef CUSDCOMMANDHANDLER_H
+#define CUSDCOMMANDHANDLER_H
+
+#include <e32base.h>
+#include <etelmm.h>
+#include <mmretrieve.h>
+#include <gsmuelem.h>
+
+#include "atmisccmdplugin.h"
+
+class CCUSSDSendMessageImpl;
+class CCUSSDReadMessageImpl;
+/**
+ *  Class for accessing plugin information and common functionality
+ */
+NONSHARABLE_CLASS( MUSSDCallback )
+    {
+public:
+    /**
+     * Creates an AT command reply based on the reply type and completes the
+     * request to ATEXT.
+     */
+    virtual void HandleReadMessageComplete(TInt aResult) = 0;
+
+    /**
+      * Creates an AT command reply based on the reply type and completes the
+      * request to ATEXT.
+      */
+    virtual void HandleSendMessageComplete(TInt aResult) = 0;
+    };
+
+
+NONSHARABLE_CLASS( CCUSDCommandHandler ) : public CATCmdAsyncBase,
+                                           public MUSSDCallback
+{
+public:
+    static CCUSDCommandHandler* NewL(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone);
+    ~CCUSDCommandHandler();
+    
+private: // methods from CActive
+    virtual void RunL();
+    virtual void DoCancel();
+    // RunError not needed as RunL does not leave
+ 
+private: // methods from MUSSDCallback
+    virtual void HandleSendMessageComplete(TInt aResult);
+    virtual void HandleReadMessageComplete(TInt aResult);
+    
+private: // methods from CATCmdAsyncBase    
+    virtual void HandleCommand( const TDesC8& aCmd, RBuf8& aReply, TBool aReplyNeeded );
+    virtual void HandleCommandCancel();
+    
+private:
+    CCUSDCommandHandler(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone);
+    void ConstructL();
+    
+    TInt ParseCUSDCmd(const TDesC8& aCmd);
+    void CCUSDCommandHandler::FindFirstCarriageReturnL( 
+         const TDesC& aBuffer ,
+         TUint& aSkipChars , 
+         TUint& aStartBit );
+    
+    TInt Pack(const TDesC8& aIn, TDes8& aOut);
+    TInt ElementSizeInBits(TSmsDataCodingScheme::TSmsAlphabet aAlphabet) const;
+    TInt PackedOctetsRequired( TInt aNumUDUnits ) const;
+    TBool IsDcsValid( const TUint8 aDcs ) const;
+    void FormatUSSDReceivedData();
+
+private:
+    TBool iSendCommandSent;
+    RBuf8 iReply;
+
+    RMobileUssdMessaging iUssdMessaging;
+
+    CCUSSDSendMessageImpl* iUSSDSender;
+    RMobileUssdMessaging::TMobileUssdAttributesV1 iSendAttributes;
+    RBuf8 iUSSDCommand;
+
+    CCUSSDReadMessageImpl* iUSSDReader;
+    RMobileUssdMessaging::TGsmUssdMessageData iReceivedData;
+    TInt iDisplayRetMessage;
+    RMobileUssdMessaging::TMobileUssdAttributesV1 iReceiveAttributes;
+    };
+
+#endif // CUSDCOMMANDHANDLER_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsatplugin/atmisccmdplugin/inc/cusdreadwriteimp.h	Tue Apr 27 16:49:44 2010 +0300
@@ -0,0 +1,68 @@
+/* Copyright (c) 2010 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 :
+ *
+ */
+
+#ifndef CUSDREADWRITEIMP_H
+#define CUSDREADWRITEIMP_H
+
+#include <e32base.h>
+#include <etelmm.h>
+
+class MUSSDCallback;
+
+NONSHARABLE_CLASS( CCUSSDReadMessageImpl ) : public CActive
+{
+public:
+    static CCUSSDReadMessageImpl* NewL(MUSSDCallback* aCallback, RMobileUssdMessaging& aUssdSession);
+    ~CCUSSDReadMessageImpl();
+
+    TInt ReadUSSDMessage(TDes8& aReceivedData, 
+                               RMobileUssdMessaging::TMobileUssdAttributesV1& aUSDAttribute );
+
+private: // methods from CActive
+    virtual void RunL();
+    virtual void DoCancel();
+    // RunError not needed as RunL does not leave
+
+private:
+    CCUSSDReadMessageImpl(MUSSDCallback* aCallback, 
+                          RMobileUssdMessaging& aUSSDMessagingSession);
+private:
+    MUSSDCallback* iCallback;
+    RMobileUssdMessaging& iUssdSession;
+    };
+
+NONSHARABLE_CLASS( CCUSSDSendMessageImpl ) : public CActive
+{
+public:
+     static CCUSSDSendMessageImpl* NewL(MUSSDCallback* aCallback, RMobileUssdMessaging& aUssdSession);
+     ~CCUSSDSendMessageImpl();
+
+    TInt HandleSendUSSDCmd(const TDesC8& aCmd, 
+                           RMobileUssdMessaging::TMobileUssdAttributesV1& aUSDAttribute);
+
+private: // methods from CActive
+    virtual void RunL();
+    virtual void DoCancel();
+    // RunError not needed as RunL does not leave
+    
+private:
+    CCUSSDSendMessageImpl(MUSSDCallback* aCallback, 
+                          RMobileUssdMessaging& aUSSDMessagingSession);
+
+private:
+    MUSSDCallback* iCallback;        
+    RMobileUssdMessaging& iUssdSession;
+    };
+
+#endif // CUSDREADWRITEIMP_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsatplugin/atmisccmdplugin/inc/debug.h	Tue Apr 27 16:49:44 2010 +0300
@@ -0,0 +1,236 @@
+/*
+ * Copyright (c) 2010 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 :tracing and debuging definitions.
+ *
+ */
+
+
+#ifndef DEBUG_H
+#define DEBUG_H
+
+#include <e32base.h>
+#include <e32svr.h>
+
+_LIT8(KDebugPrintS, "ATCmd: %s%S\r\n");
+_LIT8(KDebugPrintD, "ATCmd: %s%d\r\n");
+
+#ifdef _DEBUG
+
+#include <flogger.h>
+
+_LIT(KLogFile,"atmiscmdplugin.txt");
+_LIT(KLogDir,"atmiscmdplugin");
+_LIT(KATDebugFile, "log.txt" );
+_LIT(KATDebugDir, "atmiscmdplugin" );
+
+_LIT(KTracePrefix16, "[atmiscmdplugin] ");
+_LIT8(KTracePrefix8, "[atmiscmdplugin] ");
+_LIT8(KFuncFormat8, ">< %S");
+_LIT8(KFuncThisFormat8, ">< %S, [0x%08X]");
+_LIT8(KFuncEntryFormat8, "-> %S");
+_LIT8(KFuncEntryThisFormat8, "-> %S, [0x%08X]");
+_LIT8(KFuncEntryArgFormat8, "-> %S, (%S)");
+_LIT8(KFuncExitFormat8, "<- %S");
+_LIT(KPanicCategory, "atmiscmdplugin");
+_LIT8(KPanicPrefix8, "PANIC code ");
+_LIT8(KLeavePrefix8, "LEAVE code ");
+
+const TInt KMaxLogLineLength = 256;
+
+// Trace options
+#define KPRINTERROR		0x00000001 // Print error
+#define KPRINTINFO	    0x00000002 // Print function trace
+#define KPRINTSTATE		0x00000004 // Print state machine infos
+#define KPRINTWARNING  0x00000008 // Print warnings
+
+#define USE_FILE_LOGGING
+
+const TInt KTraceMask = KPRINTERROR | KPRINTINFO | KPRINTSTATE | KPRINTWARNING;
+
+NONSHARABLE_CLASS(TOverflowTruncate16) : public TDes16Overflow
+	{
+public:
+	void Overflow(TDes16& /*aDes*/) {}
+	};
+
+NONSHARABLE_CLASS(TOverflowTruncate8) : public TDes8Overflow
+	{
+public:
+	void Overflow(TDes8& /*aDes*/) {}
+	};
+
+inline void Trace(TRefByValue<const TDesC16> aFmt, ...)
+    {
+	VA_LIST list;
+	VA_START(list,aFmt);
+    RBuf16 buf;
+    buf.Create(KMaxLogLineLength);
+    buf.Zero();    
+	buf.Append(KTracePrefix16);
+	TOverflowTruncate16 overflow;
+	buf.AppendFormatList(aFmt,list,&overflow);
+	RDebug::Print(buf);
+#ifdef USE_FILE_LOGGING
+    RFileLogger::Write(KLogDir, KLogFile, EFileLoggingModeAppend, buf);
+#endif
+	buf.Close();
+    }
+
+inline void Trace(TRefByValue<const TDesC8> aFmt, ...)
+    {
+    VA_LIST list;
+    VA_START(list, aFmt);
+	TOverflowTruncate8 overflow;
+    RBuf8 buf8;
+    buf8.Create(KMaxLogLineLength);
+    buf8.Zero();    
+    buf8.Append(KTracePrefix8);
+	buf8.AppendFormatList(aFmt, list, &overflow);
+    RDebug::RawPrint(buf8);
+#ifdef USE_FILE_LOGGING
+    RFileLogger::Write(KLogDir, KLogFile, EFileLoggingModeAppend, buf8);
+#endif
+    buf8.Close();
+    }
+
+inline void TracePanic(
+	char* aFile, 
+	TInt aLine,
+	TInt aPanicCode,
+	const TDesC& aPanicCategory)
+    {
+	TPtrC8 fullFileName((const TUint8*)aFile);
+	TPtrC8 fileName(fullFileName.Ptr()+fullFileName.LocateReverse('\\')+1);
+    RBuf8 buf;
+    buf.Create(KMaxLogLineLength);
+    buf.Zero();    
+	buf.Append(KPanicPrefix8);
+	buf.AppendFormat(_L8("%d at line %d in file %S"), aPanicCode, aLine, &fileName);
+	Trace(buf);
+	buf.Close();
+	User::Panic(aPanicCategory, aPanicCode); 
+    }
+
+inline void TraceLeave(char* aFile, TInt aLine, TInt aReason)
+	{
+	TPtrC8 fullFileName((const TUint8*)aFile);
+	TPtrC8 fileName(fullFileName.Ptr()+fullFileName.LocateReverse('\\')+1);
+    RBuf8 buf;
+    buf.Create(KMaxLogLineLength);
+    buf.Zero();    
+	buf.Append(KLeavePrefix8);
+	buf.AppendFormat(_L8("%d at line %d in file %S"), aReason, aLine, &fileName);
+	Trace(buf);
+	buf.Close();
+	User::LeaveIfError(aReason);
+	}
+
+inline TBuf8<64> ArgFormat(TRefByValue<const TDesC8> aFmt, ...)
+    {
+    TOverflowTruncate8 overflow;
+    TBuf8<64> buf8;
+    buf8.Format(aFmt, &overflow);
+    return buf8;
+    }
+
+#define TRACE_INFO(p) {if(KTraceMask & KPRINTINFO) Trace p;}
+
+#define TRACE_ERROR(p) {if(KTraceMask & KPRINTERROR) Trace p;}
+
+#define TRACE_STATE(p) {if(KTraceMask & KPRINTSTATE) Trace p;}
+
+#define TRACE_WARNING(p) {if(KTraceMask & KPRINTWARNING) Trace p;}
+
+#define TRACE_INFO_SEG(p) {if(KTraceMask & KPRINTINFO) p;}
+
+#define TRACE_ASSERT(GUARD, CODE) {if (!(GUARD)) \
+         TracePanic(__FILE__, __LINE__, CODE, KPanicCategory);}
+
+#define PANIC(CODE) TracePanic(__FILE__, __LINE__, CODE, KPanicCategory)
+
+#define LEAVE_IF_ERROR(REASON) {if (REASON) \
+         TraceLeave(__FILE__, __LINE__, REASON);}
+
+#define LEAVE(REASON) TraceLeave(__FILE__, __LINE__, REASON)
+
+#define TRACE_FUNC_ENTRY {if(KTraceMask & KPRINTINFO) { \
+                            TPtrC8 ptr8((TUint8*)__PRETTY_FUNCTION__); \
+                            Trace(KFuncEntryFormat8, &ptr8);}}
+
+#define TRACE_FUNC_ENTRY_THIS {if(KTraceMask & KPRINTINFO) {\
+                            TPtrC8 ptr8((TUint8*)__PRETTY_FUNCTION__); \
+                            Trace(KFuncEntryThisFormat8, &ptr8, this);}}
+
+#define	 TRACE_FUNC_EXIT {if(KTraceMask & KPRINTINFO) {\
+                            TPtrC8 ptr8((TUint8*)__PRETTY_FUNCTION__); \
+                            Trace(KFuncExitFormat8, &ptr8);}}
+
+#define TRACE_FUNC {if(KTraceMask & KPRINTINFO) { \
+                            TPtrC8 ptr8((TUint8*)__PRETTY_FUNCTION__); \
+                            Trace(KFuncFormat8, &ptr8);}}
+
+#define TRACE_FUNC_THIS {if(KTraceMask & KPRINTINFO) {\
+                            TPtrC8 ptr8((TUint8*)__PRETTY_FUNCTION__); \
+                            Trace(KFuncThisFormat8, &ptr8, this);}}
+
+#define TRACE_FUNC_ARG(a) { if(KTraceMask & KPRINTINFO) { \
+                            TPtrC8 func( (TUint8*) __PRETTY_FUNCTION__ ); \
+                            TPtrC8 arg( ArgFormat a ); \
+                            Trace( KFuncEntryArgFormat8, &func, &arg ); } }
+
+#define RETURN_IF_ERR(ERR) {if(ERR) {Trace(_L8(" RETURN %d at file %S line %d"), ERR, &(TPtrC8((const TUint8*)__FILE__)), __LINE__); return ERR;}}
+
+#else // ! _DEBUG
+
+#define TRACE_INFO(p)
+
+#define TRACE_ERROR(p)
+
+#define TRACE_STATE(p)
+
+#define TRACE_WARNING(p)
+
+#define TRACE_INFO_SEG(p)
+
+#define TRACE_ASSERT(GUARD, CODE)
+
+#define PANIC(CODE) {User::Panic(KPanicCategory, CODE);}
+
+#define LEAVE_IF_ERROR(REASON) {static_cast<void>(User::LeaveIfError(REASON));}
+
+#define LEAVE(REASON) {static_cast<void>(User::Leave(REASON));}
+
+#define TRACE_FUNC_ENTRY
+
+#define TRACE_FUNC_ENTRY_THIS
+
+#define TRACE_FUNC_EXIT
+
+#define TRACE_FUNC
+
+#define TRACE_FUNC_THIS
+
+#define TRACE_FUNC_ARG(a)
+
+#define RETURN_IF_ERR(ERR) {if(ERR) return ERR;}
+
+inline void Trace(TRefByValue<const TDesC16> aFmt, ...)
+    {
+    }
+
+inline void Trace(TRefByValue<const TDesC8> aFmt, ...)
+    {
+    }
+#endif // _DEBUG
+
+#endif // DEBUG_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsatplugin/atmisccmdplugin/inc/securitycodeverifier.h	Tue Apr 27 16:49:44 2010 +0300
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2010 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 :
+ *
+ */
+
+#ifndef SECURITYCODEVERIFIER_H
+#define SECURITYCODEVERIFIER_H
+
+#include <etelmm.h>
+
+class CCLCKCommandHandler;
+
+/**
+ * AO class handling Secirity Code verification requests
+ */
+NONSHARABLE_CLASS(CSecurityCodeVerifier) : public CActive
+    {
+public:
+    static CSecurityCodeVerifier* NewL(CCLCKCommandHandler* aCLCKHandler, RMobilePhone& aPhone);
+    ~CSecurityCodeVerifier();
+    void Start(TDesC8& aPassword, RMobilePhone::TMobilePhoneSecurityCode& aSecurityCode);
+
+private: // methods from CActive
+    virtual void RunL();
+    virtual void DoCancel();
+    // RunError not needed as RunL does not leave
+    
+private:
+    CSecurityCodeVerifier(CCLCKCommandHandler* aCLCKHandler, RMobilePhone& aPhone);
+    void ConstructL();
+
+private:
+    CCLCKCommandHandler* iCLCKHandler;
+    RMobilePhone& iPhone;
+    RMobilePhone::TMobilePhoneSecurityEvent iSecurityEvent;
+    };
+
+#endif /* SECURITYCODEVERIFIER_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsatplugin/atmisccmdplugin/inc/securityeventhandler.h	Tue Apr 27 16:49:44 2010 +0300
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2010 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 :
+ *
+ */
+
+
+#ifndef SECURITYEVENTHANDLER_H
+#define SECURITYEVENTHANDLER_H
+
+#include <etelmm.h>
+
+class CCLCKCommandHandler;
+
+/**
+ * AO class handling Security Events notifications
+ */
+NONSHARABLE_CLASS(CSecurityEventHandler) : public CActive
+    {
+public:
+    static CSecurityEventHandler* NewL(CCLCKCommandHandler* aCLCKHandler, RMobilePhone& aPhone);
+    ~CSecurityEventHandler();
+    void Start();
+    
+private: // methods from CActive
+    virtual void RunL();
+    virtual void DoCancel();
+    // RunError not needed as RunL does not leave
+
+private:
+    CSecurityEventHandler(CCLCKCommandHandler* aCLCKHandler, RMobilePhone& aPhone);
+    void ConstructL();
+    
+private:
+    CCLCKCommandHandler* iCLCKHandler;
+    RMobilePhone& iPhone;
+    RMobilePhone::TMobilePhoneSecurityEvent iSecurityEvent;
+    };
+
+#endif /* SECURITYEVENTHANDLER_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsatplugin/atmisccmdplugin/readme.txt	Tue Apr 27 16:49:44 2010 +0300
@@ -0,0 +1,4 @@
+- AT misc commands plugin implements AT commands for AT+CFUN
+- This plugin will not be part of SF and will be moved to ext folder later
+- To test this plugin we need to manually build 
+- Optionally, after building we can generate a sisx file and use it for testing. Look at atmisccmdplugin\sis folder for information
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsatplugin/atmisccmdplugin/rom/atmisccmdplugin.iby	Tue Apr 27 16:49:44 2010 +0300
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2008-2009 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 :Contains information about binary files and binary file locations
+ *
+ */
+
+#ifndef ATMISCCMDPLUGIN_IBY
+#define ATMISCCMDPLUGIN_IBY
+
+ECOM_PLUGIN(atmisccmdplugin.dll, atmisccmdplugin.rsc)
+S60_APP_RESOURCE(atmisccmdpluginresource)
+
+#endif // ATMISCCMDPLUGIN_IBY
+
+// End of File
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsatplugin/atmisccmdplugin/src/atcommandparser.cpp	Tue Apr 27 16:49:44 2010 +0300
@@ -0,0 +1,261 @@
+// Copyright (c) 2010 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:
+// This file contains the implementation of the AT command parser and common utilities
+// 
+//
+
+#include "atcommandparser.h"
+#include <hash.h>
+
+#include "debug.h"
+
+
+// Max buffer length for an MD5 digest
+const TInt KSCPMaxHashLength( 32 );
+
+
+TAtCommandParser::TAtCommandParser()
+    : iCmdType(EUnknown), iCmdHandlerType(ECmdHandlerTypeUndefined)  
+    {
+    }
+
+TAtCommandParser::TAtCommandParser(const TDesC8& aCmd)
+    : iCmdType(EUnknown), iCmdHandlerType(ECmdHandlerTypeUndefined)  
+    {
+    ParseAtCommand(aCmd);
+    }
+
+
+void TAtCommandParser::ParseAtCommand(const TDesC8& aCmd)
+    {
+    TRACE_FUNC_ENTRY
+    iCmd.Assign(aCmd);
+    iCmd.Mark();
+    TChar c = 0;
+    // First extract the AT command "AT+COMMAND"
+    while(!iCmd.Eos() && !(c=='=' || c=='?'))
+        {
+        iCmd.Inc();
+        c = iCmd.Peek();
+        }
+          
+    TPtrC8 token = iCmd.MarkedToken();   
+    
+    _LIT8(KAtCfun, "AT+CFUN");
+    _LIT8(KAtCbc, "AT+CBC");
+    _LIT8(KAtClck, "AT+CLCK");
+    _LIT8(KAtCpwd, "AT+CPWD");
+    _LIT8(KAtCpin, "AT+CPIN");
+    _LIT8(KAtCusd, "AT+CUSD");
+    _LIT8(KAtCnum, "AT+CNUM");
+    
+    Trace(KDebugPrintS, "token: ", &token);
+    // Determine the AT command type
+    if(!token.Compare(KAtCfun))
+        {
+        iCmdType = ECmdAtCfun;
+        }
+    else if(!token.Compare(KAtCbc))
+        {
+        iCmdType = ECmdAtCbc;
+        }
+    else if(!token.Compare(KAtClck))
+        {
+        iCmdType = ECmdAtClck;
+        }
+    else if(!token.Compare(KAtCpwd))
+        {
+        iCmdType = ECmdAtCpwd;
+        }
+    else if(!token.Compare(KAtCpin))
+        {
+        iCmdType = ECmdAtCpin;
+        }
+    else if(!token.Compare(KAtCusd))
+        {
+        iCmdType = ECmdAtCusd;
+        }
+    else if(!token.Compare(KAtCnum))
+        {
+        iCmdType = ECmdAtCnum;
+        }
+    else
+        {
+        iCmdType = EUnknown;
+        TRACE_FUNC_EXIT
+        return;
+        }
+        
+    // Now find out the AT command handler type
+    if(iCmd.Eos())
+        {
+        iCmdHandlerType = ECmdHandlerTypeBase;
+        }
+    else if(iCmd.Peek() == '?')
+        {
+        iCmdHandlerType = ECmdHandlerTypeRead;
+        }
+    else if(iCmd.Peek() == '=')
+        {
+        iCmd.Inc();
+        if(iCmd.Peek() == '?')
+            {
+            iCmd.Inc();
+            iCmdHandlerType = ECmdHandlerTypeTest;
+            }
+        else
+            {
+            iCmdHandlerType = ECmdHandlerTypeSet;
+            }
+        }
+    else
+        {
+        iCmdHandlerType = ECmdHandlerTypeUndefined;
+        }
+    TRACE_FUNC_EXIT
+    }
+
+TAtCommandParser::TCommandType TAtCommandParser::Command() const
+    {
+    return iCmdType;
+    }
+
+TAtCommandParser::TCommandHandlerType TAtCommandParser::CommandHandlerType() const
+    {
+    return iCmdHandlerType;
+    }
+
+TPtrC8 TAtCommandParser::NextParam()
+    {
+    TRACE_FUNC_ENTRY
+    iCmd.SkipSpace(); // Skip front spaces
+    iCmd.Mark();
+    TChar chr = 0;
+    
+    if(!iCmd.Eos())
+        {
+        chr = iCmd.Peek();
+        while(!iCmd.Eos() && chr != ',' && !chr.IsSpace() && !chr.IsControl())
+            {// Stop at any of those chars: comma, space or control
+            iCmd.Inc();
+            chr = iCmd.Peek();
+            }
+        }
+    
+    // Extract the token at this point            
+    TPtrC8 retVal = iCmd.MarkedToken();
+    
+    // Skip comma, space and control chars
+    while(!iCmd.Eos() && (chr == ',' || chr.IsSpace() || chr.IsControl()))
+        {
+        iCmd.Inc();
+        chr = iCmd.Peek();
+        }
+    TRACE_FUNC_EXIT
+    return retVal;
+    }
+
+TPtrC8 TAtCommandParser::NextTextParam(TInt& aError)
+    {
+    TPtrC8 param = NextParam();
+    
+    if (param.Compare(KNullDesC8) == 0)
+        {
+        aError = KErrNotFound;
+        return param; 
+        }
+    
+    if(param.Length()<2 
+            || param[0] != '"'
+            || param[param.Length()-1] != '"')
+        {
+        aError = KErrArgument;
+        return param.Left(0);
+        }
+    aError = KErrNone;
+    return param.Mid(1, param.Length() - 2);
+    }
+
+TInt TAtCommandParser::NextIntParam(TInt& aValue)
+    {
+    TRACE_FUNC_ENTRY
+    TInt retVal =KErrNone;
+    TPtrC8 param = NextParam();
+    if (param.Compare(KNullDesC8) == 0)
+        {
+        retVal = KErrNotFound;
+        }
+    else
+        {
+        TLex8 lex(param);
+        retVal = lex.Val(aValue);
+        }
+    TRACE_FUNC_EXIT
+    return retVal;
+    }
+
+TInt TAtCommandParser::HashSecurityCode(const TDesC8& aPasscode, TDes8& aHashCode)
+    {
+    TRACE_FUNC_ENTRY
+    TInt ret = KErrNone;
+
+    // Get MD5 Hash
+    // see remotemgmt component CSCPServer::HashISACode() for encoding algorithm
+    CMD5* hashObject = NULL;
+    TRAP( ret, hashObject = CMD5::NewL() );
+
+    if(ret != KErrNone)
+        {
+        TRACE_FUNC_EXIT
+        return ret;
+        }
+    
+    RBuf pwdBuffer;
+    ret = pwdBuffer.Create(KSCPMaxHashLength);
+    if(ret != KErrNone)
+        {
+        delete hashObject;
+        TRACE_FUNC_EXIT
+        return ret;
+        }
+    pwdBuffer.Copy(aPasscode); // convert to TDes16
+
+    // add TDes16 to a binary buffer
+    TUint16* inputPtr = const_cast<TUint16*>( pwdBuffer.Ptr() ); 
+    TPtrC8 inputData( reinterpret_cast<TUint8*>(inputPtr), pwdBuffer.Length()*2 );
+    
+    TPtrC8 hash = hashObject->Final( inputData );
+    delete hashObject;
+
+    pwdBuffer.Zero();
+    pwdBuffer.Copy(hash);
+
+    // Compute the hash sum as four 32-bit integers.
+    TInt64 hashSum = *(reinterpret_cast<TInt32*>(&pwdBuffer[0])) + 
+                     *(reinterpret_cast<TInt32*>(&pwdBuffer[4])) + 
+                     *(reinterpret_cast<TInt32*>(&pwdBuffer[8])) +
+                     *(reinterpret_cast<TInt32*>(&pwdBuffer[12]));
+    pwdBuffer.Close();
+     
+    // Create a five-digit security code from this number
+    TInt isaCode = ( hashSum % 90000 ) + 10000;
+
+    // save encoded security code to TDes
+    aHashCode.Zero();
+    aHashCode.AppendNum(isaCode);
+
+    TRACE_FUNC_EXIT
+    return KErrNone;
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsatplugin/atmisccmdplugin/src/atmisccmdplugin.cpp	Tue Apr 27 16:49:44 2010 +0300
@@ -0,0 +1,529 @@
+/*
+* Copyright (c) 2010 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:  Main handler for incoming requests
+*
+*/
+
+#include "atmisccmdplugin.h"
+
+#include "clckcommandhandler.h"
+#include "cpwdcommandhandler.h"
+#include "cpincommandhandler.h"
+#include "cusdcommandhandler.h"
+#include "cnumcommandhandler.h"
+#include "cfuncommandhandler.h"
+#include "cbccommandhandler.h"
+
+#include "atmisccmdpluginconsts.h"
+#include "debug.h"
+
+#include <EXTERROR.H>           // Additional RMobilePhone error code
+
+
+// +CME error code
+_LIT8(KCMEIncorrectPassword, "+CME: 16\r\n"); // Incorrect password.\r\n
+_LIT8(KCMEPUKRequired, "+CME: 12\r\n"); // PUK required.\r\n
+_LIT8(KCMENotAllowed, "+CME: 3\r\n"); // Operation not allowed.\r\n
+_LIT8(KCMEPhoneError, "+CME: 0\r\n"); // Phone failure.\r\n
+_LIT8(KCMEPhoneUnknown, "+CME: 100\r\n"); // unknown error
+
+const TInt KErrorReplyLength = 9;  // CR+LF+"ERROR"+CR+LF
+
+CATMiscCmdPlugin* CATMiscCmdPlugin::NewL()
+    {
+    CATMiscCmdPlugin* self = new (ELeave) CATMiscCmdPlugin();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+CATMiscCmdPlugin::~CATMiscCmdPlugin()
+	{
+    iReplyBuffer.Close();
+    
+    delete iCLCKHandler;
+    delete iCPWDHandler;
+    delete iCPINHandler;
+    delete iCUSDHandler;
+    delete iCNUMHandler;
+    delete iCFUNHandler;
+    delete iCBCHandler;
+    
+    iPhone.Close();
+    iTelServer.Close();
+	}
+
+CATMiscCmdPlugin::CATMiscCmdPlugin() : 
+    CATExtPluginBase()
+    {
+    }
+
+void CATMiscCmdPlugin::ConstructL()
+    {
+    TRACE_FUNC_ENTRY
+    ConnectToEtelL(iTelServer, iPhone);
+    
+    iCLCKHandler = CCLCKCommandHandler::NewL(this, iCommandParser, iPhone);
+    iCPWDHandler = CCPWDCommandHandler::NewL(this, iCommandParser, iPhone);
+    iCUSDHandler = CCUSDCommandHandler::NewL(this, iCommandParser, iPhone);
+    iCPINHandler = CCPINCommandHandler::NewL(this, iCommandParser, iPhone);
+    iCNUMHandler = CCNUMCommandHandler::NewL(this, iCommandParser, iPhone, iTelServer);
+    iCFUNHandler = CCFUNCommandHandler::NewL(this, iCommandParser, iPhone);
+    iCBCHandler = CCBCCommandHandler::NewL(this, iCommandParser, iPhone);
+    TRACE_FUNC_EXIT
+   	}
+
+/**
+ * @see CATExtPluginBase::ReportConnectionName
+ */
+void CATMiscCmdPlugin::ReportConnectionName( const TDesC8& /*aName*/ )
+    {
+    TRACE_FUNC_ENTRY
+    TRACE_FUNC_EXIT
+    }
+
+/**
+ * @see CATExtPluginBase::IsCommandSupported
+ */
+TBool CATMiscCmdPlugin::IsCommandSupported( const TDesC8& aCmd )
+    {
+    TRACE_FUNC_ENTRY
+    iHcCmd = NULL;
+    iHcReply = NULL;
+    iCurrentHandler = NULL;
+    TBool supported = ETrue;
+    
+    Trace(KDebugPrintS, "aCmd: ", &aCmd);
+    
+    iCommandParser.ParseAtCommand(aCmd);
+
+    Trace(KDebugPrintD, "Command: ", iCommandParser.Command());
+    // TODO: check if the type is supported?
+    // iCommandParser.CommandHandlerType() != TAtCommandParser::ECmdHandlerTypeUndefined
+    switch (iCommandParser.Command())
+        {
+        case (TAtCommandParser::ECmdAtClck):
+            {
+            iCurrentHandler = iCLCKHandler;
+            break;
+            }
+        case (TAtCommandParser::ECmdAtCpwd):
+            {
+            iCurrentHandler = iCPWDHandler;
+            break;
+            }
+        case (TAtCommandParser::ECmdAtCpin):
+            {
+            iCurrentHandler = iCPINHandler;
+            break;
+            }
+        case (TAtCommandParser::ECmdAtCusd):
+            {
+            iCurrentHandler = iCUSDHandler;
+            break;
+            }   
+        case (TAtCommandParser::ECmdAtCnum):
+            {
+            iCurrentHandler = iCNUMHandler;
+            break;
+            }
+        case (TAtCommandParser::ECmdAtCfun):
+            {
+            iCurrentHandler = iCFUNHandler;
+            break;
+            }
+        case (TAtCommandParser::ECmdAtCbc):
+            {
+            iCurrentHandler = iCBCHandler;
+            break;
+            }
+        case (TAtCommandParser::EUnknown):
+        default:
+            {
+            supported = EFalse;
+            break;
+            }
+        }
+    Trace(KDebugPrintD, "supported: ", supported);
+    TRACE_FUNC_EXIT
+    return supported;
+	}
+
+/**
+ * @see CATExtPluginBase::HandleCommand
+ */
+void CATMiscCmdPlugin::HandleCommand( const TDesC8& aCmd,
+                                     RBuf8& aReply,
+                                     TBool aReplyNeeded )
+	{
+	TRACE_FUNC_ENTRY
+	
+	if (iCurrentHandler != NULL)
+	    {
+	    iHcCmd = &aCmd;
+	    iHcReply = &aReply;
+	    iCurrentHandler->HandleCommand( aCmd, aReply, aReplyNeeded );
+	    }
+	TRACE_FUNC_EXIT
+    }
+
+/**
+ * @see CATExtPluginBase::HandleCommandCancel
+ */
+void CATMiscCmdPlugin::HandleCommandCancel()
+    {
+    TRACE_FUNC_ENTRY
+    if (iCurrentHandler != NULL)
+	    {
+	    iCurrentHandler->HandleCommandCancel();
+	    }
+	TRACE_FUNC_EXIT
+    }
+
+/**
+ * @see CATExtPluginBase::NextReplyPartLength
+ */
+TInt CATMiscCmdPlugin::NextReplyPartLength()
+    {
+    TRACE_FUNC_ENTRY
+    TInt length = iReplyBuffer.Length();
+    if ( length >= KDefaultCmdBufLength )
+        {
+        length = KDefaultCmdBufLength;
+        }
+    TRACE_FUNC_EXIT
+    return length;
+    }
+
+/**
+ * @see CATExtPluginBase::GetNextPartOfReply
+ */
+TInt CATMiscCmdPlugin::GetNextPartOfReply( RBuf8& aNextReply )
+    {
+    TRACE_FUNC_ENTRY
+    TInt retVal = CreatePartOfReply( aNextReply );
+    TRACE_FUNC_EXIT
+    return retVal;
+    }
+
+/**
+ * @see CATExtPluginBase::ReceiveUnsolicitedResult
+ */
+void CATMiscCmdPlugin::ReceiveUnsolicitedResult()
+    {
+    TRACE_FUNC_ENTRY
+    TRACE_FUNC_EXIT
+    }
+
+/**
+ * @see CATExtPluginBase::ReceiveUnsolicitedResultCancel
+ */
+void CATMiscCmdPlugin::ReceiveUnsolicitedResultCancel()
+    {
+    TRACE_FUNC_ENTRY
+    TRACE_FUNC_EXIT
+    }
+
+/**
+ * @see CATExtPluginBase::ReportNvramStatusChange
+ */
+void CATMiscCmdPlugin::ReportNvramStatusChange( const TDesC8& /*aNvram*/ )
+    {
+    TRACE_FUNC_ENTRY
+    TRACE_FUNC_EXIT
+    }
+
+/**
+ * @see CATExtPluginBase::ReportExternalHandleCommandError
+ */
+void CATMiscCmdPlugin::ReportExternalHandleCommandError()
+    {
+    TRACE_FUNC_ENTRY
+    TRACE_FUNC_EXIT
+    }
+
+/**
+ * Creates part of reply from the global reply buffer to the destination
+ * buffer. Used with APIs which need the next part of reply in multipart
+ * reply requests.
+ *
+ * @param aBuffer Destination buffer; the next part of reply is stored to
+ *                   this buffer.
+ * @return None
+ */
+TInt CATMiscCmdPlugin::CreatePartOfReply( RBuf8& aBuffer )
+    {
+    TRACE_FUNC_ENTRY
+    TInt ret = KErrNone;
+    TInt partLength;
+    if ( iReplyBuffer.Length() <= 0 )
+        {
+        ret = KErrGeneral;
+        }
+    else
+        {
+        partLength = NextReplyPartLength();
+        if ( iReplyBuffer.Length() < partLength )
+            {
+            ret =  KErrNotFound;
+            }
+        }
+    Trace(KDebugPrintD, "ret: ", ret);
+    if (ret == KErrNone)
+        {
+        aBuffer.Create( iReplyBuffer, partLength );
+        iReplyBuffer.Delete( 0, partLength );
+        if ( iReplyBuffer.Length() == 0 )
+            {
+            iReplyBuffer.Close();
+            }
+        }
+
+    TRACE_FUNC_EXIT
+    return ret;
+    }
+
+/**
+ * @see MATMiscCmdPlugin::CreateReplyAndComplete
+ */
+TInt CATMiscCmdPlugin::CreateReplyAndComplete( TATExtensionReplyType aReplyType,
+                                              const TDesC8& aSrcBuffer,
+											  TInt aError )
+    {
+    TRACE_FUNC_ENTRY
+    iReplyBuffer.Close();
+    Trace(KDebugPrintD, "aError: ", aError);
+    if ( aError != KErrNone )
+        {
+        HandleCommandCompleted( aError, EReplyTypeUndefined );
+        iHcCmd = NULL;
+        iHcReply = NULL;
+        iCurrentHandler = NULL;
+        TRACE_FUNC_EXIT
+        return KErrNone;
+        }
+    
+    Trace(KDebugPrintS, "iHcReply: ", &iHcReply);
+    if (iHcReply == NULL)
+        {
+        TRACE_FUNC_EXIT
+        return KErrGeneral;
+        }
+    
+    Trace(KDebugPrintD, "iQuietMode: ", iQuietMode);
+    if ( iQuietMode )
+        {
+        iReplyBuffer.Create( KNullDesC8 );
+        }
+    else
+        {
+        iReplyBuffer.Create( aSrcBuffer );
+        }
+    
+    Trace(KDebugPrintD, "aReplyType: ", aReplyType);
+    switch ( aReplyType )
+        {
+        case EReplyTypeOther:
+            break;
+        case EReplyTypeOk:
+            CreateOkOrErrorReply( iReplyBuffer, ETrue );
+            break;
+        case EReplyTypeError:
+            CreateOkOrErrorReply( iReplyBuffer, EFalse );
+            break;
+        default:
+            TRACE_FUNC_EXIT
+            return KErrGeneral;
+        }
+    CreatePartOfReply( *iHcReply );
+    HandleCommandCompleted( KErrNone, aReplyType );
+    iHcCmd = NULL;
+    iHcReply = NULL;
+    iCurrentHandler = NULL;
+    TRACE_FUNC_EXIT
+    return KErrNone;
+    }
+
+/**
+ * @see MATMiscCmdPlugin::CreateOkOrErrorReply
+ */
+TInt CATMiscCmdPlugin::CreateOkOrErrorReply( RBuf8& aReplyBuffer,
+                                            TBool aOkReply )
+    {
+    TRACE_FUNC_ENTRY
+    _LIT8( KErrorReplyVerbose, "ERROR" );
+    _LIT8( KOkReplyVerbose,    "OK" );
+    _LIT8( KErrorReplyNumeric, "4" );
+    _LIT8( KOkReplyNumeric,    "0" );
+    TBuf8<KErrorReplyLength> replyBuffer;
+    if ( iVerboseMode )
+        {
+        replyBuffer.Append( iCarriageReturn );
+        replyBuffer.Append( iLineFeed );
+        if ( aOkReply )
+            {
+            replyBuffer.Append( KOkReplyVerbose );
+            }
+        else
+            {
+            replyBuffer.Append( KErrorReplyVerbose );
+            }
+        replyBuffer.Append( iCarriageReturn );
+        replyBuffer.Append( iLineFeed );
+        }
+    else
+        {
+        if ( aOkReply )
+            {
+            replyBuffer.Append( KOkReplyNumeric );
+            }
+        else
+            {
+            replyBuffer.Append( KErrorReplyNumeric );
+            }
+        replyBuffer.Append( iCarriageReturn );
+        }
+
+    aReplyBuffer.ReAlloc(aReplyBuffer.Length() + replyBuffer.Length());
+    aReplyBuffer.Append( replyBuffer );
+    TRACE_FUNC_EXIT
+    return KErrNone;
+    }
+
+/**
+ * @see MATMiscCmdPlugin::GetCharacterValue
+ */
+TInt CATMiscCmdPlugin::GetCharacterValue( TCharacterTypes aCharType,
+                                         TChar& aChar )
+    {
+    TRACE_FUNC_ENTRY
+    TInt retVal = KErrNone;
+    switch ( aCharType )
+        {
+        case ECharTypeCR:
+            aChar = iCarriageReturn;
+            break;
+        case ECharTypeLF:
+            aChar = iLineFeed;
+            break;
+        case ECharTypeBS:
+            aChar = iBackspace;
+            break;
+        default:
+            retVal = KErrNotFound;
+            break;
+        }
+    TRACE_FUNC_EXIT
+    return retVal;
+    }
+
+/**
+ * @see MATMiscCmdPlugin::GetModeValue
+ */
+TInt CATMiscCmdPlugin::GetModeValue( TModeTypes aModeType, TBool& aMode )
+    {
+    TRACE_FUNC_ENTRY
+    TInt retVal = KErrNone;
+    switch ( aModeType )
+        {
+        case EModeTypeQuiet:
+            aMode = iQuietMode;
+            break;
+        case EModeTypeVerbose:
+            aMode = iVerboseMode;
+            break;
+        default:
+            retVal = KErrNotFound;
+            break;
+        }
+    TRACE_FUNC_EXIT
+    return retVal;
+    }
+
+void CATMiscCmdPlugin::CreateCMEReplyAndComplete(TInt aError)
+    {
+    TRACE_FUNC_ENTRY
+    
+    // TODO should return CME error according to CME state (and quiet mode?)
+    RBuf8 response;
+    response.Create(KDefaultCmdBufLength);
+    
+    // log error code
+    response.AppendNum(aError);
+    Trace(KDebugPrintD, "complete with error ", &response);
+    
+    // return error code to AT client
+    response.Zero(); // reuse RBuf
+    response.Append(KCRLF);
+    switch(aError)
+        {
+        case KErrGsm0707IncorrectPassword:
+        case KErrAccessDenied:
+            {    
+            // code was entered erroneously
+            response.Append(KCMEIncorrectPassword);
+            break;
+            }    
+        case KErrGsmSSPasswordAttemptsViolation:
+        case KErrLocked:
+            {
+            // Pin blocked 
+            response.Append(KCMEPUKRequired);
+            break;
+            }
+        case KErrGsm0707OperationNotAllowed:
+            {
+            // not allowed with this sim
+            response.Append(KCMENotAllowed);
+            break;
+            }
+        case KErrUnknown:
+            {
+            // unknown error
+            response.Append(KCMEPhoneUnknown);
+            break;
+            }
+        default:
+            response.Append(KCMEPhoneError);
+        }
+    CreateReplyAndComplete( EReplyTypeError, response );
+    response.Close();
+    TRACE_FUNC_EXIT
+    }
+
+
+TInt CATMiscCmdPlugin::HandleUnsolicitedRequest(const TDesC8& aAT )
+    {
+    return SendUnsolicitedResult(aAT);
+    }
+
+void CATMiscCmdPlugin::ConnectToEtelL(RTelServer& aTelServer, RMobilePhone& aPhone)
+    {
+    TRACE_FUNC_ENTRY
+    User::LeaveIfError(aTelServer.Connect());
+
+    // get the name of the first available phone
+    TInt phoneCount;
+    RTelServer::TPhoneInfo info;
+
+    User::LeaveIfError(aTelServer.EnumeratePhones(phoneCount));  
+    if (phoneCount < 1)
+        {
+        User::Leave(KErrNotFound); // TODO: appropriate error code
+        }
+    User::LeaveIfError(aTelServer.GetPhoneInfo(0, info));
+    User::LeaveIfError(aPhone.Open(aTelServer, info.iName));
+    TRACE_FUNC_EXIT
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsatplugin/atmisccmdplugin/src/atmisccmdpluginbase.cpp	Tue Apr 27 16:49:44 2010 +0300
@@ -0,0 +1,33 @@
+/*
+* Copyright (c) 2010 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:  Main handler for incoming requests
+*
+*/
+
+#include "atmisccmdplugin.h"
+
+#include "debug.h"
+
+
+CATCmdAsyncBase::CATCmdAsyncBase(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone) :
+    CActive(CActive::EPriorityStandard),
+    iATCmdParser(aATCmdParser),
+    iPhone(aPhone)
+    {
+    TRACE_FUNC_ENTRY
+    iCallback = aCallback;
+    CActiveScheduler::Add(this);
+    TRACE_FUNC_EXIT
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsatplugin/atmisccmdplugin/src/cbccommandhandler.cpp	Tue Apr 27 16:49:44 2010 +0300
@@ -0,0 +1,145 @@
+/*
+ * Copyright (c) 2010 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 :
+ *
+ */
+
+#include "cbccommandhandler.h"
+
+#include "atmisccmdpluginconsts.h"
+#include "debug.h"
+
+CCBCCommandHandler* CCBCCommandHandler::NewL(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone)
+    {
+    TRACE_FUNC_ENTRY
+    CCBCCommandHandler* self = new (ELeave) CCBCCommandHandler(aCallback, aATCmdParser, aPhone);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    TRACE_FUNC_EXIT
+    return self;
+    }
+
+CCBCCommandHandler::CCBCCommandHandler(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone) :
+    CATCmdAsyncBase(aCallback, aATCmdParser, aPhone)
+    {
+    TRACE_FUNC_ENTRY
+    TRACE_FUNC_EXIT
+    }
+
+void CCBCCommandHandler::ConstructL()
+    {
+    TRACE_FUNC_ENTRY
+    iReply.CreateL(KDefaultCmdBufLength);
+    TRACE_FUNC_EXIT
+    }
+
+CCBCCommandHandler::~CCBCCommandHandler()
+    {
+    TRACE_FUNC_ENTRY
+    Cancel();
+    iReply.Close();
+    TRACE_FUNC_EXIT
+    }
+
+void CCBCCommandHandler::HandleCommand(const TDesC8& /*aCmd*/, RBuf8& /*aReply*/, TBool /*aReplyNeeded*/)
+    {
+    iReply.Zero();
+ 
+    TAtCommandParser::TCommandHandlerType cmdHandlerType = iATCmdParser.CommandHandlerType();
+    
+    switch (cmdHandlerType)
+        {
+        case (TAtCommandParser::ECmdHandlerTypeTest):
+            {
+            iCallback->CreateReplyAndComplete( EReplyTypeOther, KCBCSupportedCmdsList);
+            break;
+            }
+        case (TAtCommandParser::ECmdHandlerTypeBase):
+            {
+            iPhone.GetBatteryInfo(iStatus, iBatteryInfo);
+            SetActive();
+            break;
+            }
+        default:
+            {
+            iCallback->CreateReplyAndComplete(EReplyTypeError);
+            break;
+            }
+        }
+    TRACE_FUNC_EXIT
+    }
+
+void CCBCCommandHandler::HandleCommandCancel()
+    {
+    TRACE_FUNC_ENTRY
+    Cancel();
+    TRACE_FUNC_EXIT
+    }
+
+
+void CCBCCommandHandler::RunL()
+    {
+    TRACE_FUNC_ENTRY
+    if (iStatus.Int() == KErrNone)
+        {
+        iReply.Append(KAtCBC);
+        // status is mapped according to AT command spec: 
+        //    <bcs>:
+        //    0 MT is powered by the battery
+        //    1 MT has a battery connected, but is not powered by it
+        //    2 MT does not have a battery connected
+        //    3 Recognized power fault, calls inhibited
+        switch(iBatteryInfo.iStatus)
+            {
+            case (RMobilePhone::EPoweredByBattery):
+                {
+                iReply.AppendNum(0);
+                break;
+                }
+            case (RMobilePhone::EBatteryConnectedButExternallyPowered):
+                {
+                iReply.AppendNum(1);
+                break;
+                }
+            case (RMobilePhone::ENoBatteryConnected):
+                {
+                iReply.AppendNum(2);
+                break;
+                }
+            case (RMobilePhone::EPowerFault):
+            default:
+                {
+                iReply.AppendNum(3);
+                break;
+                }
+            }
+
+        iReply.Append(',');
+        iReply.AppendNum(iBatteryInfo.iChargeLevel);
+        iReply.Append(KOKCRLF);
+        
+        iCallback->CreateReplyAndComplete(EReplyTypeOther, iReply);
+        }
+    else
+        {
+        iCallback->CreateCMEReplyAndComplete(iStatus.Int());   
+        }
+    TRACE_FUNC_EXIT
+    }
+
+void CCBCCommandHandler::DoCancel()
+    {
+    TRACE_FUNC_ENTRY
+    iPhone.CancelAsyncRequest(EMobilePhoneGetBatteryInfo);
+    TRACE_FUNC_EXIT
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsatplugin/atmisccmdplugin/src/cbsettinghandler.cpp	Tue Apr 27 16:49:44 2010 +0300
@@ -0,0 +1,158 @@
+/*
+ * Copyright (c) 2010 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 :
+ *
+ */
+
+#include "cbsettinghandler.h"
+
+#include "clckcommandhandler.h"
+#include "debug.h"
+
+/**
+ * AO class for setting call barring(s)
+ */
+CCBSettingHandler* CCBSettingHandler::NewL(RMobilePhone& aPhone)
+    {
+    TRACE_FUNC_ENTRY
+    CCBSettingHandler* self = new(ELeave) CCBSettingHandler(aPhone);
+    TRACE_FUNC_EXIT
+    return self;
+    }
+      
+CCBSettingHandler::CCBSettingHandler(RMobilePhone& aPhone) :
+    CActive(EPriorityNormal),
+    iPhone(aPhone)
+    {
+    TRACE_FUNC_ENTRY
+    CActiveScheduler::Add(this);
+    TRACE_FUNC_EXIT
+    }
+
+CCBSettingHandler::~CCBSettingHandler()
+    {
+    TRACE_FUNC_ENTRY
+    Cancel();
+    iClassArray.Close();
+    TRACE_FUNC_EXIT
+    }
+
+void CCBSettingHandler::Start(TRequestStatus& aReqStatus, TInt aInfoClass, 
+        RMobilePhone::TMobilePhoneCBCondition aCondition,
+        RMobilePhone::TMobilePhoneCBChangeV1* aCBInfo)
+    {
+    TRACE_FUNC_ENTRY
+    
+    iCBInfo = aCBInfo;
+    iCondition = aCondition;
+    aReqStatus = KRequestPending;
+    iQueuedStatus = &aReqStatus;
+    
+    if ((aInfoClass & EInfoClassVoice) == EInfoClassVoice)
+        {
+        iClassArray.Append(RMobilePhone::ETelephony);
+        }
+   // TODO: confirm ECircuitDataService is not needed 
+    if ((aInfoClass & EInfoClassData) == EInfoClassData)
+        {
+        iClassArray.Append(RMobilePhone::EAllBearer);
+        }
+    
+    if ((aInfoClass & EInfoClassFax) == EInfoClassFax)
+        {
+        iClassArray.Append(RMobilePhone::EFaxService);
+        }
+    
+    if ((aInfoClass & EInfoClassSMS) == EInfoClassSMS)
+        {
+        iClassArray.Append(RMobilePhone::EShortMessageService);
+        }
+
+    if ((aInfoClass & EInfoClassSyncData) == EInfoClassSyncData)
+        {
+        iClassArray.Append(RMobilePhone::ESyncData);
+        }
+
+    if ((aInfoClass & EInfoClassASyncData) == EInfoClassASyncData)
+        {
+        iClassArray.Append(RMobilePhone::EAsyncData);
+        }
+    
+    if ((aInfoClass & EInfoClassPacketData) == EInfoClassPacketData)
+        {
+        iClassArray.Append(RMobilePhone::EPacketData);
+        }
+    
+    if ((aInfoClass & EInfoClassPadAccess) == EInfoClassPadAccess)
+        {
+        iClassArray.Append(RMobilePhone::EPadAccess);
+        }
+    
+    SetCBForServiceGroup();
+    
+    TRACE_FUNC_EXIT
+    }
+
+void CCBSettingHandler::SetCBForServiceGroup()
+    {
+    TRACE_FUNC_ENTRY
+    
+    Trace(KDebugPrintD, "iClassArray.Count(): ", iClassArray.Count());
+    if (iClassArray.Count() != 0)
+        {
+        iCBInfo->iServiceGroup = iClassArray[0];
+        iPhone.SetCallBarringStatus(iStatus, iCondition, *iCBInfo);
+        iClassArray.Remove(0);
+        SetActive();
+        }
+    else
+        {
+        Complete(KErrNone);
+        }
+    TRACE_FUNC_EXIT
+    }
+
+void CCBSettingHandler::RunL()
+    {
+    TRACE_FUNC_ENTRY
+    
+    Trace(KDebugPrintD, "iStatus.Int(): ", iStatus.Int());
+    
+    if (iStatus.Int() != KErrNone )
+        {
+        Complete(iStatus.Int());
+        }
+    else
+        {
+        SetCBForServiceGroup();
+        }
+    TRACE_FUNC_EXIT
+    }
+
+void CCBSettingHandler::DoCancel()
+    {
+    TRACE_FUNC_ENTRY
+    iPhone.CancelAsyncRequest(EMobilePhoneSetCallBarringStatus);
+    
+    Complete(KErrCancel);
+
+    TRACE_FUNC_EXIT
+    }
+
+void CCBSettingHandler::Complete(TInt aError)
+    {
+    if (iQueuedStatus != NULL)
+        {
+        User::RequestComplete(iQueuedStatus, aError);
+        iQueuedStatus = NULL;
+        }
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsatplugin/atmisccmdplugin/src/cfuncommandhandler.cpp	Tue Apr 27 16:49:44 2010 +0300
@@ -0,0 +1,214 @@
+/*
+ * Copyright (c) 2010 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 :
+ *
+ */
+
+#include "cfuncommandhandler.h"
+
+#include <MProfileEngine.h>
+#include <starterclient.h>
+
+#include <Profile.hrh>
+
+#include "atmisccmdpluginconsts.h"
+#include "debug.h"
+
+CCFUNCommandHandler* CCFUNCommandHandler::NewL(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone)
+    {
+    TRACE_FUNC_ENTRY
+    CCFUNCommandHandler* self = new (ELeave) CCFUNCommandHandler(aCallback, aATCmdParser, aPhone);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    TRACE_FUNC_EXIT
+    return self;
+    }
+
+CCFUNCommandHandler::CCFUNCommandHandler(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone) :
+    CATCmdAsyncBase(aCallback, aATCmdParser, aPhone)
+    {
+    TRACE_FUNC_ENTRY
+    TRACE_FUNC_EXIT
+    }
+
+void CCFUNCommandHandler::ConstructL()
+    {
+    TRACE_FUNC_ENTRY
+    iReply.CreateL(KDefaultCmdBufLength);
+    iProfileEngine = CreateProfileEngineL();
+    TRACE_FUNC_EXIT
+    }
+
+CCFUNCommandHandler::~CCFUNCommandHandler()
+    {
+    TRACE_FUNC_ENTRY
+    Cancel();
+    if (iProfileEngine != NULL)
+        {
+        iProfileEngine->Release();
+        }
+    TRACE_FUNC_EXIT
+    }
+
+void CCFUNCommandHandler::HandleCommand(const TDesC8& /*aCmd*/, RBuf8& /*aReply*/, TBool /*aReplyNeeded*/)
+    {
+    TInt ret = KErrNone;
+    iReply.Zero();
+    TAtCommandParser::TCommandHandlerType cmdHandlerType = iATCmdParser.CommandHandlerType();
+    
+    switch (cmdHandlerType)
+        {
+        case (TAtCommandParser::ECmdHandlerTypeTest):
+            {
+            iCallback->CreateReplyAndComplete( EReplyTypeOther, KCFUNSupportedCmdsList);
+            break;
+            }
+        case (TAtCommandParser::ECmdHandlerTypeRead):
+            {
+            TInt profileId = iProfileEngine->ActiveProfileId();
+            
+            iReply.Append( KAtCFUN );
+    
+            if( profileId == EProfileOffLineId )
+                {
+                iReply.Append( '0' );
+                }
+            else
+                {
+                iReply.Append( '1' );
+                }
+            iReply.Append( KOKCRLF );
+            iCallback->CreateReplyAndComplete( EReplyTypeOther, iReply);
+            break;
+            }
+        case (TAtCommandParser::ECmdHandlerTypeSet):
+            {
+            TInt func = 0;
+            TInt reset = 0; // default 0 - do not reset the MT before setting it to <fun> power level
+            
+            ret = iATCmdParser.NextIntParam(func);
+            if (ret != KErrNone && ret != KErrNotFound)
+                {
+                iCallback->CreateReplyAndComplete(EReplyTypeError);
+                TRACE_FUNC_EXIT
+                return;
+                }
+            ret = iATCmdParser.NextIntParam(reset);
+            
+            // second parameter is optional, but only 0 and 1 are valid if it is specified
+            if (ret != KErrNone && ret != KErrNotFound && (reset != 0 || reset != 1))
+                {
+                iCallback->CreateReplyAndComplete(EReplyTypeError);
+                TRACE_FUNC_EXIT
+                return;
+                }
+            ret = ActivateProfile(func, reset);
+           
+            break;
+            }
+        default:
+            {
+            iCallback->CreateReplyAndComplete(EReplyTypeError);
+            }
+        }
+    
+    if (ret != KErrNone)
+        {
+        iCallback->CreateReplyAndComplete(EReplyTypeError);
+        }
+    else
+        {
+        iCallback->CreateReplyAndComplete( EReplyTypeOther, iReply );
+        }
+    TRACE_FUNC_EXIT
+    }
+
+void CCFUNCommandHandler::HandleCommandCancel()
+    {
+    TRACE_FUNC_ENTRY
+    // no asyc requests are made in when using AT+CFUN
+    TRACE_FUNC_EXIT
+    }
+
+
+void CCFUNCommandHandler::RunL()
+    {
+    TRACE_FUNC_ENTRY
+    // no asyc requests are made in when using AT+CFUN
+    TRACE_FUNC_EXIT
+    }
+
+void CCFUNCommandHandler::DoCancel()
+    {
+    TRACE_FUNC_ENTRY
+    // no asyc requests are made in when using AT+CFUN
+    TRACE_FUNC_EXIT
+    }
+
+TInt CCFUNCommandHandler::ActivateProfile(TInt aFunc, TInt aReset)
+    {
+    TInt err = KErrNone;
+    
+    switch (aFunc)
+        {
+        case (0):
+        case (4):
+            {
+            err = SetActiveProfile(KOfflineProfileId);
+            break;
+            }
+        case (1):
+            {
+            err = SetActiveProfile(KGeneralProfileId);
+            break;
+            }
+        default:
+            {
+            err = KErrArgument;
+            break;
+            }
+        }
+    
+    if (err == KErrNone && aReset == 1)
+        {
+        err = RestartDevice();
+        }
+    
+    return err;
+    }
+
+TInt CCFUNCommandHandler::SetActiveProfile(TInt aProfileId)
+    {
+    TInt err = KErrNone;
+
+    if(iProfileEngine)
+        {
+        TRAP(err, iProfileEngine->SetActiveProfileL( aProfileId ));
+        }
+
+    return err;
+    }
+
+TInt CCFUNCommandHandler::RestartDevice()
+    {
+    RStarterSession session;
+    TInt err = session.Connect();
+
+    if( err == KErrNone )
+        {
+        session.Reset(RStarterSession::EUnknownReset);
+        session.Close();
+        }
+
+    return err;
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsatplugin/atmisccmdplugin/src/clckcommandhandler.cpp	Tue Apr 27 16:49:44 2010 +0300
@@ -0,0 +1,764 @@
+/*
+ * Copyright (c) 2010 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 :
+ *
+ */
+
+#include "clckcommandhandler.h"
+
+#include <startupdomainpskeys.h>
+#include <e32property.h>
+
+#include "securitycodeverifier.h"
+#include "securityeventhandler.h"
+#include "cbsettinghandler.h"
+
+#include "atmisccmdpluginconsts.h"
+#include "debug.h"
+
+const TInt KSCPMaxHashLength( 32 );
+
+CCLCKCommandHandler* CCLCKCommandHandler::NewL(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone)
+    {
+    TRACE_FUNC_ENTRY
+    CCLCKCommandHandler* self = new (ELeave) CCLCKCommandHandler(aCallback, aATCmdParser, aPhone);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    TRACE_FUNC_EXIT
+    return self;
+    }
+
+CCLCKCommandHandler::CCLCKCommandHandler(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone) :
+    CATCmdAsyncBase(aCallback, aATCmdParser, aPhone),
+    iLockInfoPckg(iLockInfo)
+    {
+    TRACE_FUNC_ENTRY
+    TRACE_FUNC_EXIT
+    }
+
+void CCLCKCommandHandler::ConstructL()
+    {
+    TRACE_FUNC_ENTRY
+    iReply.CreateL(KDefaultCmdBufLength);
+    
+    // initialise AOs
+    iCBRetrieve = CRetrieveMobilePhoneCBList::NewL(iPhone);
+    iCBSettingHandler = CCBSettingHandler::NewL(iPhone);
+    iSecurityEventHandler = CSecurityEventHandler::NewL(this, iPhone);
+    iSecurityCodeVerifier = CSecurityCodeVerifier::NewL(this, iPhone);
+
+    TRACE_FUNC_EXIT
+    }
+
+CCLCKCommandHandler::~CCLCKCommandHandler()
+    {
+    TRACE_FUNC_ENTRY
+    Cancel();
+    
+    delete iCBRetrieve;
+    delete iCBSettingHandler;
+    delete iSecurityEventHandler;
+    delete iSecurityCodeVerifier;
+    
+    iPassword.Close();
+    iReply.Close();
+    TRACE_FUNC_EXIT
+    }
+
+void CCLCKCommandHandler::DoCancel()
+    {
+    TRACE_FUNC_ENTRY
+    switch (iCLCKCommandType)
+        {
+        case (CCLCKCommandHandler::ECLCKLockGet):
+            {
+            iPhone.CancelAsyncRequest(EMobilePhoneGetLockInfo);
+            break;
+            }
+        case (CCLCKCommandHandler::ECLCKLockSet):
+            {
+            iPhone.CancelAsyncRequest(EMobilePhoneSetLockSetting);
+            iSecurityCodeVerifier->Cancel();
+            iSecurityEventHandler->Cancel();
+            break;
+            }
+        case (CCLCKCommandHandler::ECLCKBarringGet):
+            {
+            iCBRetrieve->Cancel();
+            break;
+            }
+        case (CCLCKCommandHandler::ECLCKBarringSet):
+            {
+            iCBSettingHandler->Cancel();
+            break;
+            }
+        }
+    TRACE_FUNC_EXIT
+    }
+
+void CCLCKCommandHandler::HandleCommand( const TDesC8& /*aCmd*/, RBuf8& /*aReply*/, TBool /*aReplyNeeded*/)
+    {
+    TRACE_FUNC_ENTRY
+    TAtCommandParser::TCommandHandlerType cmdHandlerType = iATCmdParser.CommandHandlerType();
+    Trace(KDebugPrintD, "cmdHandlerType: ", cmdHandlerType);
+    
+    switch (cmdHandlerType)
+        {
+        case (TAtCommandParser::ECmdHandlerTypeTest):
+            {
+            iCallback->CreateReplyAndComplete(EReplyTypeOther, KCLCKSupportedCmdsList);
+            break;
+            }
+        case (TAtCommandParser::ECmdHandlerTypeSet):
+            {
+            if (ParseCCLCKCommand() == KErrNone)
+                {
+                IssueCLCKCommand();
+                }
+            else
+                {
+                iCallback->CreateReplyAndComplete(EReplyTypeError);
+                }
+            break;
+            }
+        default:
+            {
+            iCallback->CreateReplyAndComplete(EReplyTypeError);
+            break;
+            }
+        }
+    TRACE_FUNC_EXIT
+    }
+
+void CCLCKCommandHandler::RunL()
+    {
+    TRACE_FUNC_ENTRY
+    Trace(KDebugPrintD, "iStatus.Int(): ", iStatus.Int());
+    TInt err = iStatus.Int();
+    if (err == KErrNone)
+        {
+        switch ( iCLCKCommandType )
+            {
+            case (CCLCKCommandHandler::ECLCKLockGet):
+                {
+                iReply.Append(KAtCLCK);
+                if (iLockInfo.iStatus == RMobilePhone::EStatusUnlocked)
+                    {
+                    iReply.AppendNum(0);
+                    iReply.Append(KCRLF);
+                    }
+                else if (iLockInfo.iStatus == RMobilePhone::EStatusLocked)
+                    {
+                    iReply.AppendNum(1); 
+                    iReply.Append(KCRLF);
+                    }
+                else
+                    {
+                    err = KErrArgument;
+                    }
+                break;
+                }
+            case(CCLCKCommandHandler::ECLCKBarringGet):
+                {
+                err = ReceiveCBList();
+                break;
+                }
+            case (CCLCKCommandHandler::ECLCKLockSet):
+                {
+                iLockSettingState = ELockSettingIdle;
+                iSecurityCodeVerifier->Cancel();
+                iSecurityEventHandler->Cancel();
+                break;
+                }
+            case(CCLCKCommandHandler::ECLCKBarringSet):
+            default:
+                {
+                // no action required
+                break;
+                }
+            }
+        }
+
+    if (err != KErrNone)
+        {
+        if (iCLCKCommandType == CCLCKCommandHandler::ECLCKLockSet)
+            {
+            iLockSettingState =ELockSettingIdle;
+            iSecurityCodeVerifier->Cancel();
+            iSecurityEventHandler->Cancel();
+            }
+        iCallback->CreateCMEReplyAndComplete(err);
+        }
+    else
+        {
+        iCallback->CreateReplyAndComplete( EReplyTypeOther, iReply );
+        }
+    
+    TRACE_FUNC_EXIT
+    }
+
+TInt CCLCKCommandHandler::ReceiveCBList()
+    {
+    TRACE_FUNC_ENTRY
+    iInfoClass = 0;
+    CMobilePhoneCBList* callBarringList=NULL;
+    TRAPD(leaveCode, callBarringList=iCBRetrieve->RetrieveListL(););
+    if (leaveCode != KErrNone) 
+        {
+        TRACE_FUNC_EXIT
+        return leaveCode;
+        }
+
+    TInt count = callBarringList->Enumerate();
+    while (count-- > 0)
+        {
+        RMobilePhone::TMobilePhoneCBInfoEntryV1 entry;
+        TRAP(leaveCode, entry = callBarringList->GetEntryL(count););
+        if (leaveCode != KErrNone) 
+            {
+            TRACE_FUNC_EXIT
+            return leaveCode;
+            }
+        if (entry.iCondition == iCondition &&
+            entry.iStatus == RMobilePhone::ECallBarringStatusActive)
+            {
+            switch (entry.iServiceGroup)
+                {
+                case(RMobilePhone::ETelephony):
+                    {
+                    iInfoClass |= EInfoClassVoice;
+                    break;   
+                    }
+                case(RMobilePhone::EAllBearer):
+                    {
+                    iInfoClass |= EInfoClassData;
+                    break;   
+                    }
+                case(RMobilePhone::EFaxService):
+                    {
+                    iInfoClass |= EInfoClassFax;
+                    break;   
+                    }
+                case(RMobilePhone::EShortMessageService):
+                    {
+                    iInfoClass |= EInfoClassSMS;
+                    break;   
+                    }
+                case(RMobilePhone::ESyncData):
+                    {
+                    iInfoClass |= EInfoClassSyncData;
+                    break;   
+                    }
+                case(RMobilePhone::EAsyncData):
+                    {
+                    iInfoClass |= EInfoClassASyncData;
+                    break;   
+                    }
+                case(RMobilePhone::EPacketData):
+                    {
+                    iInfoClass |= EInfoClassPacketData;
+                    break;   
+                    }
+                case(RMobilePhone::EPadAccess):
+                    {
+                    iInfoClass |= EInfoClassPadAccess;
+                    break;   
+                    }
+                }
+            }
+        }
+    
+    // There are no services with barring active - therefore report
+    // - status = 0 (inactive)
+    // - class = 7 (default value; voice, fax and data)
+    TInt status;
+    if (iInfoClass == 0)
+        {
+        status = 0;
+        iInfoClass = 7; // Default value, see ETSI TS 127 007 V6.9.0 (2007-06)
+        }
+    else
+        {
+        // There is at least one service with barring active - report status 1 (active)
+        status = 1;
+        }
+    
+    iReply.Append(KAtCLCK);
+    iReply.AppendNum(status);
+    iReply.Append(','); 
+    iReply.AppendNum(iInfoClass);
+    iReply.Append(KCRLF);
+    
+    delete callBarringList;
+    TRACE_FUNC_EXIT
+    return KErrNone;
+    }
+
+void CCLCKCommandHandler::HandleCommandCancel()
+    {
+    TRACE_FUNC_ENTRY
+    Cancel();
+    TRACE_FUNC_EXIT
+    }
+
+void CCLCKCommandHandler::IssueCLCKCommand()
+    {
+    TRACE_FUNC_ENTRY
+    Trace(KDebugPrintD, "iCLCKCommandType: ", iCLCKCommandType);
+    iReply.Zero();
+    
+    switch (iCLCKCommandType)
+        {
+        case (CCLCKCommandHandler::ECLCKLockGet):
+            {
+            iPhone.GetLockInfo(iStatus, iLockType, iLockInfoPckg);
+            SetActive();
+            break;
+            }
+        case (CCLCKCommandHandler::ECLCKLockSet):
+            {
+            if (iPassword.Compare(KNullDesC8) == 0)
+                {
+                iCallback->CreateReplyAndComplete( EReplyTypeError);
+                }
+            else
+                {
+                // Set the property to ignore security events in other clients
+                // it allows to avoid GUI promt for security code
+                TInt  ret = KErrNone;
+                // TODO: reenable when KIgnoreSecurityEvent propety definition is submitted to codeline
+//                if (iLockType == RMobilePhone::ELockICC)
+//                    {
+//                    ret = RProperty::Set(KPSUidStartup, KIgnoreSecurityEvent, EPSIgnoreSecurityEventEPin1Required);
+//                    }
+//                else
+//                    {
+//                    ret = RProperty::Set(KPSUidStartup, KIgnoreSecurityEvent, EPSIgnoreSecurityEventEPhonePasswordRequired);
+//                    }
+                Trace(KDebugPrintD, "RProperty::Set: ", ret);
+                if (ret == KErrNone)
+                    {
+                    // Start security event handler - this will notify whether a 
+                    // password is required to complete the set lock request.
+                    iSecurityEventHandler->Start();
+                
+                    Trace(KDebugPrintD, "SetLockSetting iLockType: ", iLockType);
+                    Trace(KDebugPrintD, "SetLockSetting iLockChange: ", iLockChange);
+                    iPhone.SetLockSetting(iStatus, iLockType, iLockChange);
+                    iLockSettingState = ELockSettingRequested;
+                    SetActive();
+                    }
+                else
+                    {
+                    iCallback->CreateReplyAndComplete( EReplyTypeError);
+                    }
+                }
+            break;
+            }
+        case (CCLCKCommandHandler::ECLCKBarringGet):
+            {
+            iCBRetrieve->Start(iStatus, iCondition, RMobilePhone::RMobilePhone::EInfoLocationNetwork);
+            SetActive();
+            break;
+            }
+        case (CCLCKCommandHandler::ECLCKBarringSet):
+            {
+            if (iPassword.Compare(KNullDesC8) == 0)
+                {
+                iCallback->CreateReplyAndComplete(EReplyTypeError);
+                }
+            else
+                {
+                iCBSettingHandler->Start(iStatus, iInfoClass, iCondition, &iCBInfo);
+                SetActive();
+                }
+            break;
+            }
+        default:
+            {
+            iCallback->CreateReplyAndComplete(EReplyTypeError);
+            break;
+            }
+        }   
+    TRACE_FUNC_EXIT
+    }
+
+void CCLCKCommandHandler::HandlePasswordVerification(TInt aError)
+    {
+    TRACE_FUNC_ENTRY
+    
+    if (aError != KErrNone)
+        {
+        iCallback->CreateCMEReplyAndComplete(aError);
+        Cancel();
+        TRACE_FUNC_EXIT
+        return;
+        }
+    
+    switch (iLockSettingState)
+         {
+         case (ELockSettingIdle):
+             {
+             // Security code setting request has already been completed
+             iSecurityEventHandler->Cancel();
+             break;
+             }
+         case (ELockSettingPasswordRequested):
+             {
+             // after password has been verified go back to the previous state
+             iLockSettingState = ELockSettingRequested;
+             break;
+             }
+         case (ELockSettingRequested):
+         default:
+             {
+             // should never be in this state
+             __ASSERT_DEBUG(EFalse,  User::Invariant());
+             break;
+             }
+         }
+
+    TRACE_FUNC_EXIT
+    }
+
+void CCLCKCommandHandler::HandleSecurityEvent(TInt aError, RMobilePhone::TMobilePhoneSecurityEvent aSecurityEvent)
+    {
+    TRACE_FUNC_ENTRY
+    if (aError != KErrNone)
+        {
+        iCallback->CreateCMEReplyAndComplete(aError);
+        Cancel();
+        TRACE_FUNC_EXIT
+        return;
+        }
+    
+    Trace(KDebugPrintD, "iLockSettingState: ", iLockSettingState);
+    Trace(KDebugPrintD, "aSecurityEvent: ", aSecurityEvent);
+    switch (iLockSettingState)
+        {
+        case (ELockSettingIdle):
+            {
+            // Set Lock request has already been completed
+            iSecurityCodeVerifier->Cancel();
+            break;
+            }
+        case (ELockSettingRequested):
+            {
+            switch (aSecurityEvent)
+                 {
+                 case(RMobilePhone::EPin1Required):
+                 case(RMobilePhone::EPhonePasswordRequired):
+                     {
+                     iSecurityEventHandler->Start();
+                     if( iSecurityCode == RMobilePhone::ESecurityCodePin1 &&
+                         aSecurityEvent == RMobilePhone::EPin1Required ||
+                         iSecurityCode == RMobilePhone::ESecurityCodePhonePassword &&
+                         aSecurityEvent == RMobilePhone::EPhonePasswordRequired)
+                         {
+                         // security code request has been triggered, reissue the security notification
+                         // request and provide the code if this is expected
+                         iSecurityCodeVerifier->Start(iPassword, iSecurityCode);
+                         iLockSettingState =ELockSettingPasswordRequested;
+                         }
+                     break;
+                     }
+                 case(RMobilePhone::ENoICCFound):
+                 case(RMobilePhone::EICCTerminated):
+                     {
+                     // No SIM present or it is unusable
+                     iCallback->CreateCMEReplyAndComplete(aError);
+                     Cancel();
+                     break;
+                     }
+                 default:
+                     {
+                     // other processes may trigger various security events, ignore them
+                     // if not related and reissue the notification request
+                     iSecurityEventHandler->Start();
+                     break;
+                     }
+                 }
+            break;
+            }
+        case (ELockSettingPasswordRequested):
+            {
+            switch (aSecurityEvent)
+                 {
+                 case(RMobilePhone::EPin1Verified):
+                     {
+                     // PIN1 has been verified, ignore if not applicable
+                     // otherwise security event handler and  security code verifier
+                     // no longer needed 
+                     // (note that another client could have provided the PIN1)
+                     if (iSecurityCode == RMobilePhone::ESecurityCodePin1)
+                         {
+                         iLockSettingState =ELockSettingRequested;
+                         }
+                     break;
+                     }
+                 case(RMobilePhone::EPhonePasswordVerified):
+                     {
+                     if (iSecurityCode == RMobilePhone::ESecurityCodePhonePassword)
+                         {
+                         iLockSettingState =ELockSettingRequested;
+                         }
+                     break;
+                     }
+                 case(RMobilePhone::ENoICCFound):
+                 case(RMobilePhone::EICCTerminated):
+                     {
+                     // No SIM present or it is unusable, terminate the operation
+                     Cancel();
+                     iCallback->CreateCMEReplyAndComplete(aError);
+                     break;
+                     }
+                 default:
+                     {
+                     // other processes may trigger various security events, ignore them if not related
+                     // and reissue the notification request
+                     iSecurityEventHandler->Start();
+                     break;
+                     }
+                 }
+            break;
+            }
+        default:
+            {
+            // lock setting state value is out of boundies, complete with error
+            iCallback->CreateCMEReplyAndComplete(aError);
+            Cancel();
+            break;
+            }
+        }
+    TRACE_FUNC_EXIT
+    }
+
+TInt CCLCKCommandHandler::ParseCCLCKCommand()
+    {
+    TRACE_FUNC_ENTRY
+    TCmdFacilityType facilityType = ECmdFacilityTypeUnknown;
+    TInt mode = 0;
+    TInt ret = KErrNone;
+
+    TPtrC8 command = iATCmdParser.NextTextParam(ret);
+    if (!command.Compare(KNullDesC8) || ret != KErrNone)
+        {
+        TRACE_FUNC_EXIT
+        return KErrArgument;
+        }
+    
+    ret = iATCmdParser.NextIntParam(mode);
+    if (!command.Compare(KNullDesC8) || ret != KErrNone)
+        {
+        TRACE_FUNC_EXIT
+        return KErrArgument;
+        }
+    
+    iPassword.Create(iATCmdParser.NextTextParam(ret));
+    Trace(KDebugPrintD, "NextTextParam returned: ", ret);
+    if (ret != KErrNone && ret != KErrNotFound)
+        {
+        TRACE_FUNC_EXIT
+        return KErrArgument;
+        }
+    
+    if (iPassword.Compare(KNullDesC8) != 0)
+        {
+        ret = iATCmdParser.NextIntParam(iInfoClass);
+        Trace(KDebugPrintD, "NextIntParam(iInfoClass): ", ret);
+        if (ret == KErrNotFound)
+            {
+            iInfoClass = 7;
+            }
+        if ((ret != KErrNone && ret != KErrNotFound ) || 
+            iATCmdParser.NextParam().Compare(KNullDesC8) != 0)
+            {
+            TRACE_FUNC_EXIT
+            return KErrArgument;
+            }
+        }
+    
+    if (command.Compare(KATCLCKPS) == 0)
+        {
+        // Lock phone to SIM on/off
+        iSecurityCode = RMobilePhone::ESecurityCodePhonePassword;
+        iLockType = RMobilePhone::ELockPhoneToICC;
+        facilityType = ECmdFacilityTypeLock;
+        }
+    else if (command.Compare(KATCLCKSC) == 0)
+        {
+        // PIN on/off
+        iSecurityCode = RMobilePhone::ESecurityCodePin1;
+        iLockType = RMobilePhone::ELockICC;
+        facilityType = ECmdFacilityTypeLock;
+        }
+    else if (command.Compare(KATCLCKAO) == 0)
+        {
+        iCondition = RMobilePhone::EBarAllOutgoing;
+        facilityType = ECmdFacilityTypeBarring;
+        }
+    else if (command.Compare(KATCLCKOI) == 0)
+        {
+        iCondition = RMobilePhone::EBarOutgoingInternational;
+        facilityType = ECmdFacilityTypeBarring;
+        }
+    else if (command.Compare(KATCLCKOX) == 0)
+        {
+        iCondition = RMobilePhone::EBarOutgoingInternationalExHC;
+        facilityType = ECmdFacilityTypeBarring;
+        }
+    else if (command.Compare(KATCLCKAI) == 0)
+        {
+        iCondition = RMobilePhone::EBarAllIncoming;
+        facilityType = ECmdFacilityTypeBarring;
+        }
+    else if (command.Compare(KATCLCKIR) == 0)
+        {
+        iCondition = RMobilePhone::EBarIncomingRoaming;
+        facilityType = ECmdFacilityTypeBarring;
+        }
+    else if (command.Compare(KATCLCKAB) == 0)
+        {
+        iCondition = RMobilePhone::EBarAllCases;
+        facilityType = ECmdFacilityTypeAllBarring;
+        }
+    else if (command.Compare(KATCLCKAG) == 0)
+        {
+        iCondition = RMobilePhone::EBarAllOutgoingServices;
+        facilityType = ECmdFacilityTypeAllBarring;
+        }
+    else if (command.Compare(KATCLCKAC) == 0)
+        {
+        iCondition = RMobilePhone::EBarAllIncomingServices;
+        facilityType = ECmdFacilityTypeAllBarring;
+        }
+    else 
+        {
+        TRACE_FUNC_EXIT
+        return KErrArgument;
+        }
+    
+    switch (facilityType)
+        {
+        case (ECmdFacilityTypeLock):
+            {
+            switch (mode)
+                {
+                case 0: // e.g. AT+CLCK="SC",0,"0000"
+                    {
+                    iCLCKCommandType = ECLCKLockSet;
+                    iLockChange = RMobilePhone::ELockSetDisabled;
+                    break;
+                    }
+                case 1: // e.g. AT+CLCK="SC",1
+                    {
+                    iCLCKCommandType = ECLCKLockSet;
+                    iLockChange = RMobilePhone::ELockSetEnabled;
+                    break;
+                    }
+                case 2: // e.g. AT+CLCK="SC",2
+                    {
+                    iCLCKCommandType = ECLCKLockGet;
+                    break;
+                    }
+                default:
+                    {
+                    TRACE_FUNC_EXIT
+                    return KErrArgument;
+                    }
+                }
+            break;
+            }
+        case (ECmdFacilityTypeBarring):
+            {
+            iCBInfo.iPassword.Copy(iPassword);
+            if (iInfoClass == 0)
+                {
+                iInfoClass = 7; // Default value, see ETSI TS 127 007 V6.9.0 (2007-06)
+                }
+            switch (mode)
+                {
+                case 0: // AT+CLCK="AO",0
+                    {
+                    iCLCKCommandType = ECLCKBarringSet;
+                    iCBInfo.iAction = RMobilePhone::EServiceActionDeactivate;
+                    break;
+                    }
+                case 1: // AT+CLCK="AO",1,"1919",1
+                    {
+                    iCLCKCommandType = ECLCKBarringSet;
+                    iCBInfo.iAction = RMobilePhone::EServiceActionActivate;
+                    break;
+                    }
+                case 2: // AT+CLCK="AO",2
+                    {
+                    iCLCKCommandType = ECLCKBarringGet;
+                    break;
+                    }
+                default:
+                    {
+                    TRACE_FUNC_EXIT
+                    return KErrArgument;
+                    }
+                }
+            break;
+            }
+        case (ECmdFacilityTypeAllBarring):
+            {
+            iCBInfo.iPassword.Copy(iPassword);
+            if (iInfoClass == 0)
+                {
+                iInfoClass = 7; // Default value, see ETSI TS 127 007 V6.9.0 (2007-06)
+                }
+            
+            if ( mode == 0)
+                {
+                iCLCKCommandType = ECLCKBarringSet;
+                iCBInfo.iAction = RMobilePhone::EServiceActionDeactivate;
+                }
+            else
+                // only deactivation is supported
+                {
+                TRACE_FUNC_EXIT
+                return KErrArgument;
+                }
+            break;
+            }
+        default:
+            {
+            TRACE_FUNC_EXIT
+            return KErrArgument;
+            }
+        }
+    
+    // if phone password is required it needs to be hashed before verification
+    if (iSecurityCode == RMobilePhone::ESecurityCodePhonePassword 
+                    && iCLCKCommandType == ECLCKLockSet)
+        {
+        TBuf8<KSCPMaxHashLength> hashedPwd;
+        iATCmdParser.HashSecurityCode(iPassword, hashedPwd);
+        if (hashedPwd.Length() > iPassword.MaxLength())
+            {
+            TInt ret = iPassword.ReAlloc(hashedPwd.Length());
+            if (ret != KErrNone)
+                {
+                TRACE_FUNC_EXIT
+                return ret;
+                }
+            }
+        iPassword = hashedPwd;
+        }
+            
+    TRACE_FUNC_EXIT
+    return KErrNone;
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsatplugin/atmisccmdplugin/src/cnumcommandhandler.cpp	Tue Apr 27 16:49:44 2010 +0300
@@ -0,0 +1,197 @@
+// Copyright (c) 2010 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:
+// This file contains the implementation of the AT+CNUM command
+// 
+//
+
+#include "cnumcommandhandler.h"
+
+#include <mmretrieve.h>
+
+#include "atmisccmdpluginconsts.h"
+#include "debug.h"
+
+CCNUMCommandHandler* CCNUMCommandHandler::NewL(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser,
+                                                RMobilePhone& aPhone, RTelServer& aTelServer)
+    {
+    TRACE_FUNC_ENTRY
+    CCNUMCommandHandler* self = new (ELeave) CCNUMCommandHandler(aCallback, aATCmdParser, aPhone, aTelServer );
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    TRACE_FUNC_EXIT
+    return self;
+    }
+
+CCNUMCommandHandler::CCNUMCommandHandler(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser,
+                                         RMobilePhone& aPhone, RTelServer& aTelServer) :
+        CATCmdAsyncBase(aCallback, aATCmdParser, aPhone),
+        iTelServer(aTelServer),
+        iOwnStoreInfoPckg(iOwnStoreInfo),
+        iOwnNumberEntryPckg(iOwnNumberEntry)
+    {
+    }
+
+void CCNUMCommandHandler::ConstructL()
+    {
+    iReplyBuffer.CreateL(KDefaultCmdBufLength);
+    }
+
+CCNUMCommandHandler::~CCNUMCommandHandler()
+    {
+    TRACE_FUNC_ENTRY
+    Cancel();
+    iReplyBuffer.Close();
+    iOwnNumberStore.Close();
+    TRACE_FUNC_EXIT
+    }
+
+void CCNUMCommandHandler::HandleCommand( const TDesC8& /*aCmd*/,
+                                   RBuf8& /*aReply*/,
+                                   TBool /*aReplyNeeded */)
+    {
+    TRACE_FUNC_ENTRY
+    TAtCommandParser::TCommandHandlerType cmdHandlerType = iATCmdParser.CommandHandlerType();
+    
+    switch (cmdHandlerType)
+        {
+        case (TAtCommandParser::ECmdHandlerTypeBase):
+            {
+            // Handle AT+CNUM
+            // step 1 check if the phone support Own Number Store
+            //  and open the store if supported
+           
+            iReplyBuffer.Zero();
+            // only open a subsession to OwnNumberStore when necessary
+            if(iOwnNumberStore.SubSessionHandle() == 0)
+                {
+                TName tsyName;
+                TInt ret = iTelServer.GetTsyName(0, tsyName);
+                if(ret != KErrNone)
+                    {
+                    Trace(KDebugPrintD, "GetTsyName returned error ", ret);
+                    iCallback->CreateReplyAndComplete(EReplyTypeError);
+                    break;
+                    }
+                
+                TBool isSupported = EFalse;
+                // TODO: isSupported should be checked
+                ret = iTelServer.IsSupportedByModule(tsyName, KETelFuncMobileOwnNumberStore, isSupported);
+                if(ret != KErrNone)
+                    {
+                    Trace(KDebugPrintD, "IsSupportedByModule returned error ", ret);
+                    iCallback->CreateReplyAndComplete(EReplyTypeError);
+                    break;
+                    }
+                
+                Trace(KDebugPrintD, "before open OwnNumberstore", 0);
+                ret = iOwnNumberStore.Open(iPhone);
+                if(ret != KErrNone)
+                    {
+                    Trace(KDebugPrintD, "Open OwnNumberStore returned error ", ret);
+                    iCallback->CreateReplyAndComplete(EReplyTypeError);
+                    break;
+                    }
+                }
+            // step 2 Get number of own number entries stored.
+            iOwnNumberStore.GetInfo(iStatus, iOwnStoreInfoPckg);
+            iPendingEvent = EMobilePhoneStoreGetInfo;
+            SetActive();
+             
+            break;
+            }
+        case (TAtCommandParser::ECmdHandlerTypeTest):
+            {
+            // Handle AT+CNUM=?
+            iCallback->CreateReplyAndComplete( EReplyTypeOk );
+            break;
+            }
+        default:
+            {
+            iCallback->CreateReplyAndComplete(EReplyTypeError);
+            break;
+            }
+        }
+    TRACE_FUNC_EXIT
+    }
+
+void CCNUMCommandHandler::HandleCommandCancel()
+    {
+    TRACE_FUNC_ENTRY
+    Cancel();
+    TRACE_FUNC_EXIT
+    }
+
+void CCNUMCommandHandler::RunL()
+    {
+    TRACE_FUNC_ENTRY
+    if(iStatus.Int() != KErrNone)
+        {
+        Trace(KDebugPrintD, "Pending event id: ", iPendingEvent);
+        iCallback->CreateCMEReplyAndComplete(iStatus.Int());
+       }
+    else if(iPendingEvent == EMobilePhoneStoreGetInfo)
+        { // step 3 check the number of entries
+        Trace(KDebugPrintD, "Number of Owner's numbers: ", iOwnStoreInfo.iUsedEntries);
+        if(iOwnStoreInfo.iUsedEntries < 1)
+            {
+            // complete with OK if no owner's number
+            iCallback->CreateReplyAndComplete(EReplyTypeOk);
+            }
+        else
+            {
+            // step 4 Read the first owner's number entry
+            iOwnNumberEntry.iIndex = 0;
+            iOwnNumberStore.Read(iStatus,iOwnNumberEntryPckg);
+            iPendingEvent = EMobilePhoneStoreRead;
+            SetActive();
+            }
+        }
+    else
+        {
+        ASSERT(iPendingEvent == EMobilePhoneStoreRead);
+        // step 5 append a phone number entry to the reply buffer
+        if(iOwnNumberEntry.iNumber.iTelNumber.Compare(KNullDesC) != 0)
+            {
+            // 129 is the type of address octet in interger format
+            _LIT8(KATNumReply, "\r\n+CNUM: ,\"%S\",129");
+            TBuf8<RMobilePhone::KMaxMobileTelNumberSize > telNumber8;
+            telNumber8.Copy(iOwnNumberEntry.iNumber.iTelNumber);
+            iReplyBuffer.AppendFormat(KATNumReply, &telNumber8);
+            }
+        // check if there is any more owner's number
+        if(iOwnNumberEntry.iIndex < iOwnStoreInfo.iUsedEntries)
+            { // step 6 read next entry 
+            ++iOwnNumberEntry.iIndex;
+            Trace(KDebugPrintD, "Next number id", iOwnNumberEntry.iIndex);
+            iOwnNumberStore.Read(iStatus,iOwnNumberEntryPckg);
+            iPendingEvent = EMobilePhoneStoreRead;
+            SetActive();
+            }
+        else
+            { // final step: all entries are retrieved. send them back to the AT server
+            iReplyBuffer.Append(KOKCRLF);
+            iCallback->CreateReplyAndComplete(EReplyTypeOther, iReplyBuffer);
+            }
+        }
+
+    TRACE_FUNC_EXIT
+    }
+
+void CCNUMCommandHandler::DoCancel()
+    {
+    TRACE_FUNC_ENTRY
+    iCallback->CreateReplyAndComplete(EReplyTypeError);
+    TRACE_FUNC_EXIT
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsatplugin/atmisccmdplugin/src/cpincommandhandler.cpp	Tue Apr 27 16:49:44 2010 +0300
@@ -0,0 +1,216 @@
+// Copyright (c) 2010 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:
+// This file contains the implementation of the AT+CPIN command
+// 
+//
+
+#include "cpincommandhandler.h"
+
+#include <mmretrieve.h>         // define AO wrapper
+#include <EXTERROR.H>           // Additional RMobilePhone error code
+
+#include "debug.h"
+
+CCPINCommandHandler* CCPINCommandHandler::NewL(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone)
+    {
+    TRACE_FUNC_ENTRY
+    CCPINCommandHandler* self = new (ELeave) CCPINCommandHandler(aCallback, aATCmdParser, aPhone);
+    TRACE_FUNC_EXIT
+    return self;
+    }
+
+CCPINCommandHandler::CCPINCommandHandler(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone) :
+    CATCmdAsyncBase(aCallback, aATCmdParser, aPhone),
+    iLockInfoPckg(iLockInfo)
+    {
+    TRACE_FUNC_ENTRY
+    TRACE_FUNC_EXIT
+    }
+
+CCPINCommandHandler::~CCPINCommandHandler()
+    {
+    TRACE_FUNC_ENTRY
+    Cancel();
+    TRACE_FUNC_EXIT
+    }
+
+void CCPINCommandHandler::HandleCommand(const TDesC8& /*aCmd*/,
+                                   RBuf8& /*aReply*/,
+                                   TBool /*aReplyNeeded*/)
+    {
+    TRACE_FUNC_ENTRY
+   
+    switch (iATCmdParser.CommandHandlerType())
+        {
+        case (TAtCommandParser::ECmdHandlerTypeTest):
+                // AT+CPIN=?  - simply return OK.
+            {
+            iCallback->CreateReplyAndComplete( EReplyTypeOk);
+            break;
+            }
+        
+        case(TAtCommandParser::ECmdHandlerTypeRead):
+            // AT+CPIN?  - Get PIN require status.  return +CPIN: READY/SIM PUK
+        case (TAtCommandParser::ECmdHandlerTypeSet):
+            // AT+CPIN="puk","pin"  - Change password when PUK is required. 
+            {
+            // call GetLockInfo to check if PUK is required
+            iPhone.GetLockInfo(iStatus, RMobilePhone::ELockICC, iLockInfoPckg);
+            iPendingEvent = EMobilePhoneGetLockInfo;
+            SetActive();
+            break;
+            }
+        default:
+            {
+            // unsupported command
+            iCallback->CreateReplyAndComplete(EReplyTypeError);
+            break;
+            }
+        }
+    
+    TRACE_FUNC_EXIT
+    }
+
+void CCPINCommandHandler::HandleCommandCancel()
+    {
+    TRACE_FUNC_ENTRY
+    Cancel();
+    TRACE_FUNC_EXIT
+    }
+
+void CCPINCommandHandler::ChangePassword()
+    {
+    TRACE_FUNC_ENTRY
+    TRequestStatus status;
+
+    // Get parameters from AT command
+    TInt ret1;
+    TInt ret2; 
+    TPtrC8 pukCode8 = iATCmdParser.NextTextParam(ret1);
+    TPtrC8 pinCode8 = iATCmdParser.NextTextParam(ret2);
+    if(ret1 != KErrNone || ret2 != KErrNone
+            || iATCmdParser.NextParam().Compare(KNullDesC8) != 0)
+        {
+        iCallback->CreateReplyAndComplete( EReplyTypeError);
+        TRACE_FUNC_EXIT
+        return;
+        }
+    
+    RMobilePhone::TMobilePassword pukCode;
+    RMobilePhone::TMobilePassword pinCode;
+    pukCode.Copy(pukCode8);
+    pinCode.Copy(pinCode8);
+    iPhone.VerifySecurityCode(iStatus, RMobilePhone::ESecurityCodePuk1, pinCode, pukCode);
+    // re-use the AO for VerifySecurityCode 
+    iPendingEvent = EMobilePhoneVerifySecurityCode; 
+    SetActive();
+    
+    TRACE_FUNC_EXIT
+    return;
+    }
+
+void CCPINCommandHandler::RunL()
+    {
+    TRACE_FUNC_ENTRY
+
+    if( iPendingEvent == EMobilePhoneGetLockInfo)
+        { // after calling GetLockInfo
+        HandleGetLockInfo();
+        }
+    else
+        { // after calling VerifySecurityCode
+        ASSERT(iPendingEvent == EMobilePhoneVerifySecurityCode);
+        HandleVerifySecurityCode();
+        }
+    TRACE_FUNC_EXIT
+    }
+
+void CCPINCommandHandler::HandleGetLockInfo()
+    {
+    TRACE_FUNC_ENTRY
+    TAtCommandParser::TCommandHandlerType handleType = iATCmdParser.CommandHandlerType();
+    
+    switch(iStatus.Int())
+        {
+        case KErrNone:
+            {
+            // log lock info
+            _LIT8(KDbgPhoneLockInfo, "GetLockInfo: Status %d, Lock %d, Setting %d");
+            Trace(KDbgPhoneLockInfo, iStatus.Int(), iLockInfo.iStatus, iLockInfo.iSetting);
+            
+            if(handleType == TAtCommandParser::ECmdHandlerTypeRead )
+                {
+                // complete without error
+                _LIT8(KCPINReady, "\r\n+CPIN: READY\r\n\r\nOK\r\n");
+                iCallback->CreateReplyAndComplete( EReplyTypeOther, KCPINReady);
+                }
+            else 
+                {
+                ASSERT( handleType== TAtCommandParser::ECmdHandlerTypeSet );
+                // PUK/PIN is not required
+                iCallback->CreateCMEReplyAndComplete(KErrGsm0707OperationNotAllowed);
+                }
+            break;
+            }
+        case KErrAccessDenied:
+            {
+            if(handleType == TAtCommandParser::ECmdHandlerTypeRead )
+                {
+                // reply PUK is required
+                _LIT8(KCPINSimPuk, "\r\n+CPIN: SIM PUK\r\n\r\nOK\r\n");
+                iCallback->CreateReplyAndComplete( EReplyTypeOther, KCPINSimPuk);
+                }
+            else
+                
+                {
+                // change PIN with a PUK code
+                ChangePassword();
+                }
+            break;
+            }
+        default:
+            {
+            // any other errors, such as KErrGeneral when SIM card is not available
+            Trace(KDebugPrintD, "Complete CPIN with error ", iStatus.Int());
+            iCallback->CreateReplyAndComplete( EReplyTypeError );
+            break;
+            }
+        }
+    TRACE_FUNC_EXIT
+    }
+
+void CCPINCommandHandler::HandleVerifySecurityCode()
+    {
+    TRACE_FUNC_ENTRY
+
+    // check error after change PUK
+    if (iStatus.Int() == KErrNone)
+        { // complete without error
+        iCallback->CreateReplyAndComplete( EReplyTypeOk );
+        }
+    else
+        { // if there is an error
+        iCallback->CreateCMEReplyAndComplete(iStatus.Int());   
+        }
+
+    TRACE_FUNC_EXIT
+    }
+
+void CCPINCommandHandler::DoCancel()
+    {
+    TRACE_FUNC_ENTRY
+    iPhone.CancelAsyncRequest(iPendingEvent);
+    TRACE_FUNC_EXIT
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsatplugin/atmisccmdplugin/src/cpwdcommandhandler.cpp	Tue Apr 27 16:49:44 2010 +0300
@@ -0,0 +1,212 @@
+// Copyright (c) 2010 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:
+// This file contains the implementation of the AT+CPWD command
+// 
+//
+
+
+#include <mmretrieve.h>         // AO
+
+#include "cpwdcommandhandler.h"
+
+#include "debug.h"
+
+
+// password types
+_LIT8(KATCPWDPS, "PS"); // Phone lock
+_LIT8(KATCPWDP2, "P2"); // PIN2
+_LIT8(KATCPWDSC, "SC"); // PIN
+_LIT8(KATCPWDAB, "AB"); // All Barring code
+
+
+
+// strings for debugging trace
+_LIT8(KDbgStr, "+CPWD: %s \r\n");
+_LIT8(KDbgTDes, "+CPWD: %s%S\r\n");
+
+// constant for Set All barring code service - originally defined in mw/PSetConstants.h
+const TInt KPsetAllSSServices = 0;
+// Max buffer length for an MD5 digest - originally defined in SCPServerInterface.h
+const TInt KSCPMaxHashLength( 32 );
+
+
+
+CCPWDCommandHandler* CCPWDCommandHandler::NewL(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone)
+    {
+    TRACE_FUNC_ENTRY
+    CCPWDCommandHandler* self = new (ELeave) CCPWDCommandHandler(aCallback, aATCmdParser, aPhone);
+    TRACE_FUNC_EXIT
+    return self;
+    }
+
+CCPWDCommandHandler::CCPWDCommandHandler(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone) :
+        CATCmdAsyncBase(aCallback, aATCmdParser, aPhone)
+    {
+    TRACE_FUNC_ENTRY
+    TRACE_FUNC_EXIT
+    }
+
+CCPWDCommandHandler::~CCPWDCommandHandler()
+    {
+    TRACE_FUNC_ENTRY
+    Cancel();
+    TRACE_FUNC_EXIT
+    }
+
+void CCPWDCommandHandler::HandleCommand( const TDesC8& /*aCmd*/,
+                                   RBuf8& /*aReply*/,
+                                   TBool /*aReplyNeeded*/ )
+    {
+    TRACE_FUNC_ENTRY
+    TAtCommandParser::TCommandHandlerType cmdHandlerType = iATCmdParser.CommandHandlerType();
+    switch (cmdHandlerType)
+        {
+        case (TAtCommandParser::ECmdHandlerTypeTest):
+            {
+            // Get supported passwords with max. length of them. AT+CPWD=?
+            // return hardcoded supported password with max. length
+            _LIT8(KCPWDTestValue, "\r\n+CPWD: (\"PS\",10),(\"SC\",8),(\"AB\",4),(\"P2\",8)\r\n\r\nOK\r\n");
+            iCallback->CreateReplyAndComplete( EReplyTypeOther, KCPWDTestValue );
+            break;
+            }
+        case (TAtCommandParser::ECmdHandlerTypeSet):
+            {
+            // Change password. AT+CPWD="nn","xxxx","yyyy"
+            ChangePassword();
+            break;
+            }
+        default:
+            {
+            iCallback->CreateReplyAndComplete(EReplyTypeError);
+            }
+        }
+    TRACE_FUNC_EXIT
+    }
+
+void CCPWDCommandHandler::HandleCommandCancel()
+    {
+    TRACE_FUNC_ENTRY
+    Cancel();
+    TRACE_FUNC_EXIT
+    }
+
+
+void CCPWDCommandHandler::ChangePassword()
+    {
+    TRACE_FUNC_ENTRY
+
+    // Get parameters from AT command
+    TInt ret1;
+    TInt ret2; 
+    TInt ret3;
+    TPtrC8 passwordType = iATCmdParser.NextTextParam(ret1);
+    TPtrC8 oldPassword = iATCmdParser.NextTextParam(ret2);
+    TPtrC8 newPassword = iATCmdParser.NextTextParam(ret3);
+    
+    if(ret1 != KErrNone || ret2 != KErrNone || ret3 != KErrNone
+            || iATCmdParser.NextParam().Compare(KNullDesC8) != 0)
+        {
+        Trace(KDbgStr, "invalid arguments");
+        iCallback->CreateReplyAndComplete( EReplyTypeError);
+        TRACE_FUNC_EXIT
+        return;
+        }
+    
+    if(passwordType.Compare(KATCPWDPS) == 0) // Phone lock
+        {
+    // "PS" PH-SIM (lock PHone to SIM/UICC card) (MT asks password when other than current SIM/UICC card
+    // inserted; MT may remember certain amount of previously used cards thus not requiring password when they
+    // are inserted)
+        RMobilePhone::TMobilePhonePasswordChangeV1 passwordChange;
+        
+        // Phone lock password is hashed in RSPClient and NokiaTSY. See CSCPServer::HashISACode() for details.
+        TBuf8<KSCPMaxHashLength> hashOldPwd;
+        TBuf8<KSCPMaxHashLength> hashNewPwd;
+        iATCmdParser.HashSecurityCode(oldPassword, hashOldPwd);
+        iATCmdParser.HashSecurityCode(newPassword, hashNewPwd);
+
+        ChangeSecurityCode(RMobilePhone::ESecurityCodePhonePassword, hashOldPwd, hashNewPwd);
+        }
+    else if(passwordType.Compare(KATCPWDSC) == 0) // SIM pin
+        {
+        // "SC" SIM (lock SIM/UICC card) (SIM/UICC asks password in MT power-up and when this lock command
+        // issued)
+        
+        // todo: if it is required to return +CME code according to SIM Lock status,
+        // should check SIM Lock is on here and return an error if it is off.
+        ChangeSecurityCode(RMobilePhone::ESecurityCodePin1, oldPassword, newPassword);
+        }
+    else if(passwordType.Compare(KATCPWDP2) == 0) // SIM pin2
+        {
+        ChangeSecurityCode(RMobilePhone::ESecurityCodePin2, oldPassword, newPassword);
+        }
+    else if(passwordType.Compare(KATCPWDAB) == 0) // All Barring services
+        {
+        // "AB" All Barring services (refer 3GPP TS 22.030 [19]) (applicable only for <mode>=0)
+        RMobilePhone::TMobilePhonePasswordChangeV2 passwordChange;
+        passwordChange.iOldPassword.Copy(oldPassword);
+        passwordChange.iNewPassword.Copy(newPassword);
+        passwordChange.iVerifiedPassword.Copy(newPassword);
+        RMobilePhone::TMobilePhonePasswordChangeV2Pckg pwdPckg ( passwordChange );
+        // The current S60 use SetSSPassword for All Barring services code.
+        // see CPsetCallBarring::ChangePasswordL for details.
+        iPhone.SetSSPassword(iStatus, pwdPckg, KPsetAllSSServices);
+        iPendingEvent = EMobilePhoneSetSSPassword;
+        SetActive();
+
+        }
+    else    // other unsupported arguments
+        {
+        Trace(KDbgTDes, "unknown password type:", &passwordType);
+        iCallback->CreateCMEReplyAndComplete(KErrUnknown);
+        }
+    
+    TRACE_FUNC_EXIT
+    return;
+    }
+
+void CCPWDCommandHandler::RunL()
+    {
+    TRACE_FUNC_ENTRY
+
+    if (iStatus.Int() == KErrNone)
+        { // complete without error
+        Trace(KDbgStr, "complete OK." );
+        iCallback->CreateReplyAndComplete( EReplyTypeOk );
+        }
+    else
+        { // if there is an error
+        iCallback->CreateCMEReplyAndComplete(iStatus.Int());   
+        }
+    TRACE_FUNC_EXIT
+    }
+
+void CCPWDCommandHandler::DoCancel()
+    {
+    TRACE_FUNC_ENTRY
+    Trace(KDbgStr, "Request cancelled." );
+    iPhone.CancelAsyncRequest(iPendingEvent);
+    TRACE_FUNC_EXIT
+    }
+
+
+void CCPWDCommandHandler::ChangeSecurityCode(RMobilePhone::TMobilePhoneSecurityCode aType, TDesC8& aOldPassword, TDesC8& aNewPassword)
+    {
+    RMobilePhone::TMobilePhonePasswordChangeV1 passwordChange;
+    passwordChange.iOldPassword.Copy(aOldPassword);
+    passwordChange.iNewPassword.Copy(aNewPassword);
+    iPhone.ChangeSecurityCode(iStatus, aType, passwordChange);
+    iPendingEvent = EMobilePhoneChangeSecurityCode;
+    SetActive();
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsatplugin/atmisccmdplugin/src/cusdcommandhandler.cpp	Tue Apr 27 16:49:44 2010 +0300
@@ -0,0 +1,460 @@
+/* Copyright (c) 2010 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 :
+ *
+ */
+#include "cusdcommandhandler.h"
+
+#include <exterror.h> 
+
+#include "atmisccmdpluginconsts.h"
+#include "cusdreadwriteimp.h"
+#include "debug.h"
+
+const TUint8 KPhCltUssdCarriageReturn = 0x0d;
+const TUint8 KPhCltUssdDcsNotSet  = 0x00; // not set
+
+const TUint8 KQuarterShift( 2 );
+const TUint8 KHighNibbleShift( 4 );
+const TUint8 KDcsCharacterSet7Bit( 0x00 );
+const TUint8 KDcsCharacterSet8Bit( 0x01 );
+const TUint8 KDcsCharacterSet16Bit( 0x02 );
+const TUint8 KDcsCharacterSet7Bit2( 0x00 );
+const TUint8 KDcsCharacterSet16Bit2( 0x01 );
+
+CCUSDCommandHandler* CCUSDCommandHandler::NewL(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone)
+    {
+    TRACE_FUNC_ENTRY
+    CCUSDCommandHandler* self = new (ELeave) CCUSDCommandHandler(aCallback, aATCmdParser, aPhone);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    TRACE_FUNC_EXIT
+    return self;
+    }
+
+CCUSDCommandHandler::CCUSDCommandHandler(MATMiscCmdPlugin* aCallback, TAtCommandParser& aATCmdParser, RMobilePhone& aPhone) :
+    CATCmdAsyncBase(aCallback, aATCmdParser, aPhone)
+    {
+    TRACE_FUNC_ENTRY
+    iSendAttributes.iDcs = KPhCltUssdDcsNotSet;  
+    iSendAttributes.iType = RMobileUssdMessaging::EUssdMORequest;
+    iSendAttributes.iFlags = RMobileUssdMessaging::KUssdMessageType | RMobileUssdMessaging::KUssdMessageDcs | RMobileUssdMessaging::KUssdDataFormat;
+    TRACE_FUNC_EXIT
+    }
+
+void CCUSDCommandHandler::ConstructL()
+    {    
+    TRACE_FUNC_ENTRY
+    User::LeaveIfError(iUssdMessaging.Open(iPhone));
+    
+    iUSSDSender = CCUSSDSendMessageImpl::NewL(this, iUssdMessaging);
+    iUSSDReader = CCUSSDReadMessageImpl::NewL(this, iUssdMessaging);
+    
+    //start a read session for network based ussd requests
+    User::LeaveIfError(iUSSDReader->ReadUSSDMessage(iReceivedData, iReceiveAttributes));
+    TRACE_FUNC_EXIT
+    }
+
+CCUSDCommandHandler::~CCUSDCommandHandler()
+    {
+    TRACE_FUNC_ENTRY
+    delete iUSSDSender;
+    delete iUSSDReader;
+    
+    iReply.Close();
+    iUssdMessaging.Close();
+    TRACE_FUNC_EXIT
+    }
+
+void CCUSDCommandHandler::DoCancel()
+    {
+    TRACE_FUNC_ENTRY
+    // This would never get called as the AO is never activated 
+    TRACE_FUNC_EXIT
+    }
+
+void CCUSDCommandHandler::HandleCommand( const TDesC8& aCmd,
+                                         RBuf8& /*aReply*/,
+                                         TBool /*aReplyNeeded*/ )
+    {
+    TRACE_FUNC_ENTRY
+    TAtCommandParser::TCommandHandlerType cmdHandlerType = iATCmdParser.CommandHandlerType();
+    
+    switch (cmdHandlerType)
+        {
+        case (TAtCommandParser::ECmdHandlerTypeTest):
+            {
+            iReply.Create(KDefaultCmdBufLength);
+            iReply.Append(KCRLF);
+            iReply.Append(KCUSDSupportedCmdsList);
+            iCallback->CreateReplyAndComplete( EReplyTypeOther, iReply );
+            break;
+            }
+        case (TAtCommandParser::ECmdHandlerTypeRead):
+            {
+            iReply.Create(KDefaultCmdBufLength);
+            iReply.Append(KCRLF);
+            iReply.Append(KAtCUSD);
+            iReply.AppendNum(iDisplayRetMessage);
+            iReply.Append(KCRLF);
+
+            iCallback->CreateReplyAndComplete( EReplyTypeOther, iReply );
+            break;
+            }
+        case (TAtCommandParser::ECmdHandlerTypeSet):
+            {         
+            if(ParseCUSDCmd(aCmd) == KErrNone)
+               {
+               if(iUSSDCommand.Length() == 0)
+                   {
+                   Trace(KDebugPrintD, "No USSD command: ", iUSSDCommand.Length());
+
+                   // the USSD command is not set then this is a set                   
+                   iReply.Create(KDefaultCmdBufLength);
+                   iReply.Append(KCRLF);
+                   iReply.Append(KAtCUSD);
+                   iReply.AppendNum(iDisplayRetMessage);
+                   iReply.Append(KCRLF);
+
+                   iCallback->CreateReplyAndComplete( EReplyTypeOther, iReply );                                     
+                   }
+                else
+                    {
+                    if(iUSSDSender->HandleSendUSSDCmd(iUSSDCommand, iSendAttributes) == KErrNone)
+                        {
+                        iSendCommandSent = ETrue;
+                        }
+                        else
+                        {
+                        iCallback->CreateReplyAndComplete(EReplyTypeError);
+                        }                 
+                    }
+                }
+            else
+                {
+                iCallback->CreateReplyAndComplete(EReplyTypeError);
+                }
+                 
+            break;
+            }
+        default:
+            {
+            iCallback->CreateReplyAndComplete(EReplyTypeError);
+            break;
+            }
+        }
+    TRACE_FUNC_EXIT
+    }
+
+void CCUSDCommandHandler::RunL()
+    {
+    TRACE_FUNC_ENTRY
+    // This would never get called as the AO is never activated 
+    TRACE_FUNC_EXIT
+    }
+
+
+void CCUSDCommandHandler::HandleCommandCancel()
+    {
+    TRACE_FUNC_ENTRY   
+    iUSSDSender->Cancel();
+    TRACE_FUNC_EXIT
+    }
+
+TInt CCUSDCommandHandler::ParseCUSDCmd(const TDesC8& aCmd)
+    {
+    TRACE_FUNC_ENTRY
+    
+    iReply.Create(KDefaultCmdBufLength);
+    TBool tempRetMessage = EFalse;
+    TInt ret = iATCmdParser.NextIntParam(tempRetMessage);
+
+    if(ret == KErrNone)
+        {
+        if(tempRetMessage < 0 || tempRetMessage > 2)
+            {
+            Trace(KDebugPrintD, "Display mode invalid: ", tempRetMessage);
+            TRACE_FUNC_EXIT
+            return KErrGeneral;       
+            }
+        else
+            {
+            iDisplayRetMessage = tempRetMessage;
+            }
+        }
+    
+    // now parse the USSD command
+    TPtrC8 command = iATCmdParser.NextTextParam(ret);
+
+    if (ret == KErrNone)
+        {
+        if(iUSSDCommand.Create(command.Length()) != KErrNone)
+           {
+            TRACE_FUNC_EXIT
+            return KErrGeneral;
+           }
+        
+        if(Pack(command, iUSSDCommand) < 0)
+           {
+           Trace(KDebugPrintS, "Pack() returned error, command: ", &command);
+           TRACE_FUNC_EXIT
+           return KErrGeneral;
+           }             
+        }
+   
+    TInt tempDcs = -1;    
+    ret = iATCmdParser.NextIntParam(tempDcs); 
+
+    if(ret == KErrNone)
+        {
+        if(!IsDcsValid(tempDcs))
+            {
+            Trace(KDebugPrintD, "Invalid coding standard: ", tempDcs);
+            TRACE_FUNC_EXIT
+            return KErrGeneral;
+            }
+        else
+            {
+            iSendAttributes.iDcs = tempDcs;
+            }
+        } 
+    TRACE_FUNC_EXIT
+    return KErrNone;
+    }
+
+void CCUSDCommandHandler::HandleSendMessageComplete(TInt aResult)
+    {
+    TRACE_FUNC_ENTRY
+    if(aResult == KErrNone)
+        {
+        iReply.Create(KDefaultCmdBufLength);
+        iReply.Append(KCRLF);
+        iReply.Append(KAtCUSD);
+        iReply.Append(KCRLF);
+        iCallback->CreateReplyAndComplete( EReplyTypeOther, iReply );          
+        }
+    else
+        {
+        iCallback->CreateReplyAndComplete(EReplyTypeError);
+        }
+    
+    iSendCommandSent = EFalse;
+    iUSSDCommand.Close();
+    TRACE_FUNC_EXIT
+    }
+
+void CCUSDCommandHandler::HandleReadMessageComplete(TInt aResult)
+    {
+    TRACE_FUNC_ENTRY
+    if(iDisplayRetMessage)
+        {
+        FormatUSSDReceivedData();
+        
+        if(iSendCommandSent)
+            {
+            iCallback->CreateReplyAndComplete( EReplyTypeOther, iReply );
+            }
+         else
+            {       
+            iCallback->HandleUnsolicitedRequest(iReply);
+            }
+        }   
+    // re-issue the read request
+    iUSSDReader->ReadUSSDMessage(iReceivedData, iReceiveAttributes);
+    TRACE_FUNC_EXIT
+    }
+
+TInt CCUSDCommandHandler::Pack(const TDesC8& aIn, TDes8& aOut)
+    {
+    TRACE_FUNC_ENTRY
+    TInt startBit = 0; 
+    
+    // Ensure we've got the right length
+    TInt packedOctetsRequired = PackedOctetsRequired( aIn.Length() );
+    if ( packedOctetsRequired > ( aOut.MaxLength() - aOut.Length() ) )
+        {
+        Trace(KDebugPrintD, "packedOctetsRequired: ", packedOctetsRequired);
+        TRACE_FUNC_EXIT
+        return KErrOverflow;
+        }
+
+    // Do the conversion
+    TInt elementSizeInBits = ElementSizeInBits(TSmsDataCodingScheme::ESmsAlphabet7Bit);
+    if ( elementSizeInBits == 8 ) // 8 bit data
+        {
+        // Straight copy here
+        aOut.Append( aIn );
+        }
+        else if ( elementSizeInBits == 7 ) // Need packing to 7-bit
+            {
+            // Get raw pointers and do packing
+            TUint8* outPtr = ( TUint8* )aOut.Ptr() + aOut.Length();
+            const TUint8* inPtr = aIn.Ptr();
+    
+            outPtr[0] = 0;
+            for ( TInt i = 0; i < aIn.Length() ; ++i )
+                {
+                TUint8 to = inPtr[i];
+                *outPtr |= ( to << startBit );
+                if ( startBit )
+                {
+                ++outPtr;
+                *outPtr = ( TUint8 ) ( to >> ( 8 - startBit ) );
+                }
+                startBit = ( startBit + 7 )%8; // roll 0,1,2,3,4,5,6,7,0,1,2,...
+             
+                if ( i == aIn.Length() - 1 ) // if this is the last time
+                    {
+                    if ( ( to == KPhCltUssdCarriageReturn && startBit == 0 ) || 
+                        startBit == 1 )
+                        {
+                    //We have to add one CR more
+                    *outPtr |= ( KPhCltUssdCarriageReturn << startBit );
+                    if ( startBit )
+                        {
+                        ++outPtr;
+                        *outPtr = ( TUint8 ) ( KPhCltUssdCarriageReturn >> ( 8 - startBit ) );
+                        }
+                    else
+                        {
+                        ++packedOctetsRequired;
+                        }
+                        startBit = ( startBit + 7 )%8;
+                        }
+                    }
+                }
+            // Increment the length for the packed data
+            aOut.SetLength( aOut.Length() + packedOctetsRequired );
+            }
+
+    // Return number of bytes used
+    TRACE_FUNC_EXIT
+    return packedOctetsRequired;
+    }
+
+ TInt CCUSDCommandHandler::PackedOctetsRequired( TInt aNumUDUnits ) const
+    {
+    TRACE_FUNC_ENTRY
+    TInt startBit = 0; 
+
+    TInt octetsRequired = 0;
+    TInt elementSizeInBits = ElementSizeInBits(TSmsDataCodingScheme::ESmsAlphabet7Bit);
+    if ( elementSizeInBits == 8 )
+         {
+        octetsRequired=aNumUDUnits;
+         }
+    else
+        {
+        octetsRequired =  ( startBit + aNumUDUnits*elementSizeInBits + 7 )/8;    // Rounds up
+        }
+    TRACE_FUNC_EXIT
+    return octetsRequired;
+    }
+
+ TBool CCUSDCommandHandler::IsDcsValid( const TUint8 aDcs ) const
+     {
+     TRACE_FUNC_ENTRY
+     TBool isDcsValid( EFalse );
+                                                                //      76543210
+     TUint8 codingGroup  = ( aDcs & 0xF0 ) >> KHighNibbleShift; // bits XXXX____
+     TUint8 characterSet = ( aDcs & 0x0C ) >> KQuarterShift;    // bits ____XX__
+     TUint8 lowQuartet   = ( aDcs & 0x0F );                     // bits ____XXXX
+  
+     switch ( codingGroup )
+         {
+         case 0x00:
+         case 0x02:
+         case 0x03:
+         case 0x0F:
+             {
+             isDcsValid = ETrue;
+             break;
+             }
+
+         case 0x01:
+             {
+             if ( ( KDcsCharacterSet7Bit2 == lowQuartet ) ||
+                  ( KDcsCharacterSet16Bit2 == lowQuartet ) )
+                 {
+                 isDcsValid = ETrue;
+                 }
+             break;
+             }
+
+         case 0x04:
+         case 0x05:
+         case 0x06:
+         case 0x07:
+         case 0x09:
+             {
+             if ( ( KDcsCharacterSet7Bit == characterSet ) ||
+                  ( KDcsCharacterSet8Bit == characterSet ) ||
+                  ( KDcsCharacterSet16Bit == characterSet ) )
+                 {
+                 isDcsValid = ETrue;
+                 }
+             break;
+             }
+         }
+     TRACE_FUNC_EXIT
+     return isDcsValid;
+     }
+ 
+TInt CCUSDCommandHandler::ElementSizeInBits(TSmsDataCodingScheme::TSmsAlphabet aAlphabet) const
+    {
+    TRACE_FUNC_ENTRY
+    TInt ret;
+    switch ( aAlphabet )
+       {
+       case TSmsDataCodingScheme::ESmsAlphabet7Bit:
+           {
+           ret = 7;
+           break;
+           }
+       case TSmsDataCodingScheme::ESmsAlphabet8Bit:
+       case TSmsDataCodingScheme::ESmsAlphabetUCS2:
+           {
+           ret = 8;
+           break;
+           }
+       default:
+           {
+           ret = KErrGsmSMSDataCodingSchemeNotSupported;
+           }
+        }
+    TRACE_FUNC_EXIT
+    return ret;
+    }
+
+void CCUSDCommandHandler::FormatUSSDReceivedData()
+    {
+    TRACE_FUNC_ENTRY
+    iReply.Create(KDefaultCmdBufLength);
+
+    iReply.Append(KCRLF);
+    iReply.Append(KAtCUSD);
+    iReply.AppendNum(iDisplayRetMessage);
+    iReply.Append(',');
+    iReply.Append('"');
+    
+    TInt length = iReceivedData.Length();
+    for(TInt i = 0; i < length; ++i)
+       {       
+       iReply.AppendNum(iReceivedData[i], EHex);
+       }
+    iReply.Append('"');
+    iReply.Append(',');
+
+    iReply.AppendNum(iReceiveAttributes.iDcs);
+    iReply.Append(KCRLF);
+    TRACE_FUNC_EXIT
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsatplugin/atmisccmdplugin/src/cusdreadwriteimp.cpp	Tue Apr 27 16:49:44 2010 +0300
@@ -0,0 +1,155 @@
+/* Copyright (c) 2010 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 :
+ *
+ */
+
+#include "cusdreadwriteimp.h"
+
+#include "cusdcommandhandler.h"
+#include "debug.h"
+
+CCUSSDReadMessageImpl* CCUSSDReadMessageImpl::NewL(MUSSDCallback* aCallback, RMobileUssdMessaging& aUssdSession)
+    {
+    TRACE_FUNC_ENTRY
+    CCUSSDReadMessageImpl* self = new(ELeave) CCUSSDReadMessageImpl(aCallback, aUssdSession);
+    TRACE_FUNC_EXIT
+    return self;
+    }
+
+CCUSSDReadMessageImpl::CCUSSDReadMessageImpl(MUSSDCallback* aCallback, 
+                                             RMobileUssdMessaging& aUssdSession):
+    CActive(CActive::EPriorityStandard),
+    iCallback(aCallback),
+    iUssdSession(aUssdSession)
+    {
+    TRACE_FUNC_ENTRY
+    CActiveScheduler::Add(this);
+    TRACE_FUNC_EXIT
+    }
+
+CCUSSDReadMessageImpl::~CCUSSDReadMessageImpl()
+    {    
+    TRACE_FUNC_ENTRY
+    Cancel();
+    TRACE_FUNC_EXIT
+    }
+
+void CCUSSDReadMessageImpl::RunL()
+    {
+    TRACE_FUNC_ENTRY
+    iCallback->HandleReadMessageComplete(iStatus.Int());
+    TRACE_FUNC_EXIT
+    }
+
+void CCUSSDReadMessageImpl::DoCancel()
+    {
+    TRACE_FUNC_ENTRY
+    iUssdSession.CancelAsyncRequest(EMobileUssdMessagingReceiveMessage);
+    TRACE_FUNC_EXIT
+    }
+
+TInt CCUSSDReadMessageImpl::ReadUSSDMessage(TDes8& aReceivedData,
+                                            RMobileUssdMessaging::TMobileUssdAttributesV1& aUssdReadAttribute)
+    {
+    TRACE_FUNC_ENTRY
+    
+    TInt retCode = KErrNone;
+    if(!IsActive())
+        {
+        TPckg<RMobileUssdMessaging::TMobileUssdAttributesV1> msgAttributes(aUssdReadAttribute);
+        iUssdSession.ReceiveMessage(iStatus, aReceivedData, msgAttributes);
+        SetActive();
+        }
+    else
+        {
+        retCode = KErrInUse;
+        }
+        
+    TRACE_FUNC_EXIT
+    return retCode;
+    }
+
+CCUSSDSendMessageImpl* CCUSSDSendMessageImpl::NewL(MUSSDCallback* aCallback, 
+                                                   RMobileUssdMessaging& aUssdSession)
+    {
+    TRACE_FUNC_ENTRY
+    CCUSSDSendMessageImpl* self = new(ELeave) CCUSSDSendMessageImpl(aCallback, aUssdSession);
+    TRACE_FUNC_EXIT
+    return self;
+    }
+
+CCUSSDSendMessageImpl::CCUSSDSendMessageImpl(MUSSDCallback* aCallback, 
+                                             RMobileUssdMessaging& aUssdSession):
+    CActive(CActive::EPriorityStandard),
+    iCallback(aCallback),
+    iUssdSession(aUssdSession)
+    {
+    TRACE_FUNC_ENTRY
+    CActiveScheduler::Add(this);
+    TRACE_FUNC_EXIT
+    }
+
+void CCUSSDSendMessageImpl::RunL()
+    {
+    TRACE_FUNC_ENTRY
+    iCallback->HandleSendMessageComplete(iStatus.Int());
+    TRACE_FUNC_EXIT
+    }
+
+void CCUSSDSendMessageImpl::DoCancel()
+    {
+    TRACE_FUNC_ENTRY
+    iUssdSession.CancelAsyncRequest(EMobileUssdMessagingSendMessage);   
+    TRACE_FUNC_EXIT
+    }
+
+TInt CCUSSDSendMessageImpl::HandleSendUSSDCmd(const TDesC8& aCmd, 
+                                              RMobileUssdMessaging::TMobileUssdAttributesV1& aUSSDAttribute)
+    {    
+    TRACE_FUNC_ENTRY
+    TInt retCode = KErrNone;
+    if(!IsActive())
+        {
+        // Get USSD messaging caps
+        RMobileUssdMessaging::TMobileUssdCapsV1 ussdCaps;
+        RMobileUssdMessaging::TMobileUssdCapsV1Pckg ussdCapsPckg(ussdCaps);
+   
+        iUssdSession.GetCaps(ussdCapsPckg);   
+        ussdCaps=ussdCapsPckg();
+        
+        if(ussdCaps.iUssdFormat != RMobileUssdMessaging::KCapsPackedString)
+            {
+            retCode =  KErrArgument;
+            }
+        else
+            {
+            // we only support packed strings?
+            aUSSDAttribute.iFormat = RMobileUssdMessaging::EFormatPackedString;
+            TPckg<RMobileUssdMessaging::TMobileUssdAttributesV1> msgAttributes(aUSSDAttribute);
+            iUssdSession.SendMessage(iStatus, aCmd, msgAttributes);
+            SetActive();
+            }   
+        }
+    else
+        {
+        retCode = KErrInUse;
+        }
+    TRACE_FUNC_EXIT
+    return retCode;
+    }
+
+CCUSSDSendMessageImpl::~CCUSSDSendMessageImpl()
+    {    
+    TRACE_FUNC_ENTRY
+    Cancel();
+    TRACE_FUNC_EXIT
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsatplugin/atmisccmdplugin/src/main.cpp	Tue Apr 27 16:49:44 2010 +0300
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2010 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 :
+ *
+ */
+
+#include <e32base.h>
+#include <ecom/implementationproxy.h>
+
+#include "atmisccmdpluginuids.hrh"
+#include "atmisccmdplugin.h"
+
+/*
+ * Ecom plug-in implementation table
+ */
+const TImplementationProxy ImplementationTable[] =
+	{
+	IMPLEMENTATION_PROXY_ENTRY(KUidATMiscCmdEcomImpl, CATMiscCmdPlugin::NewL)
+	};
+
+/*
+ * Instance of implementation proxy
+ * (exported)
+ */
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount)
+	{
+	aTableCount = sizeof( ImplementationTable ) / sizeof( TImplementationProxy );
+
+	return ImplementationTable;
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsatplugin/atmisccmdplugin/src/securitycodeverifier.cpp	Tue Apr 27 16:49:44 2010 +0300
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2010 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 :
+ *
+ */
+
+#include "securitycodeverifier.h"
+
+#include "clckcommandhandler.h"
+#include "debug.h"
+
+/**
+ * AO class for verifing security codes
+ */
+CSecurityCodeVerifier* CSecurityCodeVerifier::NewL(CCLCKCommandHandler* aCLCKHandler, RMobilePhone& aPhone)
+    {
+    TRACE_FUNC_ENTRY
+    CSecurityCodeVerifier* self = new(ELeave) CSecurityCodeVerifier(aCLCKHandler, aPhone);
+    TRACE_FUNC_EXIT
+    return self;
+    }
+      
+CSecurityCodeVerifier::CSecurityCodeVerifier(CCLCKCommandHandler* aCLCKHandler, RMobilePhone& aPhone) :
+    CActive(EPriorityNormal),
+    iCLCKHandler(aCLCKHandler),
+    iPhone(aPhone)
+    {
+    TRACE_FUNC_ENTRY
+    CActiveScheduler::Add(this);
+    TRACE_FUNC_EXIT
+    }
+
+CSecurityCodeVerifier::~CSecurityCodeVerifier()
+    {
+    Cancel();
+    }
+
+void CSecurityCodeVerifier::Start(TDesC8& aPassword, RMobilePhone::TMobilePhoneSecurityCode& aSecurityCode)
+    {
+    TRACE_FUNC_ENTRY
+    RMobilePhone::TMobilePassword code;
+    code.Copy(aPassword);
+
+    iPhone.VerifySecurityCode(iStatus, aSecurityCode, code, code);
+    SetActive();
+    TRACE_FUNC_EXIT
+    }
+
+void CSecurityCodeVerifier::RunL()
+    {
+    TRACE_FUNC_ENTRY    
+    Trace(KDebugPrintD, "iStatus.Int(): ", iStatus.Int());
+    iCLCKHandler->HandlePasswordVerification(iStatus.Int());
+    TRACE_FUNC_EXIT
+    }
+
+void CSecurityCodeVerifier::DoCancel()
+    {
+    TRACE_FUNC_ENTRY
+    iPhone.CancelAsyncRequest(EMobilePhoneNotifySecurityEvent);
+    TRACE_FUNC_EXIT
+    }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsatplugin/atmisccmdplugin/src/securityeventhandler.cpp	Tue Apr 27 16:49:44 2010 +0300
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2010 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 :
+ *
+ */
+
+#include "securityeventhandler.h"
+
+#include "clckcommandhandler.h"
+#include "debug.h"
+
+/**
+ * AO class for monitoring security events
+ */
+CSecurityEventHandler* CSecurityEventHandler::NewL(CCLCKCommandHandler* aCLCKHandler, RMobilePhone& aPhone)
+    {
+    TRACE_FUNC_ENTRY
+    CSecurityEventHandler* self = new(ELeave) CSecurityEventHandler(aCLCKHandler,aPhone);
+    TRACE_FUNC_EXIT
+    return self;
+    }
+      
+CSecurityEventHandler::CSecurityEventHandler(CCLCKCommandHandler* aCLCKHandler, RMobilePhone& aPhone) :
+    CActive(EPriorityNormal),
+    iCLCKHandler(aCLCKHandler),
+    iPhone(aPhone)
+    {
+    TRACE_FUNC_ENTRY
+    CActiveScheduler::Add(this);
+    TRACE_FUNC_EXIT
+    }
+
+CSecurityEventHandler::~CSecurityEventHandler()
+    {
+    Cancel();
+    }
+
+void CSecurityEventHandler::Start()
+    {
+    TRACE_FUNC_ENTRY
+    iPhone.NotifySecurityEvent(iStatus, iSecurityEvent);
+    SetActive();
+    TRACE_FUNC_EXIT
+    }
+
+void CSecurityEventHandler::RunL()
+    {
+    TRACE_FUNC_ENTRY    
+    Trace(KDebugPrintD, "iStatus.Int(): ", iStatus.Int());
+    Trace(KDebugPrintD, "iSecurityEvent: ", iSecurityEvent);
+    
+    iCLCKHandler->HandleSecurityEvent(iStatus.Int(), iSecurityEvent);
+    TRACE_FUNC_EXIT
+    }
+
+void CSecurityEventHandler::DoCancel()
+    {
+    TRACE_FUNC_ENTRY
+    iPhone.CancelAsyncRequest(EMobilePhoneVerifySecurityCode);
+    TRACE_FUNC_EXIT
+    }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsatplugin/group/bld.inf	Tue Apr 27 16:49:44 2010 +0300
@@ -0,0 +1,33 @@
+
+/*
+ * Copyright (c) 2008-2009 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 :This file provides the information required for building the
+ *              atcmdpluginecom.dll
+ *
+ */
+
+
+#include <platform_paths.hrh>
+
+PRJ_PLATFORMS
+
+#include "../atmisccmdplugin/group/bld.inf"
+PRJ_EXPORTS
+
+PRJ_TESTEXPORTS
+
+PRJ_MMPFILES
+
+PRJ_TESTMMPFILES
+
+// End of File
+
--- a/group/bld.inf	Wed Apr 14 16:09:00 2010 +0300
+++ b/group/bld.inf	Tue Apr 27 16:49:44 2010 +0300
@@ -22,6 +22,7 @@
 #include "../btservices_pub/group/bld.inf"
 #include "../bluetoothengine/group/bld.inf"
 #include "../atcommands/group/bld.inf"
+#include "../cbsatplugin/group/bld.inf"
 
 PRJ_EXPORTS