bluetoothengine/btnotif/btnotifsrv/src/bluetoothnotification.cpp
changeset 19 43824b19ee35
child 31 a0ea99b6fa53
equal deleted inserted replaced
17:f05641c183ff 19:43824b19ee35
       
     1 /*
       
     2 * ============================================================================
       
     3 *  Name        : bluetoothnotification.cpp
       
     4 *  Part of     : bluetoothengine / btnotif
       
     5 *  Description : Class for managing an actual user notification or query.
       
     6 *                It hides UI framework-specifics in a private class.
       
     7 *
       
     8 *  Copyright © 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     9 *  All rights reserved.
       
    10 *  This component and the accompanying materials are made available
       
    11 *  under the terms of "Eclipse Public License v1.0"
       
    12 *  which accompanies this distribution, and is available
       
    13 *  at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
    14 *
       
    15 *  Initial Contributors:
       
    16 *  Nokia Corporation - initial contribution.
       
    17 *
       
    18 *  Contributors:
       
    19 *  Nokia Corporation
       
    20 * ============================================================================
       
    21 * Template version: 4.1
       
    22 */
       
    23 
       
    24 #include "bluetoothnotification.h"
       
    25 #include <hb/hbcore/hbsymbianvariant.h>
       
    26 #include "btnotificationmanager.h"
       
    27 #include "btnotifserver.h"
       
    28 #include "bluetoothtrace.h"
       
    29 #include <utf.h>  // for debugging
       
    30 
       
    31 /**  Identifier of Bluetooth device dialog plug-in. */
       
    32 _LIT( KBTDevDialogId, "com.nokia.hb.btdevicedialog/1.0" );
       
    33 /**  Key name of result. */
       
    34 _LIT( KBTDevDialogResult, "result" );
       
    35 _LIT( KBTDevDialogInput, "input" );
       
    36 
       
    37 // ======== MEMBER FUNCTIONS ========
       
    38 
       
    39 // ---------------------------------------------------------------------------
       
    40 // C++ default constructor
       
    41 // ---------------------------------------------------------------------------
       
    42 //
       
    43 CBluetoothNotification::CBluetoothNotification( CBTNotificationManager* aManager )
       
    44 :   iManager( aManager )
       
    45     {
       
    46     }
       
    47 
       
    48 
       
    49 // ---------------------------------------------------------------------------
       
    50 // Symbian 2nd-phase constructor
       
    51 // ---------------------------------------------------------------------------
       
    52 //
       
    53 void CBluetoothNotification::ConstructL()
       
    54     {
       
    55     iNotificationData = CHbSymbianVariantMap::NewL();
       
    56     iDialog = CHbDeviceDialogSymbian::NewL();
       
    57     }
       
    58 
       
    59 
       
    60 // ---------------------------------------------------------------------------
       
    61 // NewL.
       
    62 // ---------------------------------------------------------------------------
       
    63 //
       
    64 CBluetoothNotification* CBluetoothNotification::NewL( 
       
    65     CBTNotificationManager* aManager )
       
    66     {
       
    67 	BOstraceFunctionEntry0( DUMMY_DEVLIST );
       
    68     CBluetoothNotification* self = new( ELeave ) CBluetoothNotification( aManager );
       
    69     CleanupStack::PushL( self );
       
    70     self->ConstructL();
       
    71     CleanupStack::Pop( self );
       
    72 	BOstraceFunctionExit0( DUMMY_DEVLIST );
       
    73     return self;
       
    74     }
       
    75 
       
    76 
       
    77 // ---------------------------------------------------------------------------
       
    78 // Destructor
       
    79 // ---------------------------------------------------------------------------
       
    80 //
       
    81 CBluetoothNotification::~CBluetoothNotification()
       
    82 {
       
    83     BOstraceFunctionEntry1( DUMMY_DEVLIST, this );
       
    84     delete iDialog;
       
    85     delete iNotificationData;
       
    86     delete iReturnData;
       
    87 	BOstraceFunctionExit1( DUMMY_DEVLIST, this )
       
    88 }
       
    89 
       
    90 
       
    91 // ---------------------------------------------------------------------------
       
    92 // Resets the notification, clean all the internals.
       
    93 // ---------------------------------------------------------------------------
       
    94 //
       
    95 void CBluetoothNotification::Reset()
       
    96     {
       
    97 	BOstraceFunctionEntry1( DUMMY_DEVLIST, this );
       
    98     iType = TBluetoothDialogParams::EInvalidDialog;
       
    99     iResourceId = ENoResource;
       
   100     iObserver = NULL;
       
   101     iDialog->Cancel();
       
   102     iDialog->SetObserver( NULL );   // Not interested in a callback anymore.
       
   103     delete iNotificationData;
       
   104     iNotificationData = NULL;
       
   105     iNotificationData = CHbSymbianVariantMap::NewL();
       
   106     delete iReturnData;
       
   107     iReturnData = NULL;
       
   108     iReturnData = CHbSymbianVariantMap::NewL();
       
   109     BOstraceFunctionExit1( DUMMY_DEVLIST, this );
       
   110     }
       
   111 
       
   112 
       
   113 // ---------------------------------------------------------------------------
       
   114 // Sets the data to be shown to the user.
       
   115 // ---------------------------------------------------------------------------
       
   116 //
       
   117 TInt CBluetoothNotification::SetData( TInt aDataType, const TDesC& aData )
       
   118     {
       
   119     TRAPD( err, SetDataL( aDataType, aData ) );
       
   120     return (int) err;
       
   121     }
       
   122 
       
   123 
       
   124 // ---------------------------------------------------------------------------
       
   125 // Sets the data to be shown to the user.
       
   126 // ---------------------------------------------------------------------------
       
   127 //
       
   128 TInt CBluetoothNotification::SetData( TInt aDataType, TInt aData )
       
   129     {
       
   130     TRAPD( err, SetDataL( aDataType, aData ) );
       
   131     return (int) err;
       
   132     }
       
   133 
       
   134 // ---------------------------------------------------------------------------
       
   135 // Updates the data to be shown to the user.
       
   136 // ---------------------------------------------------------------------------
       
   137 //
       
   138 TInt CBluetoothNotification::Update( const TDesC& aData )
       
   139     {
       
   140     BOstraceFunctionEntry1( DUMMY_DEVLIST, this );
       
   141     (void) aData;
       
   142     int ret = iDialog->Update( *iNotificationData );
       
   143     delete iNotificationData;
       
   144     iNotificationData = NULL;
       
   145     iNotificationData = CHbSymbianVariantMap::NewL();
       
   146     BOstraceFunctionExit1( DUMMY_DEVLIST, this );
       
   147     return ret;
       
   148     }
       
   149 
       
   150 
       
   151 // ---------------------------------------------------------------------------
       
   152 // Show the notification, which means that it is added to the queue.
       
   153 // ---------------------------------------------------------------------------
       
   154 //
       
   155 TInt CBluetoothNotification::Show()
       
   156     {
       
   157 	BOstraceFunctionEntry1( DUMMY_DEVLIST, this );
       
   158     TRAPD( err, SetDataL( TBluetoothDialogParams::EDialogType, iType ) );
       
   159     if( !err )
       
   160         {
       
   161         TRAP( err, SetDataL( TBluetoothDialogParams::EResource, iResourceId ) );
       
   162         }
       
   163     delete iReturnData;
       
   164     iReturnData = NULL;
       
   165     if( !err )
       
   166         {
       
   167         TRAP( err, iReturnData = CHbSymbianVariantMap::NewL() );
       
   168         }
       
   169     if( !err )
       
   170         {
       
   171         err = iDialog->Show( KBTDevDialogId(), *iNotificationData, this );
       
   172         }
       
   173     delete iNotificationData;
       
   174     iNotificationData = NULL;
       
   175     iNotificationData = CHbSymbianVariantMap::NewL();
       
   176     
       
   177     const TInt KPluginErr = CHbDeviceDialogSymbian::EPluginErrors + 1;
       
   178     if( err == KPluginErr )
       
   179         {
       
   180         err = KErrNotFound;
       
   181         }
       
   182 	BOstraceFunctionExitExt( DUMMY_DEVLIST, this, err );
       
   183     return err;
       
   184     }
       
   185 
       
   186 
       
   187 // ---------------------------------------------------------------------------
       
   188 // Stop showing the notification.
       
   189 // ---------------------------------------------------------------------------
       
   190 //
       
   191 TInt CBluetoothNotification::Close()
       
   192     {
       
   193     BOstraceFunctionEntry1( DUMMY_DEVLIST, this );
       
   194     iDialog->Cancel();
       
   195     iManager->ReleaseNotification( this );
       
   196 	BOstraceFunctionExit1( DUMMY_DEVLIST, this );
       
   197     return KErrNone;
       
   198     }
       
   199 
       
   200 
       
   201 // ---------------------------------------------------------------------------
       
   202 // Sets the data to be shown to the user.
       
   203 // ---------------------------------------------------------------------------
       
   204 //
       
   205 void CBluetoothNotification::SetDataL( TInt aType, const TDesC& aData )
       
   206     {
       
   207     BOstraceFunctionEntryExt( DUMMY_DEVLIST, this, aType );
       
   208     TBuf16<6> key;
       
   209     TInt err = 0;
       
   210     CHbSymbianVariant* value = NULL;
       
   211     switch( aType )
       
   212         {
       
   213         case TBluetoothDialogParams::EAddress:
       
   214         case TBluetoothDeviceDialog::EDeviceName:
       
   215         case TBluetoothDeviceDialog::EAdditionalDesc:
       
   216         case TBluetoothDialogParams::EDialogTitle:
       
   217             key.Num(aType);
       
   218             value = CHbSymbianVariant::NewL( (TAny*) &aData, CHbSymbianVariant::EDes );
       
   219 			BtTraceBlock( 
       
   220                     TBuf<32> buf;
       
   221                     switch (aType) {
       
   222                         case TBluetoothDialogParams::EAddress:
       
   223                             _LIT(KAddress,"EAddress");
       
   224                             buf.Append(KAddress); 
       
   225                             break;
       
   226                         case TBluetoothDeviceDialog::EDeviceName:
       
   227                             _LIT(KDeviceName,"EDeviceName");
       
   228                             buf.Append(KDeviceName); 
       
   229                             break;
       
   230                         case TBluetoothDeviceDialog::EAdditionalDesc:
       
   231                             _LIT(KAdditionalDesc,"EAdditionalDesc");
       
   232                             buf.Append(KAdditionalDesc); 
       
   233                             break;
       
   234                     }
       
   235                     TPtrC p(buf);
       
   236                     TPtrC16 *ptr = (TPtrC16 *)value->Data();
       
   237                     BOstraceExt2( TRACE_DEBUG, DUMMY_DEVLIST, "SetData [%S] = [%S]", &p, ptr);
       
   238                     );
       
   239             err = iNotificationData->Add( key, value );   // Takes ownership of value
       
   240             if ( err )
       
   241                 {
       
   242                 // Note: need a proper exception handling. 
       
   243                 // NOTIF_NOTHANDLED( err )
       
   244                 }
       
   245             break;
       
   246         case TBluetoothDialogParams::EResource:
       
   247         case TBluetoothDeviceDialog::EDeviceClass:
       
   248         case TBluetoothDeviceDialog::EAdditionalInt:
       
   249             PanicServer( EBTNotifPanicBadArgument );
       
   250             break;
       
   251         case TBluetoothDialogParams::ENoParams:
       
   252         case TBluetoothDeviceDialog::ENoParams:
       
   253         default:
       
   254             break;
       
   255         }
       
   256 		BOstraceFunctionExit1( DUMMY_DEVLIST, this );
       
   257     }
       
   258 
       
   259 
       
   260 // ---------------------------------------------------------------------------
       
   261 // Sets the data to be shown to the user.
       
   262 // ---------------------------------------------------------------------------
       
   263 //
       
   264 void CBluetoothNotification::SetDataL( TInt aType, TInt aData )
       
   265     {
       
   266     BOstraceFunctionEntryExt( DUMMY_DEVLIST, this, aType );
       
   267     TBuf<6> key;
       
   268     TInt err = 0;
       
   269     CHbSymbianVariant* value = NULL;
       
   270     switch( aType )
       
   271         {
       
   272         case TBluetoothDialogParams::EDialogType:
       
   273         case TBluetoothDialogParams::EResource:
       
   274         case TBluetoothDialogParams::EDialogTitle:
       
   275         case TBluetoothDeviceDialog::EDeviceClass:
       
   276         case TBluetoothDeviceDialog::EAdditionalInt:
       
   277             key.Num(aType);
       
   278             value = CHbSymbianVariant::NewL( (TAny*) &aData, CHbSymbianVariant::EInt );
       
   279 			BtTraceBlock( 
       
   280                     TBuf<32> buf;
       
   281                     switch (aType) {
       
   282                         case TBluetoothDialogParams::EDialogType:
       
   283                             buf = _L("EDialogType"); 
       
   284                             break;
       
   285                         case TBluetoothDialogParams::EResource:
       
   286                             buf = _L("EResource");
       
   287                             break;
       
   288                         case TBluetoothDeviceDialog::EDeviceClass:
       
   289                             buf = _L("EDeviceClass");
       
   290                             break;
       
   291                         case TBluetoothDeviceDialog::EAdditionalInt:
       
   292                             buf = _L("EAdditionalInt");
       
   293                             break;
       
   294                     }
       
   295                     TPtrC p(buf);
       
   296                     TInt *intPtr = (TInt *)value->Data();
       
   297                     BOstraceExt2( TRACE_DEBUG, DUMMY_DEVLIST, "SetData [%S] = [%d]", &p, *intPtr);
       
   298                     );
       
   299 			err = iNotificationData->Add( key, value );   // Takes ownership of value
       
   300 	         if ( err )
       
   301 	             {
       
   302                  // need a proper exception handling.
       
   303                  //NOTIF_NOTHANDLED( !err )
       
   304 	             }
       
   305             
       
   306             break;
       
   307         case TBluetoothDialogParams::EAddress:
       
   308         case TBluetoothDeviceDialog::EDeviceName:
       
   309             PanicServer( EBTNotifPanicBadArgument );
       
   310             break;
       
   311         case TBluetoothDialogParams::ENoParams:
       
   312         case TBluetoothDeviceDialog::ENoParams:
       
   313         default:
       
   314             break;
       
   315         }
       
   316 		BOstraceFunctionExit1( DUMMY_DEVLIST, this );
       
   317     }
       
   318 
       
   319 // ---------------------------------------------------------------------------
       
   320 // From class MHbDeviceDialogObserver.
       
   321 // Callback called when data is received from a device dialog.
       
   322 // ---------------------------------------------------------------------------
       
   323 //
       
   324 void CBluetoothNotification::DataReceived( CHbSymbianVariantMap& aData )
       
   325     {
       
   326     BOstraceFunctionEntry1( DUMMY_DEVLIST, this );
       
   327     BtTraceBlock( debugHbSymbianVariantMap(aData); );
       
   328     for( TInt i = 0; i < aData.Keys().MdcaCount(); i++ )
       
   329         {
       
   330         TPtrC key( aData.Keys().MdcaPoint( i ).Ptr(), aData.Keys().MdcaPoint( i ).Length() );
       
   331         const CHbSymbianVariant* valueRef = aData.Get( key );
       
   332         CHbSymbianVariant* value = CHbSymbianVariant::NewL( valueRef->Data(), valueRef->Type() );
       
   333         TInt err = iReturnData->Add( key, value );
       
   334         NOTIF_NOTHANDLED( !err )
       
   335         }
       
   336     iObserver->MBRDataReceived( aData );
       
   337     BOstraceFunctionExit1( DUMMY_DEVLIST, this );
       
   338     }
       
   339 
       
   340 #ifdef BLUETOOTHTRACE_ENABLED
       
   341 
       
   342 void CBluetoothNotification::debugHbSymbianVariantMap( CHbSymbianVariantMap& aData)
       
   343     {
       
   344     for( TInt i = 0; i < aData.Keys().MdcaCount(); i++ )
       
   345         {
       
   346         TBuf<128> buf;
       
   347         TPtrC key( aData.Keys().MdcaPoint( i ).Ptr(), aData.Keys().MdcaPoint( i ).Length() );
       
   348         buf = key;
       
   349         buf.Append(_L(" = "));
       
   350         const CHbSymbianVariant* value = aData.Get( key );
       
   351         TBuf<16> nbr;
       
   352         TBuf<32> newBuf;
       
   353         switch (value->Type()) {
       
   354             case CHbSymbianVariant::EInt :
       
   355                 buf.Append(_L("[EInt] ")); 
       
   356                 nbr.Num(*((TInt*)value->Data()));
       
   357                 buf.Append(nbr);
       
   358                 break;
       
   359             case  CHbSymbianVariant::EBool :
       
   360                 buf.Append(_L("[EBool] ")); 
       
   361                 buf.Append(*((TBool*)value->Data()) ? _L("True") : _L("False"));
       
   362                 break;
       
   363             case CHbSymbianVariant::EUint :
       
   364                 buf.Append( _L("[EUint] ")); 
       
   365                 nbr.Num(*((TUint*)value->Data()));
       
   366                 buf.Append(nbr);
       
   367                 break;
       
   368             case CHbSymbianVariant::EReal  :
       
   369                 buf.Append(_L("[EReal] ")); 
       
   370                 nbr.Num(*((TReal*)value->Data()));
       
   371                 buf.Append(nbr);
       
   372                 break;
       
   373             case CHbSymbianVariant::EDes :  // TDesC
       
   374                 buf.Append(_L("[EDes] ")); 
       
   375                 buf.Append(*((TPtrC16 *)value->Data()));
       
   376                 break;
       
   377             case CHbSymbianVariant::EBinary :  // TDesC8
       
   378                 buf.Append(_L("[EBinary] ")); 
       
   379                 // the following function caused problems when converting this function to 
       
   380                 // a trace function in bluetoothtrace.h
       
   381                 CnvUtfConverter::ConvertToUnicodeFromUtf8(newBuf,*((TPtrC8 *)value->Data()) );
       
   382                 buf.Append(newBuf);
       
   383                 break;
       
   384             case CHbSymbianVariant::EChar  : // a TChar
       
   385                 buf.Append(_L("[EChar] ")); 
       
   386                 buf.Append(*((TChar *)value->Data()));
       
   387                 break;
       
   388             case CHbSymbianVariant::ERect  : // a TRect
       
   389             case CHbSymbianVariant::EPoint : // a TPoint
       
   390             case CHbSymbianVariant::ESize  : // a TSize
       
   391             case CHbSymbianVariant::EDesArray : //  a MDesCArray
       
   392                 break;
       
   393             default:
       
   394                 break;
       
   395             }
       
   396         TPtrC p(buf);
       
   397         BOstraceExt1( TRACE_DEBUG, DUMMY_DEVLIST, "HbSymbianVariantMap [%S]", &p);
       
   398         }
       
   399     }
       
   400 #endif // BLUETOOTHTRACE_ENABLED
       
   401 // ---------------------------------------------------------------------------
       
   402 // From class MHbDeviceDialogObserver.
       
   403 // Callback called when a device dialog is closed.
       
   404 // ---------------------------------------------------------------------------
       
   405 //
       
   406 void CBluetoothNotification::DeviceDialogClosed( TInt aCompletionCode )
       
   407     {
       
   408     BOstraceFunctionEntryExt( DUMMY_DEVLIST, this, aCompletionCode );
       
   409     TPckg<TBool> result( EFalse );
       
   410     TPtrC8 resultPtr( result );
       
   411     const CHbSymbianVariant* value = iReturnData->Get( KBTDevDialogResult );
       
   412     if( value && value->IsValid() )
       
   413         {
       
   414         result() = *value->Value<TBool>();
       
   415         }
       
   416     RBuf8 resultBuf;
       
   417     value = iReturnData->Get( KBTDevDialogInput );
       
   418     if( value && value->IsValid() )
       
   419         {
       
   420         HBufC8* data = value->Value<HBufC8>();
       
   421         if( !resultBuf.Create( data->Length() + result.Length() ) )
       
   422             {
       
   423             resultBuf = *data;
       
   424             resultBuf.Insert( 0, result );
       
   425             resultPtr.Set( resultBuf );
       
   426             }
       
   427         }
       
   428     if( iObserver )
       
   429         {
       
   430         if( aCompletionCode == CHbDeviceDialogSymbian::ECancelledError )
       
   431             {
       
   432             aCompletionCode = KErrCancel;
       
   433             }
       
   434         iObserver->MBRNotificationClosed( aCompletionCode, resultPtr );
       
   435         }
       
   436     iManager->ReleaseNotification( this );
       
   437     // Note that we might get deleted after releasing ourselves.
       
   438     BOstraceFunctionExit1( DUMMY_DEVLIST, this );
       
   439     }
       
   440