00001
00002
00003
00004
00005
00006 #include "stdafx.h"
00007 #include "FdmApp.h"
00008 #include "vmsMetalinkFile.h"
00009
00010 _COM_SMARTPTR_TYPEDEF (IXMLDOMNamedNodeMap, __uuidof (IXMLDOMNamedNodeMap));
00011
00012 #ifdef _DEBUG
00013 #undef THIS_FILE
00014 static char THIS_FILE[]=__FILE__;
00015 #define new DEBUG_NEW
00016 #endif
00017
00018 vmsMetalinkFile::vmsMetalinkFile()
00019 {
00020 CoInitialize (NULL);
00021 }
00022
00023 vmsMetalinkFile::~vmsMetalinkFile()
00024 {
00025 CoUninitialize ();
00026 }
00027
00028 BOOL vmsMetalinkFile::Parse(LPCSTR pszFile)
00029 {
00030 USES_CONVERSION;
00031
00032 IXMLDOMDocumentPtr spXML;
00033 IXMLDOMNodePtr spNode;
00034
00035 spXML.CreateInstance (__uuidof (DOMDocument));
00036
00037 if (spXML == NULL)
00038 return FALSE;
00039
00040 spXML->put_async (FALSE);
00041
00042 VARIANT_BOOL bRes;
00043 spXML->load (COleVariant (pszFile), &bRes);
00044 if (bRes == FALSE)
00045 return FALSE;
00046
00047 spXML->selectSingleNode (L"metalink", &spNode);
00048 if (spNode == NULL)
00049 return FALSE;
00050
00051 IXMLDOMNodeListPtr spNodeList;
00052 spNode->get_childNodes (&spNodeList);
00053
00054 if (spNodeList == NULL)
00055 return FALSE;
00056
00057 IXMLDOMNodePtr spItem;
00058
00059 BOOL bHasOkFilesNode = FALSE;
00060
00061 while (SUCCEEDED (spNodeList->nextNode (&spItem)) && spItem != NULL)
00062 {
00063 CComBSTR bstrName;
00064 spItem->get_nodeName (&bstrName);
00065
00066 if (bstrName == L"description")
00067 {
00068 CComBSTR bstrText;
00069 spItem->get_text (&bstrText);
00070 m_strDescription = W2A (bstrText);
00071 }
00072
00073 else if (bstrName == L"files")
00074 {
00075 if (ReadFilesNode (spItem))
00076 bHasOkFilesNode = TRUE;
00077 }
00078
00079 spItem = NULL;
00080 }
00081
00082 return bHasOkFilesNode;
00083 }
00084
00085 BOOL vmsMetalinkFile::ReadFilesNode(IXMLDOMNode *pFiles)
00086 {
00087 IXMLDOMNodeListPtr spNodeList;
00088 pFiles->get_childNodes (&spNodeList);
00089
00090 if (spNodeList == NULL)
00091 return FALSE;
00092
00093 IXMLDOMNodePtr spItem;
00094 BOOL bHasOkFileNode = FALSE;
00095
00096 while (SUCCEEDED (spNodeList->nextNode (&spItem)) && spItem != NULL)
00097 {
00098 CComBSTR bstrName;
00099 spItem->get_nodeName (&bstrName);
00100
00101 if (bstrName == L"file")
00102 {
00103 if (ReadFileNode (spItem))
00104 bHasOkFileNode = TRUE;
00105 }
00106
00107 spItem = NULL;
00108 }
00109
00110 return bHasOkFileNode;
00111 }
00112
00113 BOOL vmsMetalinkFile::ReadFileNode(IXMLDOMNode *pFile)
00114 {
00115 USES_CONVERSION;
00116
00117 IXMLDOMNodeListPtr spNodeList;
00118 pFile->get_childNodes (&spNodeList);
00119
00120 if (spNodeList == NULL)
00121 return FALSE;
00122
00123 vmsMetalinkFile_File file;
00124
00125 IXMLDOMNamedNodeMapPtr spAttrs;
00126 pFile->get_attributes (&spAttrs);
00127 if (spAttrs != NULL)
00128 {
00129 IXMLDOMNodePtr spFileName;
00130 spAttrs->getNamedItem (L"name", &spFileName);
00131 if (spFileName != NULL)
00132 {
00133 COleVariant vt;
00134 spFileName->get_nodeValue (&vt);
00135 ASSERT (vt.vt == VT_BSTR);
00136 if (vt.vt == VT_BSTR)
00137 file.strName = W2A (vt.bstrVal);
00138 }
00139 }
00140
00141 IXMLDOMNodePtr spItem;
00142 while (SUCCEEDED (spNodeList->nextNode (&spItem)) && spItem != NULL)
00143 {
00144 CComBSTR bstrName;
00145 spItem->get_nodeName (&bstrName);
00146
00147 if (bstrName == L"verification")
00148 {
00149 ReadVerificationNode (spItem, &file);
00150 }
00151
00152 else if (bstrName == L"resources")
00153 {
00154 ReadResourcesNode (spItem, &file);
00155 }
00156
00157 else if (bstrName == L"os")
00158 {
00159 CComBSTR bstrText;
00160 spItem->get_text (&bstrText);
00161 file.strOS = W2A (bstrText);
00162 }
00163
00164 spItem = NULL;
00165 }
00166
00167 if (file.vMirrors.size () == 0)
00168 return FALSE;
00169
00170 m_vFiles.add (file);
00171
00172 return TRUE;
00173 }
00174
00175 BOOL vmsMetalinkFile::ReadVerificationNode(IXMLDOMNode *pNode, vmsMetalinkFile_File *file)
00176 {
00177 IXMLDOMNodeListPtr spNodeList;
00178 pNode->get_childNodes (&spNodeList);
00179
00180 if (spNodeList == NULL)
00181 return FALSE;
00182
00183 IXMLDOMNodePtr spItem;
00184 while (SUCCEEDED (spNodeList->nextNode (&spItem)) && spItem != NULL)
00185 {
00186 CComBSTR bstrName;
00187 spItem->get_nodeName (&bstrName);
00188
00189 if (bstrName == L"hash")
00190 {
00191 vmsMetalinkFile_File_Hash hash;
00192 if (ReadHashNode (spItem, &hash))
00193 file->vHashes.add (hash);
00194 }
00195
00196 spItem = NULL;
00197 }
00198
00199 return TRUE;
00200 }
00201
00202 BOOL vmsMetalinkFile::ReadResourcesNode(IXMLDOMNode *pNode, vmsMetalinkFile_File *file)
00203 {
00204 IXMLDOMNodeListPtr spNodeList;
00205 pNode->get_childNodes (&spNodeList);
00206
00207 if (spNodeList == NULL)
00208 return FALSE;
00209
00210 IXMLDOMNodePtr spItem;
00211 while (SUCCEEDED (spNodeList->nextNode (&spItem)) && spItem != NULL)
00212 {
00213 CComBSTR bstrName;
00214 spItem->get_nodeName (&bstrName);
00215
00216 if (bstrName == L"url")
00217 {
00218 vmsMetalinkFile_File_Url url;
00219 if (ReadUrlNode (spItem, &url))
00220 file->vMirrors.add (url);
00221 }
00222
00223 spItem = NULL;
00224 }
00225
00226 return TRUE;
00227 }
00228
00229 BOOL vmsMetalinkFile::ReadHashNode(IXMLDOMNode *pNode, vmsMetalinkFile_File_Hash *hash)
00230 {
00231 USES_CONVERSION;
00232
00233 IXMLDOMNamedNodeMapPtr spAttrs;
00234 pNode->get_attributes (&spAttrs);
00235 if (spAttrs == NULL)
00236 return FALSE;
00237
00238 IXMLDOMNodePtr spType;
00239 spAttrs->getNamedItem (L"type", &spType);
00240 if (spType == NULL)
00241 return FALSE;
00242
00243 COleVariant vt;
00244 spType->get_nodeValue (&vt);
00245 ASSERT (vt.vt == VT_BSTR);
00246 if (vt.vt == VT_BSTR)
00247 hash->strAlgorithm = W2A (vt.bstrVal);
00248
00249 CComBSTR bstrText;
00250 pNode->get_text (&bstrText);
00251 if (bstrText.Length () == 0)
00252 return FALSE;
00253
00254 hash->strChecksum = W2A (bstrText);
00255
00256 return TRUE;
00257 }
00258
00259 BOOL vmsMetalinkFile::ReadUrlNode(IXMLDOMNode *pNode, vmsMetalinkFile_File_Url *url)
00260 {
00261 USES_CONVERSION;
00262
00263 IXMLDOMNamedNodeMapPtr spAttrs;
00264 pNode->get_attributes (&spAttrs);
00265 if (spAttrs == NULL)
00266 return FALSE;
00267
00268 IXMLDOMNodePtr spType;
00269 spAttrs->getNamedItem (L"type", &spType);
00270 if (spType == NULL)
00271 return FALSE;
00272
00273 COleVariant vt;
00274 spType->get_nodeValue (&vt);
00275 ASSERT (vt.vt == VT_BSTR);
00276 if (vt.vt == VT_BSTR)
00277 url->strProtocol = W2A (vt.bstrVal);
00278
00279 CComBSTR bstrText;
00280 pNode->get_text (&bstrText);
00281 if (bstrText.Length () == 0)
00282 return FALSE;
00283
00284 url->strUrl = W2A (bstrText);
00285
00286 return TRUE;
00287 }
00288
00289 LPCSTR vmsMetalinkFile::get_Description()
00290 {
00291 return m_strDescription;
00292 }
00293
00294 int vmsMetalinkFile::get_FileCount()
00295 {
00296 return m_vFiles.size ();
00297 }
00298
00299 vmsMetalinkFile_File* vmsMetalinkFile::get_File(int nIndex)
00300 {
00301 ASSERT (nIndex < get_FileCount ());
00302 return &m_vFiles [nIndex];
00303 }