src/hbcore/devicedialogbase/hbdevicedialogsymbian.cpp
changeset 5 627c4a0fd0e7
parent 2 06ff229162e9
child 7 923ff622b8b9
equal deleted inserted replaced
3:11d3954df52a 5:627c4a0fd0e7
    77 */
    77 */
    78 /*!
    78 /*!
    79     \var TDeviceDialogError::DeviceDialogError HbDeviceDialog::ESystemCancelledError
    79     \var TDeviceDialogError::DeviceDialogError HbDeviceDialog::ESystemCancelledError
    80     Operation was cancelled by device dialog framework.
    80     Operation was cancelled by device dialog framework.
    81 */
    81 */
       
    82 /*!
       
    83     \var TDeviceDialogError::DeviceDialogError HbDeviceDialog::EInstanceExistsError
       
    84     A single instance device dialog widget exists already (has been launched).
       
    85     See HbDeviceDialogPlugin::SingleInstance.
       
    86 */
    82 
    87 
    83 /*!
    88 /*!
    84    \fn void MHbDeviceDialogObserver::DataReceived(CHbSymbianVariantMap& aData)
    89    \fn void MHbDeviceDialogObserver::DataReceived(CHbSymbianVariantMap& aData)
    85 
    90 
    86     This callback is called when data is received from a device dialog.
    91     This callback is called when data is received from a device dialog.
   109 // Device dialogs are implemented only for Symbian/S60 OS.
   114 // Device dialogs are implemented only for Symbian/S60 OS.
   110 
   115 
   111 class CHbDeviceDialogSymbianPrivate : public CActive
   116 class CHbDeviceDialogSymbianPrivate : public CActive
   112 {
   117 {
   113 public:
   118 public:
   114         CHbDeviceDialogSymbianPrivate();
   119         CHbDeviceDialogSymbianPrivate(TInt aFlags);
   115         ~CHbDeviceDialogSymbianPrivate();
   120         ~CHbDeviceDialogSymbianPrivate();
   116         TInt Show( const QByteArray& aArray );
   121         TInt Initialize();
   117         TInt Update( const QByteArray& aArray );
   122         TInt Show(const QByteArray& aArray);
       
   123         TInt Update(const QByteArray& aArray);
   118         void CancelDialog();
   124         void CancelDialog();
   119         TInt Error() const;
   125         TInt Error() const;
   120         void SetObserver( MHbDeviceDialogObserver* aObserver );
   126         void SetObserver(MHbDeviceDialogObserver* aObserver);
   121 
   127 
   122         // CActive
   128         // CActive
   123         void RunL();
   129         void RunL();
   124         void DoCancel();
   130         void DoCancel();
   125         TInt RunError( TInt aError );
   131         TInt RunError(TInt aError);
   126 
   132 
   127         void Start();
   133         void Start();
   128         TInt SymToDeviceDialogError( TInt errorCode );
   134         TInt SymToDeviceDialogError(TInt errorCode);
   129         void SetError(TInt aError);
   135         void SetError(TInt aError);
   130         bool CallDialogClosedObserver(TInt aCompletionCode);
   136         bool CallDialogClosedObserver(TInt aCompletionCode);
   131         bool CallDataReceivedObserver(CHbSymbianVariantMap& aData);
   137         bool CallDataReceivedObserver(CHbSymbianVariantMap& aData);
   132 
   138 
   133 public:
   139 public:
   143     CActiveSchedulerWait* iWait;
   149     CActiveSchedulerWait* iWait;
   144     MHbDeviceDialogObserver* iObserver;
   150     MHbDeviceDialogObserver* iObserver;
   145     bool *iDeleted;
   151     bool *iDeleted;
   146 };
   152 };
   147 
   153 
   148 CHbDeviceDialogSymbianPrivate::CHbDeviceDialogSymbianPrivate():
   154 CHbDeviceDialogSymbianPrivate::CHbDeviceDialogSymbianPrivate(TInt aFlags):
   149 CActive( EPriorityStandard ),
   155 CActive(EPriorityStandard),
   150 iFlags(0),
   156 iFlags(aFlags),
   151 iLastError(0),
   157 iDataPtr(NULL, 0, 0)
   152 iDeviceDialogId(0),
   158 {
   153 iBuffer(NULL),
   159     CActiveScheduler::Add(this);
   154 iDataPtr(NULL, 0, 0),
       
   155 iRequesting(EFalse),
       
   156 iObserver(NULL)
       
   157 {
       
   158     if (!iBuffer) {
       
   159         iBuffer = HBufC8::NewL(64);
       
   160         if (iBuffer) {
       
   161             iDataPtr.Set(iBuffer->Des());
       
   162         }
       
   163     }
       
   164 }
   160 }
   165 
   161 
   166 CHbDeviceDialogSymbianPrivate::~CHbDeviceDialogSymbianPrivate()
   162 CHbDeviceDialogSymbianPrivate::~CHbDeviceDialogSymbianPrivate()
   167 {
   163 {
   168     // Inform the server to finish the dialog session and not to cancel it
   164     // Inform the server to finish the dialog session and not to cancel it
   169     if(!iObserver) {
   165     if (!iObserver) {
   170         iHbSession.SendSyncRequest(EHbSrvClientClosing);
   166         iHbSession.SendSyncRequest(EHbSrvClientClosing);
   171     }
   167     }
   172 
   168 
   173     Cancel();
   169     Cancel();
   174     iHbSession.Close();
   170     iHbSession.Close();
   183         *iDeleted = true;
   179         *iDeleted = true;
   184         iDeleted = 0;
   180         iDeleted = 0;
   185     }
   181     }
   186 }
   182 }
   187 
   183 
   188 TInt CHbDeviceDialogSymbianPrivate::Show(const QByteArray& aArray )
   184 TInt CHbDeviceDialogSymbianPrivate::Initialize()
       
   185 {
       
   186     if (!iBuffer) {
       
   187         TRAP_IGNORE(iBuffer = HBufC8::NewL(64));
       
   188         if (iBuffer) {
       
   189             iDataPtr.Set(iBuffer->Des());
       
   190         } else {
       
   191             return KErrNoMemory;
       
   192         }
       
   193     }
       
   194     return iHbSession.Connect();
       
   195 }
       
   196 
       
   197 TInt CHbDeviceDialogSymbianPrivate::Show(const QByteArray& aArray)
   189 {
   198 {
   190     TInt error = iLastError = KErrNone;
   199     TInt error = iLastError = KErrNone;
       
   200 
       
   201     error = SymToDeviceDialogError(Initialize());
       
   202     if (error != HbDeviceDialogNoError){
       
   203         SetError(error);
       
   204         return error;
       
   205     }
   191 
   206 
   192     TPtrC8 ptr( reinterpret_cast<const TUint8*>(aArray.data()), aArray.size() );
   207     TPtrC8 ptr( reinterpret_cast<const TUint8*>(aArray.data()), aArray.size() );
   193     // Synchronous call to server to show dialog.
   208     // Synchronous call to server to show dialog.
   194     error = iHbSession.SendSyncRequest( EHbSrvShowDeviceDialog, ptr, &iDeviceDialogId );
   209     error = iHbSession.SendSyncRequest(EHbSrvShowDeviceDialog, ptr, &iDeviceDialogId);
   195     //error = SymToDeviceDialogError(error);
   210     error = SymToDeviceDialogError(error);
   196 
   211 
   197     if (error == KErrNone) {
   212     if (error == KErrNone) {
   198         // Start listening for server updates. Device dialog update and closing is
   213         // Start listening for server updates. Device dialog update and closing is
   199         // received via this channel. Error status received in RunL method.
   214         // received via this channel. Error status received in RunL method.
   200         Start();
   215         Start();
   217     if (iRequesting) {
   232     if (iRequesting) {
   218 
   233 
   219         TPtrC8 ptr( reinterpret_cast<const TUint8*>(aArray.data()), aArray.size() );
   234         TPtrC8 ptr( reinterpret_cast<const TUint8*>(aArray.data()), aArray.size() );
   220 
   235 
   221         error = iHbSession.SendSyncRequest( EHbSrvUpdateDeviceDialog, ptr );
   236         error = iHbSession.SendSyncRequest( EHbSrvUpdateDeviceDialog, ptr );
   222         //error = SymToDeviceDialogError(error);
   237         error = SymToDeviceDialogError(error);
   223         if (error != KErrNone) {
   238         if (error != KErrNone) {
   224             SetError(error);
   239             SetError(error);
   225         }
   240         }
   226     }
   241     }
   227     else {
   242     else {
   228         SetError(KErrBadHandle);
   243         error = SymToDeviceDialogError(KErrBadHandle);
   229         error = KErrBadHandle;
   244         SetError(error);
   230     }
   245     }
   231     return error;
   246     return error;
   232 }
   247 }
   233 
   248 
   234 /*!
   249 /*!
   238     at server.
   253     at server.
   239 */
   254 */
   240 void CHbDeviceDialogSymbianPrivate::CancelDialog()
   255 void CHbDeviceDialogSymbianPrivate::CancelDialog()
   241 {
   256 {
   242     iLastError = KErrNone;
   257     iLastError = KErrNone;
   243     int error = KErrNotFound;
   258     int error = SymToDeviceDialogError(KErrNotFound);
   244 
   259 
   245     if (iRequesting) {
   260     if (iRequesting) {
   246         // Ignore other than server errors.
   261         // Ignore other than server errors.
   247         error = iHbSession.SendSyncRequest(EHbSrvCancelDeviceDialog, iDeviceDialogId());
   262         error = iHbSession.SendSyncRequest(EHbSrvCancelDeviceDialog, iDeviceDialogId());
   248         // error = SymToDeviceDialogError(error);
   263         error = SymToDeviceDialogError(error);
   249     }
   264     }
   250     if (error != KErrNone) {
   265     if (error != KErrNone) {
   251         SetError(error);
   266         SetError(error);
   252     }
   267     }
   253 }
   268 }
   271     RunL from CActive.
   286     RunL from CActive.
   272 */
   287 */
   273 void CHbDeviceDialogSymbianPrivate::RunL()
   288 void CHbDeviceDialogSymbianPrivate::RunL()
   274 {
   289 {
   275     TInt completionCode = iStatus.Int();
   290     TInt completionCode = iStatus.Int();
   276     //int errorCode = SymToDeviceDialogError(completionCode);
   291     int errorCode = SymToDeviceDialogError(completionCode);
   277 
   292 
   278     if (completionCode < KErrNone) {
   293     if (completionCode < KErrNone) {
   279         // Any Symbian error, stop requesting, sycnhoronous requests are stopped
   294         // Any Symbian error, stop requesting, sycnhoronous requests are stopped
   280         // in the end of the RunL
   295         // in the end of the RunL
   281         iRequesting = EFalse;
   296         iRequesting = EFalse;
   282         SetError(completionCode);
   297         SetError(errorCode);
   283         if (CallDialogClosedObserver(completionCode)) {
   298         if (CallDialogClosedObserver(errorCode)) {
   284             return; // observed deleted this object, do not touch it
   299             return; // observed deleted this object, do not touch it
   285         }
   300         }
   286     }
   301     }
   287     else {
   302     else {
   288         // Check that event is for latest device dialog. iDeviceDialogId was updated by server
   303         // Check that event is for latest device dialog. iDeviceDialogId was updated by server
   297                     delete iBuffer;
   312                     delete iBuffer;
   298                     iBuffer = NULL;
   313                     iBuffer = NULL;
   299                     iBuffer = HBufC8::NewL(updateInfo.iInfo.iDataInfo.iDataSize);
   314                     iBuffer = HBufC8::NewL(updateInfo.iInfo.iDataInfo.iDataSize);
   300                     iDataPtr.Set(iBuffer->Des());
   315                     iDataPtr.Set(iBuffer->Des());
   301                     completionCode = iHbSession.SendSyncRequest(EHbSrvUpdateData, iDataPtr);
   316                     completionCode = iHbSession.SendSyncRequest(EHbSrvUpdateData, iDataPtr);
   302                     //errorCode = SymToDeviceDialogError(completionCode);
   317                     errorCode = SymToDeviceDialogError(completionCode);
   303 
   318 
   304                     // data request failed
   319                     // data request failed
   305                     if (completionCode < KErrNone) {
   320                     if (completionCode < KErrNone) {
   306                         iRequesting = EFalse;
   321                         iRequesting = EFalse;
   307                         SetError(completionCode);
   322                         SetError(errorCode);
   308                         if (CallDialogClosedObserver(completionCode)) {
   323                         if (CallDialogClosedObserver(errorCode)) {
   309                             return; // observed deleted this object, do not touch it
   324                             return; // observed deleted this object, do not touch it
   310                         }
   325                         }
   311                     }
   326                     }
   312                 }
   327                 }
   313                 if (completionCode == KErrNone) {
   328                 if (completionCode == KErrNone) {
   338                 break;
   353                 break;
   339             }
   354             }
   340             case EHbDeviceDialogUpdateClosed:
   355             case EHbDeviceDialogUpdateClosed:
   341                 // Signal possible cancelled error
   356                 // Signal possible cancelled error
   342                 if (completionCode != KErrNone) {
   357                 if (completionCode != KErrNone) {
   343                     SetError(completionCode);
   358                     SetError(errorCode);
   344                 }
   359                 }
   345                 iRequesting = EFalse;
   360                 iRequesting = EFalse;
   346                 if (CallDialogClosedObserver(completionCode)) {
   361                 if (CallDialogClosedObserver(errorCode)) {
   347                     return; // observed deleted this object, do not touch it
   362                     return; // observed deleted this object, do not touch it
   348                 }
   363                 }
   349                 break;
   364                 break;
   350             default:
   365             default:
   351                 break;
   366                 break;
   371 
   386 
   372 /*!
   387 /*!
   373     \internal
   388     \internal
   374     RunError from CActive.
   389     RunError from CActive.
   375 */
   390 */
   376 TInt CHbDeviceDialogSymbianPrivate::RunError( TInt /*aError*/ )
   391 TInt CHbDeviceDialogSymbianPrivate::RunError(TInt /*aError*/)
   377 {
   392 {
   378     SetError( KErrGeneral );
   393     SetError(SymToDeviceDialogError(KErrGeneral));
   379     return KErrNone;
   394     return KErrNone;
   380 }
   395 }
   381 
   396 
   382 /*!
   397 /*!
   383     \internal
   398     \internal
   393         iRequesting = ETrue;
   408         iRequesting = ETrue;
   394     }
   409     }
   395 }
   410 }
   396 
   411 
   397 // Convert symbian error code into HbDeviceDialog error code
   412 // Convert symbian error code into HbDeviceDialog error code
   398 int CHbDeviceDialogSymbianPrivate::SymToDeviceDialogError( TInt errorCode )
   413 int CHbDeviceDialogSymbianPrivate::SymToDeviceDialogError(TInt errorCode)
   399 {
   414 {
   400     if (errorCode != HbDeviceDialogNoError) {
   415     if (errorCode != HbDeviceDialogNoError) {
   401         // Any Symbian error, close session handle. It will be reopened on next show()
   416         // Convert from internal to public error code
   402         if (errorCode < KErrNone) {
   417         if (errorCode == HbDeviceDialogAlreadyExists) {
   403             iHbSession.Close();
   418             errorCode = CHbDeviceDialogSymbian::EInstanceExistsError;
   404         }
       
   405         // All Symbian errors are connected to HbDeviceDialogConnectError
       
   406         if (errorCode < KErrNone) {
       
   407             errorCode = HbDeviceDialogConnectError;
       
   408         }
   419         }
   409     }
   420     }
   410     return errorCode;
   421     return errorCode;
   411 }
   422 }
   412 
   423 
   440         return false;
   451         return false;
   441     }
   452     }
   442 }
   453 }
   443 
   454 
   444 /*!
   455 /*!
   445     Constructs CHbDeviceDialogSymbian object. \a f contains construct flags. Device
   456     Constructs CHbDeviceDialogSymbian object. \a f contains construct flags.
   446     dialog service will clean all dialogs launched when the instance is deleted.
   457 */
   447 */
   458 EXPORT_C CHbDeviceDialogSymbian* CHbDeviceDialogSymbian::NewL(TInt aFlags)
   448 
   459 {
   449 EXPORT_C CHbDeviceDialogSymbian* CHbDeviceDialogSymbian::NewL( TInt aFlags )
   460      CHbDeviceDialogSymbian* self = new (ELeave) CHbDeviceDialogSymbian;
   450 {
   461      CleanupStack::PushL(self);
   451      CHbDeviceDialogSymbian* deviceDialog = new (ELeave) CHbDeviceDialogSymbian(aFlags);
   462      self->d = new (ELeave) CHbDeviceDialogSymbianPrivate(aFlags);
   452      int error = KErrNone;
   463 
   453      if(deviceDialog->d) {
   464      if (aFlags & EImmediateResourceReservation) {
   454          error = deviceDialog->d->iHbSession.Connect();
   465          User::LeaveIfError(self->d->Initialize());
   455      }
   466      }
   456      if(error != KErrNone) {
   467      CleanupStack::Pop(); // self
   457          CleanupStack::PushL(deviceDialog);
   468      return self;
   458          User::Leave(error);
   469 }
   459          delete deviceDialog;
   470 
   460          deviceDialog = 0;
   471 CHbDeviceDialogSymbian::CHbDeviceDialogSymbian()
   461      }
   472 {
   462      return deviceDialog;
       
   463 }
   473 }
   464 
   474 
   465 EXPORT_C CHbDeviceDialogSymbian::~CHbDeviceDialogSymbian()
   475 EXPORT_C CHbDeviceDialogSymbian::~CHbDeviceDialogSymbian()
   466 {
   476 {
   467     delete d;
   477     delete d;
   554 */
   564 */
   555 EXPORT_C void CHbDeviceDialogSymbian::SetObserver(MHbDeviceDialogObserver* aObserver)
   565 EXPORT_C void CHbDeviceDialogSymbian::SetObserver(MHbDeviceDialogObserver* aObserver)
   556 {
   566 {
   557     d->SetObserver(aObserver);
   567     d->SetObserver(aObserver);
   558 }
   568 }
   559 
       
   560 CHbDeviceDialogSymbian::CHbDeviceDialogSymbian(TInt aFlags) : d(NULL)
       
   561 {
       
   562   d = new CHbDeviceDialogSymbianPrivate;
       
   563   d->iFlags = aFlags;
       
   564   CActiveScheduler::Add(d);
       
   565 
       
   566   // Is needed to implement?
       
   567   //if (mDeviceDialogFlags & HbDeviceDialog::ImmediateResourceReservationFlag)
       
   568 }