Use xmlutil helpers instead of own copy of xml FindNode function.
[apt.git] / apt-pkg / rpm / repomd.cc
1 // CNC:2002-07-03
2
3 // -*- mode: c++; 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 <config.h>
18
19 #ifdef APT_WITH_REPOMD
20
21 #include <iostream>
22 #include <apt-pkg/repomd.h>
23 #include <apt-pkg/error.h>
24 #include <libxml/parser.h>
25 #include <libxml/tree.h>
26 #include "xmlutil.h"
27
28 #include <apti18n.h>
29
30 using namespace std;
31
32 // Parse repomd.xml file for checksums
33 bool repomdRepository::ParseRelease(string File)
34 {
35    RepoMD = xmlReadFile(File.c_str(), NULL, XML_PARSE_NONET);
36    if ((Root = xmlDocGetRootElement(RepoMD)) == NULL) {
37       xmlFreeDoc(RepoMD);
38       return _error->Error(_("Could not open metadata file '%s'"),File.c_str());
39    }
40
41    for (xmlNode *Node = Root->children; Node; Node = Node->next) {
42       if (Node->type != XML_ELEMENT_NODE || 
43           strcmp((char*)Node->name, "data") != 0)
44          continue;
45
46       string Hash = "";
47       string RealPath = "";
48       string Path = "";
49       string ChecksumType = "";
50       string DataType = "";
51       string TimeStamp = "";
52       xmlNode *n = NULL;
53
54       xmlChar *type = xmlGetProp(Node, (xmlChar*)"type");
55       DataType = (char*)type;
56       xmlFree(type);
57
58       // If it's a sqlite _db file, see if we can use it and skip otherwise
59       if (DataType.substr(DataType.size()-3, 3) == "_db") {
60          n = XmlFindNode(Node, "database_version");
61          bool db_supported = false;
62          if (n) {
63             xmlChar *x = xmlNodeGetContent(n);
64             int dbver = atoi((char*)x);
65             xmlFree(x);
66             // XXX should ask about supported version from sqlite handler
67             // or something instead of hardcoding in several places...
68             if (dbver == 10) {
69                db_supported = true;
70             }
71          } 
72          if (db_supported == false) {
73             continue;
74          }
75       }
76
77       n = XmlFindNode(Node, "location");
78       if (n) {
79          xmlChar *href = xmlGetProp(n, (xmlChar*)"href");
80          Path = (char*)href;
81          xmlFree(href);
82       }
83
84       n = NULL;
85       RealPath = Path;
86       if (flExtension(Path) == "gz" || flExtension(Path) == "bz2") {
87          Path = Path.substr(0, Path.size()-flExtension(Path).size()-1);
88          n = XmlFindNode(Node, "open-checksum");
89       } else {
90          n = XmlFindNode(Node, "checksum");
91       }
92       if (n) {
93          xmlChar *hash = xmlNodeGetContent(n);
94          xmlChar *type = xmlGetProp(n, (xmlChar*)"type");
95          Hash = (char*)hash;
96          ChecksumType = (char*)type;
97          xmlFree(hash);
98          xmlFree(type);
99       }
100
101       IndexChecksums[Path].MD5 = Hash;
102       IndexChecksums[Path].Size = 0;
103       RepoFiles[DataType].Path = Path;
104       RepoFiles[DataType].RealPath = RealPath;
105       RepoFiles[DataType].TimeStamp = TimeStamp;
106       if (ChecksumType == "sha") {
107          CheckMethod = "SHA1-Hash";
108       } else {
109          CheckMethod = "MDA5-Hash";
110       }
111    }
112    GotRelease = true;
113
114    xmlFreeDoc(RepoMD);
115    return true;
116 }
117
118 string repomdRepository::FindURI(string DataType)
119 {
120    string Res = "";
121    if (RepoFiles.find(DataType) != RepoFiles.end()) {
122         Res = RepoFiles[DataType].Path;
123    }
124    return Res;
125 }
126
127 string repomdRepository::GetComprMethod(string URI)
128 {
129    string Res = "";
130    string Path = string(URI,RootURI.size());
131    
132    map<string,RepoFile>::iterator I;
133    for (I = RepoFiles.begin(); I != RepoFiles.end(); I++) {
134       if (Path == flUnCompressed(I->second.RealPath)) {
135          Res = flExtension(I->second.RealPath);
136       }
137    }
138    return Res;
139 }
140    
141
142 #endif /* APT_WITH_REPOMD */
143
144 // vim:sts=3:sw=3