+#include <unistd.h>
+ /*}}}*/
+
+using namespace std;
+
+// Global list of Items supported
+static pkgSourceList::Type *ItmList[10];
+pkgSourceList::Type **pkgSourceList::Type::GlobalList = ItmList;
+unsigned long pkgSourceList::Type::GlobalListLen = 0;
+
+// Type::Type - Constructor /*{{{*/
+// ---------------------------------------------------------------------
+/* Link this to the global list of items*/
+pkgSourceList::Type::Type()
+{
+ ItmList[GlobalListLen] = this;
+ GlobalListLen++;
+}
+ /*}}}*/
+// Type::GetType - Get a specific meta for a given type /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+pkgSourceList::Type *pkgSourceList::Type::GetType(const char *Type)
+{
+ for (unsigned I = 0; I != GlobalListLen; I++)
+ if (strcmp(GlobalList[I]->Name,Type) == 0)
+ return GlobalList[I];
+ return 0;
+}
+ /*}}}*/
+// Type::FixupURI - Normalize the URI and check it.. /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+bool pkgSourceList::Type::FixupURI(string &URI) const
+{
+ if (URI.empty() == true)
+ return false;
+
+ if (URI.find(':') == string::npos)
+ return false;
+
+ URI = SubstVar(URI,"$(ARCH)",_config->Find("APT::Architecture"));
+
+ // Make sure that the URI is / postfixed
+ if (URI[URI.size() - 1] != '/')
+ URI += '/';
+
+ return true;
+}
+ /*}}}*/
+// Type::ParseLine - Parse a single line /*{{{*/
+// ---------------------------------------------------------------------
+/* This is a generic one that is the 'usual' format for sources.list
+ Weird types may override this. */
+bool pkgSourceList::Type::ParseLine(vector<metaIndex *> &List,
+ const char *Buffer,
+ unsigned long CurLine,
+ string File) const
+{
+ string URI;
+ string Dist;
+ string Section;
+
+ if (ParseQuoteWord(Buffer,URI) == false)
+ return _error->Error(_("Malformed line %lu in source list %s (URI)"),CurLine,File.c_str());
+ if (ParseQuoteWord(Buffer,Dist) == false)
+ return _error->Error(_("Malformed line %lu in source list %s (dist)"),CurLine,File.c_str());
+
+ if (FixupURI(URI) == false)
+ return _error->Error(_("Malformed line %lu in source list %s (URI parse)"),CurLine,File.c_str());
+
+ // Check for an absolute dists specification.
+ if (Dist.empty() == false && Dist[Dist.size() - 1] == '/')
+ {
+ if (ParseQuoteWord(Buffer,Section) == true)
+ return _error->Error(_("Malformed line %lu in source list %s (absolute dist)"),CurLine,File.c_str());
+ Dist = SubstVar(Dist,"$(ARCH)",_config->Find("APT::Architecture"));
+ return CreateItem(List,URI,Dist,Section);
+ }
+
+ // Grab the rest of the dists
+ if (ParseQuoteWord(Buffer,Section) == false)
+ return _error->Error(_("Malformed line %lu in source list %s (dist parse)"),CurLine,File.c_str());
+
+ do
+ {
+ if (CreateItem(List,URI,Dist,Section) == false)
+ return false;
+ }
+ while (ParseQuoteWord(Buffer,Section) == true);
+
+ return true;
+}