hxtac.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:24k
源码类别:

Symbian

开发平台:

Visual C++

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