home *** CD-ROM | disk | FTP | other *** search
/ Internet Magazine 2003 January / INTERNET98.ISO / pc / software / windows / building / xmlspy / xmlspyentcomplete5.exe / Data1.cab / cpp.spl < prev    next >
Encoding:
INI File  |  2002-09-15  |  81.5 KB  |  3,005 lines

  1. [
  2. '-----------------------------------------------------------
  3. ' C++ XML Project Template
  4. '
  5. ' Copyright (C) 2002 Altova GmbH - The XML Spy Company
  6. ' All rights reserved.
  7. '
  8. ' XML Spy generates C++ classes based on this template.
  9. ' Refer to the XML Spy Documentation for further details.
  10. '
  11. ' http://www.xmlspy.com
  12. '-----------------------------------------------------------
  13.  
  14. map type "boolean"                to "CSchemaBoolean"
  15.  
  16. map type "byte"                    to "CSchemaByte"
  17. map type "unsignedByte"            to "CSchemaUnsignedByte"
  18. map type "short"                to "CSchemaShort"
  19. map type "unsignedShort"        to "CSchemaUnsignedShort"
  20. map type "int"                    to "CSchemaInt"
  21. map type "unsignedInt"            to "CSchemaUnsignedInt"
  22. map type "long"                    to "CSchemaLong"
  23. map type "unsignedLong"            to "CSchemaUnsignedLong"
  24.  
  25. map type "integer"                to "CSchemaInteger"
  26. map type "nonPositiveInteger"    to "CSchemaNonPositiveInteger"
  27. map type "negativeInteger"        to "CSchemaNegativeInteger"
  28. map type "positiveInteger"        to "CSchemaPositiveInteger"
  29. map type "nonNegativeInteger"    to "CSchemaNonNegativeInteger"
  30. map type "decimal"                to "CSchemaDecimal"
  31.  
  32. map type "float"                to "CSchemaFloat"
  33. map type "double"                to "CSchemaDouble"
  34.  
  35. map type "duration"                to "CSchemaDuration"
  36. map type "gYear"                to "CSchemaYear"
  37. map type "gDay"                    to "CSchemaDay"
  38. map type "gMonth"                to "CSchemaMonth"
  39. map type "gYearMonth"            to "CSchemaYearMonth"
  40. map type "gMonthDay"            to "CSchemaMonthDay"
  41. map type "date"                    to "CSchemaDate"
  42. map type "time"                    to "CSchemaTime"
  43. map type "dateTime"                to "CSchemaDateTime"
  44.  
  45. map type "string"                to "CSchemaString"
  46. map type "hexBinary"            to "CSchemaHexBinary"
  47. map type "base64Binary"            to "CSchemaBase64Binary"
  48. map type "anyURI"                to "CSchemaAnyURI"
  49. map type "QName"                to "CSchemaQName"
  50. map type "NOTATION"                to "CSchemaNotation"
  51. map type "normalizedString"        to "CSchemaNormalizedString"
  52. map type "token"                to "CSchemaToken"
  53. map type "language"                to "CSchemaLanguage"
  54. map type "IDREF"                to "CSchemaIDRef"
  55. map type "ENTITY"                to "CSchemaEntity"
  56. map type "NMTOKEN"                to "CSchemaNMToken"
  57. map type "Name"                    to "CSchemaName"
  58. map type "NCName"                to "CSchemaNCName"
  59. map type "ID"                    to "CSchemaID"
  60. map type "IDREFS"                to "CSchemaIDRefs"
  61. map type "ENTITIES"                to "CSchemaEntities"
  62. map type "NMTOKENS"                to "CSchemaNMTokens"
  63.  
  64. default "ValidFirstCharSet"            is "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
  65. default "ValidCharSet"                is "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_0123456789"
  66. default "InvalidCharReplacement"    is "_"
  67. default "AnonTypePrefix"            is ""
  68. default "AnonTypeSuffix"            is "Type"
  69. default "ClassNamePrefix"            is "C"
  70. default "ClassNameSuffix"            is ""
  71.  
  72. reserve "asm"
  73. reserve "auto"
  74. reserve "break"
  75. reserve "case"
  76. reserve "char"
  77. reserve "class"
  78. reserve "const"
  79. reserve "continue"
  80. reserve "default"
  81. reserve "delete"
  82. reserve "do"
  83. reserve "double"
  84. reserve "else"
  85. reserve "enum"
  86. reserve "extern"
  87. reserve "float"
  88. reserve "for"
  89. reserve "friend"
  90. reserve "goto"
  91. reserve "if"
  92. reserve "inline"
  93. reserve "int"
  94. reserve "long"
  95. reserve "new"
  96. reserve "operator"
  97. reserve "private"
  98. reserve "protected"
  99. reserve "public"
  100. reserve "register"
  101. reserve "return"
  102. reserve "short"
  103. reserve "signed"
  104. reserve "sizeof"
  105. reserve "static"
  106. reserve "struct"
  107. reserve "switch"
  108. reserve "template"
  109. reserve "this"
  110. reserve "throw"
  111. reserve "typedef"
  112. reserve "union"
  113. reserve "unsigned"
  114. reserve "virtual"
  115. reserve "void"
  116. reserve "volatile"
  117. reserve "while"
  118.  
  119. reserve "CNode"
  120. reserve "CNodeException"
  121. reserve "CDoc"
  122. reserve "CFragmentCollection"
  123.  
  124. create $outputpath & "/" & $module & ".h"
  125. ]//////////////////////////////////////////////////////////////////////////////
  126. //
  127. // [=$module].h
  128. //
  129. // Copyright (C) 2002 Altova GmbH - The XML Spy Company
  130. // All rights reserved.
  131. //
  132. // This file was generated by XML Spy.
  133. // DO NOT ALTER THIS FILE.
  134. //
  135. // Refer to the XML Spy Documentation for further details.
  136. // http://www.xmlspy.com
  137. //
  138. //////////////////////////////////////////////////////////////////////////////
  139.  
  140.  
  141. #pragma once
  142.  
  143. #include "Node.h"
  144.  
  145.  
  146. class C[=$module]Doc;
  147. [
  148. foreach $namespace in $namespaces
  149.     if $namespace.ContainsPublicClasses and $namespace.Prefix <> ""
  150. ]
  151. namespace [=$namespace.Prefix]
  152. {
  153. [    endif
  154.     foreach $class in $namespace.Classes
  155.         if not $class.IsInternal
  156. ]class [=$class.Name];
  157. [
  158.         endif
  159.     next
  160.     if $namespace.ContainsPublicClasses and $namespace.Prefix <> ""
  161. ]}
  162. [
  163.     endif
  164. next
  165. ]
  166.  
  167. class C[=$module]Doc : public CDoc
  168. {
  169. protected:
  170.     virtual void DeclareNamespaces(CNode& rNode);
  171. };
  172. [
  173. foreach $class in $classes : if not $class.IsInternal
  174.     if $class.NamespacePrefix <> ""
  175. ]namespace [=$class.NamespacePrefix][if $class.NamespaceURI <> ""] // URI: [=$class.NamespaceURI][endif]
  176. {
  177. [
  178.     endif
  179.     if $class.IsComplexType
  180.         if $class.Base <> "" and $class.BuiltInBase = "" and not $class.IsComplexFromSimpleType
  181.             $baseclass = $class.Base
  182.         else
  183.             $baseclass = "CNode"
  184.         endif
  185. ]
  186.  
  187. class [=$class.Name] : public [=$baseclass]
  188. {
  189. public:
  190.     [=$class.Name]() : [=$baseclass]() {}
  191.     [=$class.Name](CNode& rParentNode, MSXML2::IXMLDOMNodePtr spThisNode) : [=$baseclass](rParentNode, spThisNode) {}
  192.     [=$class.Name](MSXML2::IXMLDOMDocument2Ptr spDoc) : [=$baseclass](spDoc) {}
  193. [        if $class.IsComplexFromSimpleType
  194. ]    [=$class.Name]([=$class.Base] Value);
  195.     [=$class.Name](const CString& sValue);
  196.     virtual operator CString();
  197.     [=$class.Base] GetValue();
  198. [        endif
  199.         foreach $member in $class.Members
  200.             if $member.HasTypeObject
  201.                 if $member.TypeObject.NamespacePrefix <> $class.NamespacePrefix
  202.                     $QualifiedType = $member.TypeObject.NamespacePrefix & "::" & $member.Type
  203.                 else
  204.                     $QualifiedType = $member.Type
  205.                 endif
  206.             else
  207.                 $QualifiedType = $member.Type
  208.             endif
  209. ]
  210.     //
  211.     // [=$member.SchemaType] [=$member.SchemaName] ([=$member.MinOcc]...[if $member.MaxOcc = -1]unbounded[else][=$member.MaxOcc][endif])
  212.     //
  213.     static int Get[=$member.Name]MinCount();
  214.     static int Get[=$member.Name]MaxCount();
  215.     int Get[=$member.Name]Count();
  216.     bool Has[=$member.Name]();
  217.     void Add[=$member.Name]([=$QualifiedType] [=$member.Name]);
  218.     [=$QualifiedType] Get[=$member.Name]At(int nIndex);
  219.     [=$QualifiedType] Get[=$member.Name]();
  220.     void Remove[=$member.Name]At(int nIndex);
  221.     void Remove[=$member.Name]();
  222. [        next
  223. ]};
  224. [
  225.     else : if $class.IsSimpleType
  226.         if $class.Base = $class.BuiltInBase
  227.             $IsDirectChild = true
  228.         else
  229.             $IsDirectChild = false
  230.         endif
  231. ]
  232.  
  233. class [=$class.Name] : public [=$class.Base]
  234. {
  235. public:
  236.     [=$class.Name]([=$class.BuiltInBase]::basetype Value);
  237.     [=$class.Name](const CString& sValue);
  238.     void Validate();
  239. [        foreach $facet in $class.Facets
  240.             if $facet.IsMinLength
  241. ]    virtual int GetMinLength() { return [=$facet.Constraint]; }
  242. [            else : if $facet.IsMaxLength
  243. ]    virtual int GetMaxLength() { return [=$facet.Constraint]; }
  244. [            else : if $facet.IsLength
  245. ]    virtual int GetLength() { return [=$facet.Constraint]; }
  246. [            else : if $facet.IsMinInclusive
  247. ]    virtual [=$class.BuiltInBase] GetMinInclusive() { return [=$facet.Constraint]; }
  248. [            else : if $facet.IsMinExclusive
  249. ]    virtual [=$class.BuiltInBase] GetMinExclusive() { return [=$facet.Constraint]; }
  250. [            else : if $facet.IsMaxExclusive
  251. ]    virtual [=$class.BuiltInBase] GetMaxExclusive() { return [=$facet.Constraint]; }
  252. [            else : if $facet.IsMaxInclusive
  253. ]    virtual [=$class.BuiltInBase] GetMaxInclusive() { return [=$facet.Constraint]; }
  254. [            else : if $facet.IsTotalDigits
  255. ]    virtual int GetTotalDigits() { return [=$facet.Constraint]; }
  256. [            else : if $facet.IsFractionDigits
  257. ]    virtual int GetFractionDigits() { return [=$facet.Constraint]; }
  258. [            else : if $facet.IsWhiteSpace
  259. ]    int GetWhiteSpaceMode() { return [=$facet.Constraint]; }
  260. [            else : if $facet.IsPattern
  261. ]    CString GetPattern() { return _T("[=$facet.Constraint]"); }
  262. [            else : if $facet.IsEnumeration
  263. ]    CString GetEnumerationValues() { return _T("['=$facet.Constraint]"); }
  264. [            endif:endif:endif:endif:endif:endif:endif:endif:endif:endif:endif:endif
  265.         next
  266. ]};
  267. [    endif : endif
  268.     if $class.NamespacePrefix <> ""
  269. ]} // end of namespace [=$class.NamespacePrefix]
  270. [    endif
  271. endif : next
  272. close
  273. create $outputpath & "/" & $module & ".cpp"
  274. ]//////////////////////////////////////////////////////////////////////////////
  275. //
  276. // [=$module].cpp
  277. //
  278. // Copyright (C) 2002 Altova GmbH - The XML Spy Company
  279. // All rights reserved.
  280. //
  281. // This file was generated by XML Spy.
  282. // DO NOT ALTER THIS FILE.
  283. //
  284. // Refer to the XML Spy Documentation for further details.
  285. // http://www.xmlspy.com
  286. //
  287. //////////////////////////////////////////////////////////////////////////////
  288.  
  289.  
  290. #include "stdafx.h"
  291. #include "[=$module].h"
  292.  
  293.  
  294. void C[=$module]Doc::DeclareNamespaces(CNode& rNode)
  295. {
  296. [foreach $namespace in $namespaces
  297.     if $namespace.URI <> ""
  298. ]    DeclareNamespace(rNode, _T("[=$namespace.Prefix]"), _T("[=$namespace.URI]"));
  299. [    endif
  300. next
  301. ]}
  302.  
  303.  
  304. [
  305. foreach $class in $classes : if not $class.IsInternal
  306.     if $class.NamespacePrefix <> ""
  307. ]namespace [=$class.NamespacePrefix][if $class.NamespaceURI <> ""] // URI: [=$class.NamespaceURI][endif]
  308. {
  309. [    endif
  310. ]//////////////////////////////////////////////////////////////////////////////
  311. //
  312. // class [=$class.Name]
  313. //
  314. //////////////////////////////////////////////////////////////////////////////
  315.  
  316.  
  317. [
  318.     if $class.IsComplexType
  319.         if $class.Base <> "" and $class.BuiltInBase = "" and not $class.IsComplexFromSimpleType
  320.             $baseclass = $class.Base
  321.         else
  322.             $baseclass = "CNode"
  323.         endif
  324.         if $class.IsComplexFromSimpleType
  325. ][=$class.Name]::[=$class.Name]([=$class.Base] Value)
  326. {
  327.     m_spNode->text = (LPCTSTR)(CString)Value;
  328. }
  329.  
  330.  
  331. [=$class.Name]::[=$class.Name](const CString& sValue)
  332. {
  333.     m_spNode->text = (LPCTSTR)(CString)[=$class.Base](sValue);
  334. }
  335.  
  336.  
  337. [=$class.Name]::operator CString()
  338. {
  339.     return CString((LPCTSTR)m_spNode->text);
  340. }
  341.  
  342.  
  343. [=$class.Base] [=$class.Name]::GetValue()
  344. {
  345.     return CString((LPCTSTR)m_spNode->text);
  346. }
  347.  
  348.  
  349. [        endif
  350.         foreach $member in $class.Members
  351.             if $member.HasTypeObject
  352.                 if $member.TypeObject.NamespacePrefix <> $class.NamespacePrefix
  353.                     $QualifiedType = $member.TypeObject.NamespacePrefix & "::" & $member.Type
  354.                 else
  355.                     $QualifiedType = $member.Type
  356.                 endif
  357.             else
  358.                 $QualifiedType = $member.Type
  359.             endif
  360. ]int [=$class.Name]::Get[=$member.Name]MinCount()
  361. {
  362.     return [=$member.MinOcc];
  363. }
  364.  
  365.  
  366. int [=$class.Name]::Get[=$member.Name]MaxCount()
  367. {
  368.     return [if $member.MaxOcc = -1]INT_MAX[else][=$member.MaxOcc][endif];
  369. }
  370.  
  371.  
  372. int [=$class.Name]::Get[=$member.Name]Count()
  373. {
  374.     return ChildCount([=$member.NodeType], _T("[=$member.NamespaceURI]"), _T("[=$member.Name]"));
  375. }
  376.  
  377.  
  378. bool [=$class.Name]::Has[=$member.Name]()
  379. {
  380.     return Get[=$member.Name]Count() > 0;
  381. }
  382.  
  383.  
  384. void [=$class.Name]::Add[=$member.Name]([=$QualifiedType] [=$member.Name])
  385. {
  386. [            if $member.IsSimpleType
  387.                 if $member.IsBuiltinType
  388.                     $TmpSchemaType = $member.SchemaType
  389.                 else
  390.                     if $member.HasTypeObject
  391.                         $TmpSchemaType = $member.TypeObject.BuiltInSchemaBase
  392.                     else
  393.                         $TmpSchemaType = $member.SchemaType
  394.                     endif
  395.                 endif
  396. ]    AppendChild([=$member.NodeType], _T("[=$member.NamespaceURI]"), _T("[=$member.Name]"), [=$member.Name]);
  397. [            else
  398. ]    AppendChildElement(_T("[=$member.NamespaceURI]"), _T("[=$member.Name]"), &[=$member.Name]);
  399. [            endif
  400. ]}
  401.  
  402.  
  403. [=$QualifiedType] [=$class.Name]::Get[=$member.Name]At(int nIndex)
  404. {
  405. [            if $member.IsSimpleType
  406. ]    return CString((LPCTSTR)GetChildAt([=$member.NodeType], _T("[=$member.NamespaceURI]"), _T("[=$member.Name]"), nIndex)->text);
  407. [            else
  408. ]    return [=$QualifiedType](*this, GetChildAt([=$member.NodeType], _T("[=$member.NamespaceURI]"), _T("[=$member.Name]"), nIndex));
  409. [endif
  410. ]}
  411.  
  412.  
  413. [=$QualifiedType] [=$class.Name]::Get[=$member.Name]()
  414. {
  415.     return Get[=$member.Name]At(0);
  416. }
  417.  
  418.  
  419. void [=$class.Name]::Remove[=$member.Name]At(int nIndex)
  420. {
  421.     RemoveChildAt([=$member.NodeType], _T("[=$member.NamespaceURI]"), _T("[=$member.Name]"), nIndex);
  422. }
  423.  
  424.  
  425. void [=$class.Name]::Remove[=$member.Name]()
  426. {
  427. [            if $member.MaxOcc > 1
  428. ]    Remove[=$member.Name]At(0);
  429. [            else
  430. ]    while (Has[=$member.Name]())
  431.         Remove[=$member.Name]At(0);
  432. [endif
  433. ]}
  434.  
  435. [        next
  436.     else : if $class.IsSimpleType
  437.         if $class.Base = $class.BuiltInBase
  438.             $IsDirectChild = true
  439.         else
  440.             $IsDirectChild = false
  441.         endif
  442. ][=$class.Name]::[=$class.Name]([=$class.BuiltInBase]::basetype Value) : [=$class.Base](Value)
  443. {
  444.     Validate();
  445. }
  446.  
  447.  
  448. [=$class.Name]::[=$class.Name](const CString& sValue) : [=$class.Base](sValue)
  449. {
  450.     Validate();
  451. }
  452.  
  453.  
  454. void [=$class.Name]::Validate()
  455. {
  456. [        if not $IsDirectChild
  457. ]    //[=$class.Base]::Validate();
  458. [        endif
  459.         foreach $facet in $class.Facets
  460.             if $facet.IsMinLength
  461. ]    if( m_Value.GetLength() < GetMinLength() )
  462.         throw CNodeException(CNodeException::eError1, _T("Validation error"));
  463. [            else:if $facet.IsMaxLength
  464. ]    if( m_Value.GetLength() > GetMaxLength() )
  465.         throw CNodeException(CNodeException::eError1, _T("Validation error"));
  466. [            else:if $facet.IsLength
  467. ]    if( m_Value.GetLength() != GetLength() )
  468.         throw CNodeException(CNodeException::eError1, _T("Validation error"));
  469. [            else:if $facet.IsMinInclusive
  470. ]    if( m_Value < GetMinInclusive() )
  471.         throw CNodeException(CNodeException::eError1, _T("Validation error"));
  472. [            else:if $facet.IsMinExclusive
  473. ]    if( m_Value <= GetMinExclusive() )
  474.         throw CNodeException(CNodeException::eError1, _T("Validation error"));
  475. [            else:if $facet.IsMaxExclusive
  476. ]    if( m_Value >= GetMaxExclusive() )
  477.         throw CNodeException(CNodeException::eError1, _T("Validation error"));
  478. [            else:if $facet.IsMaxInclusive
  479. ]    if( m_Value > GetMaxInclusive() )
  480.         throw CNodeException(CNodeException::eError1, _T("Validation error"));
  481. [            else:if $facet.IsTotalDigits
  482.  
  483.             else:if $facet.IsFractionDigits
  484.             
  485.             else:if $facet.IsWhiteSpace
  486.             
  487.             else:if $facet.IsPattern
  488.             
  489.             else:if $facet.IsEnumeration
  490.             
  491.             endif:endif:endif:endif:endif:endif:endif:endif:endif:endif:endif:endif
  492.     next
  493. ]}
  494.  
  495.  
  496. [    endif : endif
  497.     if $class.NamespacePrefix <> ""
  498. ]} // end of namespace [=$class.NamespacePrefix]
  499. [    endif
  500. endif : next
  501. close
  502. create $outputpath & "/" & $module & "Test.cpp"
  503. ]//////////////////////////////////////////////////////////////////////////////
  504. //
  505. // [=$module]Test.cpp
  506. //
  507. // Copyright (C) 2002 Altova GmbH - The XML Spy Company
  508. // All rights reserved.
  509. //
  510. // This file was generated by XML Spy.
  511. // DO NOT ALTER THIS FILE.
  512. //
  513. // Refer to the XML Spy Documentation for further details.
  514. // http://www.xmlspy.com
  515. //
  516. //////////////////////////////////////////////////////////////////////////////
  517.  
  518.  
  519. #include "stdafx.h"
  520. #include "[=$module].h"
  521. #include <atlconv.h>
  522. #include <iostream>
  523.  
  524.  
  525. #ifdef _DEBUG
  526.     #define new DEBUG_NEW
  527.     #undef THIS_FILE
  528.     static char THIS_FILE\[\] = __FILE__;
  529. #endif
  530.  
  531.  
  532. using namespace std;
  533.  
  534. ostream& operator<<(ostream& out, LPCWSTR szWide)
  535. {
  536.     USES_CONVERSION;
  537.     return out << W2A(szWide);
  538. }
  539.  
  540. ostream& operator<<(ostream& out, const CString& sText)
  541. {
  542.     return operator<<(out, (LPCTSTR)sText);
  543. }
  544.  
  545.  
  546. CWinApp theApp;
  547.  
  548.  
  549. void Example()
  550. {
  551.     //////////////////////////////////////////////////////////////////////////
  552.     //
  553.     // TODO:
  554.     //   Insert your code here...
  555.     //
  556.     // EXAMPLE:
  557.     //   C[=$module]Doc doc;
  558.     //   CYourRootElementType root = doc.Load(_T("[=$module].xml"));
  559.     //   ...
  560.     //   doc.Save(_T("[=$module].xml"), root);
  561.     //
  562.     //////////////////////////////////////////////////////////////////////////
  563. }
  564.  
  565.  
  566. int _tmain(int argc, TCHAR* argv\[\], TCHAR* envp\[\])
  567. {
  568.     cout << _T("[=$module] Test Application") << endl;
  569.  
  570.     if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
  571.     {
  572.         cerr << _T("Fatal Error: MFC initialization failed") << endl;
  573.         return 1;
  574.     }
  575.  
  576.     try
  577.     {
  578.         CoInitialize(NULL);
  579.         Example();
  580.         CoUninitialize();
  581.         return 0;
  582.     }
  583.     catch (CNodeException& e)
  584.     {
  585.         cerr << _T("Error: ") << e.GetMessage() << endl;
  586.         return 2;
  587.     }
  588.     catch (_com_error& e)
  589.     {
  590.         cerr << _T("COM-Error: ") << e.ErrorMessage() << endl;
  591.         return 3;
  592.     }
  593.     catch (...)
  594.     {
  595.         cerr << _T("Unknown error") << endl;
  596.         return 4;
  597.     }
  598. }
  599. [
  600. close
  601. create $outputpath & "/" & $module & ".dsw"
  602. ]Microsoft Developer Studio Workspace File, Format Version 6.00
  603. # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
  604.  
  605. ###############################################################################
  606.  
  607. Project: "[=$module]"=./[=$module].dsp - Package Owner=<4>
  608.  
  609. Package=<5>
  610. {{{
  611. }}}
  612.  
  613. Package=<4>
  614. {{{
  615. }}}
  616.  
  617. ###############################################################################
  618.  
  619. Global:
  620.  
  621. Package=<5>
  622. {{{
  623. }}}
  624.  
  625. Package=<3>
  626. {{{
  627. }}}
  628.  
  629. ###############################################################################
  630.  
  631. [
  632. close
  633. create $outputpath & "/" & $module & ".dsp"
  634. ]# Microsoft Developer Studio Project File - Name="[=$module]" - Package Owner=<4>
  635. # Microsoft Developer Studio Generated Build File, Format Version 6.00
  636. # ** DO NOT EDIT **
  637.  
  638. # TARGTYPE "Win32 (x86) Console Application" 0x0103
  639.  
  640. CFG=[=$module] - Win32 Unicode Debug
  641. !MESSAGE This is not a valid makefile. To build this project using NMAKE,
  642. !MESSAGE use the Export Makefile command and run
  643. !MESSAGE 
  644. !MESSAGE NMAKE /f "[=$module].mak".
  645. !MESSAGE 
  646. !MESSAGE You can specify a configuration when running NMAKE
  647. !MESSAGE by defining the macro CFG on the command line. For example:
  648. !MESSAGE 
  649. !MESSAGE NMAKE /f "[=$module].mak" CFG="[=$module] - Win32 Unicode Debug"
  650. !MESSAGE 
  651. !MESSAGE Possible choices for configuration are:
  652. !MESSAGE 
  653. !MESSAGE "[=$module] - Win32 Release" (based on "Win32 (x86) Console Application")
  654. !MESSAGE "[=$module] - Win32 Debug" (based on "Win32 (x86) Console Application")
  655. !MESSAGE "[=$module] - Win32 Unicode Debug" (based on "Win32 (x86) Console Application")
  656. !MESSAGE "[=$module] - Win32 Unicode Release" (based on "Win32 (x86) Console Application")
  657. !MESSAGE 
  658.  
  659. # Begin Project
  660. # PROP AllowPerConfigDependencies 0
  661. # PROP Scc_ProjName ""
  662. # PROP Scc_LocalPath ""
  663. CPP=cl.exe
  664. RSC=rc.exe
  665.  
  666. !IF  "$(CFG)" == "[=$module] - Win32 Release"
  667.  
  668. # PROP BASE Use_MFC 2
  669. # PROP BASE Use_Debug_Libraries 0
  670. # PROP BASE Output_Dir "Release"
  671. # PROP BASE Intermediate_Dir "Release"
  672. # PROP BASE Target_Dir ""
  673. # PROP Use_MFC 2
  674. # PROP Use_Debug_Libraries 0
  675. # PROP Output_Dir "Release"
  676. # PROP Intermediate_Dir "Release"
  677. # PROP Target_Dir ""
  678. # ADD BASE CPP /nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_AFXDLL" /Yu"stdafx.h" /FD /c
  679. # ADD CPP /nologo /MD /W3 /GR /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_AFXDLL" /Yu"stdafx.h" /FD /c
  680. # ADD BASE RSC /l 0x409 /d "NDEBUG" /d "_AFXDLL"
  681. # ADD RSC /l 0x409 /d "NDEBUG" /d "_AFXDLL"
  682. BSC32=bscmake.exe
  683. # ADD BASE BSC32 /nologo
  684. # ADD BSC32 /nologo
  685. LINK32=link.exe
  686. # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
  687. # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
  688.  
  689. !ELSEIF  "$(CFG)" == "[=$module] - Win32 Debug"
  690.  
  691. # PROP BASE Use_MFC 2
  692. # PROP BASE Use_Debug_Libraries 1
  693. # PROP BASE Output_Dir "Debug"
  694. # PROP BASE Intermediate_Dir "Debug"
  695. # PROP BASE Target_Dir ""
  696. # PROP Use_MFC 2
  697. # PROP Use_Debug_Libraries 1
  698. # PROP Output_Dir "Debug"
  699. # PROP Intermediate_Dir "Debug"
  700. # PROP Target_Dir ""
  701. # ADD BASE CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_AFXDLL" /Yu"stdafx.h" /FD /GZ /c
  702. # ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_AFXDLL" /Yu"stdafx.h" /FD /GZ /c
  703. # ADD BASE RSC /l 0x409 /d "_DEBUG" /d "_AFXDLL"
  704. # ADD RSC /l 0x409 /d "_DEBUG" /d "_AFXDLL"
  705. BSC32=bscmake.exe
  706. # ADD BASE BSC32 /nologo
  707. # ADD BSC32 /nologo
  708. LINK32=link.exe
  709. # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
  710. # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
  711.  
  712. !ELSEIF  "$(CFG)" == "[=$module] - Win32 Unicode Debug"
  713.  
  714. # PROP BASE Use_MFC 2
  715. # PROP BASE Use_Debug_Libraries 1
  716. # PROP BASE Output_Dir "UnicodeDebug"
  717. # PROP BASE Intermediate_Dir "UnicodeDebug"
  718. # PROP BASE Target_Dir ""
  719. # PROP Use_MFC 2
  720. # PROP Use_Debug_Libraries 1
  721. # PROP Output_Dir "UnicodeDebug"
  722. # PROP Intermediate_Dir "UnicodeDebug"
  723. # PROP Target_Dir ""
  724. # ADD BASE CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_AFXDLL" /Yu"stdafx.h" /FD /GZ /c
  725. # ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /D "_AFXDLL" /Yu"stdafx.h" /FD /GZ /c
  726. # ADD BASE RSC /l 0x409 /d "_DEBUG" /d "_AFXDLL"
  727. # ADD RSC /l 0x409 /d "_DEBUG" /d "_AFXDLL"
  728. BSC32=bscmake.exe
  729. # ADD BASE BSC32 /nologo
  730. # ADD BSC32 /nologo
  731. LINK32=link.exe
  732. # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
  733. # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
  734.  
  735. !ELSEIF  "$(CFG)" == "[=$module] - Win32 Unicode Release"
  736.  
  737. # PROP BASE Use_MFC 2
  738. # PROP BASE Use_Debug_Libraries 0
  739. # PROP BASE Output_Dir "UnicodeRelease"
  740. # PROP BASE Intermediate_Dir "UnicodeRelease"
  741. # PROP BASE Target_Dir ""
  742. # PROP Use_MFC 2
  743. # PROP Use_Debug_Libraries 0
  744. # PROP Output_Dir "UnicodeRelease"
  745. # PROP Intermediate_Dir "UnicodeRelease"
  746. # PROP Target_Dir ""
  747. # ADD BASE CPP /nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_AFXDLL" /Yu"stdafx.h" /FD /c
  748. # ADD CPP /nologo /MD /W3 /GR /GX /O2 /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /D "_AFXDLL" /Yu"stdafx.h" /FD /c
  749. # ADD BASE RSC /l 0x409 /d "NDEBUG" /d "_AFXDLL"
  750. # ADD RSC /l 0x409 /d "NDEBUG" /d "_AFXDLL"
  751. BSC32=bscmake.exe
  752. # ADD BASE BSC32 /nologo
  753. # ADD BSC32 /nologo
  754. LINK32=link.exe
  755. # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
  756. # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
  757.  
  758. !ENDIF 
  759.  
  760. # Begin Target
  761.  
  762. # Name "[=$module] - Win32 Release"
  763. # Name "[=$module] - Win32 Debug"
  764. # Name "[=$module] - Win32 Unicode Debug"
  765. # Name "[=$module] - Win32 Unicode Release"
  766. # Begin Group "Source Files"
  767.  
  768. # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
  769. # Begin Source File
  770.  
  771. SOURCE=./[=$module].cpp
  772. # End Source File
  773. # Begin Source File
  774.  
  775. SOURCE=./[=$module].rc
  776. # End Source File
  777. # Begin Source File
  778.  
  779. SOURCE=./[=$module]Test.cpp
  780. # End Source File
  781. # Begin Source File
  782.  
  783. SOURCE=./Node.cpp
  784. # End Source File
  785. # Begin Source File
  786.  
  787. SOURCE=./StdAfx.cpp
  788. # ADD CPP /Yc"stdafx.h"
  789. # End Source File
  790. # End Group
  791. # Begin Group "Header Files"
  792.  
  793. # PROP Default_Filter "h;hpp;hxx;hm;inl"
  794. # Begin Source File
  795.  
  796. SOURCE=./[=$module].h
  797. # End Source File
  798. # Begin Source File
  799.  
  800. SOURCE=./Node.h
  801. # End Source File
  802. # Begin Source File
  803.  
  804. SOURCE=./Resource.h
  805. # End Source File
  806. # Begin Source File
  807.  
  808. SOURCE=./StdAfx.h
  809. # End Source File
  810. # End Group
  811. # Begin Group "Resource Files"
  812.  
  813. # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
  814. # End Group
  815. # Begin Source File
  816.  
  817. SOURCE=./ReadMe.txt
  818. # End Source File
  819. # End Target
  820. # End Project
  821.  
  822. [
  823. close
  824. create $outputpath & "/" & $module & ".mak"
  825. ]# Microsoft Developer Studio Generated NMAKE File, Based on [=$module].dsp
  826. !IF "$(CFG)" == ""
  827. CFG=[=$module] - Win32 Unicode Debug
  828. !MESSAGE No configuration specified. Defaulting to [=$module] - Win32 Unicode Debug.
  829. !ENDIF 
  830.  
  831. !IF "$(CFG)" != "[=$module] - Win32 Release" && "$(CFG)" != "[=$module] - Win32 Debug" && "$(CFG)" != "[=$module] - Win32 Unicode Debug" && "$(CFG)" != "[=$module] - Win32 Unicode Release"
  832. !MESSAGE Invalid configuration "$(CFG)" specified.
  833. !MESSAGE You can specify a configuration when running NMAKE
  834. !MESSAGE by defining the macro CFG on the command line. For example:
  835. !MESSAGE 
  836. !MESSAGE NMAKE /f "[=$module].mak" CFG="[=$module] - Win32 Unicode Debug"
  837. !MESSAGE 
  838. !MESSAGE Possible choices for configuration are:
  839. !MESSAGE 
  840. !MESSAGE "[=$module] - Win32 Release" (based on "Win32 (x86) Console Application")
  841. !MESSAGE "[=$module] - Win32 Debug" (based on "Win32 (x86) Console Application")
  842. !MESSAGE "[=$module] - Win32 Unicode Debug" (based on "Win32 (x86) Console Application")
  843. !MESSAGE "[=$module] - Win32 Unicode Release" (based on "Win32 (x86) Console Application")
  844. !MESSAGE 
  845. !ERROR An invalid configuration is specified.
  846. !ENDIF 
  847.  
  848. !IF "$(OS)" == "Windows_NT"
  849. NULL=
  850. !ELSE 
  851. NULL=nul
  852. !ENDIF 
  853.  
  854. !IF  "$(CFG)" == "[=$module] - Win32 Release"
  855.  
  856. OUTDIR=./Release
  857. INTDIR=./Release
  858. # Begin Custom Macros
  859. OutDir=./Release
  860. # End Custom Macros
  861.  
  862. ALL : "$(OUTDIR)/[=$module].exe"
  863.  
  864.  
  865. CLEAN :
  866.     -@erase "$(INTDIR)/[=$module].obj"
  867.     -@erase "$(INTDIR)/[=$module].pch"
  868.     -@erase "$(INTDIR)/[=$module].res"
  869.     -@erase "$(INTDIR)/[=$module]Test.obj"
  870.     -@erase "$(INTDIR)/Node.obj"
  871.     -@erase "$(INTDIR)/StdAfx.obj"
  872.     -@erase "$(INTDIR)/vc60.idb"
  873.     -@erase "$(OUTDIR)/[=$module].exe"
  874.  
  875. "$(OUTDIR)" :
  876.     if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
  877.  
  878. CPP=cl.exe
  879. CPP_PROJ=/nologo /MD /W3 /GR /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_AFXDLL" /Fp"$(INTDIR)/[=$module].pch" /Yu"stdafx.h" /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /FD /c 
  880.  
  881. .c{$(INTDIR)}.obj::
  882.    $(CPP) @<<
  883.    $(CPP_PROJ) $< 
  884. <<
  885.  
  886. .cpp{$(INTDIR)}.obj::
  887.    $(CPP) @<<
  888.    $(CPP_PROJ) $< 
  889. <<
  890.  
  891. .cxx{$(INTDIR)}.obj::
  892.    $(CPP) @<<
  893.    $(CPP_PROJ) $< 
  894. <<
  895.  
  896. .c{$(INTDIR)}.sbr::
  897.    $(CPP) @<<
  898.    $(CPP_PROJ) $< 
  899. <<
  900.  
  901. .cpp{$(INTDIR)}.sbr::
  902.    $(CPP) @<<
  903.    $(CPP_PROJ) $< 
  904. <<
  905.  
  906. .cxx{$(INTDIR)}.sbr::
  907.    $(CPP) @<<
  908.    $(CPP_PROJ) $< 
  909. <<
  910.  
  911. RSC=rc.exe
  912. RSC_PROJ=/l 0x409 /fo"$(INTDIR)/[=$module].res" /d "NDEBUG" /d "_AFXDLL" 
  913. BSC32=bscmake.exe
  914. BSC32_FLAGS=/nologo /o"$(OUTDIR)/[=$module].bsc" 
  915. BSC32_SBRS= \\
  916.     
  917. LINK32=link.exe
  918. LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /pdb:"$(OUTDIR)/[=$module].pdb" /machine:I386 /out:"$(OUTDIR)/[=$module].exe" 
  919. LINK32_OBJS= \\
  920.     "$(INTDIR)/[=$module].obj" \\
  921.     "$(INTDIR)/[=$module]Test.obj" \\
  922.     "$(INTDIR)/Node.obj" \\
  923.     "$(INTDIR)/StdAfx.obj" \\
  924.     "$(INTDIR)/[=$module].res"
  925.  
  926. "$(OUTDIR)/[=$module].exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
  927.     $(LINK32) @<<
  928.   $(LINK32_FLAGS) $(LINK32_OBJS)
  929. <<
  930.  
  931. !ELSEIF  "$(CFG)" == "[=$module] - Win32 Debug"
  932.  
  933. OUTDIR=./Debug
  934. INTDIR=./Debug
  935. # Begin Custom Macros
  936. OutDir=./Debug
  937. # End Custom Macros
  938.  
  939. ALL : "$(OUTDIR)/[=$module].exe"
  940.  
  941.  
  942. CLEAN :
  943.     -@erase "$(INTDIR)/[=$module].obj"
  944.     -@erase "$(INTDIR)/[=$module].pch"
  945.     -@erase "$(INTDIR)/[=$module].res"
  946.     -@erase "$(INTDIR)/[=$module]Test.obj"
  947.     -@erase "$(INTDIR)/Node.obj"
  948.     -@erase "$(INTDIR)/StdAfx.obj"
  949.     -@erase "$(INTDIR)/vc60.idb"
  950.     -@erase "$(INTDIR)/vc60.pdb"
  951.     -@erase "$(OUTDIR)/[=$module].exe"
  952.     -@erase "$(OUTDIR)/[=$module].ilk"
  953.     -@erase "$(OUTDIR)/[=$module].pdb"
  954.  
  955. "$(OUTDIR)" :
  956.     if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
  957.  
  958. CPP=cl.exe
  959. CPP_PROJ=/nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_AFXDLL" /Fp"$(INTDIR)/[=$module].pch" /Yu"stdafx.h" /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /FD /GZ /c 
  960.  
  961. .c{$(INTDIR)}.obj::
  962.    $(CPP) @<<
  963.    $(CPP_PROJ) $< 
  964. <<
  965.  
  966. .cpp{$(INTDIR)}.obj::
  967.    $(CPP) @<<
  968.    $(CPP_PROJ) $< 
  969. <<
  970.  
  971. .cxx{$(INTDIR)}.obj::
  972.    $(CPP) @<<
  973.    $(CPP_PROJ) $< 
  974. <<
  975.  
  976. .c{$(INTDIR)}.sbr::
  977.    $(CPP) @<<
  978.    $(CPP_PROJ) $< 
  979. <<
  980.  
  981. .cpp{$(INTDIR)}.sbr::
  982.    $(CPP) @<<
  983.    $(CPP_PROJ) $< 
  984. <<
  985.  
  986. .cxx{$(INTDIR)}.sbr::
  987.    $(CPP) @<<
  988.    $(CPP_PROJ) $< 
  989. <<
  990.  
  991. RSC=rc.exe
  992. RSC_PROJ=/l 0x409 /fo"$(INTDIR)/[=$module].res" /d "_DEBUG" /d "_AFXDLL" 
  993. BSC32=bscmake.exe
  994. BSC32_FLAGS=/nologo /o"$(OUTDIR)/[=$module].bsc" 
  995. BSC32_SBRS= \\
  996.     
  997. LINK32=link.exe
  998. LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:yes /pdb:"$(OUTDIR)/[=$module].pdb" /debug /machine:I386 /out:"$(OUTDIR)/[=$module].exe" /pdbtype:sept 
  999. LINK32_OBJS= \\
  1000.     "$(INTDIR)/[=$module].obj" \\
  1001.     "$(INTDIR)/[=$module]Test.obj" \\
  1002.     "$(INTDIR)/Node.obj" \\
  1003.     "$(INTDIR)/StdAfx.obj" \\
  1004.     "$(INTDIR)/[=$module].res"
  1005.  
  1006. "$(OUTDIR)/[=$module].exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
  1007.     $(LINK32) @<<
  1008.   $(LINK32_FLAGS) $(LINK32_OBJS)
  1009. <<
  1010.  
  1011. !ELSEIF  "$(CFG)" == "[=$module] - Win32 Unicode Debug"
  1012.  
  1013. OUTDIR=./UnicodeDebug
  1014. INTDIR=./UnicodeDebug
  1015. # Begin Custom Macros
  1016. OutDir=./UnicodeDebug
  1017. # End Custom Macros
  1018.  
  1019. ALL : "$(OUTDIR)/[=$module].exe"
  1020.  
  1021.  
  1022. CLEAN :
  1023.     -@erase "$(INTDIR)/[=$module].obj"
  1024.     -@erase "$(INTDIR)/[=$module].pch"
  1025.     -@erase "$(INTDIR)/[=$module].res"
  1026.     -@erase "$(INTDIR)/[=$module]Test.obj"
  1027.     -@erase "$(INTDIR)/Node.obj"
  1028.     -@erase "$(INTDIR)/StdAfx.obj"
  1029.     -@erase "$(INTDIR)/vc60.idb"
  1030.     -@erase "$(INTDIR)/vc60.pdb"
  1031.     -@erase "$(OUTDIR)/[=$module].exe"
  1032.     -@erase "$(OUTDIR)/[=$module].ilk"
  1033.     -@erase "$(OUTDIR)/[=$module].pdb"
  1034.  
  1035. "$(OUTDIR)" :
  1036.     if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
  1037.  
  1038. CPP=cl.exe
  1039. CPP_PROJ=/nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /D "_AFXDLL" /Fp"$(INTDIR)/[=$module].pch" /Yu"stdafx.h" /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /FD /GZ /c 
  1040.  
  1041. .c{$(INTDIR)}.obj::
  1042.    $(CPP) @<<
  1043.    $(CPP_PROJ) $< 
  1044. <<
  1045.  
  1046. .cpp{$(INTDIR)}.obj::
  1047.    $(CPP) @<<
  1048.    $(CPP_PROJ) $< 
  1049. <<
  1050.  
  1051. .cxx{$(INTDIR)}.obj::
  1052.    $(CPP) @<<
  1053.    $(CPP_PROJ) $< 
  1054. <<
  1055.  
  1056. .c{$(INTDIR)}.sbr::
  1057.    $(CPP) @<<
  1058.    $(CPP_PROJ) $< 
  1059. <<
  1060.  
  1061. .cpp{$(INTDIR)}.sbr::
  1062.    $(CPP) @<<
  1063.    $(CPP_PROJ) $< 
  1064. <<
  1065.  
  1066. .cxx{$(INTDIR)}.sbr::
  1067.    $(CPP) @<<
  1068.    $(CPP_PROJ) $< 
  1069. <<
  1070.  
  1071. RSC=rc.exe
  1072. RSC_PROJ=/l 0x409 /fo"$(INTDIR)/[=$module].res" /d "_DEBUG" /d "_AFXDLL" 
  1073. BSC32=bscmake.exe
  1074. BSC32_FLAGS=/nologo /o"$(OUTDIR)/[=$module].bsc" 
  1075. BSC32_SBRS= \\
  1076.     
  1077. LINK32=link.exe
  1078. LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:yes /pdb:"$(OUTDIR)/[=$module].pdb" /debug /machine:I386 /out:"$(OUTDIR)/[=$module].exe" /pdbtype:sept 
  1079. LINK32_OBJS= \\
  1080.     "$(INTDIR)/[=$module].obj" \\
  1081.     "$(INTDIR)/[=$module]Test.obj" \\
  1082.     "$(INTDIR)/Node.obj" \\
  1083.     "$(INTDIR)/StdAfx.obj" \\
  1084.     "$(INTDIR)/[=$module].res"
  1085.  
  1086. "$(OUTDIR)/[=$module].exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
  1087.     $(LINK32) @<<
  1088.   $(LINK32_FLAGS) $(LINK32_OBJS)
  1089. <<
  1090.  
  1091. !ELSEIF  "$(CFG)" == "[=$module] - Win32 Unicode Release"
  1092.  
  1093. OUTDIR=./UnicodeRelease
  1094. INTDIR=./UnicodeRelease
  1095. # Begin Custom Macros
  1096. OutDir=./UnicodeRelease
  1097. # End Custom Macros
  1098.  
  1099. ALL : "$(OUTDIR)/[=$module].exe"
  1100.  
  1101.  
  1102. CLEAN :
  1103.     -@erase "$(INTDIR)/[=$module].obj"
  1104.     -@erase "$(INTDIR)/[=$module].pch"
  1105.     -@erase "$(INTDIR)/[=$module].res"
  1106.     -@erase "$(INTDIR)/[=$module]Test.obj"
  1107.     -@erase "$(INTDIR)/Node.obj"
  1108.     -@erase "$(INTDIR)/StdAfx.obj"
  1109.     -@erase "$(INTDIR)/vc60.idb"
  1110.     -@erase "$(OUTDIR)/[=$module].exe"
  1111.  
  1112. "$(OUTDIR)" :
  1113.     if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
  1114.  
  1115. CPP=cl.exe
  1116. CPP_PROJ=/nologo /MD /W3 /GR /GX /O2 /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /D "_AFXDLL" /Fp"$(INTDIR)/[=$module].pch" /Yu"stdafx.h" /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /FD /c 
  1117.  
  1118. .c{$(INTDIR)}.obj::
  1119.    $(CPP) @<<
  1120.    $(CPP_PROJ) $< 
  1121. <<
  1122.  
  1123. .cpp{$(INTDIR)}.obj::
  1124.    $(CPP) @<<
  1125.    $(CPP_PROJ) $< 
  1126. <<
  1127.  
  1128. .cxx{$(INTDIR)}.obj::
  1129.    $(CPP) @<<
  1130.    $(CPP_PROJ) $< 
  1131. <<
  1132.  
  1133. .c{$(INTDIR)}.sbr::
  1134.    $(CPP) @<<
  1135.    $(CPP_PROJ) $< 
  1136. <<
  1137.  
  1138. .cpp{$(INTDIR)}.sbr::
  1139.    $(CPP) @<<
  1140.    $(CPP_PROJ) $< 
  1141. <<
  1142.  
  1143. .cxx{$(INTDIR)}.sbr::
  1144.    $(CPP) @<<
  1145.    $(CPP_PROJ) $< 
  1146. <<
  1147.  
  1148. RSC=rc.exe
  1149. RSC_PROJ=/l 0x409 /fo"$(INTDIR)/[=$module].res" /d "NDEBUG" /d "_AFXDLL" 
  1150. BSC32=bscmake.exe
  1151. BSC32_FLAGS=/nologo /o"$(OUTDIR)/[=$module].bsc" 
  1152. BSC32_SBRS= \\
  1153.     
  1154. LINK32=link.exe
  1155. LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /pdb:"$(OUTDIR)/[=$module].pdb" /machine:I386 /out:"$(OUTDIR)/[=$module].exe" 
  1156. LINK32_OBJS= \\
  1157.     "$(INTDIR)/[=$module].obj" \\
  1158.     "$(INTDIR)/[=$module]Test.obj" \\
  1159.     "$(INTDIR)/Node.obj" \\
  1160.     "$(INTDIR)/StdAfx.obj" \\
  1161.     "$(INTDIR)/[=$module].res"
  1162.  
  1163. "$(OUTDIR)/[=$module].exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
  1164.     $(LINK32) @<<
  1165.   $(LINK32_FLAGS) $(LINK32_OBJS)
  1166. <<
  1167.  
  1168. !ENDIF 
  1169.  
  1170.  
  1171. !IF "$(NO_EXTERNAL_DEPS)" != "1"
  1172. !IF EXISTS("[=$module].dep")
  1173. !INCLUDE "[=$module].dep"
  1174. !ELSE 
  1175. !MESSAGE Warning: cannot find "[=$module].dep"
  1176. !ENDIF 
  1177. !ENDIF 
  1178.  
  1179.  
  1180. !IF "$(CFG)" == "[=$module] - Win32 Release" || "$(CFG)" == "[=$module] - Win32 Debug" || "$(CFG)" == "[=$module] - Win32 Unicode Debug" || "$(CFG)" == "[=$module] - Win32 Unicode Release"
  1181. SOURCE=./[=$module].cpp
  1182.  
  1183. "$(INTDIR)/[=$module].obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)/[=$module].pch"
  1184.  
  1185.  
  1186. SOURCE=./[=$module].rc
  1187.  
  1188. "$(INTDIR)/[=$module].res" : $(SOURCE) "$(INTDIR)"
  1189.     $(RSC) $(RSC_PROJ) $(SOURCE)
  1190.  
  1191.  
  1192. SOURCE=./[=$module]Test.cpp
  1193.  
  1194. "$(INTDIR)/[=$module]Test.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)/[=$module].pch"
  1195.  
  1196.  
  1197. SOURCE=./Node.cpp
  1198.  
  1199. "$(INTDIR)/Node.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)/[=$module].pch"
  1200.  
  1201.  
  1202. SOURCE=./StdAfx.cpp
  1203.  
  1204. !IF  "$(CFG)" == "[=$module] - Win32 Release"
  1205.  
  1206. CPP_SWITCHES=/nologo /MD /W3 /GR /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "_AFXDLL" /Fp"$(INTDIR)/[=$module].pch" /Yc"stdafx.h" /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /FD /c 
  1207.  
  1208. "$(INTDIR)/StdAfx.obj"    "$(INTDIR)/[=$module].pch" : $(SOURCE) "$(INTDIR)"
  1209.     $(CPP) @<<
  1210.   $(CPP_SWITCHES) $(SOURCE)
  1211. <<
  1212.  
  1213.  
  1214. !ELSEIF  "$(CFG)" == "[=$module] - Win32 Debug"
  1215.  
  1216. CPP_SWITCHES=/nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "_AFXDLL" /Fp"$(INTDIR)/[=$module].pch" /Yc"stdafx.h" /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /FD /GZ /c 
  1217.  
  1218. "$(INTDIR)/StdAfx.obj"    "$(INTDIR)/[=$module].pch" : $(SOURCE) "$(INTDIR)"
  1219.     $(CPP) @<<
  1220.   $(CPP_SWITCHES) $(SOURCE)
  1221. <<
  1222.  
  1223.  
  1224. !ELSEIF  "$(CFG)" == "[=$module] - Win32 Unicode Debug"
  1225.  
  1226. CPP_SWITCHES=/nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /D "_AFXDLL" /Fp"$(INTDIR)/[=$module].pch" /Yc"stdafx.h" /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /FD /GZ /c 
  1227.  
  1228. "$(INTDIR)/StdAfx.obj"    "$(INTDIR)/[=$module].pch" : $(SOURCE) "$(INTDIR)"
  1229.     $(CPP) @<<
  1230.   $(CPP_SWITCHES) $(SOURCE)
  1231. <<
  1232.  
  1233.  
  1234. !ELSEIF  "$(CFG)" == "[=$module] - Win32 Unicode Release"
  1235.  
  1236. CPP_SWITCHES=/nologo /MD /W3 /GR /GX /O2 /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /D "_AFXDLL" /Fp"$(INTDIR)/[=$module].pch" /Yc"stdafx.h" /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /FD /c 
  1237.  
  1238. "$(INTDIR)/StdAfx.obj"    "$(INTDIR)/[=$module].pch" : $(SOURCE) "$(INTDIR)"
  1239.     $(CPP) @<<
  1240.   $(CPP_SWITCHES) $(SOURCE)
  1241. <<
  1242.  
  1243.  
  1244. !ENDIF 
  1245.  
  1246.  
  1247. !ENDIF 
  1248.  
  1249. [
  1250. close
  1251. create $outputpath & "/" & $module & ".dep"
  1252. ]# Microsoft Developer Studio Generated Dependency File, included by CompAnon.mak
  1253.  
  1254. [=$module].cpp : \\
  1255.     "[=$module].h"\\
  1256.     "StdAfx.h"
  1257.  
  1258. [=$module]Test.cpp : \\
  1259.     "[=$module].h"\\
  1260.     "StdAfx.h"
  1261.  
  1262. StdAfx.cpp : \\
  1263.     "StdAfx.h"
  1264. [
  1265. close
  1266. create $outputpath & "/StdAfx.h"
  1267. ]// stdafx.h : include file for standard system include files,
  1268. //  or project specific include files that are used frequently, but
  1269. //      are changed infrequently
  1270. //
  1271.  
  1272. #if !defined(AFX_STDAFX_H__38C3B4DE_1B50_4E1F_B080_C86F831304CA__INCLUDED_)
  1273. #define AFX_STDAFX_H__38C3B4DE_1B50_4E1F_B080_C86F831304CA__INCLUDED_
  1274.  
  1275. #if _MSC_VER > 1000
  1276. #pragma once
  1277. #endif // _MSC_VER > 1000
  1278.  
  1279. #define VC_EXTRALEAN        // Exclude rarely-used stuff from Windows headers
  1280.  
  1281. #include <afx.h>
  1282. #include <afxwin.h>         // MFC core and standard components
  1283. #include <afxext.h>         // MFC extensions
  1284. #include <afxdtctl.h>        // MFC support for Internet Explorer 4 Common Controls
  1285. #ifndef _AFX_NO_AFXCMN_SUPPORT
  1286. #include <afxcmn.h>            // MFC support for Windows Common Controls
  1287. #endif // _AFX_NO_AFXCMN_SUPPORT
  1288.  
  1289. #include <iostream>
  1290.  
  1291. // TODO: reference additional headers your program requires here
  1292.  
  1293. //{{AFX_INSERT_LOCATION}}
  1294. // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
  1295.  
  1296. #endif // !defined(AFX_STDAFX_H__38C3B4DE_1B50_4E1F_B080_C86F831304CA__INCLUDED_)
  1297. [
  1298. close
  1299. create $outputpath & "/StdAfx.cpp"
  1300. ]// stdafx.cpp : source file that includes just the standard includes
  1301. //    [=$module].pch will be the pre-compiled header
  1302. //    stdafx.obj will contain the pre-compiled type information
  1303.  
  1304. #include "stdafx.h"
  1305.  
  1306. // TODO: reference any additional headers you need in STDAFX.H
  1307. // and not in this file
  1308. [
  1309. close
  1310. create $outputpath & "/Resource.h"
  1311. ]
  1312. //{{NO_DEPENDENCIES}}
  1313. // Microsoft Visual C++ generated include file.
  1314. // Used by [=$module].rc
  1315. //
  1316. #define IDS_HELLO                       1
  1317.  
  1318. // Next default values for new objects
  1319. // 
  1320. #ifdef APSTUDIO_INVOKED
  1321. #ifndef APSTUDIO_READONLY_SYMBOLS
  1322. #define _APS_NEXT_RESOURCE_VALUE        101
  1323. #define _APS_NEXT_COMMAND_VALUE         40001
  1324. #define _APS_NEXT_CONTROL_VALUE         1000
  1325. #define _APS_NEXT_SYMED_VALUE           101
  1326. #endif
  1327. #endif
  1328. [
  1329. close
  1330. create $outputpath & "/" & $module & ".rc"
  1331. ]
  1332. //Microsoft Visual C++ generated resource script.
  1333. //
  1334. #include "resource.h"
  1335.  
  1336. #define APSTUDIO_READONLY_SYMBOLS
  1337. /////////////////////////////////////////////////////////////////////////////
  1338. //
  1339. // Generated from the TEXTINCLUDE 2 resource.
  1340. //
  1341. #include "afxres.h"
  1342.  
  1343. /////////////////////////////////////////////////////////////////////////////
  1344. #undef APSTUDIO_READONLY_SYMBOLS
  1345.  
  1346. #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
  1347. #ifdef _WIN32
  1348. LANGUAGE 9, 1
  1349. #pragma code_page(1252)
  1350. #endif //_WIN32
  1351.  
  1352. #ifdef APSTUDIO_INVOKED
  1353. /////////////////////////////////////////////////////////////////////////////
  1354. //
  1355. // TEXTINCLUDE
  1356. //
  1357.  
  1358. 1 TEXTINCLUDE DISCARDABLE 
  1359. BEGIN
  1360.     "resource.h\\0"
  1361. END
  1362.  
  1363. 2 TEXTINCLUDE DISCARDABLE 
  1364. BEGIN
  1365.     "#include ""afxres.h""\\r\\n"
  1366.     "\\0"
  1367. END
  1368.  
  1369. 3 TEXTINCLUDE DISCARDABLE 
  1370. BEGIN
  1371.     "\\r\\n"
  1372.     "\\0"
  1373. END
  1374.  
  1375. #endif    // APSTUDIO_INVOKED
  1376.  
  1377.  
  1378. /////////////////////////////////////////////////////////////////////////////
  1379. //
  1380. // String Table
  1381. //
  1382.  
  1383. STRINGTABLE DISCARDABLE 
  1384. BEGIN
  1385.     IDS_HELLO               "Hello from MFC!"
  1386. END
  1387.  
  1388. #endif
  1389. /////////////////////////////////////////////////////////////////////////////
  1390.  
  1391.  
  1392.  
  1393. #ifndef APSTUDIO_INVOKED
  1394. /////////////////////////////////////////////////////////////////////////////
  1395. //
  1396. // Generated from the TEXTINCLUDE 3 resource.
  1397. //
  1398.  
  1399.  
  1400. /////////////////////////////////////////////////////////////////////////////
  1401. #endif    // not APSTUDIO_INVOKED
  1402. [
  1403. close
  1404. create $outputpath & "/Node.h"
  1405. ]
  1406. #pragma once
  1407.  
  1408.  
  1409. #import "msxml4.dll" named_guids
  1410.  
  1411.  
  1412. ///////////////////////////////////////////////////////////////////////////////
  1413. //
  1414. //  CNodeException
  1415. //
  1416. ///////////////////////////////////////////////////////////////////////////////
  1417.  
  1418.  
  1419. class CNodeException
  1420. {
  1421. public:
  1422.     typedef enum
  1423.     {
  1424.         eError1,
  1425.         eError2
  1426.     } ECode;
  1427.  
  1428.     CNodeException(int nCode, const CString& sMessage);
  1429.     int GetCode();
  1430.     CString GetMessage();
  1431.  
  1432. protected:
  1433.     int        m_nCode;
  1434.     CString    m_sMessage;
  1435. };
  1436.  
  1437.  
  1438. ///////////////////////////////////////////////////////////////////////////////
  1439. //
  1440. //  CFragmentCollection
  1441. //
  1442. ///////////////////////////////////////////////////////////////////////////////
  1443.  
  1444.  
  1445. class CFragmentCollection
  1446. {
  1447. public:
  1448.     static MSXML2::IXMLDOMDocument2Ptr GetDocument();
  1449.     static MSXML2::IXMLDOMNodePtr CreateFragment();
  1450.     static void CheckDocumentCounter();
  1451.  
  1452. protected:
  1453.     static MSXML2::IXMLDOMDocument2Ptr            m_spDocument;
  1454.     static MSXML2::IXMLDOMDocumentFragmentPtr    m_spFragment;
  1455.     static int                                    m_nTmpNameCounter;
  1456. };
  1457.  
  1458.  
  1459. ///////////////////////////////////////////////////////////////////////////////
  1460. //
  1461. //  CNode
  1462. //
  1463. ///////////////////////////////////////////////////////////////////////////////
  1464.  
  1465.  
  1466. class CNode
  1467. {
  1468. public:
  1469.     typedef enum {
  1470.         Element,
  1471.         Attribute
  1472.     } ENodeType;
  1473.  
  1474. protected:
  1475.     CNode();
  1476.     CNode(CNode& rParentNode, MSXML2::IXMLDOMNodePtr spThisNode);
  1477.     CNode(MSXML2::IXMLDOMDocument2Ptr& rspDocument);
  1478.  
  1479. public:
  1480.     virtual ~CNode();
  1481.  
  1482.     CString Transform(const CString& sXSLTFilename);
  1483.  
  1484.     CString GetNodeName() const { return (LPCTSTR)m_spNode->nodeName; }
  1485.     CString GetNodeText() const { return (LPCTSTR)m_spNode->text; }
  1486.     CString ToXMLString() const { return (LPCTSTR)m_spNode->xml; }
  1487.  
  1488. protected:
  1489.     friend class CDoc;
  1490.  
  1491.     void DeclareNamespace(const CString& sPrefix, const CString& sURI);
  1492.     MSXML2::IXMLDOMNodePtr CreateNode(ENodeType eNodeType, const CString& sNamespaceURI, LPCTSTR szName);
  1493.     bool CompareChildName( MSXML2::IXMLDOMNodePtr spChild, const CString& sNamespaceURI, const CString& sName );
  1494.     int ChildCount(ENodeType eNodeType, const CString& sNamespaceURI, const CString& sName);
  1495.     MSXML2::IXMLDOMNodePtr AppendChild(ENodeType eNodeType, const CString& sNamespaceURI, const CString& sName, const CString& sValue);
  1496.     MSXML2::IXMLDOMNodePtr AppendChildAttribute(MSXML2::IXMLDOMNodePtr spNode, const CString& sNamespaceURI, const CString& sName, const CString& sValue);
  1497.     MSXML2::IXMLDOMNodePtr AppendChildElement(const CString& sNamespaceURI, const CString& sElement, CNode* pNode, MSXML2::IXMLDOMNodePtr spHostNode = MSXML2::IXMLDOMNodePtr());
  1498.     MSXML2::IXMLDOMNodePtr RemoveChildAt(ENodeType eNodeType, const CString& sNamespaceURI, const CString& sName, int nIndex);
  1499.     MSXML2::IXMLDOMNodePtr ReplaceChildAt(ENodeType eNodeType, const CString& sNamespaceURI, const CString& sName, int nIndex, const CString& sValue);
  1500.     MSXML2::IXMLDOMNodePtr GetChildAt(ENodeType eNodeType, const CString& sNamespaceURI, const CString& sName, int nIndex);
  1501.     MSXML2::IXMLDOMNodePtr SetChild(ENodeType eNodeType, const CString& sNamespaceURI, const CString& sName, const CString& sValue);
  1502.  
  1503.     MSXML2::IXMLDOMDocument2Ptr    m_spDocument;
  1504.     MSXML2::IXMLDOMNodePtr        m_spNode;
  1505. };
  1506.  
  1507.  
  1508. ///////////////////////////////////////////////////////////////////////////////
  1509. //
  1510. //  CDoc
  1511. //
  1512. ///////////////////////////////////////////////////////////////////////////////
  1513.  
  1514.  
  1515. class CDoc
  1516. {
  1517. public:
  1518.     MSXML2::IXMLDOMDocument2Ptr Load(const CString& sFilename);
  1519.     
  1520.     void SetRootElementName(CString sName, CString sNamespaceURI);
  1521.     void SetSchemaLocation(const CString& sSchemaLocation);
  1522.  
  1523.     void Save(const CString& sFilename, CNode& rNode);
  1524.     void Validate(CNode& rNode);
  1525.  
  1526. protected:
  1527.     void FinalizeRootElement(CNode& rNode);
  1528.     void InternalSetSchemaLocation(CNode& rNode);
  1529.     virtual void DeclareNamespaces(CNode& rNode) = 0;
  1530.     void DeclareNamespace(CNode& rNode, const CString& sPrefix, const CString& sURI)
  1531.     {
  1532.         rNode.DeclareNamespace(sPrefix, sURI);
  1533.     }
  1534.  
  1535.     CString m_sName;
  1536.     CString m_sNamespaceURI;
  1537.     CString m_sSchemaLocation;
  1538. };
  1539.  
  1540.  
  1541. ///////////////////////////////////////////////////////////////////////////////
  1542. //
  1543. //  CSchemaType
  1544. //
  1545. ///////////////////////////////////////////////////////////////////////////////
  1546.  
  1547.  
  1548. class CSchemaType
  1549. {
  1550. public:
  1551.     virtual operator CString() = 0;
  1552. };
  1553.  
  1554.  
  1555. ///////////////////////////////////////////////////////////////////////////////
  1556. //
  1557. //  CSchemaBoolean
  1558. //
  1559. ///////////////////////////////////////////////////////////////////////////////
  1560.  
  1561.  
  1562. class CSchemaBoolean : public CSchemaType
  1563. {
  1564. public:
  1565.     CSchemaBoolean(bool bValue) { m_Value = bValue; }
  1566.     CSchemaBoolean(const CString& sValue) { m_Value = (sValue == _T("true") || sValue == _T("1")); }
  1567.     virtual operator bool() { return m_Value; }
  1568.     virtual operator CString() { return m_Value ? _T("true") : _T("false"); }
  1569.  
  1570.     typedef bool basetype;
  1571.  
  1572. protected:
  1573.     bool m_Value;
  1574. };
  1575.  
  1576.  
  1577. ///////////////////////////////////////////////////////////////////////////////
  1578. //
  1579. //  CSchemaFloat (32bit floating point number)
  1580. //
  1581. ///////////////////////////////////////////////////////////////////////////////
  1582.  
  1583.  
  1584. class CSchemaFloat : public CSchemaType
  1585. {
  1586. public:
  1587.     CSchemaFloat(float fValue) { m_Value = fValue; }
  1588.     CSchemaFloat(const CString& sValue) { _stscanf(sValue, _T("%G"), &m_Value); }
  1589.     virtual operator float() { return m_Value; }
  1590.     virtual operator CString() { TCHAR szValue\[32\]; _sntprintf(szValue, 32, _T("%G"), m_Value); return szValue; }
  1591.  
  1592.     typedef float basetype;
  1593.  
  1594. protected:
  1595.     float m_Value;
  1596. };
  1597.  
  1598.  
  1599. ///////////////////////////////////////////////////////////////////////////////
  1600. //
  1601. //  CSchemaDouble (64bit floating point number)
  1602. //
  1603. ///////////////////////////////////////////////////////////////////////////////
  1604.  
  1605.  
  1606. class CSchemaDouble : public CSchemaType
  1607. {
  1608. public:
  1609.     CSchemaDouble(double fValue) { m_Value = fValue; }
  1610.     CSchemaDouble(const CString& sValue) { _stscanf(sValue, _T("%G"), &m_Value); }
  1611.     virtual operator double() { return m_Value; }
  1612.     virtual operator CString() { TCHAR szValue\[32\]; _sntprintf(szValue, 32, _T("%G"), m_Value); return szValue; }
  1613.  
  1614.     typedef double basetype;
  1615.  
  1616. protected:
  1617.     double m_Value;
  1618. };
  1619.  
  1620.  
  1621. ///////////////////////////////////////////////////////////////////////////////
  1622. //
  1623. //  CDecimal
  1624. //
  1625. ///////////////////////////////////////////////////////////////////////////////
  1626.  
  1627.  
  1628. class CSchemaDecimal : public CSchemaType
  1629. {
  1630. public:
  1631.     CSchemaDecimal(double fValue) { m_Value = fValue; }
  1632.     CSchemaDecimal(const CString& sValue) { _stscanf(sValue, _T("%f"), &m_Value); }
  1633.     virtual operator double() { return m_Value; }
  1634.     virtual operator CString() { TCHAR szValue\[32\]; _sntprintf(szValue, 32, _T("%f"), m_Value); return szValue; }
  1635.  
  1636.     typedef double basetype;
  1637.  
  1638. protected:
  1639.     float m_Value;
  1640. };
  1641.  
  1642.  
  1643. ///////////////////////////////////////////////////////////////////////////////
  1644. //
  1645. //  CSchemaLong (signed 64bit integer)
  1646. //
  1647. ///////////////////////////////////////////////////////////////////////////////
  1648.  
  1649.  
  1650. class CSchemaLong : public CSchemaType
  1651. {
  1652. public:
  1653.     CSchemaLong(__int64 nValue) { m_Value = nValue; }
  1654.     CSchemaLong(const CString& sValue) { m_Value = _ttoi64(sValue); }
  1655.     virtual operator __int64() { return m_Value; }
  1656.     virtual operator CString() { TCHAR szValue\[32\]; _sntprintf(szValue, 31, _T("%I64i"), m_Value); szValue\[31\] = 0; return szValue; }
  1657.  
  1658.     typedef __int64 basetype;
  1659.  
  1660. protected:
  1661.     __int64 m_Value;
  1662. };
  1663.  
  1664.  
  1665. ///////////////////////////////////////////////////////////////////////////////
  1666. //
  1667. //  CSchemaUnsignedLong (unsigned 64bit integer)
  1668. //
  1669. ///////////////////////////////////////////////////////////////////////////////
  1670.  
  1671.  
  1672. class CSchemaUnsignedLong : public CSchemaType
  1673. {
  1674. public:
  1675.     CSchemaUnsignedLong(unsigned __int64 nValue) { m_Value = nValue; }
  1676.     CSchemaUnsignedLong(const CString& sValue) { m_Value = _ttoi64(sValue); }
  1677.     virtual operator unsigned __int64() { return m_Value; }
  1678.     virtual operator CString() { TCHAR szValue\[32\]; _sntprintf(szValue, 31, _T("%I64u"), m_Value); szValue\[31\] = 0; return szValue; }
  1679.  
  1680.     typedef unsigned __int64 basetype;
  1681.  
  1682. protected:
  1683.     unsigned __int64 m_Value;
  1684. };
  1685.  
  1686.  
  1687. ///////////////////////////////////////////////////////////////////////////////
  1688. //
  1689. //  CSchemaInt (signed 32bit integer)
  1690. //
  1691. ///////////////////////////////////////////////////////////////////////////////
  1692.  
  1693.  
  1694. class CSchemaInt : public CSchemaType
  1695. {
  1696. public:
  1697.     CSchemaInt(long nValue) { m_Value = nValue; }
  1698.     CSchemaInt(const CString& sValue) { m_Value = _ttol(sValue); }
  1699.     virtual operator long() { return m_Value; }
  1700.     virtual operator CString() { TCHAR szValue\[32\]; _sntprintf(szValue, 31, _T("%li"), m_Value); szValue\[31\] = 0; return szValue; }
  1701.  
  1702.     typedef long basetype;
  1703.  
  1704. protected:
  1705.     long m_Value;
  1706. };
  1707.  
  1708.  
  1709. ///////////////////////////////////////////////////////////////////////////////
  1710. //
  1711. //  CSchemaUnsignedInt (unsigned 32bit integer)
  1712. //
  1713. ///////////////////////////////////////////////////////////////////////////////
  1714.  
  1715.  
  1716. class CSchemaUnsignedInt : public CSchemaType
  1717. {
  1718. public:
  1719.     CSchemaUnsignedInt(unsigned long nValue) { m_Value = nValue; }
  1720.     CSchemaUnsignedInt(const CString& sValue) { m_Value = _ttol(sValue); }
  1721.     virtual operator unsigned long() { return m_Value; }
  1722.     virtual operator CString() { TCHAR szValue\[32\]; _sntprintf(szValue, 31, _T("%lu"), m_Value); szValue\[31\] = 0; return szValue; }
  1723.  
  1724.     typedef unsigned long basetype;
  1725.  
  1726. protected:
  1727.     unsigned long m_Value;
  1728. };
  1729.  
  1730.  
  1731. ///////////////////////////////////////////////////////////////////////////////
  1732. //
  1733. //  CSchemaShort (signed 16bit integer)
  1734. //
  1735. ///////////////////////////////////////////////////////////////////////////////
  1736.  
  1737.  
  1738. class CSchemaShort : public CSchemaType
  1739. {
  1740. public:
  1741.     CSchemaShort(short nValue) { m_Value = nValue; }
  1742.     CSchemaShort(const CString& sValue) { m_Value = _ttoi(sValue); }
  1743.     virtual operator short() { return m_Value; }
  1744.     virtual operator CString() { TCHAR szValue\[32\]; _sntprintf(szValue, 31, _T("%hi"), m_Value); szValue\[31\] = 0; return szValue; }
  1745.  
  1746.     typedef short basetype;
  1747.  
  1748. protected:
  1749.     short m_Value;
  1750. };
  1751.  
  1752.  
  1753. ///////////////////////////////////////////////////////////////////////////////
  1754. //
  1755. //  CSchemaUnsignedShort (unsigned 16bit integer)
  1756. //
  1757. ///////////////////////////////////////////////////////////////////////////////
  1758.  
  1759.  
  1760. class CSchemaUnsignedShort : public CSchemaType
  1761. {
  1762. public:
  1763.     CSchemaUnsignedShort(unsigned short nValue) { m_Value = nValue; }
  1764.     CSchemaUnsignedShort(const CString& sValue) { m_Value = _ttoi(sValue); }
  1765.     virtual operator unsigned short() { return m_Value; }
  1766.     virtual operator CString() { TCHAR szValue\[32\]; _sntprintf(szValue, 31, _T("%hu"), m_Value); szValue\[31\] = 0; return szValue; }
  1767.  
  1768.     typedef unsigned short basetype;
  1769.  
  1770. protected:
  1771.     unsigned short m_Value;
  1772. };
  1773.  
  1774.  
  1775. ///////////////////////////////////////////////////////////////////////////////
  1776. //
  1777. //  CSchemaByte (signed 8bit integer)
  1778. //
  1779. ///////////////////////////////////////////////////////////////////////////////
  1780.  
  1781.  
  1782. class CSchemaByte : public CSchemaType
  1783. {
  1784. public:
  1785.     CSchemaByte(char nValue) { m_Value = nValue; }
  1786.     CSchemaByte(const CString& sValue) { m_Value = _ttoi(sValue); }
  1787.     virtual operator char() { return m_Value; }
  1788.     virtual operator CString() { TCHAR szValue\[32\]; _sntprintf(szValue, 31, _T("%hi"), m_Value); szValue\[31\] = 0; return szValue; }
  1789.  
  1790.     typedef char basetype;
  1791.  
  1792. protected:
  1793.     char m_Value;
  1794. };
  1795.  
  1796.  
  1797. ///////////////////////////////////////////////////////////////////////////////
  1798. //
  1799. //  CSchemaUnsignedShort (unsigned 16bit integer)
  1800. //
  1801. ///////////////////////////////////////////////////////////////////////////////
  1802.  
  1803.  
  1804. class CSchemaUnsignedByte : public CSchemaType
  1805. {
  1806. public:
  1807.     CSchemaUnsignedByte(unsigned char nValue) { m_Value = nValue; }
  1808.     CSchemaUnsignedByte(const CString& sValue) { m_Value = _ttoi(sValue); }
  1809.     virtual operator unsigned char() { return m_Value; }
  1810.     virtual operator CString() { TCHAR szValue\[32\]; _sntprintf(szValue, 31, _T("%hu"), m_Value); szValue\[31\] = 0; return szValue; }
  1811.  
  1812.     typedef unsigned char basetype;
  1813.  
  1814. protected:
  1815.     unsigned char m_Value;
  1816. };
  1817.  
  1818.  
  1819. ///////////////////////////////////////////////////////////////////////////////
  1820. //
  1821. //  CSchemaInteger
  1822. //  CSchemaNegativeInteger
  1823. //  CSchemaNonNegativeInteger
  1824. //  CSchemaPositiveInteger
  1825. //  CSchemaNonPositiveInteger
  1826. //
  1827. ///////////////////////////////////////////////////////////////////////////////
  1828.  
  1829.  
  1830. typedef CSchemaLong        CSchemaInteger;
  1831. typedef CSchemaInteger    CSchemaNegativeInteger;
  1832. typedef CSchemaInteger    CSchemaNonNegativeInteger;
  1833. typedef CSchemaInteger    CSchemaPositiveInteger;
  1834. typedef CSchemaInteger    CSchemaNonPositiveInteger;
  1835.  
  1836.  
  1837. ///////////////////////////////////////////////////////////////////////////////
  1838. //
  1839. //  CSchemaString family
  1840. //
  1841. ///////////////////////////////////////////////////////////////////////////////
  1842.  
  1843.  
  1844. class CSchemaString : public CSchemaType
  1845. {
  1846. public:
  1847.     CSchemaString(LPCTSTR szValue) : m_Value(szValue) {}
  1848.     CSchemaString(const CString& sValue) : m_Value(sValue) {}
  1849.     virtual operator CString() { return m_Value; }
  1850.  
  1851.     typedef LPCTSTR basetype;
  1852.  
  1853. protected:
  1854.     CString m_Value;
  1855. };
  1856.  
  1857.  
  1858. typedef CSchemaString CSchemaNormalizedString;
  1859. typedef CSchemaString CSchemaToken;
  1860. typedef CSchemaString CSchemaLanguage;
  1861. typedef CSchemaString CSchemaName;
  1862. typedef CSchemaString CSchemaNMToken;
  1863. typedef CSchemaString CSchemaNMTokens;
  1864. typedef CSchemaString CSchemaNCName;
  1865. typedef CSchemaString CSchemaID;
  1866. typedef CSchemaString CSchemaIDRef;
  1867. typedef CSchemaString CSchemaIDRefs;
  1868. typedef CSchemaString CSchemaEntity;
  1869. typedef CSchemaString CSchemaEntities;
  1870. typedef CSchemaString CSchemaAnyURI;
  1871. typedef CSchemaString CSchemaQName;
  1872. typedef CSchemaString CSchemaNotation;
  1873.  
  1874.  
  1875. ///////////////////////////////////////////////////////////////////////////////
  1876. //
  1877. //  CSchemaDate
  1878. //
  1879. ///////////////////////////////////////////////////////////////////////////////
  1880.  
  1881.  
  1882. class CSchemaDate : public CSchemaType
  1883. {
  1884. public:
  1885.     CSchemaDate(COleDateTime Value) : m_Value( Value ) {}
  1886.     CSchemaDate(const CString& sValue) { m_Value.SetDate(_ttoi(sValue.Mid(0, 4)), _ttoi(sValue.Mid(5, 2)), _ttoi(sValue.Mid(8, 2))); }
  1887.     virtual operator CString() { return m_Value.Format(_T("%Y-%m-%d")); }
  1888.  
  1889.     typedef COleDateTime basetype;
  1890.  
  1891. protected:
  1892.     COleDateTime m_Value;
  1893. };
  1894.  
  1895.  
  1896. ///////////////////////////////////////////////////////////////////////////////
  1897. //
  1898. //  CSchemaTime
  1899. //
  1900. ///////////////////////////////////////////////////////////////////////////////
  1901.  
  1902.  
  1903. class CSchemaTime : public CSchemaType
  1904. {
  1905. public:
  1906.     CSchemaTime(COleDateTime Value) : m_Value( Value ) {}
  1907.     CSchemaTime(const CString& sValue) { m_Value.SetTime(_ttoi(sValue.Mid(0, 2)), _ttoi(sValue.Mid(3, 2)), _ttoi(sValue.Mid(6, 2))); }
  1908.     virtual operator CString() { return m_Value.Format(_T("%H:%M:%S")); }
  1909.  
  1910.     typedef COleDateTime basetype;
  1911.  
  1912. protected:
  1913.     COleDateTime m_Value;
  1914. };
  1915.  
  1916.  
  1917. ///////////////////////////////////////////////////////////////////////////////
  1918. //
  1919. //  CSchemaDateTime
  1920. //
  1921. ///////////////////////////////////////////////////////////////////////////////
  1922.  
  1923.  
  1924. class CSchemaDateTime : public CSchemaType
  1925. {
  1926. public:
  1927.     CSchemaDateTime(COleDateTime Value) : m_Value( Value ) {}
  1928.     CSchemaDateTime(const CString& sValue) { m_Value.SetDateTime(_ttoi(sValue.Mid(0, 4)), _ttoi(sValue.Mid(5, 2)), _ttoi(sValue.Mid(8, 2)), _ttoi(sValue.Mid(11, 2)), _ttoi(sValue.Mid(14, 2)), _ttoi(sValue.Mid(17, 2))); }
  1929.     virtual operator CString() { return m_Value.Format(_T("%Y-%m-%dT%H:%M:%S")); }
  1930.  
  1931.     typedef COleDateTime basetype;
  1932.  
  1933. protected:
  1934.     COleDateTime m_Value;
  1935. };
  1936.  
  1937.  
  1938. ///////////////////////////////////////////////////////////////////////////////
  1939. //
  1940. //  CSchemaYear
  1941. //
  1942. ///////////////////////////////////////////////////////////////////////////////
  1943.  
  1944.  
  1945. typedef CSchemaShort CSchemaYear;
  1946.  
  1947.  
  1948. ///////////////////////////////////////////////////////////////////////////////
  1949. //
  1950. //  CSchemaMonth
  1951. //
  1952. ///////////////////////////////////////////////////////////////////////////////
  1953.  
  1954.  
  1955. class CSchemaMonth : public CSchemaType
  1956. {
  1957. public:
  1958.     CSchemaMonth(unsigned char nValue) { m_Value = nValue; }
  1959.     CSchemaMonth(const CString& sValue) { _stscanf(sValue, _T("--%02hi--"), &m_Value); }
  1960.     virtual operator unsigned char() { return m_Value; }
  1961.     virtual operator CString() { TCHAR szValue\[32\]; _sntprintf(szValue, 31, _T("--%02hi--"), m_Value); return szValue; }
  1962.  
  1963.     typedef unsigned char basetype;
  1964.  
  1965. protected:
  1966.     unsigned char m_Value;
  1967. };
  1968.  
  1969.  
  1970. ///////////////////////////////////////////////////////////////////////////////
  1971. //
  1972. //  CSchemaDay
  1973. //
  1974. ///////////////////////////////////////////////////////////////////////////////
  1975.  
  1976.  
  1977. class CSchemaDay : public CSchemaType
  1978. {
  1979. public:
  1980.     CSchemaDay(unsigned char nValue) { m_Value = nValue; }
  1981.     CSchemaDay(const CString& sValue) { _stscanf(sValue, _T("---%02hi"), &m_Value); }
  1982.     virtual operator unsigned char() { return m_Value; }
  1983.     virtual operator CString() { TCHAR szValue\[32\]; _sntprintf(szValue, 31, _T("---%02hi"), m_Value); return szValue; }
  1984.  
  1985.     typedef unsigned char basetype;
  1986.  
  1987. protected:
  1988.     unsigned char m_Value;
  1989. };
  1990.  
  1991.  
  1992. ///////////////////////////////////////////////////////////////////////////////
  1993. //
  1994. //  CSchemaYearMonth
  1995. //
  1996. ///////////////////////////////////////////////////////////////////////////////
  1997.  
  1998.  
  1999. class CSchemaYearMonth : public CSchemaType
  2000. {
  2001. public:
  2002.     CSchemaYearMonth(short nYear, unsigned char nMonth) { m_nYear = nYear; m_nMonth = nMonth; }
  2003.     CSchemaYearMonth(const CString& sValue) { _stscanf(sValue, _T("%04hi-%02hi"), &m_nYear, &m_nMonth); }
  2004.     CSchemaYearMonth(LPCTSTR szValue) { CSchemaYearMonth(CString(szValue)); }
  2005.     short GetYear() { return m_nYear; }
  2006.     short GetMonth() { return m_nMonth; }
  2007.     virtual operator CString() { TCHAR szValue\[32\]; _sntprintf(szValue, 31, _T("%04hi-%02hi"), m_nYear, m_nMonth); return szValue; }
  2008.  
  2009.     bool operator ==(CSchemaYearMonth& rOther) { return m_nYear == rOther.m_nYear && m_nMonth == rOther.m_nMonth; }
  2010.     bool operator <(CSchemaYearMonth& rOther) { return m_nYear < rOther.m_nYear || (m_nYear == rOther.m_nYear && m_nMonth < rOther.m_nMonth); }
  2011.  
  2012.     typedef LPCTSTR basetype;
  2013.  
  2014. protected:
  2015.     short m_nYear;
  2016.     unsigned char m_nMonth;
  2017. };
  2018.  
  2019.  
  2020. ///////////////////////////////////////////////////////////////////////////////
  2021. //
  2022. //  CSchemaMonthDay
  2023. //
  2024. ///////////////////////////////////////////////////////////////////////////////
  2025.  
  2026.  
  2027. class CSchemaMonthDay : public CSchemaType
  2028. {
  2029. public:
  2030.     CSchemaMonthDay(unsigned char nMonth, unsigned char nDay) { m_nMonth = nMonth; m_nDay = nDay; }
  2031.     CSchemaMonthDay(const CString& sValue) { _stscanf(sValue, _T("--%02hi-%02hi"), &m_nMonth, &m_nDay); }
  2032.     CSchemaMonthDay(LPCTSTR szValue) { CSchemaMonthDay(CString(szValue)); }
  2033.     short GetMonth() { return m_nMonth; }
  2034.     short GetDay() { return m_nDay; }
  2035.     virtual operator CString() { TCHAR szValue\[32\]; _sntprintf(szValue, 31, _T("--%02hi-%02hi"), m_nMonth, m_nDay); return szValue; }
  2036.  
  2037.     bool operator ==(CSchemaMonthDay& rOther) { return m_nMonth == rOther.m_nMonth && m_nDay == rOther.m_nDay; }
  2038.     bool operator <(CSchemaMonthDay& rOther) { return m_nMonth < rOther.m_nMonth || (m_nMonth == rOther.m_nMonth && m_nDay < rOther.m_nDay); }
  2039.  
  2040.     typedef LPCTSTR basetype;
  2041.  
  2042. protected:
  2043.     unsigned char m_nMonth;
  2044.     unsigned char m_nDay;
  2045. };
  2046.  
  2047.  
  2048. ///////////////////////////////////////////////////////////////////////////////
  2049. //
  2050. //  CSchemaDuration
  2051. //
  2052. ///////////////////////////////////////////////////////////////////////////////
  2053.  
  2054.  
  2055. class CSchemaDuration : public CSchemaType
  2056. {
  2057. public:
  2058.     CSchemaDuration(LPCTSTR szValue) { CSchemaDuration(CString(szValue)); }
  2059.     CSchemaDuration(const CString& sValue)
  2060.     {
  2061.         m_bPositive    = true;
  2062.         m_nYear        = 0;
  2063.         m_nMonth    = 0;
  2064.         m_nDay        = 0;
  2065.         m_nHour        = 0;
  2066.         m_nMinute    = 0;
  2067.         m_nSecond    = 0;
  2068.  
  2069.         bool bTime = false;
  2070.         const TCHAR* szBuffer = (LPCTSTR)sValue;
  2071.         
  2072.         if (*szBuffer == _T('-'))
  2073.         {
  2074.             m_bPositive = false;
  2075.             szBuffer++;
  2076.         }
  2077.         
  2078.         if (*szBuffer != _T('P'))
  2079.         {
  2080.             return;
  2081.         }
  2082.         
  2083.         while (*szBuffer)
  2084.         {
  2085.             if (*szBuffer == _T('T'))
  2086.             {
  2087.                 bTime = true;
  2088.                 szBuffer++;
  2089.             }
  2090.             
  2091.             int nData = _ttoi(szBuffer);
  2092.             szBuffer += _tcsspn(szBuffer, _T("0123456789"));
  2093.  
  2094.             if (*szBuffer == _T('.'))
  2095.             {
  2096.                 szBuffer++;
  2097.                 szBuffer += _tcsspn(szBuffer, _T("0123456789"));
  2098.             }
  2099.             
  2100.             if (bTime)
  2101.             {
  2102.                 switch (*szBuffer++)
  2103.                 {
  2104.                 case _T('H'): m_nHour = nData; break;
  2105.                 case _T('M'): m_nMinute = nData; break;
  2106.                 case _T('S'): m_nSecond = nData; break;
  2107.                 }
  2108.             }
  2109.             else
  2110.             {
  2111.                 switch (*szBuffer++)
  2112.                 {
  2113.                 case _T('Y'): m_nYear = nData; break;
  2114.                 case _T('M'): m_nMonth = nData; break;
  2115.                 case _T('D'): m_nDay = nData; break;
  2116.                 }
  2117.             }
  2118.         }
  2119.     }
  2120.     short GetYear() { return m_nYear; }
  2121.     short GetMonth() { return m_nMonth; }
  2122.     short GetDay() { return m_nDay; }
  2123.     short GetHour() { return m_nHour; }
  2124.     short GetMinue() { return m_nHour; }
  2125.     short GetSecond() { return m_nSecond; }
  2126.     virtual operator CString()
  2127.     {
  2128.         CString sResult;
  2129.         TCHAR szValue\[32\];
  2130.         
  2131.         if (!m_bPositive)
  2132.             sResult = _T('-');
  2133.         sResult += _T('P');
  2134.         
  2135.         if (m_nYear)
  2136.         {
  2137.             _sntprintf(szValue, 31, _T("%hiY"), m_nYear);
  2138.             sResult += szValue;
  2139.         }
  2140.         if (m_nMonth)
  2141.         {
  2142.             _sntprintf(szValue, 31, _T("%hiM"), m_nMonth);
  2143.             sResult += szValue;
  2144.         }
  2145.         if (m_nDay)
  2146.         {
  2147.             _sntprintf(szValue, 31, _T("%hiD"), m_nDay);
  2148.             sResult += szValue;
  2149.         }
  2150.         
  2151.         if (m_nHour || m_nMinute || m_nSecond)
  2152.         {
  2153.             sResult += _T('T');
  2154.             if (m_nHour)
  2155.             {
  2156.                 _sntprintf(szValue, 31, _T("%hiH"), m_nHour);
  2157.                 sResult += szValue;
  2158.             }
  2159.             if (m_nMinute)
  2160.             {
  2161.                 _sntprintf(szValue, 31, _T("%hiM"), m_nMinute);
  2162.                 sResult += szValue;
  2163.             }
  2164.             if (m_nSecond)
  2165.             {
  2166.                 _sntprintf(szValue, 31, _T("%hiS"), m_nSecond);
  2167.                 sResult += szValue;
  2168.             }
  2169.         }
  2170.         
  2171.         return sResult;
  2172.     }
  2173.  
  2174.     typedef LPCTSTR basetype;
  2175.  
  2176. protected:
  2177.     bool    m_bPositive;
  2178.     short    m_nYear;
  2179.     short    m_nMonth;
  2180.     short    m_nDay;
  2181.     short    m_nHour;
  2182.     short    m_nMinute;
  2183.     short    m_nSecond;
  2184. };
  2185.  
  2186.  
  2187. ///////////////////////////////////////////////////////////////////////////////
  2188. //
  2189. //  CSchemaHexBinary
  2190. //
  2191. ///////////////////////////////////////////////////////////////////////////////
  2192.  
  2193.  
  2194. inline unsigned char hex2dec(TCHAR c)
  2195. {
  2196.     if (c >= _T('0') && c <= _T('9'))
  2197.         return c - _T('0');
  2198.     if (c >= _T('a') && c <= _T('f'))
  2199.         return 10 + c - _T('a');
  2200.     if (c >= _T('A') && c <= _T('A'))
  2201.         return 10 + c - _T('A');
  2202.     return 0;
  2203. }
  2204.  
  2205.  
  2206. class CSchemaHexBinary : public CSchemaType
  2207. {
  2208. public:
  2209.     CSchemaHexBinary(LPCTSTR szValue)
  2210.     {
  2211.         CSchemaHexBinary(CString(szValue));
  2212.     }
  2213.  
  2214.     CSchemaHexBinary(const CSchemaHexBinary& rOther)
  2215.     {
  2216.         m_nSize = rOther.m_nSize;
  2217.         m_szData = new unsigned char\[m_nSize\];
  2218.         memcpy(m_szData, rOther.m_szData, m_nSize);
  2219.     }
  2220.  
  2221.     CSchemaHexBinary(const CString& sValue)
  2222.     {
  2223.         m_nSize = sValue.GetLength() / 2;
  2224.         m_szData = new unsigned char\[m_nSize\];
  2225.         LPCTSTR szValue = (LPCTSTR)sValue;
  2226.         unsigned char* szDataWriter = m_szData;
  2227.         while (*szValue && *(szValue + 1))
  2228.         {
  2229.             *szDataWriter++ = hex2dec(*szValue) * 16 + hex2dec(*(szValue + 1));
  2230.             szValue += 2;
  2231.         }
  2232.     }
  2233.  
  2234.     virtual ~CSchemaHexBinary()
  2235.     {
  2236.     }
  2237.  
  2238.     int GetSize() const { return m_nSize; }
  2239.     unsigned char* GetData() { return m_szData; }
  2240.     virtual operator CString()
  2241.     {
  2242.         return m_szData;
  2243.     }
  2244.  
  2245.     typedef LPCTSTR basetype;
  2246.  
  2247. protected:
  2248.     int                m_nSize;
  2249.     unsigned char*    m_szData;
  2250. };
  2251.  
  2252.  
  2253. ///////////////////////////////////////////////////////////////////////////////
  2254. //
  2255. //  CSchemaBase64Binary
  2256. //
  2257. ///////////////////////////////////////////////////////////////////////////////
  2258.  
  2259.  
  2260. class CSchemaBase64Binary : public CSchemaType
  2261. {
  2262. public:
  2263.     CSchemaBase64Binary(LPCTSTR szValue);
  2264.     CSchemaBase64Binary(const CSchemaBase64Binary& rOther);
  2265.     CSchemaBase64Binary(const CString& sValue);
  2266.     virtual ~CSchemaBase64Binary();
  2267.  
  2268.     CSchemaBase64Binary& operator =(const CSchemaBase64Binary& rOther);
  2269.  
  2270.     int GetSize() const;
  2271.     LPBYTE GetData() const;
  2272.     void SetData(LPBYTE pData, int nSize, bool bCopy = true);
  2273.     virtual operator CString();
  2274.  
  2275.     typedef LPCTSTR basetype;
  2276.  
  2277. protected:
  2278.     void Encode(LPBYTE pSrc, int nSrcSize, LPTSTR& rszDst, int& rnDstSize, int nMaxLineLength = 76);
  2279.     void Decode(LPCTSTR szSrc, LPBYTE& rpDst, int& rnDstSize);
  2280.  
  2281.     static const TCHAR m_EncodeArray\[\];
  2282.     static const TCHAR m_DecodeArray\[\];
  2283.  
  2284.     int        m_nSize;
  2285.     LPBYTE    m_pData;
  2286. };
  2287. [
  2288. close
  2289. create $outputpath & "/Node.cpp"
  2290. ]
  2291. #include "stdafx.h"
  2292. #include "Node.h"
  2293.  
  2294.  
  2295. ///////////////////////////////////////////////////////////////////////////////
  2296. //
  2297. //  CNodeException
  2298. //
  2299. ///////////////////////////////////////////////////////////////////////////////
  2300.  
  2301.  
  2302. CNodeException::CNodeException(int nCode, const CString& sMessage)
  2303.     : m_nCode(nCode), m_sMessage(sMessage)
  2304. {
  2305. }
  2306.  
  2307.  
  2308. int CNodeException::GetCode()
  2309. {
  2310.     return m_nCode;
  2311. }
  2312.  
  2313.  
  2314. CString CNodeException::GetMessage()
  2315. {
  2316.     return m_sMessage;
  2317. }
  2318.  
  2319.  
  2320. ///////////////////////////////////////////////////////////////////////////////
  2321. //
  2322. //  CFragmentCollection
  2323. //
  2324. ///////////////////////////////////////////////////////////////////////////////
  2325.  
  2326.  
  2327. MSXML2::IXMLDOMDocument2Ptr CFragmentCollection::GetDocument()
  2328. {
  2329.     if (m_spDocument == NULL)
  2330.     {
  2331.         m_spDocument.CreateInstance(__uuidof(MSXML2::DOMDocument40));
  2332.         m_spDocument->async = VARIANT_FALSE;
  2333.         m_spDocument->setProperty(_T("NewParser"), true);
  2334.     }
  2335.     return m_spDocument;
  2336. }
  2337.  
  2338.  
  2339. MSXML2::IXMLDOMNodePtr CFragmentCollection::CreateFragment()
  2340. {
  2341.     //return GetDocument()->createDocumentFragment();
  2342.  
  2343.     TCHAR szNumber\[32\] = _T("tmp");
  2344.     _itot(m_nTmpNameCounter++, szNumber + 3, 10);
  2345.  
  2346.     if (m_spFragment == NULL)
  2347.     {
  2348.         m_spFragment = GetDocument()->createDocumentFragment();
  2349.     }
  2350.     MSXML2::IXMLDOMNodePtr spNode = GetDocument()->createElement(szNumber);
  2351.     m_spFragment->appendChild( spNode );
  2352.     return spNode;
  2353. }
  2354.  
  2355.  
  2356. void CFragmentCollection::CheckDocumentCounter()
  2357. {
  2358.     if (m_spDocument)
  2359.     {
  2360.         m_spDocument->AddRef();
  2361.         if (m_spDocument->Release() == 1)
  2362.         {
  2363.             m_spFragment.Release();
  2364.             m_spDocument.Release();
  2365.         }
  2366.     }
  2367. }
  2368.  
  2369.  
  2370. MSXML2::IXMLDOMDocument2Ptr            CFragmentCollection::m_spDocument        = NULL;
  2371. MSXML2::IXMLDOMDocumentFragmentPtr    CFragmentCollection::m_spFragment        = NULL;
  2372. int                                    CFragmentCollection::m_nTmpNameCounter    = 0;
  2373.  
  2374.  
  2375. ///////////////////////////////////////////////////////////////////////////////
  2376. //
  2377. //  CNode
  2378. //
  2379. ///////////////////////////////////////////////////////////////////////////////
  2380.  
  2381.  
  2382. CNode::CNode()
  2383. {
  2384.     m_spDocument    = CFragmentCollection::GetDocument();
  2385.     m_spNode        = CFragmentCollection::CreateFragment();
  2386. }
  2387.  
  2388.  
  2389. CNode::CNode(CNode& rParentNode, MSXML2::IXMLDOMNodePtr spThisNode)
  2390. {
  2391.     m_spDocument    = rParentNode.m_spDocument;
  2392.     m_spNode        = spThisNode;
  2393. }
  2394.  
  2395.  
  2396. CNode::CNode(MSXML2::IXMLDOMDocument2Ptr& rspDocument)
  2397. {
  2398.     m_spDocument    = rspDocument;
  2399.     m_spNode        = rspDocument->documentElement;
  2400. }
  2401.  
  2402.  
  2403. CNode::~CNode()
  2404. {
  2405.     if ( m_spDocument )
  2406.         m_spDocument.Release();
  2407.  
  2408.     CFragmentCollection::CheckDocumentCounter();
  2409. }
  2410.  
  2411.  
  2412. CString CNode::Transform(const CString& sXSLTFilename)
  2413. {
  2414.     MSXML2::IXMLDOMDocument2Ptr spXSLTDocument;
  2415.     spXSLTDocument.CreateInstance(__uuidof(MSXML2::DOMDocument40));
  2416.     spXSLTDocument->async = VARIANT_FALSE;
  2417.     spXSLTDocument->setProperty(_T("NewParser"), true);
  2418.  
  2419.     if (!spXSLTDocument->load(_variant_t(sXSLTFilename)))
  2420.     {
  2421.         MSXML2::IXMLDOMParseErrorPtr spError = spXSLTDocument->parseError;
  2422.         throw CNodeException(CNodeException::eError1, (LPCTSTR)spError->reason);
  2423.     }
  2424.  
  2425.     return (LPCTSTR)m_spNode->transformNode(spXSLTDocument);
  2426. }
  2427.  
  2428.  
  2429. void CNode::DeclareNamespace(const CString& sPrefix, const CString& sURI)
  2430. {
  2431.     if (sURI.IsEmpty())
  2432.         return;
  2433.  
  2434.     MSXML2::IXMLDOMElementPtr spRootElement = m_spDocument->documentElement;
  2435.  
  2436.     if (sPrefix.IsEmpty())
  2437.         spRootElement->setAttribute(_T("xmlns"), (LPCTSTR)sURI);
  2438.     else
  2439.         spRootElement->setAttribute((LPCTSTR)(_T("xmlns:") + sPrefix), (LPCTSTR)sURI);
  2440. }
  2441.  
  2442.  
  2443. MSXML2::IXMLDOMNodePtr CNode::CreateNode(ENodeType eNodeType, const CString& sNamespaceURI, LPCTSTR szName)
  2444. {
  2445.     _variant_t varNodeType(eNodeType == Element ? (short)MSXML2::NODE_ELEMENT : (short)MSXML2::NODE_ATTRIBUTE);
  2446.     return m_spDocument->createNode(varNodeType, szName, (LPCTSTR)sNamespaceURI);
  2447. }
  2448.  
  2449.  
  2450. bool CNode::CompareChildName( MSXML2::IXMLDOMNodePtr spChild, const CString& sNamespaceURI, const CString& sName )
  2451. {
  2452.     return
  2453.         ( spChild->baseName == _bstr_t(sName) ) &&
  2454.         (
  2455.             ( spChild->namespaceURI == _bstr_t(sNamespaceURI) ) ||
  2456.             ( !spChild->namespaceURI && sNamespaceURI.IsEmpty() )
  2457.         );
  2458. }
  2459.  
  2460.  
  2461. int CNode::ChildCount(ENodeType eNodeType, const CString& sNamespaceURI, const CString& sName)
  2462. {
  2463.     if (eNodeType == Element)
  2464.     {
  2465.         int nCount = 0;
  2466.  
  2467.         for (MSXML2::IXMLDOMNodePtr spChild = m_spNode->firstChild; spChild; spChild = spChild->nextSibling)
  2468.             if ( CompareChildName( spChild, sNamespaceURI, sName ) )
  2469.                 nCount++;
  2470.         return nCount;
  2471.     }
  2472.     else // eNodeType == Attribute
  2473.     {
  2474.         return m_spNode->attributes->getQualifiedItem((LPCTSTR)sName, (LPCTSTR)sNamespaceURI) ? 1 : 0;
  2475.     }
  2476. }
  2477.  
  2478.  
  2479. MSXML2::IXMLDOMNodePtr CNode::AppendChild(ENodeType eNodeType, const CString& sNamespaceURI, const CString& sName, const CString& sValue)
  2480. {
  2481.     if (eNodeType == Element)
  2482.     {
  2483.         MSXML2::IXMLDOMElementPtr spElement = CreateNode(Element, sNamespaceURI, sName);
  2484.         spElement->text = (LPCTSTR)sValue;
  2485.         m_spNode->appendChild(spElement);
  2486.         return spElement;
  2487.     }
  2488.     else // eNodeType == Attribute
  2489.     {
  2490.         MSXML2::IXMLDOMAttributePtr spAttribute = CreateNode(Attribute, sNamespaceURI, sName);
  2491.         spAttribute->text = (LPCTSTR)sValue;
  2492.         MSXML2::IXMLDOMNamedNodeMapPtr spNodeMap = m_spNode->attributes;
  2493.         if (spNodeMap)
  2494.             spNodeMap->setNamedItem(spAttribute);
  2495.         else
  2496.             AfxMessageBox(_T("No access to attributes"));
  2497.         return spAttribute;
  2498.     }
  2499. }
  2500.  
  2501.  
  2502. MSXML2::IXMLDOMNodePtr CNode::AppendChildAttribute(MSXML2::IXMLDOMNodePtr spNode, const CString& sNamespaceURI, const CString& sName, const CString& sValue)
  2503. {
  2504.     MSXML2::IXMLDOMAttributePtr spAttribute = CreateNode(Attribute, sNamespaceURI, sName);
  2505.     spAttribute->text = (LPCTSTR)sValue;
  2506.     spNode->attributes->setNamedItem(spAttribute);
  2507.     return spAttribute;
  2508. }
  2509.  
  2510.  
  2511. MSXML2::IXMLDOMNodePtr CNode::AppendChildElement(const CString& sNamespaceURI, const CString& sElement, CNode* pNode, MSXML2::IXMLDOMNodePtr spHostNode/* = MSXML2::IXMLDOMNodePtr()*/)
  2512. {
  2513.     MSXML2::IXMLDOMElementPtr spElement = CreateNode(Element, sNamespaceURI, sElement);
  2514.  
  2515.     while (pNode->m_spNode->firstChild != 0)
  2516.     {
  2517.         spElement->appendChild(pNode->m_spNode->removeChild(pNode->m_spNode->firstChild));
  2518.     }
  2519.  
  2520.     MSXML2::IXMLDOMNamedNodeMapPtr spAttributeMap = pNode->m_spNode->attributes;
  2521.     while (spAttributeMap->length > 0)
  2522.     {
  2523.         spElement->attributes->setNamedItem(spAttributeMap->removeNamedItem(spAttributeMap->item\[0\]->nodeName));
  2524.     }
  2525.  
  2526.     pNode->m_spNode = spElement;
  2527.     pNode->m_spDocument = m_spDocument;
  2528.  
  2529.     if (spHostNode == NULL)
  2530.         m_spNode->appendChild(spElement);
  2531.     else
  2532.         spHostNode->appendChild(spElement);
  2533.     return spElement;
  2534. }
  2535.  
  2536.  
  2537. MSXML2::IXMLDOMNodePtr CNode::RemoveChildAt(ENodeType eNodeType, const CString& sNamespaceURI, const CString& sName, int nIndex)
  2538. {
  2539.     if (eNodeType == Element)
  2540.     {
  2541.         int nCount = 0;
  2542.         for (MSXML2::IXMLDOMNodePtr spChild = m_spNode->firstChild; spChild; spChild = spChild->nextSibling)
  2543.             if ( CompareChildName( spChild, sNamespaceURI, sName ) )
  2544.                 if (nCount++ == nIndex)
  2545.                     return m_spNode->removeChild(spChild);
  2546.         if (nCount > 0)
  2547.             throw CNodeException(CNodeException::eError1, _T("Index out of range"));
  2548.         else
  2549.             throw CNodeException(CNodeException::eError1, _T("Not found"));
  2550.     }
  2551.     else // eNodeType == Attribute
  2552.     {
  2553.         return m_spNode->attributes->removeNamedItem((LPCTSTR)sName);
  2554.     }
  2555. }
  2556.  
  2557.  
  2558. MSXML2::IXMLDOMNodePtr CNode::ReplaceChildAt(ENodeType eNodeType, const CString& sNamespaceURI, const CString& sName, int nIndex, const CString& sValue)
  2559. {
  2560.     if (eNodeType == Element)
  2561.     {
  2562.         int nCount = 0;
  2563.         for (MSXML2::IXMLDOMNodePtr spChild = m_spNode->firstChild; spChild; spChild = spChild->nextSibling)
  2564.             if ( CompareChildName( spChild, sNamespaceURI, sName ) )
  2565.                 if (nCount++ == nIndex)
  2566.                 {
  2567.                     MSXML2::IXMLDOMElementPtr spElement = m_spDocument->createElement((LPCTSTR)sName);
  2568.                     spElement->text = (LPCTSTR)sValue;
  2569.  
  2570.                     return m_spNode->replaceChild(spElement, spChild);
  2571.                 }
  2572.         throw CNodeException(CNodeException::eError1, _T("Not found"));
  2573.     }
  2574.     else // eNodeType == Attribute
  2575.     {
  2576.         if (nIndex > 0)
  2577.             throw CNodeException(CNodeException::eError1, _T("Index must be zero"));
  2578.         MSXML2::IXMLDOMAttributePtr spAttribute = m_spNode->attributes->getQualifiedItem((LPCTSTR)sName, (LPCTSTR)sNamespaceURI);
  2579.         if (spAttribute)
  2580.         {
  2581.             spAttribute->text = (LPCTSTR)sValue;
  2582.             return spAttribute;
  2583.         }
  2584.         else
  2585.             throw CNodeException(CNodeException::eError1, _T("Not found"));
  2586.     }
  2587. }
  2588.  
  2589.  
  2590. MSXML2::IXMLDOMNodePtr CNode::GetChildAt(ENodeType eNodeType, const CString& sNamespaceURI, const CString& sName, int nIndex)
  2591. {
  2592.     if (eNodeType == Element)
  2593.     {
  2594.         int nCount = 0;
  2595.         for (MSXML2::IXMLDOMNodePtr spChild = m_spNode->firstChild; spChild; spChild = spChild->nextSibling)
  2596.             if ( CompareChildName( spChild, sNamespaceURI, sName ) )
  2597.                 if (nCount++ == nIndex)
  2598.                     return spChild;
  2599.         if (nCount > 0)
  2600.             throw CNodeException(CNodeException::eError1, _T("Index out of range"));
  2601.         else
  2602.             throw CNodeException(CNodeException::eError1, _T("Not found"));
  2603.     }
  2604.     else // eNodeType == Attribute
  2605.     {
  2606.         if (nIndex > 0)
  2607.             throw CNodeException(CNodeException::eError1, _T("Index must be zero"));
  2608.         MSXML2::IXMLDOMNodePtr spAttribute = m_spNode->attributes->getQualifiedItem((LPCTSTR)sName, (LPCTSTR)sNamespaceURI);
  2609.         if (spAttribute)
  2610.             return spAttribute;
  2611.         else
  2612.             throw CNodeException(CNodeException::eError1, _T("Index out of range"));
  2613.     }
  2614. }
  2615.  
  2616.  
  2617. MSXML2::IXMLDOMNodePtr CNode::SetChild(ENodeType eNodeType, const CString& sNamespaceURI, const CString& sName, const CString& sValue)
  2618. {
  2619.     if (ChildCount(eNodeType, sNamespaceURI, sName) == 0)
  2620.         return AppendChild(eNodeType, sNamespaceURI, sName, sValue);
  2621.     else
  2622.         return ReplaceChildAt(eNodeType, sNamespaceURI, sName, 0, sValue);
  2623. }
  2624.  
  2625.  
  2626. ///////////////////////////////////////////////////////////////////////////////
  2627. //
  2628. //  CDoc
  2629. //
  2630. ///////////////////////////////////////////////////////////////////////////////
  2631.  
  2632.  
  2633. MSXML2::IXMLDOMDocument2Ptr CDoc::Load(const CString& sFilename)
  2634. {
  2635.     MSXML2::IXMLDOMDocument2Ptr spDocument;
  2636.  
  2637.     spDocument.CreateInstance(__uuidof(MSXML2::DOMDocument40));
  2638.     spDocument->async = VARIANT_FALSE;
  2639.     spDocument->validateOnParse = VARIANT_FALSE;
  2640.     spDocument->setProperty(_T("NewParser"), true);
  2641.  
  2642.     if (!spDocument->load(_variant_t(sFilename)))
  2643.     {
  2644.         MSXML2::IXMLDOMParseErrorPtr spError = spDocument->parseError;
  2645.         throw CNodeException(CNodeException::eError1, (LPCTSTR)spError->reason);
  2646.     }
  2647.     return spDocument;
  2648. }
  2649.  
  2650.  
  2651. void CDoc::SetRootElementName(CString sName, CString sNamespaceURI)
  2652. {
  2653.     m_sName = sName;
  2654.     m_sNamespaceURI = sNamespaceURI;
  2655. }
  2656.  
  2657.  
  2658. void CDoc::SetSchemaLocation(const CString& sSchemaLocation)
  2659. {
  2660.     m_sSchemaLocation = sSchemaLocation;
  2661. }
  2662.  
  2663.  
  2664. void CDoc::Save(const CString& sFilename, CNode& rNode)
  2665. {
  2666.     if (rNode.m_spNode->parentNode->nodeTypeString == _bstr_t(_T("documentfragment")))
  2667.     {
  2668.         FinalizeRootElement(rNode);
  2669.     }
  2670.     InternalSetSchemaLocation(rNode);
  2671.  
  2672.     rNode.m_spDocument->save(_variant_t(sFilename));
  2673. }
  2674.  
  2675.  
  2676. void CDoc::Validate(CNode& rNode)
  2677. {
  2678.  
  2679.     if (rNode.m_spNode->parentNode->nodeTypeString == _bstr_t(_T("documentfragment")))
  2680.     {
  2681.         FinalizeRootElement(rNode);
  2682.     }
  2683.     InternalSetSchemaLocation(rNode);
  2684.  
  2685.     MSXML2::IXMLDOMParseErrorPtr spError = rNode.m_spDocument->validate();
  2686.     if (spError->errorCode)
  2687.     {
  2688.         throw CNodeException(CNodeException::eError1, (LPCTSTR)spError->reason);
  2689.     }
  2690. }
  2691.  
  2692.  
  2693. void CDoc::FinalizeRootElement(CNode& rNode)
  2694. {
  2695.     if (m_sName.IsEmpty())
  2696.     {
  2697.         throw CNodeException(CNodeException::eError1, _T("Call SetRootElementName first"));
  2698.     }
  2699.  
  2700.     rNode.m_spDocument.CreateInstance(__uuidof(MSXML2::DOMDocument40));
  2701.     rNode.m_spDocument->async = VARIANT_FALSE;
  2702.     rNode.m_spDocument->setProperty(_T("NewParser"), true);
  2703.  
  2704.     rNode.m_spDocument->appendChild(rNode.m_spDocument->createProcessingInstruction(_T("xml"), _T("version='1.0' encoding='UTF-8'")));
  2705.  
  2706.     rNode.m_spNode = rNode.AppendChildElement(m_sNamespaceURI, m_sName, &rNode, rNode.m_spDocument);
  2707.     MSXML2::IXMLDOMElementPtr spRootElement = rNode.m_spNode;
  2708.  
  2709.     spRootElement->setAttribute(_T("xmlns:xsi"), _T("http://www.w3.org/2001/XMLSchema-instance"));
  2710.  
  2711.     if (m_sNamespaceURI.IsEmpty())
  2712.     {
  2713.         if (!m_sSchemaLocation.IsEmpty())
  2714.             spRootElement->setAttribute(_T("xsi:noNamespaceSchemaLocation"), (LPCTSTR)m_sSchemaLocation);
  2715.     }
  2716.     else
  2717.     {
  2718.         if (!m_sSchemaLocation.IsEmpty())
  2719.             spRootElement->setAttribute(_T("xsi:schemaLocation"), (LPCTSTR)(m_sNamespaceURI + _T(" ") + m_sSchemaLocation));
  2720.     }
  2721.     
  2722.     DeclareNamespaces(rNode);
  2723. }
  2724.  
  2725.  
  2726. void CDoc::InternalSetSchemaLocation(CNode& rNode)
  2727. {
  2728.     MSXML2::IXMLDOMElementPtr spRootElement = rNode.m_spNode;
  2729.  
  2730.     if (m_sNamespaceURI.IsEmpty())
  2731.     {
  2732.         if (!m_sSchemaLocation.IsEmpty() && spRootElement->getAttributeNode(_T("xsi:noNamespaceSchemaLocation")) == NULL)
  2733.             spRootElement->setAttribute(_T("xsi:noNamespaceSchemaLocation"), (LPCTSTR)m_sSchemaLocation);
  2734.     }
  2735.     else
  2736.     {
  2737.         if (!m_sSchemaLocation.IsEmpty() && spRootElement->getAttributeNode(_T("xsi:schemaLocation")) == NULL)
  2738.             spRootElement->setAttribute(_T("xsi:schemaLocation"), (LPCTSTR)(m_sNamespaceURI + _T(" ") + m_sSchemaLocation));
  2739.     }
  2740. }
  2741.  
  2742.  
  2743. ///////////////////////////////////////////////////////////////////////////////
  2744. //
  2745. //  CSchemaBase64Binary
  2746. //
  2747. ///////////////////////////////////////////////////////////////////////////////
  2748.  
  2749.  
  2750. const TCHAR CSchemaBase64Binary::m_EncodeArray\[\] =
  2751.     _T("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");
  2752.  
  2753.  
  2754. const TCHAR CSchemaBase64Binary::m_DecodeArray\[\] =
  2755. {
  2756.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  2757.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  2758.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    62,    -1,    -1,    -1,    63,
  2759.     52,    53,    54,    55,    56,    57,    58,    59,    60,    61,    -1,    -1,    -1,    -1,    -1,    -1,
  2760.     -1,     0,     1,     2,     3,     4,     5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
  2761.     15,    16,    17,    18,    19,    20,    21,    22,    23,    24,    25,    -1,    -1,    -1,    -1,    -1,
  2762.     -1,    26,    27,    28,    29,    30,    31,    32,    33,    34,    35,    36,    37,    38,    39,    40,
  2763.     41,    42,    43,    44,    45,    46,    47,    48,    49,    50,    51,    -1,    -1,    -1,    -1,    -1,
  2764.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  2765.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  2766.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  2767.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  2768.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  2769.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  2770.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  2771.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1
  2772. };
  2773.  
  2774.  
  2775. CSchemaBase64Binary::CSchemaBase64Binary(LPCTSTR szValue)
  2776. {
  2777.     Decode(szValue, m_pData, m_nSize);
  2778. }
  2779.  
  2780.  
  2781. CSchemaBase64Binary::CSchemaBase64Binary(const CSchemaBase64Binary& rOther)
  2782. {
  2783.     m_nSize = rOther.m_nSize;
  2784.     m_pData = new BYTE\[m_nSize\];
  2785.     memcpy(m_pData, rOther.m_pData, m_nSize);
  2786. }
  2787.  
  2788.  
  2789. CSchemaBase64Binary::CSchemaBase64Binary(const CString& sValue)
  2790. {
  2791.     Decode(sValue, m_pData, m_nSize);
  2792. }
  2793.  
  2794.  
  2795. CSchemaBase64Binary::~CSchemaBase64Binary()
  2796. {
  2797.     if (m_pData)
  2798.     {
  2799.         delete\[\] m_pData;
  2800.     }
  2801. }
  2802.  
  2803.  
  2804. CSchemaBase64Binary& CSchemaBase64Binary::operator =(const CSchemaBase64Binary& rOther)
  2805. {
  2806.     m_nSize = rOther.m_nSize;
  2807.     m_pData = new BYTE\[m_nSize\];
  2808.     memcpy(m_pData, rOther.m_pData, m_nSize);
  2809.     return *this;
  2810. }
  2811.  
  2812.  
  2813. int CSchemaBase64Binary::GetSize() const
  2814. {
  2815.     return m_nSize;
  2816. }
  2817.  
  2818.  
  2819. unsigned char* CSchemaBase64Binary::GetData() const
  2820. {
  2821.     return m_pData;
  2822. }
  2823.  
  2824.  
  2825. void CSchemaBase64Binary::SetData(LPBYTE pData, int nSize, bool bCopy/* = true*/)
  2826. {
  2827.     if (m_pData)
  2828.     {
  2829.         delete\[\] m_pData;
  2830.     }
  2831.  
  2832.     m_nSize = nSize;
  2833.     if (bCopy)
  2834.     {
  2835.         m_pData = new BYTE\[m_nSize\];
  2836.         memcpy(m_pData, pData, m_nSize);
  2837.     }
  2838.     else
  2839.     {
  2840.         m_pData = pData;
  2841.     }
  2842. }
  2843.  
  2844.  
  2845. CSchemaBase64Binary::operator CString()
  2846. {
  2847.     LPTSTR szDst;
  2848.     int nDstSize;
  2849.     CString sResult;
  2850.     Encode(m_pData, m_nSize, szDst, nDstSize);
  2851.     sResult = szDst;
  2852.     delete szDst;
  2853.     return sResult;
  2854. }
  2855.  
  2856.  
  2857. void CSchemaBase64Binary::Encode(LPBYTE pSrc, int nSrcSize, LPTSTR& rszDst, int& rnDstSize, int nMaxLineLength/* = 76*/)
  2858. {
  2859.     int        nTmpSize, nAllocSize, nLineLength, i;
  2860.     LPTSTR    szDstWriter;
  2861.     DWORD    bBuf;
  2862.  
  2863.     if (nSrcSize == 0)
  2864.     {
  2865.         rszDst = NULL;
  2866.         rnDstSize = 0;
  2867.         return;
  2868.     }
  2869.  
  2870.     nTmpSize    = nSrcSize * 4 / 3;
  2871.     nAllocSize    = nTmpSize + 8;
  2872.     if (nMaxLineLength > 0)
  2873.         nAllocSize += nTmpSize * 2 / nMaxLineLength;
  2874.     
  2875.     rszDst        = new TCHAR\[nAllocSize\];
  2876.     szDstWriter    = rszDst;
  2877.     nTmpSize    = nSrcSize / 3 * 3;
  2878.     rnDstSize    = 0;
  2879.     nLineLength    = 0;
  2880.  
  2881.     if (nMaxLineLength > 0)
  2882.     {
  2883.         for (i = 0; i < nTmpSize; i += 3)
  2884.         {
  2885.             bBuf = *(pSrc + i) << 16 | *(pSrc + i + 1) << 8 | *(pSrc + i + 2);
  2886.             *szDstWriter++ = m_EncodeArray\[(bBuf >> 18) & 0x3F\];
  2887.             *szDstWriter++ = m_EncodeArray\[(bBuf >> 12) & 0x3F\];
  2888.             *szDstWriter++ = m_EncodeArray\[(bBuf >>  6) & 0x3F\];
  2889.             *szDstWriter++ = m_EncodeArray\[ bBuf        & 0x3F\];
  2890.             rnDstSize += 4;
  2891.  
  2892.             nLineLength += 4;
  2893.             if (nMaxLineLength > 0 && nLineLength >= nMaxLineLength)
  2894.             {
  2895.                 *szDstWriter++ = _T('\\r');
  2896.                 *szDstWriter++ = _T('\\n');
  2897.                 rnDstSize += 2;
  2898.                 nLineLength = 0;
  2899.             }
  2900.         }
  2901.     }
  2902.     else
  2903.     {
  2904.         for (i = 0; i < nTmpSize; i += 3)
  2905.         {
  2906.             bBuf = *(pSrc + i) << 16 | *(pSrc + i + 1) << 8 | *(pSrc + i + 2);
  2907.             *szDstWriter++ = m_EncodeArray\[(bBuf >> 18) & 0x3F\];
  2908.             *szDstWriter++ = m_EncodeArray\[(bBuf >> 12) & 0x3F\];
  2909.             *szDstWriter++ = m_EncodeArray\[(bBuf >>  6) & 0x3F\];
  2910.             *szDstWriter++ = m_EncodeArray\[ bBuf        & 0x3F\];
  2911.             rnDstSize += 4;
  2912.         }
  2913.     }
  2914.  
  2915.     int nRest = nSrcSize - nTmpSize;
  2916.     if (nRest == 2)
  2917.     {
  2918.         bBuf = *(pSrc + i) << 8 | *(pSrc + i + 1);
  2919.         *szDstWriter++ = m_EncodeArray\[(bBuf >> 10) & 0x3F\];
  2920.         *szDstWriter++ = m_EncodeArray\[(bBuf >>  4) & 0x3F\];
  2921.         *szDstWriter++ = m_EncodeArray\[(bBuf <<  2) & 0x3F\];
  2922.         *szDstWriter++ = _T('=');
  2923.         rnDstSize += 4;
  2924.     }
  2925.     else if (nRest == 1)
  2926.     {
  2927.         bBuf = *(pSrc + i);
  2928.         *szDstWriter++ = m_EncodeArray\[(bBuf >>  2) & 0x3F\];
  2929.         *szDstWriter++ = m_EncodeArray\[(bBuf <<  4) & 0x3F\];
  2930.         *szDstWriter++ = _T('=');
  2931.         *szDstWriter++ = _T('=');
  2932.         rnDstSize += 4;
  2933.     }
  2934.  
  2935.     *szDstWriter = 0;
  2936. }
  2937.  
  2938.  
  2939. void CSchemaBase64Binary::Decode(LPCTSTR szSrc, LPBYTE& rpDst, int& rnDstSize)
  2940. {
  2941.     int            nSrcSize;
  2942.     LPCTSTR        szSrcReader;
  2943.     LPBYTE        pDstWriter;
  2944.     DWORD        nBuf;
  2945.     LPBYTE        pnBuf = (LPBYTE)&nBuf;
  2946.     int            nCount;
  2947.  
  2948.     szSrcReader    = szSrc;
  2949.     while (*szSrcReader && m_DecodeArray\[*szSrcReader\] == -1)
  2950.     {
  2951.         szSrcReader++;
  2952.     }
  2953.     nSrcSize = _tcslen(szSrcReader);
  2954.     if (nSrcSize == 0)
  2955.     {
  2956.         rpDst = NULL;
  2957.         rnDstSize = 0;
  2958.         return;
  2959.     }
  2960.  
  2961.     rpDst        = new BYTE\[nSrcSize\];
  2962.     pDstWriter    = rpDst;
  2963.     rnDstSize    = 0;
  2964.     nBuf        = 0;
  2965.     nCount        = 0;
  2966.  
  2967.     while (*szSrcReader)
  2968.     {
  2969.         while (m_DecodeArray\[*szSrcReader\] == -1)
  2970.         {
  2971.             if (!*++szSrcReader)
  2972.                 goto finish;
  2973.         }
  2974.  
  2975.         nBuf |= m_DecodeArray\[*szSrcReader++\];
  2976.  
  2977.         if (++nCount == 4)
  2978.         {
  2979.             *pDstWriter++ = (BYTE)(nBuf >> 16);
  2980.             *pDstWriter++ = (BYTE)(nBuf >>  8);
  2981.             *pDstWriter++ = (BYTE) nBuf;
  2982.             rnDstSize += 3;
  2983.             nBuf = 0;
  2984.             nCount = 0;
  2985.         }
  2986.         else
  2987.         {
  2988.             nBuf <<= 6;
  2989.         }
  2990.     }
  2991.  
  2992. finish:
  2993.     if (nCount == 2)
  2994.     {
  2995.         *pDstWriter++ = (BYTE)(nBuf >> 10);
  2996.         rnDstSize++;
  2997.     }
  2998.     else if (nCount == 3)
  2999.     {
  3000.         *pDstWriter++ = (BYTE)(nBuf >> 16) & 0xFF;
  3001.         *pDstWriter++ = (BYTE)(nBuf >>  8) & 0xFF;
  3002.         rnDstSize += 2;
  3003.     }
  3004. }
  3005. [close]