syncmlfw/common/sosserver_clientapi/src/NSmlClientContactSuiteAPIActiveCallback.cpp
changeset 0 b497e44ab2fc
child 23 4af31167ea77
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/syncmlfw/common/sosserver_clientapi/src/NSmlClientContactSuiteAPIActiveCallback.cpp	Thu Dec 17 09:07:52 2009 +0200
@@ -0,0 +1,328 @@
+/*
+* Copyright (c) 2004 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 for event/progress notifiers
+*
+*/
+
+
+// This define should be moved somewhere else (symbian headers) !!
+#include <s32mem.h>
+#include <SyncMLObservers.h>
+
+#include "NSmlClientAPIDefs.h"
+#include "NSmlClientAPIUtils.h"
+#include "NSmlClientAPIActiveCallback.h"
+#include "NSmlClientContactSuiteAPIActiveCallback.h"
+#include "nsmlsosserverdefs.h"
+#include "NSmlErrorCodeConversion.h"
+
+
+//
+// CSmlActiveContactSuiteProgressCallback
+//
+
+
+// -----------------------------------------------------------------------------
+// CSmlActiveContactSuiteProgressCallback::NewL(
+// Two-phase construction.
+// -----------------------------------------------------------------------------
+//
+CSmlActiveContactSuiteProgressCallback* CSmlActiveContactSuiteProgressCallback::NewL( const CSmlContactSuiteActiveCallback* aCallback )
+    {
+    CSmlActiveContactSuiteProgressCallback* self = new (ELeave) CSmlActiveContactSuiteProgressCallback( aCallback );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop(); // self
+    return self;
+    }
+    
+// -----------------------------------------------------------------------------
+// CSmlActiveContactSuiteProgressCallback::~CSmlActiveContactSuiteProgressCallback()
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CSmlActiveContactSuiteProgressCallback::~CSmlActiveContactSuiteProgressCallback()
+    {
+    Cancel();
+    if ( iRequesting )
+        {
+        CancelProgress();
+        }
+    
+    delete iBuf;
+    iBuf = NULL;
+    }
+    
+// -----------------------------------------------------------------------------
+// CSmlActiveContactSuiteProgressCallback::SetObserver()
+// Sets the observer to be notified. Starts requesting progress 
+// events if it is not yet started.
+// -----------------------------------------------------------------------------
+//
+void CSmlActiveContactSuiteProgressCallback::SetObserver( MSyncMLProgressObserver& aObserver )
+    {
+    iObserver = &aObserver;
+    
+    if ( !iRequesting )
+        {
+        iRequesting = ETrue;
+        Request();
+        }
+    }
+    
+// -----------------------------------------------------------------------------
+// CSmlActiveContactSuiteProgressCallback::CancelProgress()
+// Cancels progress notification.
+// -----------------------------------------------------------------------------
+//
+void CSmlActiveContactSuiteProgressCallback::CancelProgress()
+    {
+    DoCancel();
+    }
+    
+// -----------------------------------------------------------------------------
+// CSmlActiveContactSuiteProgressCallback::DoCancel()
+// -----------------------------------------------------------------------------
+//
+void CSmlActiveContactSuiteProgressCallback::DoCancel()
+    {
+    // cancel request to server
+    iCallback->SendReceive( ECmdContactSuiteProgressRequestCancel );
+    iRequesting = EFalse;
+    }
+    
+// -----------------------------------------------------------------------------
+// CSmlActiveContactSuiteProgressCallback::RunL()
+// -----------------------------------------------------------------------------
+//
+void CSmlActiveContactSuiteProgressCallback::RunL()
+    {
+    // check status
+    if ( iStatus.Int() == KErrNone )
+        {
+        // open a readstream to iEventBuf's data
+        RDesReadStream readStream( iBufPtr );
+        CleanupClosePushL( readStream );
+        
+        // read the fist interger in databuffer -> the type of message
+        TInt8 type = readStream.ReadInt8L();
+        if ( type != ENSmlTypeProgressEvent )
+            {
+            User::Panic( KNSmlClientAPIPanic, KErrArgument );
+            }
+
+        // check which progress event was received, and notify observer
+        TNSmlProgressEventType eventType = (TNSmlProgressEventType)readStream.ReadInt8L();
+        switch( eventType )
+            {
+            case ENSmlSyncError:
+                NotifyErrorL( readStream );
+                break;
+            case ENSmlSyncProgress:
+                NotifyProgressL( readStream );
+                break;
+            case ENSmlModifications:
+                NotifyModificationsL( readStream );
+                break;
+            default:
+                User::Panic( KNSmlClientAPIPanic, KErrArgument );
+                break;
+            }
+        
+        CleanupStack::PopAndDestroy(); // readStream
+        
+        if ( iRequesting )
+            {
+            Request();
+            }
+        }
+#ifdef __CLIENT_API_MT_
+    else
+        {
+        CActiveScheduler::Stop();
+        }
+#endif
+    }
+    
+// -----------------------------------------------------------------------------
+// CSmlActiveContactSuiteProgressCallback::Request()
+// Sends asynchronous progress event request to server.
+// -----------------------------------------------------------------------------
+//
+void CSmlActiveContactSuiteProgressCallback::Request()
+    {
+    iBufPtr.Zero();
+    
+    if ( !IsActive() )
+        {
+        SetActive();
+        }
+    
+    if ( iCallback )
+        {
+        iCallback->SendReceive( ECmdContactSuiteProgressRequest, TIpcArgs( &iBufPtr ), iStatus );
+        }
+    }
+    
+// -----------------------------------------------------------------------------
+// CSmlActiveContactSuiteProgressCallback::ConstructL()
+// -----------------------------------------------------------------------------
+//
+void CSmlActiveContactSuiteProgressCallback::ConstructL()
+    {
+    iBuf = HBufC8::NewL( KNSmlMaxProgressMessageLength );
+    iBufPtr.Set( iBuf->Des() );
+    }
+    
+// -----------------------------------------------------------------------------
+// CSmlActiveContactSuiteProgressCallback::CSmlActiveContactSuiteProgressCallback()
+// Contructor.
+// -----------------------------------------------------------------------------
+//
+CSmlActiveContactSuiteProgressCallback::CSmlActiveContactSuiteProgressCallback( const CSmlContactSuiteActiveCallback* aCallback )
+    : CActive( EPriorityStandard ), iRequesting( EFalse ), iBufPtr( 0, NULL, 0 ), iCallback( aCallback )
+    {
+    CActiveScheduler::Add( this );
+    }
+    
+// -----------------------------------------------------------------------------
+// CSmlActiveContactSuiteProgressCallback::NotifyErrorL()
+// Reads progress error related data and notifies observer.
+// -----------------------------------------------------------------------------
+//
+void CSmlActiveContactSuiteProgressCallback::NotifyErrorL( RReadStream& aStream ) const
+    {
+    TInt8 errorLevel = aStream.ReadInt8L();
+    TInt32 error = aStream.ReadInt32L();
+    TInt32 taskId = aStream.ReadInt32L();
+    TInt32 info1 = aStream.ReadInt32L();
+    TInt32 info2 = aStream.ReadInt32L();
+    
+    TNSmlErrorConversion errorconv( error );
+    error = errorconv.Convert();
+    
+    iObserver->OnSyncMLSyncError( (MSyncMLProgressObserver::TErrorLevel)errorLevel, error, taskId, info1, info2 );
+    }
+    
+// -----------------------------------------------------------------------------
+// CSmlActiveContactSuiteProgressCallback::NotifyProgressL()
+// Reads progress event related data and notifies observer.
+// -----------------------------------------------------------------------------
+//
+void CSmlActiveContactSuiteProgressCallback::NotifyProgressL( RReadStream& aStream ) const
+    {
+    TInt8 status = aStream.ReadInt8L();
+    TInt32 info1 = aStream.ReadInt32L();
+    TInt32 info2 = aStream.ReadInt32L();
+    
+    iObserver->OnSyncMLSyncProgress( (MSyncMLProgressObserver::TStatus)status, info1, info2 );
+    }
+    
+// -----------------------------------------------------------------------------
+// CSmlActiveContactSuiteProgressCallback::NotifyModificationsL()
+// Reads progress information of modifications and notifies 
+// observer.
+// -----------------------------------------------------------------------------
+//
+void CSmlActiveContactSuiteProgressCallback::NotifyModificationsL( RReadStream& aStream )
+    {
+#ifdef SYNCML_V3
+    TInt32 taskId = aStream.ReadInt32L();
+    
+    iClientMods.iNumAdded = aStream.ReadInt32L();
+    iClientMods.iNumReplaced = aStream.ReadInt32L();
+    iClientMods.iNumMoved = aStream.ReadInt32L();
+    iClientMods.iNumDeleted = aStream.ReadInt32L();
+    iClientMods.iNumFailed = aStream.ReadInt32L();
+    
+    iServerMods.iNumAdded = aStream.ReadInt32L();
+    iServerMods.iNumReplaced = aStream.ReadInt32L();
+    iServerMods.iNumMoved = aStream.ReadInt32L();
+    iServerMods.iNumDeleted = aStream.ReadInt32L();
+    iServerMods.iNumFailed = aStream.ReadInt32L();
+    
+    iObserver->OnSyncMLDataSyncModifications( taskId, iClientMods, iServerMods );
+#endif
+    }
+// -----------------------------------------------------------------------------
+// CSmlActiveCallback::CSmlActiveCallback()
+// -----------------------------------------------------------------------------
+//
+CSmlContactSuiteActiveCallback::CSmlContactSuiteActiveCallback( RSyncMLSession& aSession )
+    : iContactSuiteSession( aSession ), iActiveCallback(aSession)
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CSmlActiveCallback::~CSmlActiveCallback()
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CSmlContactSuiteActiveCallback::~CSmlContactSuiteActiveCallback()
+    {
+    //delete iEventCallback; iEventCallback = NULL;
+    delete iProgressCallback; iProgressCallback = NULL;
+    }
+
+// -----------------------------------------------------------------------------
+// CSmlActiveCallback::SetProgressObserverL()
+// Sets the progress observer.
+// -----------------------------------------------------------------------------
+//
+void CSmlContactSuiteActiveCallback::SetProgressObserverL( MSyncMLProgressObserver& aObserver )
+    {
+    if ( !iProgressCallback )
+        {
+        iProgressCallback = CSmlActiveContactSuiteProgressCallback::NewL( this );
+        }
+    
+    iProgressCallback->SetObserver( aObserver );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CSmlActiveCallback::CancelProgress()
+// Cancels progress notification.
+// -----------------------------------------------------------------------------
+//
+void CSmlContactSuiteActiveCallback::CancelProgress()
+    {
+    if ( iProgressCallback )
+        {
+        iProgressCallback->CancelProgress();
+        delete iProgressCallback; iProgressCallback = NULL;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CSmlActiveCallback::SendReceive()
+// Makes an asynchronous IPC call to server. Used by event and progress 
+// notifier objects.
+// -----------------------------------------------------------------------------
+//
+void CSmlContactSuiteActiveCallback::SendReceive( TInt aCmd, const TIpcArgs& aArgs, TRequestStatus& aStatus ) const
+    {
+    iActiveCallback.SendReceive( aCmd, aArgs , aStatus );    
+    }
+
+// -----------------------------------------------------------------------------
+// CSmlActiveCallback::SendReceive()
+// Makes a synchronous IPC call to server. Used by event and progress 
+// notifier objects.
+// -----------------------------------------------------------------------------
+//
+void CSmlContactSuiteActiveCallback::SendReceive( TInt aCmd ) const
+    {
+    iActiveCallback.SendReceive( aCmd );    
+    }