bluetoothengine/btnotif/btnotifwrapper/src/btnotifwrapper.cpp
branchRCL_3
changeset 55 613943a21004
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetoothengine/btnotif/btnotifwrapper/src/btnotifwrapper.cpp	Tue Aug 31 15:25:10 2010 +0300
@@ -0,0 +1,302 @@
+/*
+* ============================================================================
+*  Name        : btnotifwrapper.cpp
+*  Part of     : bluetoothengine / btnotif
+*  Description : Wrapper for Bluetooth Notifiers
+*
+*  Copyright © 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:
+*  Nokia Corporation
+* ============================================================================
+* Template version: 4.1
+*/
+
+#include "btnotifwrapper.h"
+#include <btnotif.h>
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <btextnotifierspartner.h>
+#endif
+
+/**  Identifier of the active object. */
+const TInt KWrapperActive = 10;
+
+// ======== MEMBER FUNCTIONS ========
+
+
+// ---------------------------------------------------------------------------
+// ?description_if_needed
+// ---------------------------------------------------------------------------
+//
+CBTNotifWrapper::CBTNotifWrapper( const TUid& aUid, const TUid& aChannel )
+:   MEikSrvNotifierBase2(),
+    iUid( aUid ),
+    iChannel( aChannel ),
+    iResponsePtr( NULL, 0 )
+    {
+    }
+
+
+// ---------------------------------------------------------------------------
+// ?description_if_needed
+// ---------------------------------------------------------------------------
+//
+void CBTNotifWrapper::ConstructL()
+    {
+    // lazy initialization: members are created and destroyed when needed.
+    }
+
+
+// ---------------------------------------------------------------------------
+// NewLC
+// ---------------------------------------------------------------------------
+//
+CBTNotifWrapper* CBTNotifWrapper::NewLC( const TUid& aUid, const TUid& aChannel )
+    {
+    CBTNotifWrapper* self = new( ELeave ) CBTNotifWrapper( aUid, aChannel );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// ?description_if_needed
+// ---------------------------------------------------------------------------
+//
+CBTNotifWrapper::~CBTNotifWrapper()
+    {
+    Cancel();   // Cleans up buffers
+    delete iActive;
+    iBTNotif.Close();
+    }
+
+// ---------------------------------------------------------------------------
+// From class MEikSrvNotifierBase2.
+// Frees all the resources i.e. destruct ourselves.
+// ---------------------------------------------------------------------------
+//
+void CBTNotifWrapper::Release()
+    {
+    delete this;
+    }
+
+// ---------------------------------------------------------------------------
+// From class MEikSrvNotifierBase2.
+// ?implementation_description
+// ---------------------------------------------------------------------------
+//
+MEikSrvNotifierBase2::TNotifierInfo CBTNotifWrapper::RegisterL()
+    {
+    return Info();
+    }
+
+
+// ---------------------------------------------------------------------------
+// From class MEikSrvNotifierBase2.
+// ?implementation_description
+// ---------------------------------------------------------------------------
+//
+MEikSrvNotifierBase2::TNotifierInfo CBTNotifWrapper::Info() const
+    {
+    MEikSrvNotifierBase2::TNotifierInfo info;
+    info.iUid = iUid;
+    info.iChannel = iChannel;
+    info.iPriority = MEikSrvNotifierBase2::ENotifierPriorityVHigh;
+    return info;
+    }
+
+
+// ---------------------------------------------------------------------------
+// From class MEikSrvNotifierBase2.
+// ?implementation_description
+// ---------------------------------------------------------------------------
+//
+TPtrC8 CBTNotifWrapper::StartL(const TDesC8& aBuffer)
+    {
+    if( !IsSync() )
+        {
+        // due to the charasteristics of Bluetooth and UI operations,
+        // most of Bluetooth notifiers do not support synchronous version.
+        User::Leave( KErrNotSupported );
+        }
+    // Call notifier server and get response.
+    if( !iBTNotif.Handle() )
+        {
+        User::LeaveIfError( iBTNotif.Connect() );
+        }
+    User::LeaveIfError( iBTNotif.StartNotifier( iUid, aBuffer ) );
+    iBTNotif.Close();
+    return KNullDesC8();
+    }
+
+// ---------------------------------------------------------------------------
+// From class MEikSrvNotifierBase2.
+// ?implementation_description
+// ---------------------------------------------------------------------------
+//
+void CBTNotifWrapper::StartL(const TDesC8& aBuffer, TInt aReplySlot, 
+    const RMessagePtr2& aMessage)
+    {
+    if( !iMessage.IsNull() )
+        {
+        aMessage.Complete( KErrAlreadyExists );
+        return;
+        }
+
+    // Call notifier server and get response.
+    if( !iBTNotif.Handle() )
+        {
+        User::LeaveIfError( iBTNotif.Connect() );
+        }
+    if( !iActive )
+        {
+        iActive = CBtSimpleActive::NewL( *this, KWrapperActive );
+        }
+
+    // We need to store the parameters locally, as aBuffer is destroyed after
+    // returning from this call. We do it on the heap, so we do not permanently
+    // consume memory for the buffer.
+
+    iParamsBuf.CreateL( aBuffer );
+    TInt len = aMessage.GetDesMaxLength( aReplySlot );
+    
+    iResponseBuf.CreateL( len );
+    aMessage.ReadL( aReplySlot, iResponseBuf );
+
+    iBTNotif.StartNotifierAndGetResponse( iActive->RequestStatus(),
+                iUid, iParamsBuf, iResponseBuf );
+    iActive->GoActive();
+    // record the request
+    iReplySlot = aReplySlot;
+    iMessage = aMessage;
+    }
+
+// ---------------------------------------------------------------------------
+// From class MEikSrvNotifierBase2.
+// ?implementation_description
+// ---------------------------------------------------------------------------
+//
+void CBTNotifWrapper::Cancel()
+    {
+    // Call notifier server to cancel.
+    if( iActive  )
+        {
+        iActive->Cancel(); 
+        }
+    if( !iMessage.IsNull() )
+        {
+        iMessage.Complete( KErrCancel );
+        }
+    iReplySlot = 0;
+    iParamsBuf.Close();
+    iResponseBuf.Close();
+    }
+
+// ---------------------------------------------------------------------------
+// From class MEikSrvNotifierBase2.
+// Synchronous notifier update.
+// ---------------------------------------------------------------------------
+//
+TPtrC8 CBTNotifWrapper::UpdateL(const TDesC8& aBuffer)
+    {
+    // Call notifier server and get response.
+    TBuf8<256> response;
+    if( !iBTNotif.Handle() )
+        {
+        User::LeaveIfError( iBTNotif.Connect() );
+        }
+    User::LeaveIfError( iBTNotif.UpdateNotifier( iUid, aBuffer, response ) );
+    return response;
+    }
+
+// ---------------------------------------------------------------------------
+// From class MEikSrvNotifierBase2.
+// Asynchronous notifier update.
+// ---------------------------------------------------------------------------
+//
+void CBTNotifWrapper::UpdateL(const TDesC8& aBuffer, TInt aReplySlot, const RMessagePtr2& aMessage)
+    {
+    (void) aReplySlot;
+    (void) aBuffer;
+    if( iMessage.IsNull() )
+        {
+        // There is no outstanding request, can't relate this to anything.
+        aMessage.Complete( KErrNotFound );
+        return;
+        }
+    // Call notifier server and get response.
+    // Async updates are just for updating parameters, so they are still 
+    // done synchronously between here and btnotif, as they don't 
+    // require any user feedback or other response with
+    // asynchronous/long cycles.
+    TPtrC8 response = UpdateL( aBuffer );
+    aMessage.WriteL( aReplySlot, response );
+    aMessage.Complete( KErrNone );
+    }
+
+// ---------------------------------------------------------------------------
+// From class MBtSimpleActiveObserver.
+// Callback to notify that an outstanding request has completed.
+// ---------------------------------------------------------------------------
+//
+void CBTNotifWrapper::RequestCompletedL( CBtSimpleActive* aActive, TInt aStatus )
+    {
+    ASSERT( aActive->RequestId() == KWrapperActive );
+    (void) aActive;
+    if( !iMessage.IsNull() )
+        {
+        TInt err( aStatus );
+        if( !err )
+            {
+            err = iMessage.Write( iReplySlot, iResponseBuf );
+            }
+        iMessage.Complete( err );
+        }
+    // Clean up after usage.
+    iBTNotif.Close();
+    delete iActive;
+    iActive = NULL;
+    }
+
+
+// ---------------------------------------------------------------------------
+// From class MBtSimpleActiveObserver.
+// Cancel and clean up all requests related to the active object.
+// ---------------------------------------------------------------------------
+//
+void CBTNotifWrapper::CancelRequest( TInt aRequestId )
+    {
+    ASSERT( aRequestId == KWrapperActive );
+    (void) aRequestId;
+    iBTNotif.CancelNotifier( iUid );
+    }
+
+// ---------------------------------------------------------------------------
+// From class MBtSimpleActiveObserver.
+// 
+// ---------------------------------------------------------------------------
+//
+void CBTNotifWrapper::HandleError( CBtSimpleActive* aActive, 
+        TInt aError )
+    {
+    // RequestCompletedL() is not leavable.
+    (void) aActive;
+    (void) aError;
+    }
+
+// ---------------------------------------------------------------------------
+// Check if this is a synchronous notifier or not.
+// ---------------------------------------------------------------------------
+//
+TBool CBTNotifWrapper::IsSync() const
+    {
+    return ( iUid == KBTGenericInfoNotifierUid );
+    }