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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: rpfile.cpp,v 1.1.26.1 2004/07/09 01:54:51 hubbe 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
  50. #include "hxtypes.h"
  51. #include "hxwintyp.h"
  52. #include "hxcom.h"
  53. #include "hxresult.h"
  54. #include "ihxpckts.h"
  55. // hxmisc
  56. #include "baseobj.h"
  57. #include "unkimp.h"
  58. // hxcont
  59. #include "hxbuffer.h"
  60. #include "hxslist.h"
  61. #include "hxmap.h"
  62. // pxcomlib
  63. #include "pxrect.h"
  64. #include "pxcolor.h"
  65. #include "pxeffect.h"
  66. #include "rpfile.h"
  67. // hxdebug
  68. #include "hxheap.h"
  69. #ifdef _DEBUG
  70. #undef HX_THIS_FILE
  71. static char HX_THIS_FILE[] = __FILE__;
  72. #endif
  73. BEGIN_INTERFACE_LIST(PXRealPixFile)
  74. END_INTERFACE_LIST
  75. PXRealPixFile::PXRealPixFile()
  76. {
  77.     m_pTitleStr           = NULL;
  78.     m_pAuthorStr          = NULL;
  79.     m_pCopyrightStr       = NULL;
  80.     m_ulStart             = 0;
  81.     m_ulDuration          = 0;
  82.     m_ulPreroll           = 0;
  83.     m_ulBitrate           = 0;
  84.     m_ulWidth             = 0;
  85.     m_ulHeight            = 0;
  86.     m_ulTimeFormat        = kTimeFormatMilliseconds;
  87.     m_ulBackgroundColor   = 0; // in 0x00RRGGBB format
  88.     m_ulBackgroundOpacity = 255;
  89.     m_ulDefaultMaxFps     = 0;
  90.     m_bDefaultAspectFlag  = TRUE;
  91.     m_bDefaultCenterFlag  = FALSE;
  92.     m_pDefaultURLStr      = NULL;
  93.     m_ulContentVersion    = HX_ENCODE_PROD_VERSION(0, 0, 0, 0);
  94.     m_pImageMap           = NULL;
  95.     m_pEffectsList        = NULL;
  96.     m_pFileNameStr        = NULL;
  97. }
  98. PXRealPixFile::~PXRealPixFile()
  99. {
  100.     HX_RELEASE(m_pTitleStr);
  101.     HX_RELEASE(m_pAuthorStr);
  102.     HX_RELEASE(m_pCopyrightStr);
  103.     HX_RELEASE(m_pDefaultURLStr);
  104.     ClearImageMap();
  105.     ClearEffectsList();
  106.     HX_DELETE(m_pImageMap);
  107.     HX_DELETE(m_pEffectsList);
  108.     HX_RELEASE(m_pFileNameStr);
  109. }
  110. void PXRealPixFile::ClearImageMap()
  111. {
  112.     if (m_pImageMap)
  113.     {
  114.         // Run through the map, deleting all image objects
  115.         POSITION pos = m_pImageMap->GetStartPosition();
  116.         while (pos)
  117.         {
  118.             // Get the object pointer at the current position
  119.             // and advance to the next position
  120.             LONG32 lKey     = 0;
  121.             void*  pElement = NULL;
  122.             m_pImageMap->GetNextAssoc(pos, lKey, pElement);
  123.             // Release the object
  124.             PXImageInfo* pInfo = (PXImageInfo*) pElement;
  125.             HX_DELETE(pInfo);
  126.         }
  127.         // Clear the map
  128.         m_pImageMap->RemoveAll();
  129.     }
  130. }
  131. void PXRealPixFile::ClearEffectsList()
  132. {
  133.     if (m_pEffectsList)
  134.     {
  135.         LISTPOSITION pos = m_pEffectsList->GetHeadPosition();
  136.         while (pos)
  137.         {
  138.             PXEffect* pEffect = (PXEffect*) m_pEffectsList->GetNext(pos);
  139.             HX_RELEASE(pEffect);
  140.         }
  141.         m_pEffectsList->RemoveAll();
  142.     }
  143. }
  144. HX_RESULT PXRealPixFile::AddImage(UINT32 ulHandle, const char* pszName)
  145. {
  146.     HX_RESULT retVal = HXR_OK;
  147.     IHXBuffer* pTmp = NULL;
  148.     retVal           = SetString(pszName, &pTmp);
  149.     if (SUCCEEDED(retVal))
  150.     {
  151.         retVal = AddImage(ulHandle, pTmp);
  152.     }
  153.     HX_RELEASE(pTmp);
  154.     return retVal;
  155. }
  156. HX_RESULT PXRealPixFile::AddImage(UINT32 ulHandle, IHXBuffer* pName)
  157. {
  158.     HX_RESULT retVal = HXR_OK;
  159.     if (ulHandle && pName)
  160.     {
  161.         if (!m_pImageMap)
  162.         {
  163.             m_pImageMap = new CHXMapLongToObj();
  164.             if (!m_pImageMap)
  165.             {
  166.                 retVal = HXR_OUTOFMEMORY;
  167.             }
  168.         }
  169.         if (SUCCEEDED(retVal))
  170.         {
  171.             // Create a PXImageInfo object
  172.             PXImageInfo* pInfo = new PXImageInfo;
  173.             if (pInfo)
  174.             {
  175.                 // Set the handle
  176.                 pInfo->m_ulHandle = ulHandle;
  177.                 // Set the string
  178.                 pInfo->m_pNameStr = pName;
  179.                 pInfo->m_pNameStr->AddRef();
  180.                 // Check if there is already an entry in the map
  181.                 void* pVoid    = NULL;
  182.                 BOOL  bPresent = m_pImageMap->Lookup((LONG32) ulHandle, pVoid);
  183.                 if (bPresent)
  184.                 {
  185.                     retVal = HXR_FAIL;
  186.                 }
  187.                 else
  188.                 {
  189.                     // Put the entry into the map
  190.                     m_pImageMap->SetAt((LONG32) ulHandle, (void*) pInfo);
  191.                 }
  192.             }
  193.             else
  194.             {
  195.                 retVal = HXR_OUTOFMEMORY;
  196.             }
  197.             if (FAILED(retVal))
  198.             {
  199.                 HX_DELETE(pInfo);
  200.             }
  201.         }
  202.     }
  203.     else
  204.     {
  205.         retVal = HXR_INVALID_PARAMETER;
  206.     }
  207.     return retVal;
  208. }
  209. UINT32 PXRealPixFile::GetNumImages() const
  210. {
  211.     UINT32 ulRet = 0;
  212.     if (m_pImageMap)
  213.     {
  214.         ulRet = m_pImageMap->GetCount();
  215.     }
  216.     return ulRet;
  217. }
  218. UINT32 PXRealPixFile::GetNumImagesWithNoSize() const
  219. {
  220.     UINT32 ulRet = 0;
  221.     if (m_pImageMap)
  222.     {
  223.         POSITION pos = m_pImageMap->GetStartPosition();
  224.         while (pos)
  225.         {
  226.             // Get the object pointer at the current position
  227.             // and advance to the next position
  228.             LONG32 lKey     = 0;
  229.             void*  pElement = NULL;
  230.             m_pImageMap->GetNextAssoc(pos, lKey, pElement);
  231.             // Check the PXImageInfo object
  232.             if (pElement)
  233.             {
  234.                 PXImageInfo* pInfo = (PXImageInfo*) pElement;
  235.                 if (pInfo->m_lErrorStatus != HXR_OK)
  236.                 {
  237.                     ulRet++;
  238.                 }
  239.             }
  240.         }
  241.     }
  242.     return ulRet;
  243. }
  244. HX_RESULT PXRealPixFile::GetImageIterator(REF(void*) rpIterator)
  245. {
  246.     HX_RESULT retVal = HXR_OK;
  247.     if (m_pImageMap)
  248.     {
  249.         POSITION pos = m_pImageMap->GetStartPosition();
  250.         if (pos)
  251.         {
  252.             rpIterator = pos;
  253.         }
  254.         else
  255.         {
  256.             retVal = HXR_FAIL;
  257.         }
  258.     }
  259.     else
  260.     {
  261.         retVal = HXR_NOT_INITIALIZED;
  262.     }
  263.     return retVal;
  264. }
  265. HX_RESULT PXRealPixFile::GetNextImageHandle(REF(void*) rpIterator, REF(UINT32) rulHandle)
  266. {
  267.     HX_RESULT retVal = HXR_OK;
  268.     if (m_pImageMap)
  269.     {
  270.         if (rpIterator)
  271.         {
  272.             // Get the object pointer at the current position
  273.             // and advance to the next position
  274.             LONG32 lKey     = 0;
  275.             void*  pElement = NULL;
  276.             m_pImageMap->GetNextAssoc(rpIterator, lKey, pElement);
  277.             // The handle *is* the key
  278.             rulHandle = (UINT32) lKey;
  279.         }
  280.         else
  281.         {
  282.             retVal = HXR_FAIL;
  283.         }
  284.     }
  285.     else
  286.     {
  287.         retVal = HXR_NOT_INITIALIZED;
  288.     }
  289.     return retVal;
  290. }
  291. BOOL PXRealPixFile::IsImagePresent(UINT32 ulHandle)
  292. {
  293.     BOOL bPresent = FALSE;
  294.     if (m_pImageMap)
  295.     {
  296.         void* pVoid = NULL;
  297.         bPresent    = m_pImageMap->Lookup((LONG32) ulHandle, pVoid);
  298.     }
  299.     return bPresent;
  300. }
  301. HX_RESULT PXRealPixFile::GetImageName(UINT32 ulHandle, REF(IHXBuffer*) rpNameStr)
  302. {
  303.     PXImageInfo* pInfo  = NULL;
  304.     HX_RESULT    retVal = GetImageInfo(ulHandle, pInfo);
  305.     if (SUCCEEDED(retVal))
  306.     {
  307.         if (pInfo->m_pNameStr)
  308.         {
  309.             HX_RELEASE(rpNameStr);
  310.             rpNameStr = pInfo->m_pNameStr;
  311.             rpNameStr->AddRef();
  312.         }
  313.         else
  314.         {
  315.             retVal = HXR_FAIL;
  316.         }
  317.     }
  318.     return retVal;
  319. }
  320. HX_RESULT PXRealPixFile::GetImageName(UINT32 ulHandle, REF(const char*) rpszName)
  321. {
  322.     PXImageInfo* pInfo  = NULL;
  323.     HX_RESULT    retVal = GetImageInfo(ulHandle, pInfo);
  324.     if (SUCCEEDED(retVal))
  325.     {
  326.         rpszName = (const char*) (pInfo->m_pNameStr ? pInfo->m_pNameStr->GetBuffer() : NULL);
  327.     }
  328.     return retVal;
  329. }
  330. const char* PXRealPixFile::GetImageName(UINT32 ulHandle)
  331. {
  332.     const char* pszName = NULL;
  333.     GetImageName(ulHandle, pszName);
  334.     return pszName;
  335. }
  336. HX_RESULT PXRealPixFile::SetImageName(UINT32 ulHandle, IHXBuffer* pNameStr)
  337. {
  338.     PXImageInfo* pInfo  = NULL;
  339.     HX_RESULT    retVal = GetImageInfo(ulHandle, pInfo);
  340.     if (SUCCEEDED(retVal))
  341.     {
  342.         HX_RELEASE(pInfo->m_pNameStr);
  343.         retVal = SetString(pNameStr, &pInfo->m_pNameStr);
  344.     }
  345.     return retVal;
  346. }
  347. HX_RESULT PXRealPixFile::SetImageName(UINT32 ulHandle, const char* pszName)
  348. {
  349.     PXImageInfo* pInfo  = NULL;
  350.     HX_RESULT    retVal = GetImageInfo(ulHandle, pInfo);
  351.     if (SUCCEEDED(retVal))
  352.     {
  353.         HX_RELEASE(pInfo->m_pNameStr);
  354.         retVal = SetString(pszName, &pInfo->m_pNameStr);
  355.     }
  356.     return retVal;
  357. }
  358. HX_RESULT PXRealPixFile::GetImageErrorStatus(UINT32 ulHandle, REF(HX_RESULT) rlStatus)
  359. {
  360.     PXImageInfo* pInfo  = NULL;
  361.     HX_RESULT    retVal = GetImageInfo(ulHandle, pInfo);
  362.     if (SUCCEEDED(retVal))
  363.     {
  364.         rlStatus = pInfo->m_lErrorStatus;
  365.     }
  366.     return retVal;
  367. }
  368. HX_RESULT PXRealPixFile::SetImageErrorStatus(UINT32 ulHandle, HX_RESULT lStatus)
  369. {
  370.     PXImageInfo* pInfo  = NULL;
  371.     HX_RESULT    retVal = GetImageInfo(ulHandle, pInfo);
  372.     if (SUCCEEDED(retVal))
  373.     {
  374.         pInfo->m_lErrorStatus = lStatus;
  375.     }
  376.     return retVal;
  377. }
  378. HX_RESULT PXRealPixFile::GetImageSize(UINT32 ulHandle, REF(UINT32) rulSize)
  379. {
  380.     PXImageInfo* pInfo  = NULL;
  381.     HX_RESULT    retVal = GetImageInfo(ulHandle, pInfo);
  382.     if (SUCCEEDED(retVal))
  383.     {
  384.         rulSize = pInfo->m_ulSize;
  385.     }
  386.     return retVal;
  387. }
  388. UINT32 PXRealPixFile::GetImageSize(UINT32 ulHandle)
  389. {
  390.     UINT32 ulSize = 0;
  391.     GetImageSize(ulHandle, ulSize);
  392.     return ulSize;
  393. }
  394. HX_RESULT PXRealPixFile::SetImageSize(UINT32 ulHandle, UINT32 ulSize)
  395. {
  396.     PXImageInfo* pInfo  = NULL;
  397.     HX_RESULT    retVal = GetImageInfo(ulHandle, pInfo);
  398.     if (SUCCEEDED(retVal))
  399.     {
  400.         if (ulSize)
  401.         {
  402.             pInfo->m_ulSize       = ulSize;
  403.             pInfo->m_lErrorStatus = HXR_OK;
  404.         }
  405.         else
  406.         {
  407.             retVal = HXR_FAIL;
  408.         }
  409.     }
  410.     return retVal;
  411. }
  412. BOOL PXRealPixFile::IsImageSizeInitialized(UINT32 ulHandle)
  413. {
  414.     BOOL         bRet  = FALSE;
  415.     PXImageInfo* pInfo = NULL;
  416.     GetImageInfo(ulHandle, pInfo);
  417.     if (pInfo && pInfo->m_lErrorStatus == HXR_OK)
  418.     {
  419.         bRet = TRUE;
  420.     }
  421.     return bRet;
  422. }
  423. HX_RESULT PXRealPixFile::GetImageFileMimeType(UINT32 ulHandle, REF(IHXBuffer*) rpMimeStr)
  424. {
  425.     PXImageInfo* pInfo  = NULL;
  426.     HX_RESULT    retVal = GetImageInfo(ulHandle, pInfo);
  427.     if (SUCCEEDED(retVal))
  428.     {
  429.         if (pInfo->m_pFileMimeStr)
  430.         {
  431.             HX_RELEASE(rpMimeStr);
  432.             rpMimeStr = pInfo->m_pFileMimeStr;
  433.             rpMimeStr->AddRef();
  434.         }
  435.         else
  436.         {
  437.             retVal = HXR_FAIL;
  438.         }
  439.     }
  440.     return retVal;
  441. }
  442. HX_RESULT PXRealPixFile::GetImageFileMimeType(UINT32 ulHandle, REF(const char*) rpszMime)
  443. {
  444.     PXImageInfo* pInfo  = NULL;
  445.     HX_RESULT    retVal = GetImageInfo(ulHandle, pInfo);
  446.     if (SUCCEEDED(retVal))
  447.     {
  448.         rpszMime = (const char*) (pInfo->m_pFileMimeStr ? pInfo->m_pFileMimeStr->GetBuffer() : NULL);
  449.     }
  450.     return retVal;
  451. }
  452. const char* PXRealPixFile::GetImageFileMimeType(UINT32 ulHandle)
  453. {
  454.     const char* pszMime = NULL;
  455.     GetImageFileMimeType(ulHandle, pszMime);
  456.     return pszMime;
  457. }
  458. HX_RESULT PXRealPixFile::SetImageFileMimeType(UINT32 ulHandle, IHXBuffer* pMimeStr)
  459. {
  460.     PXImageInfo* pInfo  = NULL;
  461.     HX_RESULT    retVal = GetImageInfo(ulHandle, pInfo);
  462.     if (SUCCEEDED(retVal))
  463.     {
  464.         HX_RELEASE(pInfo->m_pFileMimeStr);
  465.         retVal = SetString(pMimeStr, &pInfo->m_pFileMimeStr);
  466.     }
  467.     return retVal;
  468. }
  469. HX_RESULT PXRealPixFile::SetImageFileMimeType(UINT32 ulHandle, const char* pszMime)
  470. {
  471.     PXImageInfo* pInfo  = NULL;
  472.     HX_RESULT    retVal = GetImageInfo(ulHandle, pInfo);
  473.     if (SUCCEEDED(retVal))
  474.     {
  475.         HX_RELEASE(pInfo->m_pFileMimeStr);
  476.         retVal = SetString(pszMime, &pInfo->m_pFileMimeStr);
  477.     }
  478.     return retVal;
  479. }
  480. HX_RESULT PXRealPixFile::GetImageStreamMimeType(UINT32 ulHandle, REF(IHXBuffer*) rpMimeStr)
  481. {
  482.     PXImageInfo* pInfo  = NULL;
  483.     HX_RESULT    retVal = GetImageInfo(ulHandle, pInfo);
  484.     if (SUCCEEDED(retVal))
  485.     {
  486.         if (pInfo->m_pStreamMimeStr)
  487.         {
  488.             HX_RELEASE(rpMimeStr);
  489.             rpMimeStr = pInfo->m_pStreamMimeStr;
  490.             rpMimeStr->AddRef();
  491.         }
  492.         else
  493.         {
  494.             retVal = HXR_FAIL;
  495.         }
  496.     }
  497.     return retVal;
  498. }
  499. HX_RESULT PXRealPixFile::GetImageStreamMimeType(UINT32 ulHandle, REF(const char*) rpszMime)
  500. {
  501.     PXImageInfo* pInfo  = NULL;
  502.     HX_RESULT    retVal = GetImageInfo(ulHandle, pInfo);
  503.     if (SUCCEEDED(retVal))
  504.     {
  505.         rpszMime = (const char*) (pInfo->m_pStreamMimeStr ? pInfo->m_pStreamMimeStr->GetBuffer() : NULL);
  506.     }
  507.     return retVal;
  508. }
  509. const char* PXRealPixFile::GetImageStreamMimeType(UINT32 ulHandle)
  510. {
  511.     const char* pszMime = NULL;
  512.     GetImageStreamMimeType(ulHandle, pszMime);
  513.     return pszMime;
  514. }
  515. HX_RESULT PXRealPixFile::SetImageStreamMimeType(UINT32 ulHandle, IHXBuffer* pMimeStr)
  516. {
  517.     PXImageInfo* pInfo  = NULL;
  518.     HX_RESULT    retVal = GetImageInfo(ulHandle, pInfo);
  519.     if (SUCCEEDED(retVal))
  520.     {
  521.         HX_RELEASE(pInfo->m_pStreamMimeStr);
  522.         retVal = SetString(pMimeStr, &pInfo->m_pStreamMimeStr);
  523.     }
  524.     return retVal;
  525. }
  526. HX_RESULT PXRealPixFile::SetImageStreamMimeType(UINT32 ulHandle, const char* pszMime)
  527. {
  528.     PXImageInfo* pInfo  = NULL;
  529.     HX_RESULT    retVal = GetImageInfo(ulHandle, pInfo);
  530.     if (SUCCEEDED(retVal))
  531.     {
  532.         HX_RELEASE(pInfo->m_pStreamMimeStr);
  533.         retVal = SetString(pszMime, &pInfo->m_pStreamMimeStr);
  534.     }
  535.     return retVal;
  536. }
  537. HX_RESULT PXRealPixFile::GetAllImageInfo(UINT32 ulHandle, REF(UINT32) rulSize, REF(IHXBuffer*) rpNameStr,
  538.                                          REF(IHXBuffer*) rpFileMimeStr, REF(IHXBuffer*) rpStreamMimeStr)
  539. {
  540.     PXImageInfo* pInfo  = NULL;
  541.     HX_RESULT    retVal = GetImageInfo(ulHandle, pInfo);
  542.     if (SUCCEEDED(retVal))
  543.     {
  544.         rulSize        = pInfo->m_ulSize;
  545.         if (pInfo->m_pNameStr)
  546.         {
  547.             HX_RELEASE(rpNameStr);
  548.             rpNameStr = pInfo->m_pNameStr;
  549.             rpNameStr->AddRef();
  550.         }
  551.         if (pInfo->m_pFileMimeStr)
  552.         {
  553.             HX_RELEASE(rpFileMimeStr);
  554.             rpFileMimeStr = pInfo->m_pFileMimeStr;
  555.             rpFileMimeStr->AddRef();
  556.         }
  557.         if (pInfo->m_pStreamMimeStr)
  558.         {
  559.             HX_RELEASE(rpStreamMimeStr);
  560.             rpStreamMimeStr = pInfo->m_pStreamMimeStr;
  561.             rpStreamMimeStr->AddRef();
  562.         }
  563.     }
  564.     return retVal;
  565. }
  566. HX_RESULT PXRealPixFile::GetAllImageInfo(UINT32 ulHandle, REF(UINT32) rulSize, REF(const char*) rpszName,
  567.                                          REF(const char*) rpszFileMime, REF(const char*) rpszStreamMime)
  568. {
  569.     PXImageInfo* pInfo  = NULL;
  570.     HX_RESULT    retVal = GetImageInfo(ulHandle, pInfo);
  571.     if (SUCCEEDED(retVal))
  572.     {
  573.         rulSize        = pInfo->m_ulSize;
  574.         rpszName       = (const char*) (pInfo->m_pNameStr ? pInfo->m_pNameStr->GetBuffer() : NULL);
  575.         rpszFileMime   = (const char*) (pInfo->m_pFileMimeStr ? pInfo->m_pFileMimeStr->GetBuffer() : NULL);
  576.         rpszStreamMime = (const char*) (pInfo->m_pStreamMimeStr ? pInfo->m_pStreamMimeStr->GetBuffer() : NULL);
  577.     }
  578.     return retVal;
  579. }
  580. BOOL PXRealPixFile::AllImageSizesInitialized()
  581. {
  582.     BOOL bRet = TRUE;
  583.     if (m_pImageMap)
  584.     {
  585.         // Run through the map, deleting all image objects
  586.         POSITION pos = m_pImageMap->GetStartPosition();
  587.         while (pos)
  588.         {
  589.             // Get the object pointer at the current position
  590.             // and advance to the next position
  591.             LONG32 lKey     = 0;
  592.             void*  pElement = NULL;
  593.             m_pImageMap->GetNextAssoc(pos, lKey, pElement);
  594.             // Check the PXImageInfo object
  595.             if (pElement)
  596.             {
  597.                 PXImageInfo* pInfo = (PXImageInfo*) pElement;
  598.                 if (pInfo->m_lErrorStatus == HXR_NOT_INITIALIZED)
  599.                 {
  600.                     bRet = FALSE;
  601.                     break;
  602.                 }
  603.             }
  604.         }
  605.     }
  606.     return bRet;
  607. }
  608. BOOL PXRealPixFile::AllImageSizesOK()
  609. {
  610.     BOOL bRet = TRUE;
  611.     if (m_pImageMap)
  612.     {
  613.         // Run through the map, deleting all image objects
  614.         POSITION pos = m_pImageMap->GetStartPosition();
  615.         while (pos)
  616.         {
  617.             // Get the object pointer at the current position
  618.             // and advance to the next position
  619.             LONG32 lKey     = 0;
  620.             void*  pElement = NULL;
  621.             m_pImageMap->GetNextAssoc(pos, lKey, pElement);
  622.             // Check the PXImageInfo object
  623.             if (pElement)
  624.             {
  625.                 PXImageInfo* pInfo = (PXImageInfo*) pElement;
  626.                 if (pInfo->m_lErrorStatus != HXR_OK)
  627.                 {
  628.                     bRet = FALSE;
  629.                     break;
  630.                 }
  631.             }
  632.         }
  633.     }
  634.     return bRet;
  635. }
  636. HX_RESULT PXRealPixFile::GetFailedImageName(REF(IHXBuffer*) rpFailedNameStr)
  637. {
  638.     HX_RESULT retVal = HXR_FAIL;
  639.     if (m_pImageMap)
  640.     {
  641.         // Run through the map, deleting all image objects
  642.         POSITION pos = m_pImageMap->GetStartPosition();
  643.         while (pos)
  644.         {
  645.             // Get the object pointer at the current position
  646.             // and advance to the next position
  647.             LONG32 lKey     = 0;
  648.             void*  pElement = NULL;
  649.             m_pImageMap->GetNextAssoc(pos, lKey, pElement);
  650.             // Check the PXImageInfo object
  651.             if (pElement)
  652.             {
  653.                 PXImageInfo* pInfo = (PXImageInfo*) pElement;
  654.                 if (pInfo->m_lErrorStatus != HXR_OK)
  655.                 {
  656.                     if (pInfo->m_pNameStr)
  657.                     {
  658.                         HX_RELEASE(rpFailedNameStr);
  659.                         rpFailedNameStr = pInfo->m_pNameStr;
  660.                         rpFailedNameStr->AddRef();
  661.                         retVal = HXR_OK;
  662.                         break;
  663.                     }
  664.                 }
  665.             }
  666.         }
  667.     }
  668.     return retVal;
  669. }
  670. HX_RESULT PXRealPixFile::AddEffect(PXEffect* pEffect)
  671. {
  672.     HX_RESULT retVal = HXR_OK;
  673.     if (pEffect)
  674.     {
  675.         if (!m_pEffectsList)
  676.         {
  677.             m_pEffectsList = new CHXSimpleList();
  678.             if (!m_pEffectsList)
  679.             {
  680.                 retVal = HXR_OUTOFMEMORY;
  681.             }
  682.         }
  683.         if (SUCCEEDED(retVal))
  684.         {
  685.             // Check for a few shortcuts before searching the whole list
  686.             // If there aren't any elements in the queue, we know just to
  687.             // add ourselves to the end of the list.
  688.             if (m_pEffectsList->GetCount() > 0)
  689.             {
  690.                 // Now we check the last element in the queue. If our start time is
  691.                 // greater than or equal to its start time, then we know just to
  692.                 // add ourselves at the tail of the queue.
  693.                 PXEffect *pTailEffect = (PXEffect *) m_pEffectsList->GetTail();
  694.                 if (pTailEffect)
  695.                 {
  696.                     if (pEffect->GetStart() < pTailEffect->GetStart())
  697.                     {
  698.                         // Now we have to search the list.
  699.                         // Insert effect into list which is sorted by increasing start time
  700.                         // We look for the first effect which has a start time greater
  701.                         // than the one we're inserting
  702.                         LISTPOSITION pos = m_pEffectsList->GetHeadPosition();
  703.                         while (pos)
  704.                         {
  705.                             PXEffect *pListEffect = (PXEffect *) m_pEffectsList->GetAt(pos);
  706.                             if (pListEffect)
  707.                             {
  708.                                 if (pListEffect->GetStart() > pEffect->GetStart())
  709.                                 {
  710.                                     // Addref effect before insertion
  711.                                     pEffect->AddRef();
  712.                                     // Insert into the list
  713.                                     m_pEffectsList->InsertBefore(pos, (void *) pEffect);
  714.                                     break;
  715.                                 }
  716.                                 m_pEffectsList->GetNext(pos);
  717.                             }
  718.                             else
  719.                             {
  720.                                 retVal = HXR_FAIL;
  721.                                 break;
  722.                             }
  723.                         }
  724.                         // If we added ourselves in the above loop, then pos will be non-NULL.
  725.                         // If we DIDN'T add ourselves in the above loop, then pos will be NULL.
  726.                         if (!pos)
  727.                         {
  728.                             // We didn't find an effect with a start time greater, so
  729.                             // this effect must be the new largest start time, so
  730.                             // we add this effect to the tail of the list. 
  731.                             //
  732.                             pEffect->AddRef();
  733.                             m_pEffectsList->AddTail((void *) pEffect);
  734.                         }
  735.                     }
  736.                     else
  737.                     {
  738.                         // Addref before adding to the list
  739.                         pEffect->AddRef();
  740.                         // Add it to the list
  741.                         m_pEffectsList->AddTail((void *) pEffect);
  742.                     }
  743.                 }
  744.                 else
  745.                 {
  746.                     retVal = HXR_FAIL;
  747.                 }
  748.             }
  749.             else
  750.             {
  751.                 // Addref the effect object before adding to the list
  752.                 pEffect->AddRef();
  753.                 // Add it to the list
  754.                 m_pEffectsList->AddTail((void *) pEffect);
  755.             }
  756.         }
  757.     }
  758.     else
  759.     {
  760.         retVal = HXR_INVALID_PARAMETER;
  761.     }
  762.     return retVal;
  763. }
  764. UINT32 PXRealPixFile::GetNumEffects() const
  765. {
  766.     UINT32 ulRet = 0;
  767.     if (m_pEffectsList)
  768.     {
  769.         ulRet = m_pEffectsList->GetCount();
  770.     }
  771.     return ulRet;
  772. }
  773. HX_RESULT PXRealPixFile::GetEffectHeadIterator(REF(void*) rpIterator)
  774. {
  775.     HX_RESULT retVal = HXR_OK;
  776.     if (m_pEffectsList)
  777.     {
  778.         LISTPOSITION pos = m_pEffectsList->GetHeadPosition();
  779.         if (pos)
  780.         {
  781.             rpIterator = pos;
  782.         }
  783.         else
  784.         {
  785.             retVal = HXR_FAIL;
  786.         }
  787.     }
  788.     else
  789.     {
  790.         retVal = HXR_FAIL;
  791.     }
  792.     return retVal;
  793. }
  794. HX_RESULT PXRealPixFile::GetEffectTailIterator(REF(void*) rpIterator)
  795. {
  796.     HX_RESULT retVal = HXR_OK;
  797.     if (m_pEffectsList)
  798.     {
  799.         LISTPOSITION pos = m_pEffectsList->GetTailPosition();
  800.         if (pos)
  801.         {
  802.             rpIterator = pos;
  803.         }
  804.         else
  805.         {
  806.             retVal = HXR_FAIL;
  807.         }
  808.     }
  809.     else
  810.     {
  811.         retVal = HXR_FAIL;
  812.     }
  813.     return retVal;
  814. }
  815. HX_RESULT PXRealPixFile::GetAtNextEffect(REF(void*) rpIterator, REF(PXEffect*) rpEffect)
  816. {
  817.     HX_RESULT retVal = HXR_OK;
  818.     if (m_pEffectsList)
  819.     {
  820.         if (rpIterator)
  821.         {
  822.             rpEffect = (PXEffect*) m_pEffectsList->GetAtNext(rpIterator);
  823.             if (rpEffect)
  824.             {
  825.                 rpEffect->AddRef();
  826.             }
  827.             else
  828.             {
  829.                 retVal = HXR_FAIL;
  830.             }
  831.         }
  832.         else
  833.         {
  834.             retVal = HXR_FAIL;
  835.         }
  836.     }
  837.     else
  838.     {
  839.         retVal = HXR_NOT_INITIALIZED;
  840.     }
  841.     return retVal;
  842. }
  843. HX_RESULT PXRealPixFile::GetNextEffect(REF(void*) rpIterator, REF(PXEffect*) rpEffect)
  844. {
  845.     HX_RESULT retVal = HXR_OK;
  846.     if (m_pEffectsList)
  847.     {
  848.         if (rpIterator)
  849.         {
  850.             rpEffect = (PXEffect*) m_pEffectsList->GetNext(rpIterator);
  851.             if (rpEffect)
  852.             {
  853.                 rpEffect->AddRef();
  854.             }
  855.             else
  856.             {
  857.                 retVal = HXR_FAIL;
  858.             }
  859.         }
  860.         else
  861.         {
  862.             retVal = HXR_FAIL;
  863.         }
  864.     }
  865.     else
  866.     {
  867.         retVal = HXR_NOT_INITIALIZED;
  868.     }
  869.     return retVal;
  870. }
  871. HX_RESULT PXRealPixFile::GetPrevEffect(REF(void*) rpIterator, REF(PXEffect*) rpEffect)
  872. {
  873.     HX_RESULT retVal = HXR_OK;
  874.     if (m_pEffectsList)
  875.     {
  876.         if (rpIterator)
  877.         {
  878.             rpEffect = (PXEffect*) m_pEffectsList->GetPrev(rpIterator);
  879.             if (rpEffect)
  880.             {
  881.                 rpEffect->AddRef();
  882.             }
  883.             else
  884.             {
  885.                 retVal = HXR_FAIL;
  886.             }
  887.         }
  888.         else
  889.         {
  890.             retVal = HXR_FAIL;
  891.         }
  892.     }
  893.     else
  894.     {
  895.         retVal = HXR_NOT_INITIALIZED;
  896.     }
  897.     return retVal;
  898. }
  899. HX_RESULT PXRealPixFile::GetCurrentEffect(void* pIterator, REF(PXEffect*) rpEffect)
  900. {
  901.     HX_RESULT retVal = HXR_OK;
  902.     if (m_pEffectsList)
  903.     {
  904.         if (pIterator)
  905.         {
  906.             rpEffect = (PXEffect*) m_pEffectsList->GetAt(pIterator);
  907.             if (rpEffect)
  908.             {
  909.                 rpEffect->AddRef();
  910.             }
  911.             else
  912.             {
  913.                 retVal = HXR_FAIL;
  914.             }
  915.         }
  916.         else
  917.         {
  918.             retVal = HXR_FAIL;
  919.         }
  920.     }
  921.     else
  922.     {
  923.         retVal = HXR_NOT_INITIALIZED;
  924.     }
  925.     return retVal;
  926. }
  927. HX_RESULT PXRealPixFile::GetImageInfo(UINT32 ulHandle, REF(PXImageInfo*) rpInfo)
  928. {
  929.     HX_RESULT retVal = HXR_OK;
  930.     if (m_pImageMap)
  931.     {
  932.         void *pVoid   = NULL;
  933.         BOOL bPresent = m_pImageMap->Lookup((LONG32) ulHandle, pVoid);
  934.         if (bPresent && pVoid)
  935.         {
  936.             rpInfo = (PXImageInfo*) pVoid;
  937.         }
  938.         else
  939.         {
  940.             retVal = HXR_FAIL;
  941.         }
  942.     }
  943.     else
  944.     {
  945.         retVal = HXR_NOT_INITIALIZED;
  946.     }
  947.     return retVal;
  948. }
  949. HX_RESULT PXRealPixFile::PostParseInit()
  950. {
  951.     HX_RESULT retVal = HXR_OK;
  952.     // First we need to set the first and last use effect flags.
  953.     // To set the first use flags, we initialize a map and
  954.     // run forward through the list of effects. Whenever we see
  955.     // an image used, we check to see if there's an entry in the
  956.     // map already. If not, then it's the first time this image
  957.     // has been used, so we mark the first use flag as true
  958.     // and then put an entry in the map. For last use flags,
  959.     // we do the same thing, but run through the effects in reverse.
  960.     //
  961.     // First, create the map
  962.     CHXMapLongToObj* pMap = new CHXMapLongToObj();
  963.     if (pMap)
  964.     {
  965.         // Now do a forward run through the effects
  966.         PXEffect*    pEffect = NULL;
  967.         LISTPOSITION pos     = m_pEffectsList->GetHeadPosition();
  968.         while (pos)
  969.         {
  970.             pEffect = (PXEffect*) m_pEffectsList->GetNext(pos);
  971.             if (pEffect)
  972.             {
  973.                 if (pEffect->HasTarget())
  974.                 {
  975.                     // Is there already an entry in the map for this image?
  976.                     void* pVoid    = NULL;
  977.                     BOOL  bPresent = pMap->Lookup((LONG32) pEffect->GetTarget(), pVoid);
  978.                     if (bPresent)
  979.                     {
  980.                         // This image has already been used, so clear the FirstUse flag
  981.                         pEffect->SetFirstUse(FALSE);
  982.                     }
  983.                     else
  984.                     {
  985.                         // This image has NOT been used so far, so set the FirstUse flag
  986.                         pEffect->SetFirstUse(TRUE);
  987.                         // And also put an entry in the map for this image. It
  988.                         // doesn't matter what the entry is, just that there IS
  989.                         // an entry in the map
  990.                         pMap->SetAt((LONG32) pEffect->GetTarget(), (void*) 1);
  991.                     }
  992.                 }
  993.             }
  994.         }
  995.         // Now clear the map to get ready for a backwards run
  996.         pMap->RemoveAll();
  997.         // Now run through the effects in reverse, doing the same thing
  998.         pos = m_pEffectsList->GetTailPosition();
  999.         while (pos)
  1000.         {
  1001.             PXEffect* pEffect = (PXEffect*) m_pEffectsList->GetPrev(pos);
  1002.             if (pEffect)
  1003.             {
  1004.                 if (pEffect->HasTarget())
  1005.                 {
  1006.                     // Is there already an entry in the map for this image?
  1007.                     void* pVoid    = NULL;
  1008.                     BOOL  bPresent = pMap->Lookup((LONG32) pEffect->GetTarget(), pVoid);
  1009.                     if (bPresent)
  1010.                     {
  1011.                         // This image has already been used, so clear the LastUse flag
  1012.                         pEffect->SetLastUse(FALSE);
  1013.                     }
  1014.                     else
  1015.                     {
  1016.                         // This image has NOT been used so far, so set the LastUse flag
  1017.                         pEffect->SetLastUse(TRUE);
  1018.                         // And also put an entry in the map for this image. It
  1019.                         // doesn't matter what the entry is, just that there IS
  1020.                         // an entry in the map
  1021.                         pMap->SetAt((LONG32) pEffect->GetTarget(), (void*) 1);
  1022.                     }
  1023.                 }
  1024.             }
  1025.         }
  1026.     }
  1027.     else
  1028.     {
  1029.         retVal = HXR_OUTOFMEMORY;
  1030.     }
  1031.     HX_DELETE(pMap);
  1032.     // Now we need to check if we need to compute the duration. If the duration is
  1033.     // still zero at this point, then it was never set in parsing. Therefore,
  1034.     // we need to calculate it from the effects
  1035.     if (!m_ulDuration)
  1036.     {
  1037.         // Run through the effects list, find the max end time.
  1038.         UINT32       ulMaxTime = 0;
  1039.         LISTPOSITION pos       = m_pEffectsList->GetHeadPosition();
  1040.         while (pos)
  1041.         {
  1042.             PXEffect* pEffect = (PXEffect*) m_pEffectsList->GetNext(pos);
  1043.             if (pEffect)
  1044.             {
  1045.                 if (pEffect->GetEnd() > ulMaxTime)
  1046.                 {
  1047.                     ulMaxTime = pEffect->GetEnd();
  1048.                 }
  1049.             }
  1050.         }
  1051.         // We don't let the duration be exactly zero.
  1052.         if (!ulMaxTime)
  1053.         {
  1054.             ulMaxTime = kMinDuration;
  1055.         }
  1056.         // Now set the duration of the presentation to this duration
  1057.         m_ulDuration = ulMaxTime;
  1058.     }
  1059.     return retVal;
  1060. }