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

Symbian

开发平台:

Visual C++

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