]>
git.saurik.com Git - apt.git/blob - apt-pkg/sourcelist.cc
1 // -*- mode: cpp; mode: fold -*-
3 // $Id: sourcelist.cc,v 1.18 2001/02/20 07:03:17 jgg Exp $
4 /* ######################################################################
8 ##################################################################### */
10 // Include Files /*{{{*/
12 #pragma implementation "apt-pkg/sourcelist.h"
15 #include <apt-pkg/sourcelist.h>
16 #include <apt-pkg/error.h>
17 #include <apt-pkg/fileutl.h>
18 #include <apt-pkg/configuration.h>
19 #include <apt-pkg/strutl.h>
26 // Global list of Item supported
27 static pkgSourceList::Type
*ItmList
[10];
28 pkgSourceList::Type
**pkgSourceList::Type::GlobalList
= ItmList
;
29 unsigned long pkgSourceList::Type::GlobalListLen
= 0;
31 // Type::Type - Constructor /*{{{*/
32 // ---------------------------------------------------------------------
33 /* Link this to the global list of items*/
34 pkgSourceList::Type::Type()
36 ItmList
[GlobalListLen
] = this;
40 // Type::GetType - Get a specific meta for a given type /*{{{*/
41 // ---------------------------------------------------------------------
43 pkgSourceList::Type
*pkgSourceList::Type::GetType(const char *Type
)
45 for (unsigned I
= 0; I
!= GlobalListLen
; I
++)
46 if (strcmp(GlobalList
[I
]->Name
,Type
) == 0)
51 // Type::FixupURI - Normalize the URI and check it.. /*{{{*/
52 // ---------------------------------------------------------------------
54 bool pkgSourceList::Type::FixupURI(string
&URI
) const
56 if (URI
.empty() == true)
59 if (URI
.find(':') == string::npos
)
62 URI
= SubstVar(URI
,"$(ARCH)",_config
->Find("APT::Architecture"));
64 // Make sure that the URN is / postfixed
65 if (URI
[URI
.size() - 1] != '/')
71 // Type::ParseLine - Parse a single line /*{{{*/
72 // ---------------------------------------------------------------------
73 /* This is a generic one that is the 'usual' format for sources.list
74 Weird types may override this. */
75 bool pkgSourceList::Type::ParseLine(vector
<pkgIndexFile
*> &List
,
77 unsigned long CurLine
,
84 if (ParseQuoteWord(Buffer
,URI
) == false)
85 return _error
->Error(_("Malformed line %lu in source list %s (URI)"),CurLine
,File
.c_str());
86 if (ParseQuoteWord(Buffer
,Dist
) == false)
87 return _error
->Error(_("Malformed line %lu in source list %s (dist)"),CurLine
,File
.c_str());
89 if (FixupURI(URI
) == false)
90 return _error
->Error(_("Malformed line %lu in source list %s (URI parse)"),CurLine
,File
.c_str());
92 // Check for an absolute dists specification.
93 if (Dist
.empty() == false && Dist
[Dist
.size() - 1] == '/')
95 if (ParseQuoteWord(Buffer
,Section
) == true)
96 return _error
->Error(_("Malformed line %lu in source list %s (Absolute dist)"),CurLine
,File
.c_str());
97 Dist
= SubstVar(Dist
,"$(ARCH)",_config
->Find("APT::Architecture"));
98 return CreateItem(List
,URI
,Dist
,Section
);
101 // Grab the rest of the dists
102 if (ParseQuoteWord(Buffer
,Section
) == false)
103 return _error
->Error(_("Malformed line %lu in source list %s (dist parse)"),CurLine
,File
.c_str());
107 if (CreateItem(List
,URI
,Dist
,Section
) == false)
110 while (ParseQuoteWord(Buffer
,Section
) == true);
116 // SourceList::pkgSourceList - Constructors /*{{{*/
117 // ---------------------------------------------------------------------
119 pkgSourceList::pkgSourceList()
123 pkgSourceList::pkgSourceList(string File
)
128 // SourceList::ReadMainList - Read the main source list from etc /*{{{*/
129 // ---------------------------------------------------------------------
131 bool pkgSourceList::ReadMainList()
133 return Read(_config
->FindFile("Dir::Etc::sourcelist"));
136 // SourceList::Read - Parse the sourcelist file /*{{{*/
137 // ---------------------------------------------------------------------
139 bool pkgSourceList::Read(string File
)
141 // Open the stream for reading
142 ifstream
F(File
.c_str(),ios::in
| ios::nocreate
);
144 return _error
->Errno("ifstream::ifstream",_("Opening %s"),File
.c_str());
146 List
.erase(List
.begin(),List
.end());
150 while (F
.eof() == false)
152 F
.getline(Buffer
,sizeof(Buffer
));
154 _strtabexpand(Buffer
,sizeof(Buffer
));
158 for (I
= Buffer
; *I
!= 0 && *I
!= '#'; I
++);
161 const char *C
= _strstrip(Buffer
);
164 if (C
[0] == '#' || C
[0] == 0)
169 if (ParseQuoteWord(C
,LineType
) == false)
170 return _error
->Error(_("Malformed line %u in source list %s (type)"),CurLine
,File
.c_str());
172 Type
*Parse
= Type::GetType(LineType
.c_str());
174 return _error
->Error(_("Type '%s' is not known in on line %u in source list %s"),LineType
.c_str(),CurLine
,File
.c_str());
176 if (Parse
->ParseLine(List
,C
,CurLine
,File
) == false)
182 // SourceList::FindIndex - Get the index associated with a file /*{{{*/
183 // ---------------------------------------------------------------------
185 bool pkgSourceList::FindIndex(pkgCache::PkgFileIterator File
,
186 pkgIndexFile
*&Found
) const
188 for (const_iterator I
= List
.begin(); I
!= List
.end(); I
++)
190 if ((*I
)->FindInCache(*File
.Cache()) == File
)
200 // SourceList::GetIndexes - Load the index files into the downloader /*{{{*/
201 // ---------------------------------------------------------------------
203 bool pkgSourceList::GetIndexes(pkgAcquire
*Owner
) const
205 for (const_iterator I
= List
.begin(); I
!= List
.end(); I
++)
206 if ((*I
)->GetIndexes(Owner
) == false)