- merge repomd branch
[apt.git] / apt-pkg / rpm / repomd.cc
1 // CNC:2002-07-03
2
3 // -*- mode: cpp; mode: fold -*-
4 // Description                                                          /*{{{*/
5 // $Id: repository.cc,v 1.4 2002/07/29 18:13:52 niemeyer Exp $
6 /* ######################################################################
7
8    Repository abstraction for 1 or more unique URI+Dist
9    
10    ##################################################################### */
11                                                                         /*}}}*/
12 // Include Files                                                        /*{{{*/
13 #ifdef __GNUG__
14 #pragma implementation "apt-pkg/repomd.h"
15 #endif
16
17 #include <iostream>
18 #include <apt-pkg/repomd.h>
19 #include <apt-pkg/error.h>
20 #include <libxml/parser.h>
21 #include <libxml/tree.h>
22
23 #include <apti18n.h>
24
25 using namespace std;
26
27 xmlNode *FindNode(xmlNode *Node, const string Name)
28 {
29    for (xmlNode *n = Node->children; n; n = n->next) {
30       if (strcmp((char*)n->name, Name.c_str()) == 0) {
31          return n;
32       }
33    }
34    return NULL;
35 }
36
37
38 // Parse repomd.xml file for checksums
39 bool repomdRepository::ParseRelease(string File)
40 {
41    RepoMD = xmlReadFile(File.c_str(), NULL, XML_PARSE_NONET);
42    if ((Root = xmlDocGetRootElement(RepoMD)) == NULL) {
43       xmlFreeDoc(RepoMD);
44       return _error->Error(_("could not open Release file '%s'"),File.c_str());
45    }
46
47    for (xmlNode *Node = Root->children; Node; Node = Node->next) {
48       if (Node->type != XML_ELEMENT_NODE || 
49           strcmp((char*)Node->name, "data") != 0)
50          continue;
51
52       string Hash = "";
53       string Path = "";
54       string Type = "";
55       string Timestamp = "";
56       xmlNode *n = NULL;
57
58       n = FindNode(Node, "location");
59       if (n)
60          Path = (char*)xmlGetProp(n, (xmlChar*)"href");
61
62       n = NULL;
63       if (flExtension(Path) == "gz") {
64          Path = Path.substr(0, Path.size()-3);
65          n = FindNode(Node, "open-checksum");
66       } else {
67          n = FindNode(Node, "checksum");
68       }
69       if (n) {
70          Hash = (char*)xmlNodeGetContent(n);
71          Type = (char*)xmlGetProp(n, (xmlChar*)"type");
72       }
73       IndexChecksums[Path].MD5 = Hash;
74       IndexChecksums[Path].Size = 0;
75       if (Type == "sha") {
76          CheckMethod = "SHA1-Hash";
77       } else {
78          CheckMethod = "MDA5-Hash";
79       }
80    }
81    
82    GotRelease = true;
83
84    xmlFreeDoc(RepoMD);
85    return true;
86 }
87
88 // vim:sts=3:sw=3