chxavmisc.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:24k
源码类别:

Symbian

开发平台:

C/C++

  1. /*****************************************************************************
  2.  * chxavmisc.cpp
  3.  * -------------
  4.  *
  5.  * Synopsis:
  6.  * Misc helpers for s60 player only
  7.  *
  8.  *
  9.  *
  10.  * Target:
  11.  * Symbian OS
  12.  *
  13.  *
  14.  * (c) 1995-2003 RealNetworks, Inc. Patents pending. All rights reserved.
  15.  *
  16.  *****************************************************************************/
  17. // Symbian includes...
  18. #include <coeutils.h>
  19. #include <aknenv.h>
  20. #include <limits.h>
  21. #include <apgwgnam.h>
  22. #include <apsettingshandlerui.h>
  23. #include <akntabgrp.h>
  24. #include <akniconarray.h> 
  25. #include <aputils.h> 
  26. #include <apgcli.h>
  27. #include <commdb.h>
  28. #include <avkon.rsg>
  29. // Helix includes...
  30. #include "hxassert.h"
  31. #include "hxstring.h"
  32. // Includes from this project...
  33. #include "chxavutil.h"
  34. #include "chxavmisc.h"
  35. #include "chxavfileutil.h"
  36. #include "chxavinfolist.h"
  37. #include "chxavmessagedialog.h"
  38. #include "chxavcleanstring.h"
  39. #include "chxavcleanupstack.h"
  40. #include "chxavnamedisplaytrait.h"
  41. #include "chxavurllist.h"
  42. #include "realplayer.rsg"
  43. #include "realplayer.hrh"
  44. #include "comptr.h"
  45. #include "ihxpckts.h"
  46. #include "chxavplayer.h"
  47. #include "hxdebug_hxapi.h"
  48. #include "hxsym_leaveutil.h"
  49. #include "hxapihelp.h"
  50. namespace
  51. {
  52. ////////////////////////////////////////
  53. // icon indexes:
  54. //
  55. // local media (.rm, .ra, etc.)
  56. // remote media (url)
  57. // list  (.ram)
  58. // broken local file
  59. // 
  60. enum ClipTypeIconIndex
  61. {
  62.     IconLocal,
  63.     IconRemote,
  64.     IconList,
  65.     IconLocalBroken
  66. };
  67. ClipTypeIconIndex GetIconIndex(const TDesC& path, bool bPathIsLocal)
  68. {
  69.     ClipTypeIconIndex idxIcon = ClipTypeIconIndex(-1);
  70.     if( bPathIsLocal )
  71.     {
  72.         CHXAvFile::FileType type = CHXAvFile::GetFileType(path);
  73.         if (CHXAvFile::ftRam == type)
  74.         {
  75.             idxIcon = IconList;
  76.         }
  77.         else
  78.         {
  79.             // for now, use local icon for everything else
  80.             idxIcon = IconLocal;
  81.         }
  82.         if (!ConeUtils::FileExists(path))
  83. {
  84.     // file no longer exists
  85.     idxIcon = IconLocalBroken;
  86. }
  87.     }
  88.     else
  89.     {
  90.         idxIcon = IconRemote;
  91.     }
  92.     return idxIcon;
  93. }
  94. } // end locals
  95. namespace CHXAvMisc
  96. {
  97. ////////////////////////////////////////////////////////////
  98. // allocate descriptive filesize text, e.g., "4.9 kbytes"
  99. HBufC* AllocFileSizeDescL(TUint cbFile)
  100. {
  101.     HBufC* pbuff = 0;
  102.     if( cbFile < CHXAvUtil::k_bytesPerKilobyte )
  103.     {
  104.         CHXAvCleanString text(R_FILEVIEW_BYTES_FORMAT, TInt(cbFile));
  105. pbuff = text().AllocL();
  106.     }
  107.     else
  108.     {
  109.         HX_ASSERT((cbFile / k_bytesPerKilobyte) <= INT_MAX); // next cast
  110.         CHXAvCleanString text(R_FILEVIEW_KB_FORMAT, TInt(cbFile / k_bytesPerKilobyte));
  111.         pbuff = text().AllocL();
  112.     }
  113.     return pbuff;
  114. }
  115. //
  116. // graphic list item text format is:
  117. //
  118. // [{icon index}]t{main text}[t{subtext}][t{idxIconD}]
  119. //
  120. HBufC* AllocGrListItemL(const TDesC& mainText, const TDesC& subText, TInt idxIcon)
  121. {
  122.     HX_ASSERT(mainText.Length() > 0);
  123.     const TUint cchExtraSpace = 10; // enough for t and icon indexes
  124.     TUint cchItemText = cchExtraSpace + mainText.Length() + subText.Length();
  125.     
  126.     HBufC* pBuf = HBufC::NewL(cchItemText);
  127.     AUTO_PUSH_POP(pBuf); // out
  128.     TPtr ptr = pBuf->Des();
  129.     // -1 means "no icon"
  130.     if( idxIcon != -1 )
  131.     {
  132.         ptr.AppendNum(idxIcon);
  133.     }
  134.     // main text
  135.     ptr.Append(KListColumnDelimiter);
  136.     HBufC* pFixedMainText = CHXAvMisc::AllocDisplayFriendlyStringL(mainText);
  137.     AUTO_PUSH_POP_DEL(pFixedMainText);
  138.     ptr.Append(*pFixedMainText);
  139.     // sub text
  140.     if( subText.Length() > 0 )
  141.     {
  142.         ptr.Append(KListColumnDelimiter);
  143.         HBufC* pFixedSubText = CHXAvMisc::AllocDisplayFriendlyStringL(subText);
  144.         AUTO_PUSH_POP_DEL(pFixedSubText);
  145.         ptr.Append(*pFixedSubText);
  146.     }
  147.   
  148.     return pBuf;
  149. }
  150. ////////////////////////////////////////
  151. //
  152. // graphic list item text must be:
  153. //
  154. // [icon index]tmain text[t subtext][tidxIconD][tidxIconD]
  155. //
  156. HBufC* AllocGrListItemL(ListType type, 
  157.                                   TInt idxIcon, 
  158.                                   const TDesC& mainText, 
  159.                                   const TDesC& subText)
  160. {
  161.     _LIT(KSingle, "%dt%S");
  162.     _LIT(KSingleNoIcon, "%dt%S");
  163.     _LIT(KDouble, "%dt%St%S");
  164.     _LIT(KDoubleNoIcon, "t%St%S");
  165.     HX_ASSERT(mainText.Length() > 0);
  166.     const TUint cchIndexSpace = 20;
  167.     TUint cchItemText = cchIndexSpace + mainText.Length() + subText.Length();
  168.     
  169.     HBufC* pBuf = HBufC::NewL(cchItemText);
  170.     TPtr ptr = pBuf->Des();
  171.     switch (type)
  172.     {
  173.     case Double:
  174.         ptr.Format(KDouble, idxIcon, &mainText, &subText);
  175.         break;
  176.     case DoubleNoIcon:
  177.         ptr.Format(KDoubleNoIcon, &mainText, &subText);
  178.         break;
  179.     case Single:
  180.         ptr.Format(KSingle, idxIcon, &mainText);
  181.         break;
  182.     case SingleNoIcon:
  183.         ptr.Format(KSingleNoIcon, &mainText);
  184.         break;
  185.     default:
  186.         HX_ASSERT(false);
  187.         break;
  188.     }
  189.     return pBuf;
  190. }
  191. ////////////////////////////////////////////
  192. // show the access point settings page
  193. //
  194. // wapApId = id of item that should be selected by
  195. // default (i.e., the currently set access point)
  196. //
  197. TInt RunAccessPointSettingPageL(TInt wapApId)
  198. {
  199.     const bool bStartWithSel            = true; // if false (edit only), other params ignored
  200.     const TSelectionListType listType   = EApSettingsSelListIsPopUp;
  201.     const TSelectionMenuType menuType   = EApSettingsSelMenuSelectNormal;
  202.     const TInt ispFilter                = KEApIspTypeInternetOnly | KEApIspTypeInternetAndWAP;
  203.     const TInt bearerType               = EApBearerTypeAll;
  204.     const TInt sortType                 = KEApSortNameAscending;
  205.     // access point settings ui handler; displays setting page ui
  206.     CApSettingsHandler* pSettings 
  207.         = CApSettingsHandler::NewLC(bStartWithSel, listType, menuType,
  208.                                     ispFilter, bearerType, sortType);
  209.     AUTO_POP_DEL(pSettings);
  210.     TUint32 idSelected = 0;
  211.     pSettings->RunSettingsL(wapApId, idSelected);
  212.     return idSelected;
  213. }
  214. ///////////////////////////////////////
  215. // extract text chunk from delimited text (e.g., "thellotthere")
  216. TPtrC
  217. TextChunk(const TDesC& text, TInt idxChunk, TChar chDelimit)
  218. {
  219.     TPtrC titleOut(KNullDesC);
  220.     TPtrC temp = text;
  221.     TInt idxDelimit = 0;
  222.     // skip to chunk
  223.     while(idxChunk--)
  224.     {
  225.         // skip past tab delimiter
  226.         idxDelimit = temp.Locate(chDelimit);
  227.         if( KErrNotFound == idxDelimit )
  228.         {
  229.             break;
  230.         }
  231.         temp.Set(temp.Mid(idxDelimit + 1));
  232.     }
  233.     if( idxDelimit != KErrNotFound )
  234.     {
  235.         idxDelimit = 0;
  236.         TInt idxDelimit = temp.Locate(chDelimit);
  237.         if( idxDelimit == KErrNotFound )
  238.         {
  239.             // ok, no ending tab
  240.             idxDelimit = temp.Length();
  241.         }
  242.         // collect to next delimiter or end
  243. titleOut.Set(temp.Left(idxDelimit));
  244.     }
  245.     
  246.     return titleOut;
  247. }
  248. ////////////////////////////////////
  249. //
  250. TInt LaunchAppL(RFs& fsSession, const TDesC& appPath, const TDesC& doc)
  251. {
  252.     // get absolute path to the app
  253.     TFileName fullPathApp;
  254.     TInt err = CHXAvFile::GetFullPath(fsSession, appPath, fullPathApp);
  255.     if( KErrNone == err )
  256.     {
  257.         // set up the command line
  258.         CApaCommandLine* cmdLine = CApaCommandLine::NewLC();
  259.         cmdLine->SetLibraryNameL(fullPathApp);
  260.         cmdLine->SetDocumentNameL(doc);
  261.         cmdLine->SetCommandL(EApaCommandOpen);
  262.         // run the command line
  263.         RApaLsSession ls;
  264.         HXSYM_LEAVE_IF_ERR(ls.Connect());
  265.         CleanupClosePushL(ls);
  266.         HXSYM_LEAVE_IF_ERR(ls.StartApp(*cmdLine));
  267.         CleanupStack::PopAndDestroy(2); // ls and cmdLine
  268.         
  269.     }
  270.     return err;
  271. }
  272. ////////////////////////////////////////////////
  273. // iterate all app instances with the given uid
  274. // and either end or kill
  275. //
  276. // note: this will not find embedded instances!
  277. //
  278. void ForEachAppInstanceL(TUid uid, ForEachAppInstanceCommand command)
  279. {
  280.     RWsSession& ws = CEikonEnv::Static()->WsSession();
  281.     
  282.     TInt wgId = 0;
  283.     CApaWindowGroupName::FindByAppUid(uid, ws, wgId);
  284.     while( wgId != KErrNotFound )
  285.     {
  286.         DPRINTF(SYMP_INFO, ("ForEachAppInstanceL(): found task wgid = %ld", wgId));
  287.         TApaTask task(ws);
  288.         task.SetWgId(wgId);
  289.         // end this task if it is not our own (identified by thread id)
  290.         if( task.ThreadId() != RThread().Id() )
  291.         {
  292.             if( command == KillApp )
  293.             {
  294.                 DPRINTF(SYMP_INFO, ("ForEachAppInstanceL(): killing task (wgid = %ld)", wgId));
  295.                 task.KillTask();
  296.             }
  297.             else
  298.             {
  299.                 DPRINTF(SYMP_INFO, ("ForEachAppInstanceL(): ending task (wgid = %ld)", wgId));
  300.                 task.EndTask();
  301.             }
  302.         }
  303.         CApaWindowGroupName::FindByAppUid(uid, ws, wgId);
  304.     }
  305. }
  306. ////////////////////////////////////////////////
  307. //
  308. void LaunchAppL(TInt uid, const TDesC& arg)
  309. {
  310.     
  311.     TUid uidApp = TUid::Uid(uid);
  312.     TApaTaskList taskList(CEikonEnv::Static()->WsSession());
  313.     TApaTask task = taskList.FindApp(uidApp);
  314.     if (task.Exists())
  315.     {
  316.         // convert to 8-bit message (note that copy, append convert)
  317.         HBufC8* pBuf = HBufC8::NewL(arg.Length());
  318.         AUTO_PUSH_POP_DEL(pBuf);
  319.         TPtr8 ptr = pBuf->Des();
  320.         ptr.Copy(arg);
  321.         // send message to the task; uid is not used
  322.         task.SendMessage(TUid::Uid( 0 ), *pBuf);
  323.         
  324.         //HXSYM_LEAVE_IF_ERR(task.SwitchOpenFile(aFileName));
  325. //task.BringToForeground();
  326.     }
  327.     else 
  328.     {
  329.         // launch the webbrowser app
  330.         RApaLsSession session;
  331.         HXSYM_LEAVE_IF_ERR(session.Connect());
  332.         TThreadId tidNewAppInstance = 0; // ignored
  333.         session.StartDocument( arg, uidApp, tidNewAppInstance );
  334.         session.Close();
  335.     }
  336. }
  337. ////////////////////////////////////////////
  338. // form our app-specific message for BroadcastWsEventL()
  339. HBufC8* MakeHXPlayerPrivateMessageL(const TDesC8& name)
  340. {
  341.     const TUint k_cbForRest = 50;
  342.     HBufC8* pbuff = HBufC8::NewL(name.Length() + k_cbForRest);
  343.     
  344.     // name:tid
  345.     _LIT8(KFormatText, "%S:0x%x");
  346.     TThreadId tid = RThread().Id();
  347.     TPtr8 des = pbuff->Des();
  348.     des.AppendFormat(KFormatText, &name, tid);
  349.     return pbuff;
  350. }
  351. //////////////////////////////////////////////////////
  352. // send TWsEvent to all window groups except ours
  353. void BroadcastWsEventL(TUint type, const HBufC8* pMsg)
  354. {
  355.     TWsEvent event;
  356.     
  357.     event.SetType(type);
  358.     HXSYM_LEAVE_IF_FALSE(pMsg->Length() <= TWsEvent::EWsEventDataSize);
  359.     Mem::Copy(event.EventData(), pMsg->Ptr(), pMsg->Length());
  360.     RWsSession& ws = CEikonEnv::Static()->WsSession();
  361.     TInt wgidThisInstance = GetThisWgId();
  362.     CArrayFixFlat<TInt>* pWindowList = new (ELeave) CArrayFixFlat<TInt>(4);
  363.     AUTO_PUSH_POP_DEL(pWindowList);
  364.     HXSYM_LEAVE_IF_ERR(ws.WindowGroupList(pWindowList));
  365.     for (TInt idx = 0; idx < pWindowList->Count(); ++idx)
  366.     {
  367.         TInt wgid = (*pWindowList)[idx];
  368.         if(wgid != wgidThisInstance)
  369.         {
  370.             ws.SendEventToWindowGroup(wgid, event);
  371.         }
  372.     }
  373. }
  374. TInt GetThisWgId()
  375. {
  376.     RWindowGroup& win = CCoeEnv::Static()->RootWin();
  377.     return win.Identifier();
  378. }
  379. TUid GetAppUidFromWgId(TInt wgid)
  380. {
  381.     RWsSession& ws = CEikonEnv::Static()->WsSession();
  382.     CApaWindowGroupName* pName = CApaWindowGroupName::NewL(ws);
  383.     AUTO_PUSH_POP_DEL(pName);
  384.     pName->ConstructFromWgIdL(wgid);
  385.     return pName->AppUid();
  386. }
  387. ////////////////////////////////////////
  388. // create array of list items based on URL list
  389. //
  390. CDesCArrayFlat*
  391. AllocGrPopupListItemsL(CHXAvURLList *list, const CHXAvNameDisplayTrait* pDisplayTrait)
  392. {
  393.     TInt itemCount = list->NumURLs();
  394.     CDesCArrayFlat* pItems = new (ELeave) CDesCArrayFlat(itemCount);
  395.     AUTO_PUSH_POP(pItems); // out
  396.     for(TInt idx = 0; idx < itemCount; ++idx)
  397.     {
  398. CHXAvURLInfo* pInfo = list->GetURL(idx);
  399.         // use unescaped path-only portion of URL (e.g., realnetworksrootfoo.rm) 
  400.         HBufC* pPath = CHXAvUtil::AllocStdPathFromPlayerUrlL(pInfo->URL());
  401.         AUTO_PUSH_POP_DEL(pPath);
  402.         bool bIsLocal = CHXAvUtil::IsLocal(pInfo->URL());
  403. TInt idxIcon = GetIconIndex(*pPath, bIsLocal);
  404. TPtrC name(pInfo->Title());
  405. if( name.Length() == 0 )
  406. {
  407.             // no tile; use url
  408.             TPtrC urlName = CHXAvFile::GetNakedPathNode(*pPath);
  409.     if(pDisplayTrait)
  410.     {
  411. // fix up the display name (e.g., hide extension)
  412. NameExt info = pDisplayTrait->GetDisplayText(urlName);
  413. name.Set(info.first);
  414.     }
  415.     else
  416.     {
  417. name.Set(urlName);
  418.     }
  419. }
  420. if( name.Length() > 0 )
  421. {
  422.             HBufC* pItemText = AllocGrListItemL(name, idxIcon);
  423.     AUTO_PUSH_POP_DEL(pItemText);
  424.             pItems->AppendL(*pItemText);
  425. }
  426.     }
  427.     return pItems;
  428. }
  429. //////////////////////////////////////////
  430. // sync the scrollbar associated with the list box
  431. //
  432. void UpdateScrollBar(CEikListBox* pListBox)
  433. {
  434.     if(pListBox) 
  435.     {
  436.         // this apparantly does not handle below
  437.         pListBox->UpdateScrollBarsL();
  438.         TInt pos = pListBox->CurrentItemIndex();
  439. if( pos < 0 ) // -1 = empty 
  440. {
  441.     pos = 0;
  442. }
  443.     
  444. CEikScrollBarFrame* pFrame = pListBox->ScrollBarFrame();
  445. if( pFrame != 0 )
  446. {
  447.     pFrame->MoveVertThumbTo(pos);
  448. }  
  449.     }
  450. }
  451. ////////////////////////////////////////////////////////
  452. // alloc string with special characters replaced by spaces; this
  453. // can be used in ui displays so that boxes are not seen in place
  454. // of these characters
  455. //
  456. void MakeDisplayFriendly(TDes& des, const TDesC& replaceChars)
  457. {
  458.     // replace with spaces
  459.     ReplaceCharacters(
  460.         des, 
  461.         replaceChars, ' ');
  462. }
  463. ////////////////////////////////////////////////////////
  464. // see MakeDisplayFriendly()
  465. HBufC* AllocDisplayFriendlyStringL(const TDesC& text, const TDesC& replaceChars)
  466. {
  467.     HBufC* pbuff = text.AllocL();
  468.     AUTO_PUSH_POP(pbuff);
  469.     TPtr ptr = pbuff->Des();
  470.     MakeDisplayFriendly(ptr, replaceChars);
  471.     return pbuff;
  472. }
  473. //////////////////////////
  474. // for each character in text, replace with chWith if character is in replaceChars
  475. //
  476. void ReplaceCharacters(TDes& text, const TDesC& replaceChars, TChar chWith)
  477. {
  478.     TInt cchText = text.Length();
  479.     for (TInt idx = 0; idx < cchText; ++idx)
  480.     {
  481.         if( KErrNotFound != replaceChars.Locate(text[idx]) )
  482.         {
  483.             // this character matches one of replaceChars; replace
  484.             text[idx] = chWith;
  485.         }
  486.     }
  487. }
  488. ////////////////////////////////////////////////////////////
  489. //helper
  490. void AddTabL(CAknTabGroup* pGroup, const TDesC& imageFilePath, TInt idTab, TInt idxImage, TInt idxMask)
  491. {
  492.     CFbsBitmap* pImage = new (ELeave) CFbsBitmap();
  493.     AUTO_PUSH_POP(pImage);
  494.     HXSYM_LEAVE_IF_ERR(pImage->Load(imageFilePath, idxImage, ETrue));
  495.         
  496.     CFbsBitmap* pMask = new (ELeave) CFbsBitmap();
  497.     AUTO_PUSH_POP(pMask);
  498.     HXSYM_LEAVE_IF_ERR(pMask->Load(imageFilePath, idxMask, ETrue));
  499.         
  500.     // tab group assumes ownership of bitmap
  501.     pGroup->AddTabL(idTab, pImage, pMask);
  502.     
  503. }
  504. ////////////////////////////////////////////////////////////
  505. //
  506. // The mbmPath may or may not have drive letter. If empty, we assume default app mbm file.
  507. //
  508. void AddIconHelperL(const TDesC& mbmPath, ImageInfo const info[], TInt count, CAknIconArray*& pIcons)
  509. {
  510.     TFileName* pFullImagePath = 0;
  511.     if( mbmPath.Length() == 0 )
  512.     {
  513.         pFullImagePath = CHXAvFile::AllocAppFolderPathL(CHXAvUtil::KImagesMBMName);
  514.     }
  515.     else
  516.     {
  517.         pFullImagePath = new (ELeave) TFileName;
  518.         AUTO_PUSH_POP(pFullImagePath);
  519.         RFs& fs = CCoeEnv::Static()->FsSession();
  520.         
  521.         // ensure path is full path (with drive) //XXXLCM does CreateIconL do this resolution for us?
  522.         HXSYM_LEAVE_IF_ERR( CHXAvFile::GetFullPath(fs, mbmPath, *pFullImagePath) );
  523.     }
  524.     AUTO_PUSH_POP_DEL(pFullImagePath);
  525.     
  526.     for( TInt idx = 0; idx < count; ++idx )
  527.     {
  528.         CEikonEnv* pEnv = CEikonEnv::Static();
  529.         CGulIcon* pIcon = pEnv->CreateIconL(*pFullImagePath, info[idx].idxImg, info[idx].idxImgMask);
  530.         AUTO_PUSH_POP(pIcon); // transfer ownership
  531. pIcons->AppendL(pIcon);
  532.     }
  533. }
  534. ////////////////////////////////////////////////////////
  535. // allocate an array of icons from image file
  536. CAknIconArray* AllocIconsL(const ImageInfo vec[], TInt imageCount, const TDesC& imageFilePath)
  537. {
  538.     CAknIconArray* pIcons = new (ELeave) CAknIconArray(10/*granularity*/); //XXXLCM
  539.     AUTO_PUSH_POP(pIcons); // out
  540.     AddIconHelperL(imageFilePath, vec, imageCount, pIcons);
  541.     return pIcons;
  542. }
  543. ////////////////////////////////////////
  544. // count valid media folder root
  545. /*TUint GetValidRootCountL(const utVector<avMediaFolderInfoPtr>& mediaFolderInfo)
  546. {
  547.     TUint validRootCount = 0;
  548.  
  549.     for(TInt idx = 0; idx < mediaFolderInfo.Nelements(); ++idx)
  550.     {
  551.         avMediaFolderInfoPtr spInfo = mediaFolderInfo[idx];
  552.         if( CHXAvFile::PathExists(spInfo->GetRoot()) )
  553.         {
  554.             ++validRootCount;
  555.         }
  556.     }
  557.     HX_ASSERT(validRootCount > 0);
  558.    
  559.     return validRootCount;
  560. }*/
  561. ////////////////////////////////////////
  562. //
  563. HBufC* AllocTimerTextL(TUint ms)
  564. {
  565.     HBufC* pText = HBufC::NewL(CHXAvUtil::k_cchMaxTimerText);
  566.     TPtr ptr = pText->Des();
  567.     FormatTimerText(ms, ptr);
  568.     return pText;
  569. }
  570. /////////////////////////////////////////////////////////////////
  571. void FormatTimerText(TUint ms, TDes& des)
  572. {
  573.     HX_ASSERT(des.MaxLength() >= k_cchMaxTimerText);
  574.     TLocale locale;
  575.     CHXString fmt;
  576.     TUint totalSecs = ms / 1000;
  577.     TUint hours = totalSecs / k_secsPerHour;
  578.     TUint mins = ((totalSecs % k_secsPerHour) / k_secsPerMin);
  579.     TUint secs = ((totalSecs % k_secsPerHour) % k_secsPerMin);
  580.     TBuf<16> dhrs;
  581.     TBuf<2> dmins;
  582.     TBuf<2> dsecs;
  583.     dhrs.AppendNum(hours);
  584.     dmins.AppendNum(mins);
  585.     dsecs.AppendNum(secs);
  586.     
  587.     if (hours != 0) 
  588.     {
  589. des.Append(dhrs);
  590. des.Append(locale.TimeSeparator(1));
  591.         if (mins < 10)
  592.     des.Append(_L("0"));
  593.     }
  594.     des.Append(dmins);
  595.     des.Append(locale.TimeSeparator(2));
  596.     if (secs < 10) {
  597. des.AppendNum(0);
  598.     }
  599.     des.Append(dsecs);
  600. }
  601. ////////////////////////////////////////////////////////////
  602. // init/add items that go in all options menus in all views
  603. void InitDebugMenuItemsL(CEikMenuPane* pPane)
  604. {
  605. #if defined(TEST_MENU)
  606. // add test item to menu
  607.     CEikMenuPaneItem::SData extraItem;
  608.     extraItem.iCommandId = EDoTest;
  609.     extraItem.iCascadeId = 0;
  610.     extraItem.iFlags     = 0;
  611.     extraItem.iText.Copy(_L("Test"));
  612.     pPane->AddMenuItemL(extraItem);
  613. #endif
  614. }
  615. /////////
  616. ///////////////////////////////////////////////////
  617. // add menu item
  618. void AddMenuItemL(CEikMenuPane* pPane, TInt idCmd, TInt resIdText)
  619. {
  620.     CEikMenuPaneItem::SData extraItem;
  621.     extraItem.iCommandId = idCmd;
  622.     extraItem.iCascadeId = 0;
  623.     extraItem.iFlags     = 0;
  624.     extraItem.iText.Copy(CHXAvCleanString(resIdText)());
  625.     pPane->AddMenuItemL(extraItem);
  626. }
  627. void InitHelpMenuItem(CEikMenuPane* pPane)
  628. {
  629.     // look for something like "z:\System\Apps\CsHelp\CsHelp.app"
  630.     _LIT(KHelpAppPath, "z:\System\Apps\CsHelp\CsHelp.app"); //XXXLCM once hlplnch.h is available
  631.     bool bExists = CHXAvFile::PathExists(KHelpAppPath);
  632.     pPane->SetItemDimmed(EAknCmdHelp, !bExists);
  633. }
  634. ////////////////////////////////////////////
  635. // true if we know for sure file is an app/program
  636. bool IsAppFileL(const TDesC& file)
  637. {
  638.     RApaLsSession ls;
  639.     HXSYM_LEAVE_IF_ERR(ls.Connect());
  640.     CleanupClosePushL(ls);
  641.     TBool bIsAnApp = EFalse;
  642.     TInt err = ls.IsProgram(file, bIsAnApp);
  643.     
  644.     CleanupStack::PopAndDestroy(); // ls
  645.     return bIsAnApp;
  646. }
  647. ////////////////////////////////////////////////////////
  648. //
  649. // return title for display in title bar or recent clips
  650. //
  651. // title is taken from file header; if that is missing, it is
  652. // formed based on play url; if that is missing, it is
  653. // formed based on main url (ram or playlist if play url is empty)
  654. //
  655. HBufC* AllocTitleL(CHXAvPlayer* pPlayer)
  656. {
  657.     HX_ASSERT(pPlayer);
  658.     comptr<IHXValues> header(pPlayer->GetClipInfo().GetFileHeader(0));
  659.     // header may be missing, e.g., clip not played yet or fails to open
  660.     CHXString strTitle;
  661.     if( header )
  662.     {
  663.         val::GetString(header, "Title", strTitle, val::buffer);
  664.     }
  665.  
  666.     HBufC* pTitleText = 0;
  667.     if( strTitle.GetLength() > 0)
  668.     {
  669.         CHXAvCleanString text(strTitle);
  670.         pTitleText = CHXAvMisc::AllocDisplayFriendlyStringL(text());
  671.     }
  672.     else
  673.     {
  674.         // no title in header; create one from clip url
  675.         CHXString strUrl = pPlayer->GetPlayURL();
  676.         if( strUrl.IsEmpty() )
  677.         {
  678.             strUrl = pPlayer->GetMainURL();
  679.         }
  680.         
  681.         if( !strUrl.IsEmpty() )
  682.         {
  683.             CHXAvCleanString text(strUrl);
  684.             pTitleText = CHXAvUtil::AllocDisplayTextForPlayerUrlL(text());
  685.         }
  686.     }
  687.     return pTitleText;
  688. }
  689. #if(0) /////////////////////////////////////////////////////////////////////////////////
  690. void EnsureProcessNotRunningL(const TDesC& name)
  691. {
  692.     // the full process name is something like '{process name}[{appuid}]{4 digit number}'
  693.     
  694.     // form name plus wildcard
  695.     _LIT(KSearchNameFormat, "%S*");
  696.     HBufC* pSearchName = HBufC::NewL(name.Length() + 1); // plus space for asterisk
  697.     AUTO_PUSH_POP_DEL(pSearchName);
  698.     pSearchName->Des().Format(KSearchNameFormat, &name);
  699.     // find process
  700.     TFindProcess finder(*pSearchName);
  701.     DPRINTF(SYMP_INFO, ("EnsureProcessNotRunningL(): searching for process '%s'n", dbg::CharPtr(*pSearchName)()));
  702.     TFullName fullName;
  703.     TInt res = finder.Next(fullName);
  704.     while( KErrNone == res )
  705.     {
  706.         // server exists; server should not exist before we call start
  707.         DPRINTF(SYMP_INFO, ("EnsureProcessNotRunningL(): '%s' foundn", dbg::CharPtr(fullName)()));
  708.         RProcess proc;
  709.         res = proc.Open(finder);
  710.         if( KErrNone == res )
  711.         {
  712.             // kill this if it is not the current process
  713.             if( proc.Id() != RProcess().Id() )
  714.             {
  715.                 DPRINTF(SYMP_INFO, ("EnsureProcessNotRunningL(): killing process!n"));
  716.                 proc.Kill(KErrNone);
  717.                 proc.Close();
  718.             }
  719.         }
  720.         res = finder.Next(fullName);
  721.     }
  722. }
  723. void DumpWindowGroupInfoL()
  724. {
  725.     RWsSession& ws = CEikonEnv::Static()->WsSession();
  726.     TThreadId tidThis = RThread().Id();
  727.     // get list of window groups
  728.     CArrayFixFlat<TInt>* pWindowList = new (ELeave) CArrayFixFlat<TInt>(4);
  729.     AUTO_PUSH_POP_DEL(pWindowList);
  730.     HXSYM_LEAVE_IF_ERR(ws.WindowGroupList(pWindowList));
  731.     // iterate over window groups
  732.     TBuf<200> winName;
  733.     for (TInt idx = 0; idx < pWindowList->Count(); ++idx)
  734.     {
  735.         // get window group name
  736.         TInt wgid = (*pWindowList)[idx];
  737.         ws.GetWindowGroupNameFromIdentifier(wgid, winName );
  738.         RDebug::Print(_L("win group %d name: %S"), wgid, &winName);
  739.         winName.Zero();
  740.         CApaWindowGroupName* pWgn = CApaWindowGroupName::NewL(ws);
  741.         AUTO_PUSH_POP_DEL(pWgn);
  742.         pWgn->ConstructFromWgIdL(wgid);
  743.         // now get info
  744.         RDebug::Print(_L("win group info:"));
  745.         RDebug::Print(_L("caption: %S"), &(pWgn->Caption()));
  746.         RDebug::Print(_L("doc: %S"), &(pWgn->DocName()));
  747.         RDebug::Print(_L("hidden = %d; system = %d"), pWgn->Hidden(), pWgn->IsSystem());
  748.         RDebug::Print(_L("app uid: 0x%x"), pWgn->AppUid());
  749.    
  750.         // get thread info associated with window group
  751.         TThreadId threadId = 0;
  752.         TInt err = ws.GetWindowGroupClientThreadId(wgid, threadId);
  753.         if( err == KErrNone)
  754.         {
  755.             RThread thread;
  756.             err = thread.Open(threadId);
  757.             if( err == KErrNone)
  758.             {
  759.                 RDebug::Print(_L("thread name: %S"), &(thread.Name()));
  760.                 thread.Close();
  761.             }
  762.         }
  763.     }
  764. }
  765. #endif /////////////////////////////////////////////////////////////////
  766. } // avMisc