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