menufw/hierarchynavigator/hnmetadatamodel/src/hnrepositoryobserver.cpp
branchRCL_3
changeset 93 b01126ce0bec
parent 88 3321d3e205b6
child 102 ba63c83f4716
equal deleted inserted replaced
88:3321d3e205b6 93:b01126ce0bec
   225 //
   225 //
   226 void CHnRepositoryShowFolderObserver::ConstructL( const TUid aRepositoryUid )
   226 void CHnRepositoryShowFolderObserver::ConstructL( const TUid aRepositoryUid )
   227     {
   227     {
   228     CHnRepositoryObserver::ConstructL( aRepositoryUid );
   228     CHnRepositoryObserver::ConstructL( aRepositoryUid );
   229     TInt ret = iRepository->Create( iId, KBlank );
   229     TInt ret = iRepository->Create( iId, KBlank );
   230     iNotifyHandler = CCenRepNotifyHandler::NewL(
   230     iNotifyHandler = CCenRepNotifyHandler::NewL( *this, *iRepository,
   231         *this, *iRepository,
   231             CCenRepNotifyHandler::EStringKey, iId );
   232       CCenRepNotifyHandler::EStringKey, iId );
       
   233     iNotifyHandler->StartListeningL();
   232     iNotifyHandler->StartListeningL();
   234     }
   233     }
   235 
   234 
   236 
   235 
   237 // ---------------------------------------------------------------------------
   236 // ---------------------------------------------------------------------------
   271     DEBUG(("_MM_:CHnRepositoryShowFolderObserver::HandleNotifyStringL IN"));
   270     DEBUG(("_MM_:CHnRepositoryShowFolderObserver::HandleNotifyStringL IN"));
   272     DEBUG(("\tID: %d : %S", aId, &aNewValue));
   271     DEBUG(("\tID: %d : %S", aId, &aNewValue));
   273 
   272 
   274     //++Show Folder
   273     //++Show Folder
   275     if( aId == iId && aNewValue.Length())
   274     if( aId == iId && aNewValue.Length())
   276     {
   275         {
   277         iNotifyType = 0;
   276         iNotifyType = 0;
   278     ExtractCRKeyShowFolderName( aNewValue );
   277         ExtractCRKeyShowFolderName( aNewValue );
   279 
   278 
   280     // iCRKeyFolderItemUid can contain mcs id or uid
   279         // iCRKeyFolderItemUid can contain mcs id or uid
   281     // in case of uid it will be replaced whith id in HandleNotifyL callback
   280         // in case of uid it will be replaced whith id in HandleNotifyL callback
   282     if( iCRKeyFolderItemUid.Length()>0 )
   281         if( iCRKeyFolderItemUid.Length()>0 )
       
   282             {
       
   283             if( iCRKeyFolderItemUid.FindF( KHexPrefix8 )==0 )
       
   284                 {
       
   285                 iNotifyType |= EAPP_UID;
       
   286                 }
       
   287             else
       
   288                 {
       
   289                 iNotifyType |= EAPP_ID;
       
   290                 }
       
   291             }
       
   292 
       
   293             CHnMdBaseKey* inDataKey = HnMdKeyFactory::CreateL(
       
   294                 KInData8, KKeyTypeMap, KDefaultParentId8 );
       
   295             CleanupStack::PushL( inDataKey );
       
   296 
       
   297             CHnMdBaseKey* filter( NULL );
       
   298             HBufC8* id( NULL );
       
   299             if ( iCRKeyFolderName.Length()>0 && !( iNotifyType & EAPP_UID ) )
       
   300                 {
       
   301                 // app group name is known
       
   302                 // id is optional
       
   303                 id = HnConvUtils::NumToStr8LC( KRootId );
       
   304                 inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KType8, KKeyTypeString, KMenuFolder8 ) );
       
   305                 inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KIdParam, KKeyTypeInteger, *id ) );
       
   306                 inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KRecursiveSearch8, KKeyTypeBoolean, KStringTrue8 ) );
       
   307                 inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KFlatResult8, KKeyTypeBoolean, KStringTrue8 ) );
       
   308 
       
   309                 filter = HnMdKeyFactory::CreateL(
       
   310                         KFilter8, KKeyTypeMap, KStringTrue8 );
       
   311                 CleanupStack::PushL( filter );
       
   312                 filter->AddSubKeyL( HnMdKeyFactory::CreateL( KMcsAppGroupName8, KKeyTypeString, iCRKeyFolderName ) );
       
   313                 filter->AddSubKeyL( HnMdKeyFactory::CreateL( KType8, KKeyTypeString, KMenuFolder8 ) );
       
   314                 filter->AddSubKeyL( HnMdKeyFactory::CreateL( KHidden8, KKeyTypeBoolean, KStringFalse8 ) );
       
   315                 }
       
   316             else if( iNotifyType & EAPP_ID )
       
   317                 {
       
   318                 // no app group name, id is known
       
   319                 inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KType8, KKeyTypeString, KMenuApplication8 ) );
       
   320                 inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KIdParam, KKeyTypeInteger, iCRKeyFolderItemUid ) );
       
   321                 inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KParentOnly8, KKeyTypeBoolean, KStringTrue8 ) );
       
   322                 }
       
   323             else if( iNotifyType & EAPP_UID )
       
   324                 {
       
   325                 // uid is known
       
   326                 // app group name is optional
       
   327                 id = HnConvUtils::NumToStr8LC( KRootId );
       
   328                 inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KType8, KKeyTypeString, KMenuFolder8 ) );
       
   329                 inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KIdParam, KKeyTypeInteger, *id ) );
       
   330                 inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KRecursiveSearch8, KKeyTypeBoolean, KStringTrue8 ) );
       
   331                 inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KFlatResult8, KKeyTypeBoolean, KStringTrue8 ) );
       
   332 
       
   333                 filter = HnMdKeyFactory::CreateL(
       
   334                     KFilter8, KKeyTypeMap, KStringTrue8 );
       
   335                 CleanupStack::PushL( filter );
       
   336                 filter->AddSubKeyL( HnMdKeyFactory::CreateL( KUid8, KKeyTypeInteger, iCRKeyFolderItemUid ) );
       
   337                 filter->AddSubKeyL( HnMdKeyFactory::CreateL( KType8, KKeyTypeString, KMenuApplication8 ) );
       
   338                 filter->AddSubKeyL( HnMdKeyFactory::CreateL( KHidden8, KKeyTypeBoolean, KStringFalse8 ) );
       
   339                 }
       
   340             else
       
   341                 {
       
   342                 // No app group name, no uid. Search for root.
       
   343                 id = HnConvUtils::NumToStr8LC( KRootId );
       
   344                 inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KType8, KKeyTypeString, KMenuFolder8 ) );
       
   345                 inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KIdParam, KKeyTypeInteger, *id ) );
       
   346                 inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KParentOnly8, KKeyTypeBoolean, KStringTrue8 ) );
       
   347                 }
       
   348 
       
   349             RPointerArray< CHnMdBaseKey > data;
       
   350             CleanupClosePushL( data );
       
   351             data.AppendL( inDataKey );
       
   352             if ( filter )
       
   353                 {
       
   354                 data.AppendL( filter );
       
   355                 }
       
   356 
       
   357             CHnMdBaseKey* serviceData = HnMdKeyFactory::CreateL(
       
   358                 KServiceContentName, KKeyTypeString, KMatrixMenuData );
       
   359             CleanupStack::PushL( serviceData );
       
   360 
       
   361             RPointerArray< CHnMdBaseKey> constructor;
       
   362             CleanupClosePushL( constructor );
       
   363             constructor.AppendL( serviceData );
       
   364             CLiwGenericParamList* constructorLiw = CLiwGenericParamList::NewLC();
       
   365             CLiwGenericParamList* commandLiw = CLiwGenericParamList::NewLC();
       
   366             HnLiwUtils::SetGenericParamListL( constructor, *constructorLiw );
       
   367             HnLiwUtils::SetGenericParamListL( data, *commandLiw );
       
   368 
       
   369             TBuf8< KMaxLength > interface( KMCSDataSourceInterface8 );
       
   370 
       
   371             delete iServiceHandler;
       
   372             iServiceHandler = NULL;
       
   373             iServiceHandler = CHnServiceHandler::NewL(
       
   374                     KMCSService8, interface, KCmdGetList8,
       
   375                     EServiceModeAsynchronous, constructorLiw, commandLiw );
       
   376 
       
   377             CleanupStack::Pop( commandLiw );
       
   378             CleanupStack::Pop( constructorLiw );
       
   379 
       
   380             iServiceHandler->ExecuteL( this );
       
   381 
       
   382             CleanupStack::PopAndDestroy( &constructor );
       
   383             CleanupStack::PopAndDestroy( serviceData );
       
   384             CleanupStack::PopAndDestroy( &data );
       
   385             if( filter )
       
   386                 {
       
   387                 CleanupStack::PopAndDestroy( filter );
       
   388                 }
       
   389             if( id )
       
   390                 {
       
   391                 CleanupStack::PopAndDestroy( id );
       
   392                 }
       
   393             CleanupStack::PopAndDestroy( inDataKey );
       
   394         }
       
   395 
       
   396     DEBUG(("_MM_:CHnRepositoryShowFolderObserver::HandleNotifyStringL OUT"));
       
   397     }
       
   398 
       
   399 // ---------------------------------------------------------------------------
       
   400 //
       
   401 // ---------------------------------------------------------------------------
       
   402 //
       
   403 void CHnRepositoryShowFolderObserver::ExtractCRKeyShowFolderName( const TDesC& aNewValue )
       
   404     {
       
   405     DEBUG(( "_MM_:CHnRepositoryShowFolderObserver::ExtractCRKeyShowFolderName IN" ));
       
   406     iCRKeyFolderName.Copy( KBlank );
       
   407     iCRKeyFolderItemUid.Copy( KBlank );
       
   408 
       
   409     int keyValueLength = aNewValue.Length();
       
   410     if( keyValueLength )
   283         {
   411         {
   284         if( iCRKeyFolderItemUid.FindF( KHexPrefix8 )==0 )
   412         TApaAppGroupName folder;
   285             {
   413         TBuf<KTimeStampBufferLength + KUidStringLength + 1> tempBuf;
   286             iNotifyType |= EAPP_UID;
   414         TBuf<KTimeStampBufferLength> timeStamp;
       
   415 
       
   416         TInt ret = aNewValue.Find( KComma );
       
   417         if( ( ret == KErrNotFound ) || ( ret == ( keyValueLength - 1 ) ) )
       
   418             {
       
   419             DEBUG(( "_MM_:CHnRepositoryShowFolderObserver::ExtractCRKeyShowFolderName (bad CR key value input) OUT" ));
       
   420             return; //bad CR key value input
       
   421             }
       
   422         if( ret > KApaMaxAppGroupName )
       
   423             {
       
   424             return;
       
   425             }
       
   426         folder.Copy( aNewValue.Left( ret ) );
       
   427         if( aNewValue.Length() - ret > tempBuf.MaxLength() )
       
   428             {
       
   429             return;
       
   430             }
       
   431         tempBuf.Copy( aNewValue.Mid( ret + 1 ) );
       
   432 
       
   433         TInt posUid = tempBuf.Find( KComma );
       
   434         if( KErrNotFound != posUid )
       
   435             {
       
   436             if( posUid > KTimeStampBufferLength )
       
   437                 {
       
   438                 return;
       
   439                 }
       
   440             timeStamp.Copy( tempBuf.Left( posUid ) );
       
   441             if( tempBuf.Length() - ( posUid + 1 ) > KUidStringLength )
       
   442                 {
       
   443                 return;
       
   444                 }
       
   445             iCRKeyFolderItemUid.Copy( tempBuf.Mid( posUid + 1 ) );
   287             }
   446             }
   288         else
   447         else
   289             {
   448             {
   290             iNotifyType |= EAPP_ID;
   449             if( tempBuf.Length() > KTimeStampBufferLength )
       
   450                 {
       
   451                 return;
       
   452                 }
       
   453             timeStamp.Copy( tempBuf );
       
   454             }
       
   455 
       
   456         TTime currentTime;
       
   457         currentTime.HomeTime();
       
   458         TTimeIntervalSeconds interval;
       
   459 
       
   460         TTime timeStampTime;
       
   461         ret = timeStampTime.Set( timeStamp );
       
   462 
       
   463         if( ret == KErrGeneral )
       
   464             {
       
   465             DEBUG(( "_MM_:CHnRepositoryShowFolderObserver::ExtractCRKeyShowFolderName (bad timestamp) OUT" ));
       
   466             return; // bad time stamp value
       
   467             }
       
   468 
       
   469         ret = currentTime.SecondsFrom( timeStampTime, interval );
       
   470 
       
   471         if( interval.Int() < 0 )
       
   472             {//negative timestamp is set ahead of current time...!
       
   473             DEBUG(( "_MM_:CHnRepositoryShowFolderObserver::ExtractCRKeyShowFolderName (negative interval) OUT" ));
       
   474             return;
       
   475             }
       
   476 
       
   477         if( ( interval.Int() ) > KTimeStampCutOff )
       
   478             {//positive timestamp but more than 5 seconds
       
   479             DEBUG(( "_MM_:CHnRepositoryShowFolderObserver::ExtractCRKeyShowFolderName (more than 5 seconds) OUT" ));
       
   480             return;
       
   481             }
       
   482         else
       
   483             {
       
   484             iCRKeyFolderName.Copy( folder );
   291             }
   485             }
   292         }
   486         }
   293 
   487     DEBUG(( "_MM_:CHnRepositoryShowFolderObserver::ExtractCRKeyShowFolderName OUT" ));
   294         CHnMdBaseKey* inDataKey = HnMdKeyFactory::CreateL(
   488     }
   295             KInData8, KKeyTypeMap, KDefaultParentId8 );
       
   296         CleanupStack::PushL( inDataKey );
       
   297 
       
   298         CHnMdBaseKey* filter( NULL );
       
   299         HBufC8* id( NULL );
       
   300         if ( iCRKeyFolderName.Length()>0 && !( iNotifyType & EAPP_UID ) )
       
   301             {
       
   302             // app group name is known
       
   303             // id is optional
       
   304             id = HnConvUtils::NumToStr8LC( KRootId );
       
   305             inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KType8, KKeyTypeString, KMenuFolder8 ) );
       
   306             inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KIdParam, KKeyTypeInteger, *id ) );
       
   307             inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KRecursiveSearch8, KKeyTypeBoolean, KStringTrue8 ) );
       
   308             inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KFlatResult8, KKeyTypeBoolean, KStringTrue8 ) );
       
   309 
       
   310             filter = HnMdKeyFactory::CreateL(
       
   311                     KFilter8, KKeyTypeMap, KStringTrue8 );
       
   312             CleanupStack::PushL( filter );
       
   313             filter->AddSubKeyL( HnMdKeyFactory::CreateL( KMcsAppGroupName8, KKeyTypeString, iCRKeyFolderName ) );
       
   314             filter->AddSubKeyL( HnMdKeyFactory::CreateL( KType8, KKeyTypeString, KMenuFolder8 ) );
       
   315             filter->AddSubKeyL( HnMdKeyFactory::CreateL( KHidden8, KKeyTypeBoolean, KStringFalse8 ) );
       
   316             }
       
   317         else if( iNotifyType & EAPP_ID )
       
   318             {
       
   319             // no app group name, id is known
       
   320             inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KType8, KKeyTypeString, KMenuApplication8 ) );
       
   321             inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KIdParam, KKeyTypeInteger, iCRKeyFolderItemUid ) );
       
   322             inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KParentOnly8, KKeyTypeBoolean, KStringTrue8 ) );
       
   323             }
       
   324         else if( iNotifyType & EAPP_UID )
       
   325             {
       
   326             // uid is known
       
   327             // app group name is optional
       
   328             id = HnConvUtils::NumToStr8LC( KRootId );
       
   329             inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KType8, KKeyTypeString, KMenuFolder8 ) );
       
   330             inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KIdParam, KKeyTypeInteger, *id ) );
       
   331             inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KRecursiveSearch8, KKeyTypeBoolean, KStringTrue8 ) );
       
   332             inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KFlatResult8, KKeyTypeBoolean, KStringTrue8 ) );
       
   333 
       
   334             filter = HnMdKeyFactory::CreateL(
       
   335                 KFilter8, KKeyTypeMap, KStringTrue8 );
       
   336             CleanupStack::PushL( filter );
       
   337             filter->AddSubKeyL( HnMdKeyFactory::CreateL( KUid8, KKeyTypeInteger, iCRKeyFolderItemUid ) );
       
   338             filter->AddSubKeyL( HnMdKeyFactory::CreateL( KType8, KKeyTypeString, KMenuApplication8 ) );
       
   339             filter->AddSubKeyL( HnMdKeyFactory::CreateL( KHidden8, KKeyTypeBoolean, KStringFalse8 ) );
       
   340             }
       
   341         else
       
   342             {
       
   343             // No app group name, no uid. Search for root.
       
   344             id = HnConvUtils::NumToStr8LC( KRootId );
       
   345             inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KType8, KKeyTypeString, KMenuFolder8 ) );
       
   346             inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KIdParam, KKeyTypeInteger, *id ) );
       
   347             inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KParentOnly8, KKeyTypeBoolean, KStringTrue8 ) );
       
   348             }
       
   349 
       
   350         RPointerArray< CHnMdBaseKey > data;
       
   351         CleanupClosePushL( data );
       
   352         data.AppendL( inDataKey );
       
   353         if ( filter )
       
   354             {
       
   355             data.AppendL( filter );
       
   356             }
       
   357 
       
   358         CHnMdBaseKey* serviceData = HnMdKeyFactory::CreateL(
       
   359             KServiceContentName, KKeyTypeString, KMatrixMenuData );
       
   360         CleanupStack::PushL( serviceData );
       
   361 
       
   362         RPointerArray< CHnMdBaseKey> constructor;
       
   363         CleanupClosePushL( constructor );
       
   364         constructor.AppendL( serviceData );
       
   365         CLiwGenericParamList* constructorLiw = CLiwGenericParamList::NewLC();
       
   366         CLiwGenericParamList* commandLiw = CLiwGenericParamList::NewLC();
       
   367         HnLiwUtils::SetGenericParamListL( constructor, *constructorLiw );
       
   368         HnLiwUtils::SetGenericParamListL( data, *commandLiw );
       
   369 
       
   370         TBuf8< KMaxLength > interface( KMCSDataSourceInterface8 );
       
   371 
       
   372         delete iServiceHandler;
       
   373         iServiceHandler = NULL;
       
   374         iServiceHandler = CHnServiceHandler::NewL(
       
   375                 KMCSService8, interface, KCmdGetList8,
       
   376                 EServiceModeAsynchronous, constructorLiw, commandLiw );
       
   377 
       
   378         CleanupStack::Pop( commandLiw );
       
   379         CleanupStack::Pop( constructorLiw );
       
   380 
       
   381         iServiceHandler->ExecuteL( this );
       
   382 
       
   383         CleanupStack::PopAndDestroy( &constructor );
       
   384         CleanupStack::PopAndDestroy( serviceData );
       
   385         CleanupStack::PopAndDestroy( &data );
       
   386         if( filter )
       
   387             {
       
   388             CleanupStack::PopAndDestroy( filter );
       
   389             }
       
   390         if( id )
       
   391             {
       
   392             CleanupStack::PopAndDestroy( id );
       
   393             }
       
   394         CleanupStack::PopAndDestroy( inDataKey );
       
   395     }
       
   396 
       
   397     DEBUG(("_MM_:CHnRepositoryShowFolderObserver::HandleNotifyStringL OUT"));
       
   398 
       
   399     }
       
   400 
       
   401 // ---------------------------------------------------------------------------
       
   402 //
       
   403 // ---------------------------------------------------------------------------
       
   404 //
       
   405 void CHnRepositoryShowFolderObserver::ExtractCRKeyShowFolderName( const TDesC& aNewValue )
       
   406   {
       
   407   DEBUG(( "_MM_:CHnRepositoryShowFolderObserver::ExtractCRKeyShowFolderName IN" ));
       
   408   iCRKeyFolderName.Copy( KBlank );
       
   409   iCRKeyFolderItemUid.Copy( KBlank );
       
   410 
       
   411   int keyValueLength = aNewValue.Length();
       
   412   if( keyValueLength )
       
   413     {
       
   414       TApaAppGroupName folder;
       
   415           TBuf<KTimeStampBufferLength + KUidStringLength + 1> tempBuf;
       
   416           TBuf<KTimeStampBufferLength> timeStamp;
       
   417 
       
   418           TInt ret = aNewValue.Find( KComma );
       
   419           if( (ret == KErrNotFound )|| ( ret == ( keyValueLength-1 ) ) )
       
   420               {
       
   421               DEBUG(( "_MM_:CHnRepositoryShowFolderObserver::ExtractCRKeyShowFolderName (bad CR key value input) OUT" ));
       
   422             return;	//bad CR key value input
       
   423               }
       
   424           if( ret>KApaMaxAppGroupName )
       
   425               {
       
   426               return;
       
   427               }
       
   428           folder.Copy(aNewValue.Left(ret));
       
   429           if( aNewValue.Length()-ret > tempBuf.MaxLength() )
       
   430               {
       
   431               return;
       
   432               }
       
   433           tempBuf.Copy(aNewValue.Mid( ret + 1 ) );
       
   434 
       
   435           TInt posUid = tempBuf.Find( KComma );
       
   436           if ( KErrNotFound != posUid )
       
   437             {
       
   438             if( posUid>KTimeStampBufferLength )
       
   439                 {
       
   440                 return;
       
   441                 }
       
   442             timeStamp.Copy( tempBuf.Left(posUid) );
       
   443             if( tempBuf.Length()-(posUid+1) > KUidStringLength )
       
   444                 {
       
   445                 return;
       
   446                 }
       
   447             iCRKeyFolderItemUid.Copy( tempBuf.Mid( posUid + 1 ) );
       
   448             }
       
   449           else
       
   450             {
       
   451                 if( tempBuf.Length()>KTimeStampBufferLength )
       
   452                     {
       
   453                     return;
       
   454                     }
       
   455             timeStamp.Copy( tempBuf );
       
   456             }
       
   457 
       
   458           TTime currentTime;
       
   459           currentTime.HomeTime();
       
   460           TTimeIntervalSeconds interval;
       
   461 
       
   462           TTime timeStampTime;
       
   463           ret = timeStampTime.Set(timeStamp);
       
   464 
       
   465           if(ret == KErrGeneral )
       
   466               {
       
   467               DEBUG(( "_MM_:CHnRepositoryShowFolderObserver::ExtractCRKeyShowFolderName (bad timestamp) OUT" ));
       
   468             return; // bad time stamp value
       
   469               }
       
   470 
       
   471           ret = currentTime.SecondsFrom( timeStampTime, interval );
       
   472 
       
   473           if( interval.Int() < 0 )
       
   474               {//negative timestamp is set ahead of current time...!
       
   475               DEBUG(( "_MM_:CHnRepositoryShowFolderObserver::ExtractCRKeyShowFolderName (negative interval) OUT" ));
       
   476             return;
       
   477               }
       
   478 
       
   479           if(( interval.Int()) > KTimeStampCutOff )
       
   480               {//positive timestamp but more than 5 seconds
       
   481               DEBUG(( "_MM_:CHnRepositoryShowFolderObserver::ExtractCRKeyShowFolderName (more than 5 seconds) OUT" ));
       
   482             return;
       
   483               }
       
   484           else
       
   485               {
       
   486             iCRKeyFolderName.Copy(folder);
       
   487               }
       
   488     }
       
   489   DEBUG(( "_MM_:CHnRepositoryShowFolderObserver::ExtractCRKeyShowFolderName OUT" ));
       
   490   }
       
   491 
   489 
   492 // ---------------------------------------------------------------------------
   490 // ---------------------------------------------------------------------------
   493 //
   491 //
   494 // ---------------------------------------------------------------------------
   492 // ---------------------------------------------------------------------------
   495 //
   493 //
   545 //
   543 //
   546 // ---------------------------------------------------------------------------
   544 // ---------------------------------------------------------------------------
   547 //
   545 //
   548 void CHnRepositoryShowFolderObserver::GetShowFolderGroupNameL()
   546 void CHnRepositoryShowFolderObserver::GetShowFolderGroupNameL()
   549     {
   547     {
   550 
       
   551     CHnMdBaseKey* inDataKey = HnMdKeyFactory::CreateL(
   548     CHnMdBaseKey* inDataKey = HnMdKeyFactory::CreateL(
   552         KInData8, KKeyTypeMap, KDefaultParentId8 );
   549         KInData8, KKeyTypeMap, KDefaultParentId8 );
   553     CleanupStack::PushL( inDataKey );
   550     CleanupStack::PushL( inDataKey );
   554     HBufC8* id = HnConvUtils::NumToStr8LC( KRootId );
   551     HBufC8* id = HnConvUtils::NumToStr8LC( KRootId );
   555     inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KType8, KKeyTypeString, KMenuFolder8 ) );
   552     inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KType8, KKeyTypeString, KMenuFolder8 ) );
   609 // ---------------------------------------------------------------------------
   606 // ---------------------------------------------------------------------------
   610 //
   607 //
   611 // ---------------------------------------------------------------------------
   608 // ---------------------------------------------------------------------------
   612 //
   609 //
   613 TInt CHnRepositoryShowFolderObserver::HandleNotifyL(
   610 TInt CHnRepositoryShowFolderObserver::HandleNotifyL(
   614     TInt /*aCmdId*/,
   611         TInt /*aCmdId*/,
   615     TInt aEventId,
   612         TInt aEventId,
   616     CLiwGenericParamList& aEventParamList,
   613         CLiwGenericParamList& aEventParamList,
   617     const CLiwGenericParamList& /*aInParamList*/)
   614         const CLiwGenericParamList& /*aInParamList*/)
   618   {
   615     {
   619   DEBUG(("_MM_:CHnRepositoryShowFolderObserver::HandleNotifyL IN"));
   616     DEBUG(("_MM_:CHnRepositoryShowFolderObserver::HandleNotifyL IN"));
   620   if( aEventId == KLiwEventCanceled )
   617     if( aEventId == KLiwEventCanceled )
   621         {
   618         {
   622         return KErrNotFound;
   619         return KErrNotFound;
   623         }
   620         }
   624     else
   621     else
   625         {
   622         {
   770 
   767 
   771   DEBUG(("_MM_:CHnRepositoryShowFolderObserver::HandleNotifyL OUT"));
   768   DEBUG(("_MM_:CHnRepositoryShowFolderObserver::HandleNotifyL OUT"));
   772   return KErrNone;
   769   return KErrNone;
   773   }
   770   }
   774 
   771 
       
   772 // class CHnRepositoryOpenItemObserver
       
   773 // ---------------------------------------------------------------------------
       
   774 //
       
   775 // ---------------------------------------------------------------------------
       
   776 //
       
   777 CHnRepositoryOpenItemObserver * CHnRepositoryOpenItemObserver::NewL(
       
   778         THnMdCommonPointers* aCmnPtrs, const TUid aRepositoryUid, const TUint32 aId )
       
   779     {
       
   780     CHnRepositoryOpenItemObserver * self = CHnRepositoryOpenItemObserver::NewLC(
       
   781             aCmnPtrs, aRepositoryUid, aId );
       
   782     CleanupStack::Pop(self);
       
   783     return self;
       
   784     }
       
   785 
       
   786 // ---------------------------------------------------------------------------
       
   787 //
       
   788 // ---------------------------------------------------------------------------
       
   789 //
       
   790 CHnRepositoryOpenItemObserver * CHnRepositoryOpenItemObserver::NewLC(
       
   791         THnMdCommonPointers* aCmnPtrs, const TUid aRepositoryUid, const TUint32 aId )
       
   792     {
       
   793     CHnRepositoryOpenItemObserver * self = new (ELeave) CHnRepositoryOpenItemObserver(
       
   794             aCmnPtrs, aId );
       
   795     CleanupStack::PushL(self);
       
   796     self->ConstructL( aRepositoryUid );
       
   797     return self;
       
   798     }
       
   799 
       
   800 // ---------------------------------------------------------------------------
       
   801 //
       
   802 // ---------------------------------------------------------------------------
       
   803 //
       
   804 void CHnRepositoryOpenItemObserver::ConstructL( const TUid aRepositoryUid )
       
   805     {
       
   806     CHnRepositoryObserver::ConstructL( aRepositoryUid );
       
   807     TInt ret = iRepository->Create( iId, KBlank );
       
   808     iNotifyHandler = CCenRepNotifyHandler::NewL( *this, *iRepository,
       
   809             CCenRepNotifyHandler::EStringKey, iId );
       
   810     iNotifyHandler->StartListeningL();
       
   811     }
       
   812 
       
   813 
       
   814 // ---------------------------------------------------------------------------
       
   815 //
       
   816 // ---------------------------------------------------------------------------
       
   817 //
       
   818 CHnRepositoryOpenItemObserver::CHnRepositoryOpenItemObserver( 
       
   819         THnMdCommonPointers* aCmnPtrs, TUint32 aId  ) :
       
   820             CHnRepositoryObserver( aCmnPtrs, aId )
       
   821     {
       
   822     }
       
   823 
       
   824 // ---------------------------------------------------------------------------
       
   825 //
       
   826 // ---------------------------------------------------------------------------
       
   827 //
       
   828 CHnRepositoryOpenItemObserver::~CHnRepositoryOpenItemObserver()
       
   829     {
       
   830     iRepository->Delete( iId );
       
   831     delete iServiceHandler;
       
   832     }
       
   833 
       
   834 // ---------------------------------------------------------------------------
       
   835 //
       
   836 // ---------------------------------------------------------------------------
       
   837 //
       
   838 void CHnRepositoryOpenItemObserver::HandleNotifyString(
       
   839         TUint32 aId, const TDesC16& aNewValue )
       
   840     {
       
   841     TRAP_IGNORE( HandleNotifyStringL( aId, aNewValue ) );
       
   842     }
       
   843 
       
   844 // ---------------------------------------------------------------------------
       
   845 //
       
   846 // ---------------------------------------------------------------------------
       
   847 //
       
   848 void CHnRepositoryOpenItemObserver::HandleNotifyStringL(
       
   849         TUint32 aId, const TDesC16& aNewValue )
       
   850     {
       
   851     DEBUG(("_MM_:CHnRepositoryOpenItemObserver::HandleNotifyStringL IN"));
       
   852     DEBUG(("\tID: %d : %S", aId, &aNewValue));
       
   853 
       
   854     // Open item
       
   855     if( aId == iId && aNewValue.Length())
       
   856         {
       
   857         ShowFolderL( aNewValue );
       
   858         }
       
   859     }
       
   860 
       
   861 // ---------------------------------------------------------------------------
       
   862 //
       
   863 // ---------------------------------------------------------------------------
       
   864 //
       
   865 TInt CHnRepositoryOpenItemObserver::HandleNotifyL(
       
   866         TInt /*aCmdId*/,
       
   867         TInt aEventId,
       
   868         CLiwGenericParamList& aEventParamList,
       
   869         const CLiwGenericParamList& /*aInParamList*/)
       
   870     {
       
   871     DEBUG(("_MM_:CHnRepositoryOpenItemObserver::HandleNotifyL IN"));
       
   872     if( aEventId == KLiwEventCanceled )
       
   873         {
       
   874         return KErrNotFound;
       
   875         }
       
   876     else
       
   877         {
       
   878         TInt pos( 0 );
       
   879         const TLiwGenericParam* first = aEventParamList.FindFirst(
       
   880                 pos, KReturnValue8() );
       
   881         if( pos == KErrNotFound )
       
   882             {
       
   883             return KErrNotFound;
       
   884             }
       
   885 
       
   886         TInt count = first->Value().AsList()->Count();
       
   887         if( count == 0 )
       
   888             {
       
   889             return KErrNotFound;
       
   890             }
       
   891 
       
   892         TLiwVariant varId;
       
   893         varId.PushL();
       
   894         TLiwVariant varAppGroupName;
       
   895         varAppGroupName.PushL();
       
   896         TLiwVariant varSuiteName;
       
   897         varSuiteName.PushL();
       
   898         TLiwVariant varChildrenCount;
       
   899         varChildrenCount.PushL();
       
   900 
       
   901         HnLiwUtils::GetVariantL( aEventParamList, KIdPath8, 0, varId );
       
   902         HnLiwUtils::GetVariantL( aEventParamList, KAppGroupNamePath8, 0, varAppGroupName );
       
   903         HnLiwUtils::GetVariantL( aEventParamList, KTitleNamePath8, 0, varSuiteName );
       
   904         HnLiwUtils::GetVariantL( aEventParamList, KChildrenCountPath8, 0, varChildrenCount );
       
   905 
       
   906         CLiwGenericParamList* paramList = CLiwGenericParamList::NewL();
       
   907         CleanupStack::PushL( paramList );
       
   908 
       
   909         CLiwDefaultMap* map = CLiwDefaultMap::NewLC();
       
   910 
       
   911         paramList->AppendL( TLiwGenericParam( KSuiteName8, TLiwVariant(
       
   912                 KFolderSuite ) ) );
       
   913 
       
   914         map->InsertL( KSuiteName8, varSuiteName );
       
   915         map->InsertL( KFolderId8, varId );
       
   916         map->InsertL( KRemoveLocked8, TLiwVariant( KStringFalse8 ) );
       
   917         map->InsertL( KParentFolderId8, varId );
       
   918         map->InsertL( KTmpParentFolderId8, varId );
       
   919         map->InsertL( KMcsAppGroupName8, varAppGroupName );
       
   920 
       
   921         paramList->AppendL( TLiwGenericParam( KParams8, TLiwVariant( map ) ) );
       
   922 
       
   923         CleanupStack::PopAndDestroy( map );
       
   924 
       
   925         while( iCmnPtrs->iModel->LoadedSuitesCount() > 1 )
       
   926             {
       
   927             CHnMdSuite* suite = iCmnPtrs->iModel->GetLastSuite();
       
   928             iCmnPtrs->iContainer->PopSuiteModelL( suite->SuiteName() );
       
   929             iCmnPtrs->iModel->DeleteLastSuite();
       
   930             }
       
   931 
       
   932         if( iCmnPtrs->iContainer->GetLastSuiteModel()->CustomId()
       
   933                 != varId.AsTInt64() )
       
   934             {
       
   935             iCmnPtrs->iModelEventObserver->HandleModelEventL(
       
   936                     KNewSuiteLoadedMdEvent, *paramList );
       
   937             iCmnPtrs->iModel->QueueForeground(
       
   938                     CHnMdModel::EWhenCurrentTopSuiteIsEvaluated );
       
   939             }
       
   940         else
       
   941             {
       
   942             iCmnPtrs->iContainer->GetLastSuiteModel()->NotifyObserversL(
       
   943                     ESuiteModelInitialized );
       
   944             CLiwGenericParamList* paramList = CLiwGenericParamList::NewL();
       
   945             CleanupStack::PushL( paramList );
       
   946             iCmnPtrs->iModelEventObserver->HandleModelEventL(
       
   947                     KAppGainForeground, *paramList );
       
   948             CleanupStack::PopAndDestroy( paramList );
       
   949             }
       
   950 
       
   951         iRepository->Set( iId, KBlank ); // reset key repository to empty string
       
   952 
       
   953         CleanupStack::PopAndDestroy( paramList );
       
   954         CleanupStack::PopAndDestroy( &varChildrenCount );
       
   955         CleanupStack::PopAndDestroy( &varSuiteName );
       
   956         CleanupStack::PopAndDestroy( &varAppGroupName );
       
   957         CleanupStack::PopAndDestroy( &varId );
       
   958         }
       
   959 
       
   960     DEBUG(("_MM_:CHnRepositoryOpenItemObserver::HandleNotifyL OUT"));
       
   961     return KErrNone;
       
   962     }
       
   963 
       
   964 // ---------------------------------------------------------------------------
       
   965 //
       
   966 // ---------------------------------------------------------------------------
       
   967 //
       
   968 void CHnRepositoryOpenItemObserver::ShowFolderL( const TDesC16& aFolderId )
       
   969     {
       
   970     CHnMdBaseKey* inDataKey = HnMdKeyFactory::CreateL(
       
   971             KInData8, KKeyTypeMap, KDefaultParentId8 );
       
   972     CleanupStack::PushL( inDataKey );
       
   973     inDataKey->AddSubKeyL(
       
   974             HnMdKeyFactory::CreateL( KType8, KKeyTypeString, KMenuFolder8 ) );
       
   975     inDataKey->AddSubKeyL(
       
   976             HnMdKeyFactory::CreateL( KIdParam, KKeyTypeInteger, aFolderId ) );
       
   977     inDataKey->AddSubKeyL(
       
   978             HnMdKeyFactory::CreateL( KParentOnly8, KKeyTypeBoolean, KStringTrue8 ) );
       
   979 
       
   980     RPointerArray< CHnMdBaseKey > data;
       
   981     CleanupClosePushL( data );
       
   982     data.Append( inDataKey );
       
   983 
       
   984     CHnMdBaseKey* serviceData = HnMdKeyFactory::CreateL(
       
   985         KServiceContentName, KKeyTypeString, KMatrixMenuData );
       
   986     CleanupStack::PushL( serviceData );
       
   987 
       
   988     RPointerArray< CHnMdBaseKey> constructor;
       
   989     CleanupClosePushL( constructor );
       
   990     constructor.Append( serviceData );
       
   991     CLiwGenericParamList* constructorLiw = CLiwGenericParamList::NewLC();
       
   992     CLiwGenericParamList* commandLiw = CLiwGenericParamList::NewLC();
       
   993     HnLiwUtils::SetGenericParamListL( constructor, *constructorLiw );
       
   994     HnLiwUtils::SetGenericParamListL( data, *commandLiw );
       
   995 
       
   996     TBuf8< KMaxLength > interface( KMCSDataSourceInterface8 );
       
   997 
       
   998     delete iServiceHandler;
       
   999     iServiceHandler = NULL;
       
  1000     iServiceHandler = CHnServiceHandler::NewL(
       
  1001             KMCSService8, interface, KCmdGetList8,
       
  1002             EServiceModeAsynchronous, constructorLiw, commandLiw );
       
  1003 
       
  1004     CleanupStack::Pop( commandLiw );
       
  1005     CleanupStack::Pop( constructorLiw );
       
  1006 
       
  1007     iServiceHandler->ExecuteL( this );
       
  1008 
       
  1009     CleanupStack::PopAndDestroy( &constructor );
       
  1010     CleanupStack::PopAndDestroy( serviceData );
       
  1011     CleanupStack::PopAndDestroy( &data );
       
  1012     CleanupStack::PopAndDestroy( inDataKey );
       
  1013 
       
  1014     }
       
  1015 
   775 // End of File
  1016 // End of File