81cbab575841f27b6771b9e015b258dfafd1213c
[apt.git] / apt-pkg / repository.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/repository.h"
15 #endif
16
17 #include <apt-pkg/sourcelist.h>
18 #include <apt-pkg/repository.h>
19 #include <apt-pkg/error.h>
20 #include <apt-pkg/fileutl.h>
21 #include <apt-pkg/configuration.h>
22 #include <apt-pkg/strutl.h>
23 #include <apt-pkg/tagfile.h>
24 #include <apt-pkg/acquire-item.h> 
25
26 #include <apti18n.h>
27
28 #include <fstream>
29                                                                         /*}}}*/
30 using namespace std;
31
32 // Repository::ParseRelease - Parse Release file for checksums          /*{{{*/
33 // ---------------------------------------------------------------------
34 /* */
35 bool pkgRepository::ParseRelease(string File)
36 {
37    // Open the stream for reading
38    FileFd F(File, FileFd::ReadOnly);
39    if (_error->PendingError())
40       return _error->Error(_("could not open Release file '%s'"),File.c_str());
41
42    pkgTagFile Tags(&F);
43    pkgTagSection Section;
44
45    if (!Tags.Step(Section))
46        return false;
47
48    GotRelease = true;
49
50    string Files = Section.FindS("MD5Sum");
51    // Lack of checksum is only fatal if authentication is on
52    if (Files.empty())
53    {
54       if (IsAuthenticated())
55          return _error->Error(_("No MD5Sum data in Release file '%s'"),
56                               Files.c_str());
57       else
58          return true;
59    }
60
61    // Iterate over the entire list grabbing each triplet
62    const char *C = Files.c_str();
63    while (*C != 0)
64    {
65       string Hash = "";
66       string Size = "";
67       string Path = "";
68
69       if (ParseQuoteWord(C,Hash) == false || Hash.empty() == true ||
70           ParseQuoteWord(C,Size) == false || atoi(Size.c_str()) < 0 ||
71           ParseQuoteWord(C,Path) == false || Path.empty() == true)
72          return _error->Error(_("Error parsing MD5Sum hash record on Release file '%s'"),
73                               File.c_str());
74       
75       // Parse the size and append the directory      
76       IndexChecksums[Path].Size = atoi(Size.c_str());
77       IndexChecksums[Path].MD5 = Hash;
78    }
79    
80    return true;
81 }
82                                                                         /*}}}*/
83 // Repository::FindChecksums - Get checksum info for file               /*{{{*/
84 // ---------------------------------------------------------------------
85 /* */
86 bool pkgRepository::FindChecksums(string URI,off_t &Size, string &MD5)
87 {
88    string Path = string(URI,RootURI.size());
89    if (IndexChecksums.find(Path) == IndexChecksums.end())
90       return false;
91    Size = IndexChecksums[Path].Size;
92    MD5 = IndexChecksums[Path].MD5;
93    return true;
94 }
95
96 // vim:sts=3:sw=3