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

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. // system
  36. #include "hlxclib/stdio.h"
  37. #include "hlxclib/string.h"
  38. // include
  39. #include "hxtypes.h"
  40. #include "hxcom.h"
  41. #include "hxresult.h"
  42. #include "hxcomm.h"
  43. #include "ihxpckts.h"
  44. #include "hxxres.h"
  45. #include "hxxrsmg.h"
  46. // coreres
  47. #include "pixres.h"
  48. // pxcomlib
  49. #include "pxerror.h"
  50. // hxdebug
  51. #include "hxassert.h"
  52. #include "hxheap.h"
  53. #ifdef _DEBUG
  54. #undef HX_THIS_FILE     
  55. static char HX_THIS_FILE[] = __FILE__;
  56. #endif
  57. const PXError::PXErrorString PXError::m_pErrorTable[] = 
  58. {
  59.     { IDS_ERR_PIX_NOTLICENSED,     ERRSTR_PIX_NOTLICENSED     },
  60.     { IDS_ERR_PIX_BADEXTENSION,    ERRSTR_PIX_BADEXTENSION    },
  61.     { IDS_ERR_PIX_NOCODEC,         ERRSTR_PIX_NOCODEC         },
  62.     { IDS_ERR_PIX_MISSINGFILE,     ERRSTR_PIX_MISSINGFILE     },
  63.     { IDS_ERR_PIX_NOSTART,         ERRSTR_PIX_NOSTART         },
  64.     { IDS_ERR_PIX_NOEND,           ERRSTR_PIX_NOEND           },
  65.     { IDS_ERR_PIX_NOXMLEND,        ERRSTR_PIX_NOXMLEND        },
  66.     { IDS_ERR_PIX_NULLTITLE,       ERRSTR_PIX_NULLTITLE       },
  67.     { IDS_ERR_PIX_NULLAUTHOR,      ERRSTR_PIX_NULLAUTHOR      },
  68.     { IDS_ERR_PIX_NULLCOPYRIGHT,   ERRSTR_PIX_NULLCOPYRIGHT   },
  69.     { IDS_ERR_PIX_NULLVERSION,     ERRSTR_PIX_NULLVERSION     },
  70.     { IDS_ERR_PIX_BADTIMEFORMAT,   ERRSTR_PIX_BADTIMEFORMAT   },
  71.     { IDS_ERR_PIX_BADSTARTTIME,    ERRSTR_PIX_BADSTARTTIME    },
  72.     { IDS_ERR_PIX_BADPREROLL,      ERRSTR_PIX_BADPREROLL      },
  73.     { IDS_ERR_PIX_NULLURL,         ERRSTR_PIX_NULLURL         },
  74.     { IDS_ERR_PIX_URLALLWHITE,     ERRSTR_PIX_URLALLWHITE     },
  75.     { IDS_ERR_PIX_BADDURATION,     ERRSTR_PIX_BADDURATION     },
  76.     { IDS_ERR_PIX_ZERODURATION,    ERRSTR_PIX_ZERODURATION    },
  77.     { IDS_ERR_PIX_NOBITRATE,       ERRSTR_PIX_NOBITRATE       },
  78.     { IDS_ERR_PIX_BADBITRATE,      ERRSTR_PIX_BADBITRATE      },
  79.     { IDS_ERR_PIX_NOWIDTH,         ERRSTR_PIX_NOWIDTH         },
  80.     { IDS_ERR_PIX_NOHEIGHT,        ERRSTR_PIX_NOHEIGHT        },
  81.     { IDS_ERR_PIX_UNKNOWNTAG,      ERRSTR_PIX_UNKNOWNTAG      },
  82.     { IDS_ERR_PIX_INVALIDHEAD,     ERRSTR_PIX_INVALIDHEAD     },
  83.     { IDS_ERR_PIX_NOEFFECTS,       ERRSTR_PIX_NOEFFECTS       },
  84.     { IDS_ERR_PIX_NODURNOEFFECT,   ERRSTR_PIX_NODURNOEFFECT   },
  85.     { IDS_ERR_PIX_INVALIDEFFECTS,  ERRSTR_PIX_INVALIDEFFECTS  },
  86.     { IDS_ERR_PIX_NOHANDLE,        ERRSTR_PIX_NOHANDLE        },
  87.     { IDS_ERR_PIX_BADHANDLE,       ERRSTR_PIX_BADHANDLE       },
  88.     { IDS_ERR_PIX_NONAME,          ERRSTR_PIX_NONAME          },
  89.     { IDS_ERR_PIX_NULLNAME,        ERRSTR_PIX_NULLNAME        },
  90.     { IDS_ERR_PIX_BADEFFECT,       ERRSTR_PIX_BADEFFECT       },
  91.     { IDS_ERR_PIX_GENERALERROR,    ERRSTR_PIX_GENERALERROR    },
  92.     { IDS_ERR_PIX_BADASPECTFLAG,   ERRSTR_PIX_BADASPECTFLAG   },
  93.     { IDS_ERR_PIX_UNKHEADATTR,     ERRSTR_PIX_UNKHEADATTR     },
  94.     { IDS_ERR_PIX_BADATTRIBUTE,    ERRSTR_PIX_BADATTRIBUTE    },
  95.     { IDS_ERR_PIX_MISSINGSTART,    ERRSTR_PIX_MISSINGSTART    },
  96.     { IDS_ERR_PIX_MISSINGDURATION, ERRSTR_PIX_MISSINGDURATION },
  97.     { IDS_ERR_PIX_MISSINGCOLOR,    ERRSTR_PIX_MISSINGCOLOR    },
  98.     { IDS_ERR_PIX_BADCOLOR,        ERRSTR_PIX_BADCOLOR        },
  99.     { IDS_ERR_PIX_MISSINGTARGET,   ERRSTR_PIX_MISSINGTARGET   },
  100.     { IDS_ERR_PIX_MISSINGNAME,     ERRSTR_PIX_MISSINGNAME     },
  101.     { IDS_ERR_PIX_MISSINGPACKAGE,  ERRSTR_PIX_MISSINGPACKAGE  },
  102.     { IDS_ERR_PIX_BADBOOL,         ERRSTR_PIX_BADBOOL         },
  103.     { IDS_ERR_PIX_BADWIPEDIR,      ERRSTR_PIX_BADWIPEDIR      },
  104.     { IDS_ERR_PIX_BADWIPETYPE,     ERRSTR_PIX_BADWIPETYPE     },
  105.     { IDS_ERR_PIX_BADBGCOLOR,      ERRSTR_PIX_BADBGCOLOR      },
  106.     { IDS_ERR_PIX_ILLEGALATTR,     ERRSTR_PIX_ILLEGALATTR     },
  107.     { IDS_ERR_PIX_MISSREQATTR,     ERRSTR_PIX_MISSREQATTR     },
  108.     { IDS_ERR_PIX_ROOTNOTFIRST,    ERRSTR_PIX_ROOTNOTFIRST    },
  109.     { IDS_ERR_PIX_HEADNOTFIRST,    ERRSTR_PIX_HEADNOTFIRST    },
  110.     { IDS_ERR_PIX_BADATTRVALUE,    ERRSTR_PIX_BADATTRVALUE    },
  111.     { IDS_ERR_PIX_BADDSTRECT,      ERRSTR_PIX_BADDSTRECT      },
  112.     { IDS_ERR_PIX_BADCENTERFLAG,   ERRSTR_PIX_BADCENTERFLAG   },
  113.     { IDS_ERR_PIX_FUTUREVERSION,   ERRSTR_PIX_FUTUREVERSION   },
  114.     { IDS_ERR_PIX_INCOMPATVERSION, ERRSTR_PIX_INCOMPATVERSION },
  115.     { IDS_ERR_PIX_DUPHANDLE,       ERRSTR_PIX_DUPHANDLE       },
  116.     { IDS_ERR_PIX_ZEROSIZE,        ERRSTR_PIX_ZEROSIZE        },
  117.     { 0,                           NULL                       }
  118. };
  119. PXError::PXError(IUnknown* pContext)
  120. {
  121.     if (pContext)
  122.     {
  123.         m_pContext = pContext;
  124.         m_pContext->AddRef();
  125.     }
  126. }
  127. PXError::~PXError()
  128. {
  129.     HX_RELEASE(m_pContext);
  130. }
  131. HX_RESULT PXError::SetError(UINT32 ulErrorID, UINT32 ulLine, UINT32 ulCol,
  132.                             const char* pszArg1, const char* pszArg2,
  133.                             REF(IHXBuffer*) rpErrStr)
  134. {
  135.     HX_RESULT retVal = HXR_OK;
  136.     const char*    pszFormat = NULL;
  137.     IHXXResource* pRes      = NULL;
  138.     retVal                   = GetErrorResource(ulErrorID, pRes);
  139.     if (SUCCEEDED(retVal))
  140.     {
  141.         pszFormat = (const char*) pRes->ResourceData();
  142.     }
  143.     else
  144.     {
  145.         retVal = GetDefaultErrorFormatString(ulErrorID, pszFormat);
  146.     }
  147.     if (SUCCEEDED(retVal))
  148.     {
  149.         // Make sure num args provided and num args in format string match up
  150.         UINT32 ulNumFormatArgs = CountArguments(pszFormat);
  151.         UINT32 ulNumArgs       = 0;
  152.         if (pszArg1)
  153.         {
  154.             ulNumArgs++;
  155.         }
  156.         if (pszArg2)
  157.         {
  158.             ulNumArgs++;
  159.         }
  160.         // Only display the error if the number of arguments match up
  161.         HX_ASSERT(ulNumFormatArgs == ulNumArgs);
  162.         if (ulNumFormatArgs == ulNumArgs)
  163.         {
  164.             // Create a new format string with line and column in it
  165.             // pszFormat is the format string we got from the resource lookup
  166.             // pszFormat1 is the template for the new format string
  167.             // pszFormat2 is the new format string
  168.             // Max size of pszFormat2 = strlen(pszFormat1) +
  169.             //                          strlen(pszFormat)  +
  170.             //                          2*MAX_UINT32_STRING_SIZE + 1
  171.             //                        = strlen(") + strlen(") + 21
  172.             const char* pszFormat1 = "%s (line %lu, column %lu)";
  173.             UINT32      ulMaxSize  = strlen(pszFormat1) + strlen(pszFormat) + 21;
  174.             char*       pszFormat2 = new char [ulMaxSize];
  175.             if (pszFormat2)
  176.             {
  177.                 // Create the new format string
  178.                 sprintf(pszFormat2, pszFormat1, pszFormat, ulLine, ulCol); /* Flawfinder: ignore */
  179.                 // Create the error string
  180.                 //
  181.                 // Max size of error string = strlen(pszFormat2) +
  182.                 //                            strlen(pszArg1)    +
  183.                 //                            strlen(pszArg2)    + 1
  184.                 // 
  185.                 ulMaxSize = strlen(pszFormat2) +
  186.                             (pszArg1 ? strlen(pszArg1) : 0) +
  187.                             (pszArg2 ? strlen(pszArg2) : 0) + 1;
  188.                 char* pszErr = new char [ulMaxSize];
  189.                 if (pszErr)
  190.                 {
  191.                     switch(ulNumArgs)
  192.                     {
  193.                         case 0:
  194.                             strcpy(pszErr, pszFormat2); /* Flawfinder: ignore */
  195.                             break;
  196.                         case 1:
  197.                             sprintf(pszErr, pszFormat2, pszArg1); /* Flawfinder: ignore */
  198.                             break;
  199.                         case 2:
  200.                             sprintf(pszErr, pszFormat2, pszArg1, pszArg2); /* Flawfinder: ignore */
  201.                             break;
  202.                         default:
  203.                             pszErr[0] = '';
  204.                     }
  205.                     retVal = SetString(pszErr, rpErrStr);
  206.                 }
  207.                 HX_VECTOR_DELETE(pszErr);
  208.             }
  209.             HX_VECTOR_DELETE(pszFormat2);
  210.         }
  211.     }
  212.     HX_RELEASE(pRes);
  213.     return retVal;
  214. }
  215. HX_RESULT PXError::SetError(UINT32 ulErrorID, const char* pszArg1,
  216.                             const char* pszArg2, REF(IHXBuffer*) rpErrStr)
  217. {
  218.     HX_RESULT retVal = HXR_OK;
  219.     const char*    pszFormat = NULL;
  220.     IHXXResource* pRes      = NULL;
  221.     retVal                   = GetErrorResource(ulErrorID, pRes);
  222.     if (SUCCEEDED(retVal))
  223.     {
  224.         pszFormat = (const char*) pRes->ResourceData();
  225.     }
  226.     else
  227.     {
  228.         retVal = GetDefaultErrorFormatString(ulErrorID, pszFormat);
  229.     }
  230.     if (SUCCEEDED(retVal))
  231.     {
  232.         // Make sure num args provided and num args in format string match up
  233.         UINT32 ulNumFormatArgs = CountArguments(pszFormat);
  234.         UINT32 ulNumArgs       = 0;
  235.         if (pszArg1)
  236.         {
  237.             ulNumArgs++;
  238.         }
  239.         if (pszArg2)
  240.         {
  241.             ulNumArgs++;
  242.         }
  243.         // Only display the error if the number of arguments match up
  244.         HX_ASSERT(ulNumFormatArgs == ulNumArgs);
  245.         if (ulNumFormatArgs == ulNumArgs)
  246.         {
  247.             // Create error string
  248.             //
  249.             // Max size of error string = strlen(pszFormat) +
  250.             //                            strlen(pszArg1)   +
  251.             //                            strlen(pszArg2)   + 1
  252.             UINT32 ulMaxSize = strlen(pszFormat)               +
  253.                                (pszArg1 ? strlen(pszArg1) : 0) +
  254.                                (pszArg2 ? strlen(pszArg2) : 0) + 1;
  255.             char* pszErr = new char [ulMaxSize];
  256.             if (pszErr)
  257.             {
  258.                 switch (ulNumArgs)
  259.                 {
  260.                     case 0:
  261.                         strcpy(pszErr, pszFormat); /* Flawfinder: ignore */
  262.                         break;
  263.                     case 1:
  264.                         sprintf(pszErr, pszFormat, pszArg1); /* Flawfinder: ignore */
  265.                         break;
  266.                     case 2:
  267.                         sprintf(pszErr, pszFormat, pszArg1, pszArg2); /* Flawfinder: ignore */
  268.                         break;
  269.                     default:
  270.                         pszErr[0] = '';
  271.                 }
  272.                 retVal = SetString(pszErr, rpErrStr);
  273.             }
  274.             HX_VECTOR_DELETE(pszErr);
  275.         }
  276.     }
  277.     HX_RELEASE(pRes);
  278.     return retVal;
  279. }
  280. HX_RESULT PXError::SetError(const char* pszFileName, UINT32 ulErrorID, UINT32 ulLine,
  281.                             UINT32 ulCol, const char* pszArg1, const char* pszArg2,
  282.                             REF(IHXBuffer*) rpErrStr)
  283. {
  284.     HX_RESULT retVal = HXR_OK;
  285.     const char*    pszFormat = NULL;
  286.     IHXXResource* pRes      = NULL;
  287.     retVal                   = GetErrorResource(ulErrorID, pRes);
  288.     if (SUCCEEDED(retVal))
  289.     {
  290.         pszFormat = (const char*) pRes->ResourceData();
  291.     }
  292.     else
  293.     {
  294.         retVal = GetDefaultErrorFormatString(ulErrorID, pszFormat);
  295.     }
  296.     if (SUCCEEDED(retVal))
  297.     {
  298.         // Make sure num args provided and num args in format string match up
  299.         UINT32 ulNumFormatArgs = CountArguments(pszFormat);
  300.         UINT32 ulNumArgs       = 0;
  301.         if (pszArg1)
  302.         {
  303.             ulNumArgs++;
  304.         }
  305.         if (pszArg2)
  306.         {
  307.             ulNumArgs++;
  308.         }
  309.         // Only display the error if the number of arguments match up
  310.         HX_ASSERT(ulNumFormatArgs == ulNumArgs);
  311.         if (ulNumFormatArgs == ulNumArgs)
  312.         {
  313.             // Create a new format string from the resource format string
  314.             //
  315.             const char* pszFormat1 = "(%s): %s (line %lu, column %lu)";
  316.             // The max size of the new format string = strlen(pszFormat1)  +
  317.             //                                         strlen(pszFileName) +
  318.             //                                         strlen(pszFormat)   +
  319.             //                                         2*MAX_SIZE_OF_UINT32 string + 1
  320.             //                                       = strlen(") + strlen(") + strlen(") + 21;
  321.             UINT32 ulMaxSize = strlen(pszFormat1)  +
  322.                                strlen(pszFileName) +
  323.                                strlen(pszFormat)   + 21;
  324.             char* pszFormat2 = new char [ulMaxSize];
  325.             if (pszFormat2)
  326.             {
  327.                 // Create the format string
  328.                 sprintf(pszFormat2, pszFormat1, pszFileName, pszFormat, ulLine, ulCol); /* Flawfinder: ignore */
  329.                 // Create the error string
  330.                 //
  331.                 // The max size of the error string = strlen(pszFormat2) +
  332.                 //                                    strlen(pszArg1)    +
  333.                 //                                    strlen(pszArg2)    + 1
  334.                 ulMaxSize = strlen(pszFormat2) +
  335.                             (pszArg1 ? strlen(pszArg1) : 0) +
  336.                             (pszArg2 ? strlen(pszArg2) : 0) + 1;
  337.                 char* pszErr = new char [ulMaxSize];
  338.                 if (pszErr)
  339.                 {
  340.                     switch (ulNumArgs)
  341.                     {
  342.                         case 0:
  343.                             strcpy(pszErr, pszFormat2); /* Flawfinder: ignore */
  344.                             break;
  345.                         case 1:
  346.                             sprintf(pszErr, pszFormat2, pszArg1); /* Flawfinder: ignore */
  347.                             break;
  348.                         case 2:
  349.                             sprintf(pszErr, pszFormat2, pszArg1, pszArg2); /* Flawfinder: ignore */
  350.                             break;
  351.                         default:
  352.                             pszErr[0] = '';
  353.                     }
  354.                     retVal = SetString(pszErr, rpErrStr);
  355.                 }
  356.                 HX_VECTOR_DELETE(pszErr);
  357.             }
  358.             HX_VECTOR_DELETE(pszFormat2);
  359.         }
  360.     }
  361.     HX_RELEASE(pRes);
  362.     return retVal;
  363. }
  364. HX_RESULT PXError::GetErrorResource(UINT32 ulErrorID, REF(IHXXResource*) rpResource)
  365. {
  366.     HX_RESULT retVal = HXR_OK;
  367.     if (m_pContext)
  368.     {
  369.         IHXExternalResourceManager* pMgr = NULL;
  370.         retVal = m_pContext->QueryInterface(IID_IHXExternalResourceManager, (void**) &pMgr);
  371.         if (SUCCEEDED(retVal))
  372.         {
  373.             IHXExternalResourceReader* pRdr = NULL;
  374.             retVal = pMgr->CreateExternalResourceReader(CORE_RESOURCE_SHORT_NAME, pRdr);
  375.             if (SUCCEEDED(retVal))
  376.             {
  377.                 IHXXResource* pRes = pRdr->GetResource(HX_RT_STRING, ulErrorID);
  378.                 if(pRes)
  379.                 {
  380.                     HX_RELEASE(rpResource);
  381.                     rpResource = pRes;
  382.                     rpResource->AddRef();
  383.                 }
  384.                 else
  385.                 {
  386.                     retVal = HXR_FAIL;
  387.                 }
  388.                 HX_RELEASE(pRes);
  389.             }
  390.             HX_RELEASE(pRdr);
  391.         }
  392.         HX_RELEASE(pMgr);
  393.     }
  394.     else
  395.     {
  396.         retVal = HXR_UNEXPECTED;
  397.     }
  398.     return retVal;
  399. }
  400. HX_RESULT PXError::GetDefaultErrorFormatString(UINT32 ulErrorID, REF(const char*) rpszFormat)
  401. {
  402.     HX_RESULT retVal = HXR_FAIL;
  403.     // Search the table
  404.     PXErrorString* pErr = (PXErrorString*) m_pErrorTable;
  405.     while (pErr->m_pszString)
  406.     {
  407.         if (ulErrorID == pErr->m_ulStringID)
  408.         {
  409.             break;
  410.         }
  411.         pErr++;
  412.     }
  413.     // Assign the out parameter
  414.     if (pErr->m_pszString)
  415.     {
  416.         rpszFormat = pErr->m_pszString;
  417.         retVal     = HXR_OK;
  418.     }
  419.     return retVal;
  420. }
  421. HX_RESULT PXError::SetString(const char* pszErr, REF(IHXBuffer*) rpErrStr)
  422. {
  423.     HX_RESULT retVal = HXR_OK;
  424.     if (m_pContext)
  425.     {
  426.         IHXCommonClassFactory* pFactory = NULL;
  427.         retVal = m_pContext->QueryInterface(IID_IHXCommonClassFactory,
  428.                                             (void**) &pFactory);
  429.         if (SUCCEEDED(retVal))
  430.         {
  431.             IHXBuffer* pBuffer = NULL;
  432.             retVal = pFactory->CreateInstance(CLSID_IHXBuffer, (void**) &pBuffer);
  433.             if (SUCCEEDED(retVal))
  434.             {
  435.                 retVal = pBuffer->Set((const unsigned char*) pszErr,
  436.                                       strlen(pszErr) + 1);
  437.                 if (SUCCEEDED(retVal))
  438.                 {
  439.                     HX_RELEASE(rpErrStr);
  440.                     rpErrStr = pBuffer;
  441.                     rpErrStr->AddRef();
  442.                 }
  443.             }
  444.             HX_RELEASE(pBuffer);
  445.         }
  446.         HX_RELEASE(pFactory);
  447.     }
  448.     else
  449.     {
  450.         retVal = HXR_UNEXPECTED;
  451.     }
  452.     return retVal;
  453. }
  454. UINT32 PXError::CountArguments(const char* pszFormat)
  455. {
  456.     UINT32 ulRet = 0;
  457.     if (pszFormat)
  458.     {
  459.         char* pszPct = (char*) pszFormat;
  460.         do
  461.         {
  462.             pszPct = (char*)strchr((const char*) pszPct, '%');
  463.             if (pszPct)
  464.             {
  465.                 ulRet++;
  466.                 pszPct++;
  467.             }
  468.         }
  469.         while (pszPct);
  470.     }
  471.     return ulRet;
  472. }