sysstatemgmt/ssmcustcmds/ssmsystemcmds/src/ssmpskeyobserver.cpp
changeset 0 4e1aa6a622a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysstatemgmt/ssmcustcmds/ssmsystemcmds/src/ssmpskeyobserver.cpp	Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,170 @@
+/*
+* Copyright (c) 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:
+* Implementation of CSsmPsKeyObserver class.
+*
+*/
+
+
+#include "ssmpskeyobserver.h"
+#include "trace.h"
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CSsmPsKeyObserver::CSsmPsKeyObserver
+//
+// ---------------------------------------------------------------------------
+//
+CSsmPsKeyObserver::CSsmPsKeyObserver( TUid aCategory, TUint aKey )
+  : CActive( EPriorityHigh ),
+    iCategory( aCategory ),
+    iKey( aKey )
+    {
+    FUNC_LOG;
+
+    CActiveScheduler::Add( this );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSsmPsKeyObserver::~CSsmPsKeyObserver
+//
+// ---------------------------------------------------------------------------
+//
+CSsmPsKeyObserver::~CSsmPsKeyObserver()
+    {
+    FUNC_LOG;
+
+    Cancel();
+    iProperty.Close();
+    Complete( KErrCancel ); // Just in case
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSsmPsKeyObserver::StartObserving
+//
+// ---------------------------------------------------------------------------
+//
+void CSsmPsKeyObserver::StartObserving( TRequestStatus& aStatus )
+    {
+    FUNC_LOG;
+    ASSERT_TRACE( !IsActive() );
+
+    aStatus = KRequestPending;
+    iClientStatus = &aStatus;
+
+    TInt errorCode = iProperty.Attach( iCategory, iKey );
+    ERROR_2( errorCode, "Failed to attach to property 0x%08x::0x%08x", 
+             iCategory.iUid, iKey );
+    
+    if ( errorCode == KErrNone )
+        {
+        CheckKeyValue();
+        }
+    else
+        {
+        Complete( errorCode );
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSsmPsKeyObserver::DoCancel
+//
+// ---------------------------------------------------------------------------
+//
+void CSsmPsKeyObserver::DoCancel()
+    {
+    FUNC_LOG;
+
+    iProperty.Cancel();
+    Complete( KErrCancel );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSsmPsKeyObserver::RunL
+//
+// ---------------------------------------------------------------------------
+//
+void CSsmPsKeyObserver::RunL()
+    {
+    FUNC_LOG;
+    INFO_1( "CSsmPsKeyObserver::iStatus = %d", iStatus.Int() );
+
+    if ( iStatus == KErrCancel ||
+         iStatus == KErrServerTerminated ||
+         iStatus ==KErrNotSupported )
+        {
+        Complete( iStatus.Int() );
+        }
+    else
+        {
+        CheckKeyValue();
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSsmPsKeyObserver::CheckKeyValue
+//
+// ---------------------------------------------------------------------------
+//
+void CSsmPsKeyObserver::CheckKeyValue()
+    {
+    FUNC_LOG;
+    ASSERT( !IsActive() );
+
+    iProperty.Subscribe( iStatus );
+    SetActive();
+
+    TInt value( -KMaxTInt );
+    TInt errorCode = iProperty.Get( value );
+    ERROR_2( errorCode, "Failed to get value of property 0x%08x::0x%08x",
+             iCategory.iUid, iKey );
+    if ( errorCode != KErrNone || IsMatch( value ) )
+        {
+        INFO_3( "Property 0x%08x::0x%08x reached the target value %d.", 
+                 iCategory.iUid, iKey, value );
+
+        Complete( errorCode );
+        Cancel();
+        }
+    else
+        {
+        INFO_3( "Value of property 0x%08x::0x%08x is %d. Waiting...",
+                 iCategory.iUid, iKey, value );
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSsmPsKeyObserver::Complete
+//
+// ---------------------------------------------------------------------------
+//
+void CSsmPsKeyObserver::Complete( const TInt aErrorCode )
+    {
+    FUNC_LOG;
+
+    if ( iClientStatus )
+        {
+        INFO_1( "Completing request with status %d", aErrorCode );
+
+        User::RequestComplete( iClientStatus, aErrorCode );
+        iClientStatus = NULL;
+        }
+    }