src/hbcore/devicedialogbase/hbsymbianvariant.cpp
changeset 28 b7da29130b0e
parent 21 4633027730f5
child 30 80e4d18b72f5
equal deleted inserted replaced
23:e6ad4ef83b23 28:b7da29130b0e
    25 
    25 
    26 #include "hbsymbianvariant.h"
    26 #include "hbsymbianvariant.h"
    27 
    27 
    28 _LIT(KPanicSymbianVariantNotSupportedType, "CHbSymbianVariant: Not supported type");
    28 _LIT(KPanicSymbianVariantNotSupportedType, "CHbSymbianVariant: Not supported type");
    29 
    29 
    30 class CHbSymbianVariantPrivate : public CBase
    30 NONSHARABLE_CLASS(CHbSymbianVariantPrivate) : public CBase
    31 {
    31 {
    32 public:
    32 public:
    33     CHbSymbianVariantPrivate();
    33     CHbSymbianVariantPrivate();
    34     ~CHbSymbianVariantPrivate();
    34     ~CHbSymbianVariantPrivate();
    35 
    35 
   245     }
   245     }
   246     return return_value;
   246     return return_value;
   247 };
   247 };
   248 
   248 
   249 /*!
   249 /*!
   250  \class CHbSymbianVariant
   250     \class CHbSymbianVariant
   251  \brief CHbSymbianVariant implements QVariant for Symbian.
   251     \brief CHbSymbianVariant is a QVariant like union for Symbian data types.
   252 
   252 
   253  It supports part of the data types supported in QVariant:
   253     <b>This class is Symbian only. Not available on other platforms.</b>
   254  QString (TDesC)
   254 
   255  QChar (TChar)
   255     CHbSymbianVariant holds a single value of a single type at a time. CHbSymbianVariant::TType
   256  QPoint(TPoint)
   256     specifies supported data types.
   257  QRect(TRect)
   257 
   258  QSize(TSize)
   258     The class is used to pass parameters to device dialog and indicator plugins. Device dialog
   259  QByteArray(TDesC8)
   259     and indicator frameworks perform conversion between Qt and Symbian data types. Below list
   260  QStringList (MDesCArray)
   260     contains a partial list of Symbian data types and corresponding Qt types supported by
   261 
   261     the class.
   262  The data passed to the constructor is copied to the CHbSymbianVariant.
   262 
   263 
   263      <table>
   264  \sa CHbSymbianVariantMap, CHbDeviceDialog
   264          <caption> Symbian/Qt data type analogy</caption>
   265  \stable
   265          <tr><th>Symbian type</th><th>Qt type</th></tr>
   266 
   266          <tr><td>TDesC</td><td>QString</td></tr>
   267  \hbcore
   267          <tr><td>TChar</td><td>QChar</td></tr>
   268 
   268          <tr><td>TPoint</td><td>QPoint</td></tr>
       
   269          <tr><td>TRect</td><td>QRect</td></tr>
       
   270          <tr><td>TSize</td><td>QSize</td></tr>
       
   271          <tr><td>TDesC8</td><td>QByteArray</td></tr>
       
   272          <tr><td>MDesCArray</td><td>QStringList</td></tr>
       
   273          <tr><td>CHbSymbianVariantMap</td><td>QVariantMap</td></tr>
       
   274      </table>
       
   275 
       
   276     \sa CHbSymbianVariantMap, CHbDeviceDialogSymbian, CHbIndicatorSymbian
       
   277  
       
   278     \stable
       
   279     \hbcore
   269  */
   280  */
   270 
   281 
   271 /*!
   282 /*!
   272    \enum CHbSymbianVariant::TType
   283    \enum CHbSymbianVariant::TType
   273    Data types the CHbSymbianVariant can contain
   284    Data types CHbSymbianVariant supports.
   274 */
   285 */
   275 /*!
   286 /*!
   276    \var CHbSymbianVariant::EInt
   287    \var CHbSymbianVariant::TType CHbSymbianVariant::EInt
   277    a TInt
   288    Data type TInt.
   278 */
   289 */
   279 /*!
   290 /*!
   280     \var CHbSymbianVariant::EBool
   291     \var CHbSymbianVariant::TType CHbSymbianVariant::EBool
   281     a TBool
   292     Data type TBool.
   282 */
   293 */
   283 /*!
   294 /*!
   284     \var CHbSymbianVariant::EUint
   295     \var CHbSymbianVariant::TType CHbSymbianVariant::EUint
   285     a TUint
   296     Data type TUint.
   286 */
   297 */
   287 /*!
   298 /*!
   288     \var CHbSymbianVariant::EReal
   299     \var CHbSymbianVariant::TType CHbSymbianVariant::EReal
   289     a TReal
   300     Data type TReal.
   290 */
   301 */
   291 /*!
   302 /*!
   292     \var CHbSymbianVariant::ERect
   303     \var CHbSymbianVariant::TType CHbSymbianVariant::ERect
   293     a TRect
   304     Data type TRect.
   294 */
   305 */
   295 /*!
   306 /*!
   296     \var CHbSymbianVariant::EPoint
   307     \var CHbSymbianVariant::TType CHbSymbianVariant::EPoint
   297     a TPoint
   308     Data type TPoint.
   298 */
   309 */
   299 /*!
   310 /*!
   300     \var CHbSymbianVariant::ESize
   311     \var CHbSymbianVariant::TType CHbSymbianVariant::ESize
   301     a TSize
   312     Data type TSize.
   302 */
   313 */
   303 /*!
   314 /*!
   304     \var CHbSymbianVariant::EChar
   315     \var CHbSymbianVariant::TType CHbSymbianVariant::EChar
   305     a TChar
   316     Data type TChar.
   306 */
   317 */
   307 /*!
   318 /*!
   308     \var CHbSymbianVariant::EDes
   319     \var CHbSymbianVariant::TType CHbSymbianVariant::EDes
   309     a TDesC
   320     Data type TDesC.
   310 */
   321 */
   311 /*!
   322 /*!
   312     \var CHbSymbianVariant::EBinary
   323     \var CHbSymbianVariant::TType CHbSymbianVariant::EBinary
   313     a TDesC8
   324     Data type TDesC8.
   314 */
   325 */
   315 /*!
   326 /*!
   316     \var CHbSymbianVariant::EDesArray
   327     \var CHbSymbianVariant::TType CHbSymbianVariant::EDesArray
   317     a MDesCArray
   328     Data type MDesCArray.
   318 */
   329 */
   319 /*!
   330 /*!
   320     \var CHbSymbianVariant::EVariantMap
   331     \var CHbSymbianVariant::TType CHbSymbianVariant::EVariantMap
   321     a symbian variant map
   332     Data type CHbSymbianVariantMap.
   322 */
   333 */
   323 
   334 
   324  /*!
   335  /*!
   325     \fn T * CHbSymbianVariant::Value()
   336     \fn T* CHbSymbianVariant::Value() const
   326 
   337 
   327     Template class to get variants value casted to the correct pointer type. See the
   338     Template fuction to get variant's value casted to a correct pointer type. See
   328     CHbSymbianVariant::TType for the supported classes.
   339     TType for the supported types.
   329 
   340 
   330     \sa CHbSymbianVariant::TType
   341     \sa TType
   331 */
   342 */
   332 
   343 
   333 /*!
   344 /*!
   334     Creates a new CHbSymbianVariant. Note that if CHbSymbianVariant::EDesArray
   345     Creates a new CHbSymbianVariant. Data passed to the constructor is copied to the
   335     is used the \aData must be casted to MDesCArray pointer when passed to the method.
   346     CHbSymbianVariant.
   336 */
   347 
   337 
   348     \param aData Data to copy into the variant. Note: If EDesArray is used, data pointer must be casted to MDesCArray.
       
   349     \param aDataType Type of data. 
       
   350 */
   338 EXPORT_C CHbSymbianVariant* CHbSymbianVariant::NewL(const TAny* aData, TType aDataType)
   351 EXPORT_C CHbSymbianVariant* CHbSymbianVariant::NewL(const TAny* aData, TType aDataType)
   339 {
   352 {
   340     CHbSymbianVariant* variant = new (ELeave) CHbSymbianVariant(aData, aDataType);
   353     CHbSymbianVariant* variant = new (ELeave) CHbSymbianVariant(aData, aDataType);
   341     CleanupStack::PushL(variant);
   354     CleanupStack::PushL(variant);
   342     variant->ConstructL(aData, aDataType);
   355     variant->ConstructL(aData, aDataType);
   343     CleanupStack::Pop(variant); //variant
   356     CleanupStack::Pop(variant); //variant
   344     return variant;
   357     return variant;
   345 }
   358 }
   346 
   359 
   347 
   360 /*!
   348 /*!
   361     Returns type of data stored in CHbSymbianVariant.
   349     Returns the data type stored in CHbSymbianVariant
   362 
   350 
   363     \sa TType
   351     \sa CHbSymbianVariant::TType
       
   352 */
   364 */
   353 EXPORT_C CHbSymbianVariant::TType CHbSymbianVariant::Type() const
   365 EXPORT_C CHbSymbianVariant::TType CHbSymbianVariant::Type() const
   354 {
   366 {
   355     return d->iType;
   367     return d->iType;
   356 }
   368 }
   357 
   369 
   358 /*!
   370 /*!
   359     Get TAny pointer to the CHbSymbianVariant data.
   371     Returns pointer to data stored by CHbSymbianVariant. Ownership does not changed.
   360     The CHbSymbianVariant::Value() should be used instead of this method.
   372     Value() should be used instead of this method.
   361 
       
   362     Ownership is not changed.
       
   363 */
   373 */
   364 EXPORT_C TAny* CHbSymbianVariant::Data() const
   374 EXPORT_C TAny* CHbSymbianVariant::Data() const
   365 {
   375 {
   366     return d->Data();
   376     return d->Data();
   367 }
   377 }
   368 
   378 
   369 /*!
   379 /*!
   370     Set new data to CHbSymbianVariant. Old data is deleted.
   380     Copies new data to CHbSymbianVariant. Old data is deleted.
   371 
   381     Ownership does not changed.
   372     Ownership is not changed.
   382 
       
   383     \param aData Data to copy into the variant. Note: If EDesArray is used, data pointer must be casted to MDesCArray.
       
   384     \param aDataType Type of data. 
   373 */
   385 */
   374 EXPORT_C void CHbSymbianVariant::SetData(TAny* aData, TType aDataType)
   386 EXPORT_C void CHbSymbianVariant::SetData(TAny* aData, TType aDataType)
   375 {
   387 {
   376     if(d) {
   388     if(d) {
   377         d->ResetData();
   389         d->ResetData();
   378         d->InitializeDataL(aData, aDataType);
   390         d->InitializeDataL(aData, aDataType);
   379     }
   391     }
   380 }
   392 }
   381 /*!
   393 /*!
   382     Is the the data in CHbSymbianVariant valid. data is valid if the variant
   394     Returns true if CHbSymbianVariant holds valid data.
   383     is created with valid data and data type
       
   384 */
   395 */
   385 EXPORT_C TBool CHbSymbianVariant::IsValid() const
   396 EXPORT_C TBool CHbSymbianVariant::IsValid() const
   386 {
   397 {
   387     if(d && !(d->iNull))
   398     if(d && !(d->iNull))
   388         return ETrue;
   399         return ETrue;
   404 {
   415 {
   405     d = new (ELeave) CHbSymbianVariantPrivate;
   416     d = new (ELeave) CHbSymbianVariantPrivate;
   406     d->InitializeDataL(aData, aDataType);
   417     d->InitializeDataL(aData, aDataType);
   407 }
   418 }
   408 
   419 
   409 class CHbSymbianVariantMapPrivate : public CBase
   420 NONSHARABLE_CLASS(CHbSymbianVariantMapPrivate) : public CBase
   410 {
   421 {
   411 public:
   422 public:
   412     CHbSymbianVariantMapPrivate():iKeyArray(NULL),iVariantArray() {
   423     CHbSymbianVariantMapPrivate():iKeyArray(NULL),iVariantArray() {
   413         iKeyArray = new CDesC16ArrayFlat(16);
   424         iKeyArray = new CDesC16ArrayFlat(16);
   414     };
   425     };
   423     CDesC16Array* iKeyArray;
   434     CDesC16Array* iKeyArray;
   424     RPointerArray<CHbSymbianVariant> iVariantArray;
   435     RPointerArray<CHbSymbianVariant> iVariantArray;
   425 };
   436 };
   426 
   437 
   427 /*!
   438 /*!
   428   \class CHbSymbianVariantMap
   439     \class CHbSymbianVariantMap
   429   \brief CHbSymbianVariantMap is a container for CHbSymbianVariant objects.
   440     \brief CHbSymbianVariantMap is QVariantMap style container for CHbSymbianVariant objects.
   430 
   441 
   431   It replicates QVariantMap functionality to Symbian native programming side.
   442     <b>This class is Symbian only. Not available on other platforms.</b>
   432 
   443 
   433   \sa CHbSymbianVariant, CHbDeviceDialog
   444     This class is used to pass parameters to/from device dialogs.
   434   \stable
   445 
   435 */
   446     \sa CHbSymbianVariant, CHbDeviceDialogSymbian
   436 
   447     \stable
   437 /*!
   448 */
   438   Create a new CHbSymbianVariantMap. Map is empty after creation and
   449 
   439   ready for use.
   450 /*!
       
   451     Creates an empty CHbSymbianVariantMap.
   440  */
   452  */
   441 EXPORT_C CHbSymbianVariantMap* CHbSymbianVariantMap::NewL()
   453 EXPORT_C CHbSymbianVariantMap* CHbSymbianVariantMap::NewL()
   442 {
   454 {
   443     CHbSymbianVariantMap* map = new (ELeave) CHbSymbianVariantMap();
   455     CHbSymbianVariantMap* map = new (ELeave) CHbSymbianVariantMap();
   444     CleanupStack::PushL(map);
   456     CleanupStack::PushL(map);
   452     delete d;
   464     delete d;
   453     d = 0;
   465     d = 0;
   454 }
   466 }
   455 
   467 
   456 /*!
   468 /*!
   457  Adds a key-value pairing to the map. Takes ownership of the variant,
   469     Adds a key-value pair into the container. Takes ownership of the variant,
   458  key is copied. If key is already in the map, the value connected to the key
   470     key is copied. If key is already in the map, the value connected to the key
   459  is replaced with the new value. the old value is deleted.
   471     is replaced with the new value and the old value is deleted.
       
   472 
       
   473     \param aKey Key for the value.
       
   474     \param aVariant Value to add. 
       
   475 
       
   476     \return Returns Symbian error code. On error ownership of \p aKey is returned to caller. 
   460  */
   477  */
   461 EXPORT_C TInt CHbSymbianVariantMap::Add(const TDesC& aKey, CHbSymbianVariant* aVariant)
   478 EXPORT_C TInt CHbSymbianVariantMap::Add(const TDesC& aKey, CHbSymbianVariant* aVariant)
   462 {
   479 {
   463     TInt pos = KErrNotFound;
   480     TInt pos = KErrNotFound;
   464     TInt result = d->iKeyArray->Find(aKey, pos,ECmpNormal);
   481     TInt result = d->iKeyArray->Find(aKey, pos, ECmpNormal);
   465 
   482 
   466     // there is already a key-value pairing in the map
   483     // There is already a key-value pairing in the map
   467     if((result == KErrNone) && (pos >= 0)) {
   484     if ((result == KErrNone) && (pos >= 0)) {
   468 
   485 
   469         // for some reason directly deleting the pointer and
   486         // for some reason directly deleting the pointer and
   470         // assigning a new one to position does not work
   487         // assigning a new one to position does not work
   471         CHbSymbianVariant* remove = d->iVariantArray[pos];
   488         CHbSymbianVariant* remove = d->iVariantArray[pos];
   472         d->iVariantArray.Remove(pos);
   489         d->iVariantArray.Remove(pos);
   478     }
   495     }
   479     // new key-value pair
   496     // new key-value pair
   480     else {
   497     else {
   481         result = KErrNone;
   498         result = KErrNone;
   482         TRAP(result, d->iKeyArray->AppendL(aKey));
   499         TRAP(result, d->iKeyArray->AppendL(aKey));
   483         if(result == KErrNone){
   500         if (result == KErrNone){
   484             result = d->iVariantArray.Append(aVariant);
   501             result = d->iVariantArray.Append(aVariant);
   485             if(result) {
   502             if (result) {
   486                 d->iKeyArray->Delete(d->iKeyArray->MdcaCount()-1);
   503                 d->iKeyArray->Delete(d->iKeyArray->MdcaCount()-1);
   487             }
   504             }
   488         }
   505         }
   489     }
   506     }
   490     return result;
   507     return result;
   491 }
   508 }
   492 /*!
   509 
   493  Deletes value mapped to the key given as parameter \a aKey
   510 /*!
   494 
   511     Deletes value from the container.
   495  On error returns possible Symbian error code.
   512 
       
   513     \param aKey Key for the value.
       
   514 
       
   515     \return Returns Symbian error code.
   496  */
   516  */
   497 EXPORT_C TInt CHbSymbianVariantMap::Delete(const TDesC& aKey)
   517 EXPORT_C TInt CHbSymbianVariantMap::Delete(const TDesC& aKey)
   498 {
   518 {
   499     TInt pos = 0;
   519     TInt pos = 0;
   500     TInt result = d->iKeyArray->Find(aKey, pos,ECmpNormal);
   520     TInt result = d->iKeyArray->Find(aKey, pos,ECmpNormal);
   507     }
   527     }
   508     return result;
   528     return result;
   509 }
   529 }
   510 
   530 
   511 /*!
   531 /*!
   512   Gets value mapped to the key. CHbSymbianVariantMap keeps the ownership of the object.
   532     Gets a value from the container.
   513   Returns NULL if not found.
   533 
       
   534     \param aKey Key for the value.
       
   535 
       
   536     \return Returns pointer to the value or 0 if not found. Value ownership does not transfer.
   514  */
   537  */
   515 EXPORT_C const CHbSymbianVariant* CHbSymbianVariantMap::Get(const TDesC& aKey) const
   538 EXPORT_C const CHbSymbianVariant* CHbSymbianVariantMap::Get(const TDesC& aKey) const
   516 {
   539 {
   517     TInt pos = 0;
   540     TInt pos = 0;
   518     CHbSymbianVariant* variant = 0;
   541     CHbSymbianVariant* variant = 0;
   522     }
   545     }
   523     return variant;
   546     return variant;
   524 }
   547 }
   525 
   548 
   526 /*!
   549 /*!
   527  Get all keys in the map. CHbSymbianVariantMap keeps the ownership of the object.
   550     Returns all keys in the map. CHbSymbianVariantMap keeps ownership of the returned value.
   528  */
   551  */
   529 EXPORT_C MDesCArray& CHbSymbianVariantMap::Keys() const
   552 EXPORT_C MDesCArray& CHbSymbianVariantMap::Keys() const
   530 {
   553 {
   531     return *(d->iKeyArray);
   554     return *(d->iKeyArray);
   532 }
   555 }
   538 
   561 
   539 void CHbSymbianVariantMap::ConstructL()
   562 void CHbSymbianVariantMap::ConstructL()
   540 {
   563 {
   541     d = new (ELeave) CHbSymbianVariantMapPrivate();
   564     d = new (ELeave) CHbSymbianVariantMapPrivate();
   542 }
   565 }
   543