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

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #include "hxcom.h"
  36. #include "hxtypes.h"
  37. #include "hxcomm.h"
  38. #include "hxausvc.h"
  39. #include "ihxpckts.h"
  40. #include "hxengin.h"
  41. #include "hxcore.h"
  42. #include "hxmap.h"
  43. #include "hxgroup.h"
  44. #include "basgroup.h"
  45. #include "advgroup.h"
  46. #include "hxplay.h"
  47. #include "hxstrutl.h"
  48. #include "hxtac.h"
  49. #include "hxheap.h"
  50. #ifdef _DEBUG
  51. #undef HX_THIS_FILE
  52. static const char HX_THIS_FILE[] = __FILE__;
  53. #endif
  54. // note: these constants much match the order of szTACNames
  55. #define TitlePosition    0
  56. #define AuthorPosition    1
  57. #define CopyrightPosition  2
  58. #define AbstractPosition   3
  59. #define KeywordsPosition   4
  60. #define DescriptionPosition 5
  61. static const char* const szTACNames[] =
  62. {
  63.     "Title",
  64.     "Author",
  65.     "Copyright",
  66.     "Abstract",
  67.     "Keywords",
  68.     "Description"
  69. };
  70. // init static data
  71. UINT32 const TACData::NoFind = 9;
  72. /////////////////////////////////////////////////////////////////////////
  73. //      Method:
  74. //              HXMasterTAC::HXMasterTAC
  75. //      Purpose:
  76. //              Constructor
  77. //
  78. HXMasterTAC::HXMasterTAC(HXBasicGroupManager* pGroupManager) :
  79.       m_tacStatus(TAC_Pending)
  80.     , m_pTACPropWatch(NULL)
  81.     , m_pTACProps(NULL)
  82.     , m_lRefCount(0)
  83. #if defined(HELIX_FEATURE_REGISTRY)
  84.     , m_pRegistry(NULL)
  85. #endif /* HELIX_FEATURE_REGISTRY */
  86.     , m_ptacPropIDs(NULL)
  87. {
  88.     m_pGroupManager = pGroupManager;
  89.     HX_ADDREF(m_pGroupManager);
  90.     m_pTACProps = new CHXHeader();
  91.     m_pTACProps->AddRef();
  92.     // init master tac prop ID array
  93.     for (int n=0; n<NUMB_TAC_NAMES; n++)
  94.     {
  95. m_masterTACPropIDs[n] = 0;
  96.     }
  97. }
  98. /////////////////////////////////////////////////////////////////////////
  99. //      Method:
  100. //              HXMasterTAC::~HXMasterTAC
  101. //      Purpose:
  102. //              Destructor
  103. //
  104. HXMasterTAC::~HXMasterTAC()
  105. {
  106.     HX_RELEASE(m_pTACProps);
  107. #if defined(HELIX_FEATURE_REGISTRY)
  108.     HX_RELEASE(m_pRegistry);
  109. #endif /* HELIX_FEATURE_REGISTRY */
  110.     HX_DELETE(m_ptacPropIDs);
  111. }
  112. void HXMasterTAC::Close()
  113. {
  114.     // clear TAC prop watches and release prop watch object
  115.     if (m_pTACPropWatch)
  116.     {
  117. ResetTAC();
  118. HX_RELEASE(m_pTACPropWatch);
  119.     }
  120.     HX_RELEASE(m_pGroupManager);
  121. }
  122. BOOL
  123. HXMasterTAC::IsTACComplete(IHXValues* pProps)
  124. {
  125.     BOOL bResult = TRUE;
  126.     UINT16 nIdx = 0;
  127.     IHXBuffer* pValue = NULL;
  128.     
  129.     if (!pProps)
  130.     {
  131. bResult = FALSE;
  132. goto cleanup;
  133.     }
  134.     for(nIdx = 0; nIdx < NUMB_TAC_NAMES - 1; nIdx++)
  135.     {
  136. if (HXR_OK != pProps->GetPropertyCString(szTACNames[nIdx], pValue) || !pValue)
  137. {
  138.     bResult = FALSE;
  139.     break;
  140. }
  141. HX_RELEASE(pValue);
  142.     }
  143. cleanup:
  144.     HX_RELEASE(pValue);
  145.     return bResult;
  146. }
  147. void HXMasterTAC::SetRegistry(HXClientRegistry* pRegistry, UINT32 playerID)
  148. {
  149. #if defined(HELIX_FEATURE_REGISTRY)
  150.     // save the reg ptr and addref
  151.     m_pRegistry = pRegistry;
  152.     m_pRegistry->AddRef();
  153.     // and create properties in player's space
  154.     char szPropName[1024]; /* Flawfinder: ignore */
  155.     IHXBuffer* pPlayerName = NULL;
  156.     HX_ASSERT(playerID != 0);
  157.     if (HXR_OK == m_pRegistry->GetPropName(playerID, pPlayerName))
  158.     {
  159. for (int n=0; n<NUMB_TAC_NAMES; n++)
  160. {
  161.     // add each master TAC prop
  162.     SafeSprintf(szPropName, 1024, "%s.%s", (char*) pPlayerName->GetBuffer(), szTACNames[n]);
  163.     m_masterTACPropIDs[n] = m_pRegistry->AddStr(szPropName, NULL);
  164. }
  165. HX_RELEASE(pPlayerName);
  166.     }
  167.     // create prop watch object
  168.     m_pRegistry->CreatePropWatch(m_pTACPropWatch);
  169.     m_pTACPropWatch->Init((IHXPropWatchResponse*) this);
  170. #endif /* HELIX_FEATURE_REGISTRY */
  171. }
  172. /*
  173.  * IUnknown methods
  174.  */
  175. /////////////////////////////////////////////////////////////////////////
  176. //      Method:
  177. //              IUnknown::QueryInterface
  178. //      Purpose:
  179. //              Implement this to export the interfaces supported by your
  180. //              object.
  181. //
  182. STDMETHODIMP HXMasterTAC::QueryInterface(REFIID riid, void** ppvObj)
  183. {
  184.     QInterfaceList qiList[] =
  185.         {
  186.             { GET_IIDHANDLE(IID_IHXPropWatchResponse), (IHXPropWatchResponse*)this },
  187.             { GET_IIDHANDLE(IID_IUnknown), (IUnknown*)(IHXPropWatchResponse*)this },
  188.         };
  189.     
  190.     return ::QIFind(qiList, QILISTSIZE(qiList), riid, ppvObj);
  191. }
  192. /////////////////////////////////////////////////////////////////////////
  193. //      Method:
  194. //              IUnknown::AddRef
  195. //      Purpose:
  196. //              Everyone usually implements this the same... feel free to use
  197. //              this implementation.
  198. //
  199. STDMETHODIMP_(ULONG32) HXMasterTAC::AddRef()
  200. {
  201.     return InterlockedIncrement(&m_lRefCount);
  202. }
  203. /////////////////////////////////////////////////////////////////////////
  204. //      Method:
  205. //              IUnknown::Release
  206. //      Purpose:
  207. //              Everyone usually implements this the same... feel free to use
  208. //              this implementation.
  209. //
  210. STDMETHODIMP_(ULONG32) HXMasterTAC::Release()
  211. {
  212.     if (InterlockedDecrement(&m_lRefCount) > 0)
  213.     {
  214. return m_lRefCount;
  215.     }
  216.     delete this;
  217.     return 0;
  218. }
  219. #if defined(HELIX_FEATURE_REGISTRY)
  220. // IHXPropWatchResponse methods
  221. STDMETHODIMP
  222. HXMasterTAC::AddedProp(const UINT32 id,
  223.     const HXPropType propType,
  224.     const UINT32 ulParentHash)
  225. {
  226.     return HXR_NOTIMPL;
  227. }
  228. STDMETHODIMP
  229. HXMasterTAC::ModifiedProp(const UINT32 id,
  230.        const HXPropType propType,
  231.        const UINT32 ulParentHash)
  232. {
  233.     if (m_ptacPropIDs)
  234.     {
  235. // first see which prop this is (0-3) and copy data 
  236. // to equivilent unfied Player prop
  237. UINT32 masterID = 0;
  238. TACData* pTACData = NULL;
  239. IHXBuffer* pValue = NULL;
  240. LISTPOSITION pos = m_ptacPropIDs->GetHeadPosition();
  241. while (pos)
  242. {
  243.     // get next tac data object
  244.     pTACData = (TACData*) m_ptacPropIDs->GetNext(pos);
  245.     // find the equivilent master prop ID
  246.     masterID = pTACData->FindMasterIndex(id);
  247.     if (masterID != TACData::NoFind)
  248.     {
  249. // get prop from ID 
  250. m_pRegistry->GetStrById(id, pValue);
  251. if (pValue)
  252. {
  253.     // set new master tac prop
  254.     m_pRegistry->SetStrById(m_masterTACPropIDs[masterID], pValue);
  255.     HX_RELEASE(pValue);
  256. }
  257. break;
  258.     }
  259. }
  260.     }
  261.     return HXR_OK;
  262. }
  263. STDMETHODIMP
  264. HXMasterTAC::DeletedProp(const UINT32 id,
  265.       const UINT32 ulParentHash)
  266. {
  267.     HRESULT hRes = HXR_OK;
  268.     // clear TAC prop watches and release prop watch object
  269.     if (m_pTACPropWatch)
  270.     {
  271. if (m_ptacPropIDs)
  272. {
  273.     TACData* pTACData = NULL;
  274.     LISTPOSITION pos = m_ptacPropIDs->GetHeadPosition();
  275.     while (pos)
  276.     {
  277. // get next TAC data object 
  278. pTACData = (TACData*) m_ptacPropIDs->GetNext(pos);
  279. // see if this ID is part of this TAC data object
  280. if (pTACData->IsIDPresent(id))
  281. {
  282.     pTACData->Clear(id);
  283.     break;
  284. }
  285.     }
  286. }
  287. // clear the watch now
  288. hRes = m_pTACPropWatch->ClearWatchById(id);
  289.     }
  290.     return hRes;
  291. }
  292. #endif /* HELIX_FEATURE_REGISTRY */
  293. /************************************************************************
  294.  *      Method:
  295.  *          HXMasterTAC::ResetTAC
  296.  *      Purpose:
  297.  *          Reset all TAC related members in preparation for next group
  298.  *
  299.  */
  300. void HXMasterTAC::ResetTAC(BOOL bResetStatus /*=TRUE*/, BOOL bClearMasterProps /*=FALSE*/)
  301. {
  302.     if (bResetStatus)
  303.     {
  304. m_tacStatus = TAC_Pending;
  305.     }
  306.     TACData* pTACData = NULL;
  307.     if (m_ptacPropIDs)
  308.     {
  309. LISTPOSITION pos = m_ptacPropIDs->GetHeadPosition();
  310. while (pos)
  311. {
  312.     // get next TAC data object 
  313.     pTACData = (TACData*) m_ptacPropIDs->GetNext(pos);
  314.     // clear all watches set
  315.     pTACData->ClearAll(m_pTACPropWatch);
  316.     // free tac data object
  317.     delete pTACData;
  318.     pTACData = NULL;
  319. }
  320. // remove all list entries 
  321. m_ptacPropIDs->RemoveAll();
  322. HX_DELETE(m_ptacPropIDs);
  323.     }
  324.     // clear the master tac props value if this flag is set 
  325.     if (bClearMasterProps)
  326.     {
  327. HX_RELEASE(m_pTACProps);
  328. m_pTACProps = new CHXHeader();
  329. m_pTACProps->AddRef();
  330. #if defined(HELIX_FEATURE_REGISTRY)
  331. // set values in registry
  332. IHXBuffer* pValue = NULL;
  333. for (int i=0; i<NUMB_TAC_NAMES; i++)
  334. {
  335.     UCHAR nullString[1];
  336.     *nullString = '';
  337.     // set to blank string
  338.     pValue = new CHXBuffer();
  339.     pValue->AddRef();
  340.     pValue->Set(nullString, 1);
  341.     m_pRegistry->SetStrById(m_masterTACPropIDs[i], pValue);
  342.     HX_RELEASE(pValue);
  343. }
  344. #endif /* HELIX_FEATURE_REGISTRY */
  345.     }
  346. }
  347. /************************************************************************
  348.  *      Method:
  349.  *          HXMasterTAC::CheckTrackAndSourceOnTrackStarted
  350.  *      Purpose:
  351.  *           Private function used to examine track props for TAC info
  352.  *
  353.  */
  354. BOOL HXMasterTAC::CheckTrackAndSourceOnTrackStarted(INT32 nGroup, 
  355.   INT32 nTrack, 
  356.   UINT32 sourceID)
  357. {
  358.     BOOL res = TRUE;
  359.     // if we have no tac yet, or, if we have a Source TAC set and 
  360.     // in fact the track props have TAC info, try for Track props...
  361.     if (m_tacStatus == TAC_Pending || m_tacStatus == TAC_Source)
  362.     {
  363. // see if track props have TAC info
  364. if (!CheckTrackForTACInfo(nGroup, nTrack))
  365. {
  366.     // finally, if Track Props have no TAC, check the Source props! 
  367.     res = CheckSourceForTACInfo(nGroup, nTrack, sourceID);
  368. }
  369.     }
  370.     return res;
  371. }
  372. /************************************************************************
  373.  *      Method:
  374.  *          HXMasterTAC::CheckGroupForTACInfo
  375.  *      Purpose:
  376.  *          Private function used to examine group props for TAC info
  377.  *
  378.  */
  379. BOOL HXMasterTAC::CheckGroupForTACInfo(INT32 nGroup)
  380. {
  381.     BOOL bFoundTAC = FALSE;
  382.     // first get the group object's properties using the IHXGroup
  383.     IHXGroup* pGroup = NULL;
  384.     if (m_pGroupManager && 
  385. HXR_OK == m_pGroupManager->GetGroup((UINT16) nGroup, pGroup))
  386.     {
  387. // now get the props
  388. IHXValues* pGroupProps = pGroup->GetGroupProperties();
  389. // now search the group props for TAC info
  390. RetrieveTACProperties(pGroupProps);
  391. if (m_pTACProps && IsTACComplete(m_pTACProps))
  392. {
  393.     SetTAC(m_pTACProps, TAC_Group);
  394.     bFoundTAC = TRUE;
  395. }
  396. else if (pGroupProps) // the group has no TAC props, so check the individidual tracks
  397. {
  398.     for (int n=0; !bFoundTAC && n<pGroup->GetTrackCount(); n++)
  399.     {
  400. // now get the next track
  401. IHXValues* pTrack = NULL;
  402. if (HXR_OK == pGroup->GetTrack((UINT16) n, pTrack))
  403. {
  404.     // now search the props for TAC info
  405.     RetrieveTACProperties(pTrack);
  406.     if (m_pTACProps && IsTACComplete(m_pTACProps))
  407.     {
  408. // promote track props to group
  409. IHXBuffer* pValue = NULL;
  410. UINT16 nIdx;
  411. for(nIdx = 0; nIdx < NUMB_TAC_NAMES; nIdx++)
  412. {
  413.     m_pTACProps->GetPropertyCString(szTACNames[nIdx], pValue);
  414.     if (pValue)
  415.     {
  416.      pGroupProps->SetPropertyCString(szTACNames[nIdx], pValue);
  417.      HX_RELEASE(pValue);
  418.     }
  419. }
  420. // set new tac info 
  421. SetTAC(m_pTACProps, TAC_Group);
  422. bFoundTAC = TRUE;
  423.     }
  424.     HX_RELEASE(pTrack);
  425. }
  426.     }
  427. }
  428. HX_RELEASE(pGroupProps);
  429. HX_RELEASE(pGroup);
  430.     }
  431.     return bFoundTAC;
  432. }
  433. /************************************************************************
  434.  *      Method:
  435.  *          HXMasterTAC::CheckTrackForTACInfo
  436.  *      Purpose:
  437.  *           Private function used to examine track props for TAC info
  438.  *
  439.  */
  440. BOOL HXMasterTAC::CheckTrackForTACInfo(INT32 nGroup, INT32 nTrack)
  441. {
  442.     BOOL bFoundTAC = FALSE;
  443.     // first get the group object's properties using the IHXGroup
  444.     IHXGroup* pGroup = NULL;
  445.     if (m_pGroupManager && 
  446. HXR_OK == m_pGroupManager->GetGroup((UINT16) nGroup, pGroup))
  447.     {
  448. // but first check the group's props 
  449. IHXValues* pGroupProps = pGroup->GetGroupProperties();
  450. // now search the group props for TAC info
  451. RetrieveTACProperties(pGroupProps);
  452. if (m_pTACProps && IsTACComplete(m_pTACProps))
  453. {
  454.     SetTAC(m_pTACProps, TAC_Group);
  455.     bFoundTAC = TRUE;
  456. }
  457. else
  458. {
  459.     // now get the track using track ID
  460.     IHXValues* pTrack = NULL;
  461.     if (HXR_OK == pGroup->GetTrack((UINT16) nTrack, pTrack))
  462.     {
  463. // now search the props for TAC info
  464. RetrieveTACProperties(pTrack);
  465. if (m_pTACProps && IsTACComplete(m_pTACProps))
  466. {
  467.     SetTAC(m_pTACProps, TAC_Track);
  468.     
  469.     bFoundTAC = TRUE;
  470. }
  471. HX_RELEASE(pTrack);
  472.     }
  473. }
  474. HX_RELEASE(pGroupProps);
  475.     }
  476.    
  477.     HX_RELEASE(pGroup);
  478.     return bFoundTAC;
  479. }
  480. /************************************************************************
  481.  *      Method:
  482.  *          HXMasterTAC::CheckSourceForTACInfo
  483.  *      Purpose:
  484.  *           Private function used to examine source props for TAC
  485.  *      info. If found, adds them to the Track props and sets
  486.  *      the player's TAC props.
  487.  *
  488.  *       If Track props already had TAC props, this method would
  489.  *       not be called!
  490.  *
  491.  */
  492. BOOL HXMasterTAC::CheckSourceForTACInfo(INT32 nGroup, INT32 nTrack, UINT32 sourceID)
  493. {
  494.     BOOL bFoundTAC = FALSE;
  495.     // first get the group object's properties using the IHXGroup
  496.     IHXGroup* pGroup = NULL;
  497.     IHXValues* pTrack = NULL;
  498.     if (m_pGroupManager && 
  499. HXR_OK == m_pGroupManager->GetGroup((UINT16) nGroup, pGroup))
  500.     {
  501. pGroup->GetTrack((UINT16) nTrack, pTrack);
  502.     }
  503. #if defined(HELIX_FEATURE_REGISTRY)
  504.     // get source prop name 
  505.     IHXBuffer* pSourceName = NULL;
  506.     if (HXR_OK == m_pRegistry->GetPropName(sourceID, pSourceName))
  507.     {
  508. if (!m_ptacPropIDs)
  509. {
  510.     m_ptacPropIDs = new CHXSimpleList;
  511.     if (!m_ptacPropIDs)
  512.     {
  513. return FALSE;
  514.     }
  515. }
  516. // build TAC property strings & get props
  517. IHXValues* pTACProps = new CHXHeader();
  518. pTACProps->AddRef();
  519. IHXBuffer* pValue = NULL;
  520. // create tac data object and add to collection
  521. TACData* pTACData = new TACData();
  522. m_ptacPropIDs->AddTail(pTACData);
  523. // get each prop from the registry and add them to the 
  524. // pTACProps & pTrack collection also
  525. char szPropName[1024]; /* Flawfinder: ignore */
  526. for (int n=0; n<NUMB_TAC_NAMES; n++)
  527. {
  528.     SafeSprintf(szPropName, 1024, "%s.%s", (char*) pSourceName->GetBuffer(), szTACNames[n]);
  529.     if (HXR_OK == m_pRegistry->GetStrByName(szPropName, pValue) ||
  530. m_pRegistry->GetId(szPropName))
  531.     {
  532. if (pValue)
  533. {
  534.     // now add it to the pTACProps values
  535.     pTACProps->SetPropertyCString(szTACNames[n], pValue);
  536.     // if we have a track 
  537.     if (pTrack)
  538.     {
  539. pTrack->SetPropertyCString(szTACNames[n], pValue);
  540.     }
  541.     HX_RELEASE(pValue);
  542.     bFoundTAC = TRUE;
  543. }
  544. // set prop watch on this property (even if it has no TAC data so far - it may later!)
  545. pTACData->SetPropAndWatch(n, m_pRegistry->GetId(szPropName), m_pTACPropWatch);
  546.     }
  547. }
  548. // if we found some (we might not have) set them as the player TAC props
  549. if (bFoundTAC)
  550. {
  551.     RetrieveTACProperties(pTACProps);
  552. }
  553. SetTAC(m_pTACProps, TAC_Source);
  554. // cleanup
  555. HX_RELEASE(pTACProps);
  556. HX_RELEASE(pSourceName);
  557.     }
  558. #endif /* HELIX_FEATURE_REGISTRY */
  559.     // clean up track & group - if present
  560.     if (pTrack)
  561.     {
  562. HX_RELEASE(pTrack);
  563.     }
  564.     if (pGroup)
  565.     {
  566. HX_RELEASE(pGroup);
  567.     }
  568.     return bFoundTAC;
  569. }
  570. /************************************************************************
  571.  *      Method:
  572.  *          HXMasterTAC::RetrieveTACProperties
  573.  *      Purpose:
  574.  *          Get registry ID(hash_key) of the objects(player, source and stream)
  575.  *
  576.  */
  577. void HXMasterTAC::RetrieveTACProperties(IHXValues* pFromProps)
  578. {
  579.     IHXBuffer* pValue1 = NULL;
  580.     IHXBuffer* pValue2 = NULL;
  581.     IHXValues* pResult = NULL;
  582.     if (pFromProps)
  583.     {
  584. UINT16 nIdx;
  585. for(nIdx = 0; nIdx < NUMB_TAC_NAMES; nIdx++)
  586. {
  587.     pFromProps->GetPropertyCString(szTACNames[nIdx], pValue1);
  588.     if (pValue1)
  589.     {
  590. m_pTACProps->GetPropertyCString(szTACNames[nIdx], pValue2);
  591. if (!pValue2)
  592. {
  593.     m_pTACProps->SetPropertyCString(szTACNames[nIdx], pValue1);
  594. }
  595.      HX_RELEASE(pValue1);
  596. HX_RELEASE(pValue2);
  597.     }
  598. }
  599.     }
  600. }
  601. /************************************************************************
  602.  *      Method:
  603.  *          HXMasterTAC::SetTAC
  604.  *      Purpose:
  605.  *          Set TAC properties in registry using values in tacProps 
  606.  *
  607.  */
  608. void HXMasterTAC::SetTAC(IHXValues* tacProps, TACStatus status)
  609. {
  610.     // ignore new TAC settings unless this setting has a higher "status"
  611.     if (status < m_tacStatus)
  612.     {
  613. return;
  614.     }
  615.     // if we had Source based TAC before, and now we have a Track with
  616.     // TAC props (ie. from the SMIL) we want that to be it for the group
  617.     // so ignore any new mm sync events - clear all Source prop watches
  618.     if (status == TAC_Track && m_tacStatus == TAC_Source)
  619.     {
  620. // clear all TAC watches
  621. ResetTAC();
  622.     }
  623. #if defined(HELIX_FEATURE_REGISTRY)
  624.     // set values in registry
  625.     IHXBuffer* pValue = NULL;
  626.     for (int i=0; i<NUMB_TAC_NAMES; i++)
  627.     {
  628. tacProps->GetPropertyCString(szTACNames[i],pValue);    
  629. if (pValue)
  630. {
  631.     m_pRegistry->SetStrById(m_masterTACPropIDs[i], pValue);
  632.     HX_RELEASE(pValue);
  633. }
  634. else
  635. {
  636.     UCHAR nullString[1];
  637.     *nullString = '';
  638.     // set to blank string
  639.     pValue = new CHXBuffer();
  640.     pValue->AddRef();
  641.     pValue->Set(nullString, 1);
  642.     m_pRegistry->SetStrById(m_masterTACPropIDs[i], pValue);
  643.     HX_RELEASE(pValue);
  644. }
  645.     }
  646. #endif /* HELIX_FEATURE_REGISTRY */
  647.     // set new status
  648.     m_tacStatus = status;
  649. }
  650. /************************************************************************
  651.  *      Method:
  652.  *          TACData::SetPropAndWatch
  653.  *      Purpose:
  654.  *          Set a prop watch on the propID passed and save the ID
  655.  *     The propIndex value denotes which of the 4 TACA items we are setting
  656.  *
  657.  */
  658. void TACData::SetPropAndWatch(UINT32 propIndex, UINT32 propID, IHXPropWatch* pPropWatch)
  659. {   
  660.     // first save the propID in the appropriate member
  661.     if (propIndex == TitlePosition)
  662.     {
  663. m_titleID = propID;
  664.     }
  665.     else if (propIndex == AuthorPosition) 
  666.     {
  667. m_authorID = propID;
  668.     }
  669.     else if (propIndex == CopyrightPosition)
  670.     {
  671. m_copyrightID = propID;
  672.     }
  673.     else if (propIndex == AbstractPosition)
  674.     {
  675. m_abstractID = propID;
  676.     }
  677.     else if (propIndex == KeywordsPosition)
  678.     {
  679. m_keywordsID = propID;
  680.     }
  681.     else if (propIndex == DescriptionPosition )
  682.     {
  683. m_descriptionID = propID;
  684.     }
  685.     // set the prop watch
  686.     pPropWatch->SetWatchById(propID);
  687. }
  688. /************************************************************************
  689.  *      Method:
  690.  *          TACData::ClearAll
  691.  *      Purpose:
  692.  *          Clear all/any prop watches for this TAC objects prop IDs
  693.  *
  694.  */
  695. void TACData::ClearAll(IHXPropWatch* pPropWatch)
  696. {
  697.     if (m_titleID > 0)
  698.     {
  699. pPropWatch->ClearWatchById(m_titleID);
  700. m_titleID = 0;
  701.     }
  702.     if (m_authorID > 0)
  703.     {
  704. pPropWatch->ClearWatchById(m_authorID);
  705. m_authorID = 0;
  706.     }
  707.     if (m_copyrightID > 0)
  708.     {
  709. pPropWatch->ClearWatchById(m_copyrightID);
  710. m_copyrightID = 0;
  711.     }
  712.     if (m_abstractID > 0)
  713.     {
  714. pPropWatch->ClearWatchById(m_abstractID);
  715. m_abstractID = 0;
  716.     }
  717.     if (m_keywordsID > 0)
  718.     {
  719. pPropWatch->ClearWatchById(m_keywordsID);
  720. m_keywordsID = 0;
  721.     }
  722.     if (m_descriptionID > 0)
  723.     {
  724. pPropWatch->ClearWatchById(m_descriptionID);
  725. m_descriptionID = 0;
  726.     }
  727. }
  728. /************************************************************************
  729.  *      Method:
  730.  *          TACData::FindMasterID
  731.  *      Purpose:
  732.  *          Given a Source0 TAC prop id, find the correlating master ID
  733.  *
  734.  */
  735. UINT32 TACData::FindMasterIndex(UINT32 sourcePropID)
  736. {
  737.     UINT32 res = NoFind;  
  738.     if (m_titleID == sourcePropID)
  739.     {
  740. res = TitlePosition;
  741.     }
  742.     if (m_authorID == sourcePropID)
  743.     {
  744. res = AuthorPosition;
  745.     }
  746.     if (m_copyrightID == sourcePropID)
  747.     {
  748. res = CopyrightPosition;
  749.     }
  750.     if (m_abstractID == sourcePropID)
  751.     {
  752. res = AbstractPosition;
  753.     }
  754.     if (m_keywordsID == sourcePropID)
  755.     {
  756. res = KeywordsPosition;
  757.     }
  758.     
  759.     if (m_descriptionID == sourcePropID)
  760.     {
  761. res = DescriptionPosition;
  762.     }
  763.     return res;
  764. }
  765. /************************************************************************
  766.  *      Method:
  767.  *          TACData::IsIDPresent
  768.  *      Purpose:
  769.  *          Given a Source0 TAC prop id, find the correlating master ID
  770.  *
  771.  */
  772. BOOL TACData::IsIDPresent(UINT32 sourcePropID)
  773. {
  774.     BOOL res = FALSE;
  775.     if (m_titleID == sourcePropID || 
  776. m_authorID == sourcePropID || 
  777. m_copyrightID == sourcePropID || 
  778. m_abstractID == sourcePropID ||
  779. m_keywordsID == sourcePropID ||
  780.         m_descriptionID == sourcePropID ) 
  781.     {
  782. res = TRUE;
  783.     }
  784.     return res;
  785. }
  786. /************************************************************************
  787.  *      Method:
  788.  *          TACData::IsIDPresent
  789.  *      Purpose:
  790.  *          Given a Source0 TAC prop id, find the correlating master ID
  791.  *
  792.  */
  793. void TACData::Clear(UINT32 sourcePropID)
  794. {
  795.     if (m_titleID == sourcePropID)
  796.     {
  797. m_titleID = 0;
  798.     }
  799.     if (m_authorID == sourcePropID)
  800.     {
  801. m_authorID = 0;
  802.     }
  803.     if (m_copyrightID == sourcePropID)
  804.     {
  805. m_copyrightID = 0;
  806.     }
  807.     if (m_abstractID == sourcePropID)
  808.     {
  809. m_abstractID = 0;
  810.     }
  811.     if (m_keywordsID == sourcePropID)
  812.     {
  813. m_keywordsID = 0;
  814.     }
  815.     
  816.     if (m_descriptionID == sourcePropID)
  817.     {
  818. m_descriptionID = 0;
  819.     }
  820. }