From f46e768107c0250eb0609a89a74b66ab3c9d8cec Mon Sep 17 00:00:00 2001 From: Arch Librarian Date: Mon, 20 Sep 2004 16:51:49 +0000 Subject: CDROM method Author: jgg Date: 1998-12-03 07:29:16 GMT CDROM method --- methods/cdrom.cc | 144 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 methods/cdrom.cc (limited to 'methods/cdrom.cc') diff --git a/methods/cdrom.cc b/methods/cdrom.cc new file mode 100644 index 000000000..0d1e8f031 --- /dev/null +++ b/methods/cdrom.cc @@ -0,0 +1,144 @@ +// -*- mode: cpp; mode: fold -*- +// Description /*{{{*/ +// $Id: cdrom.cc,v 1.1 1998/12/03 07:29:21 jgg Exp $ +/* ###################################################################### + + CDROM URI method for APT + + ##################################################################### */ + /*}}}*/ +// Include Files /*{{{*/ +#include +#include +#include +#include +#include + +#include +#include + /*}}}*/ + +class CDROMMethod : public pkgAcqMethod +{ + Configuration Database; + string CurrentID; + + virtual bool Fetch(FetchItem *Itm); + string GetID(string Name); + + public: + + CDROMMethod(); +}; + +// CDROMMethod::CDROMethod - Constructor /*{{{*/ +// --------------------------------------------------------------------- +/* */ +CDROMMethod::CDROMMethod() : pkgAcqMethod("1.0",SingleInstance | LocalOnly) +{ + // Read the database + string DFile = _config->FindFile("Dir::State::cdroms"); + if (FileExists(DFile) == true) + { + if (ReadConfigFile(Database,DFile) == false) + { + _error->Error("Unable to read the cdrom database %s", + DFile.c_str()); + Fail(); + } + } +}; + /*}}}*/ +// CDROMMethod::GetID - Get the ID hash for /*{{{*/ +// --------------------------------------------------------------------- +/* We search the configuration space for the name and then return the ID + tag associated with it. */ +string CDROMMethod::GetID(string Name) +{ + const Configuration::Item *Top = Database.Tree(0); + for (; Top != 0;) + { + if (Top->Value == Name) + return Top->Tag; + + Top = Top->Next; + } + + return string(); +} + /*}}}*/ +// CDROMMethod::Fetch - Fetch a file /*{{{*/ +// --------------------------------------------------------------------- +/* */ +bool CDROMMethod::Fetch(FetchItem *Itm) +{ + URI Get = Itm->Uri; + string File = Get.Path; + FetchResult Res; + + /* All IMS queries are returned as a hit, CDROMs are readonly so + time stamps never change */ + if (Itm->LastModified != 0) + { + Res.LastModified = Itm->LastModified; + Res.IMSHit = true; + URIDone(Res); + return true; + } + + string ID = GetID(Get.Host); + + // All non IMS queries for package files fail. + if (Itm->IndexFile == true || ID.empty() == false) + { + Fail("Please use apt-cdrom to make this CD recognized by APT." + " apt-get update cannot be used to add new CDs"); + return true; + } + + // We already have a CD inserted, but it is the wrong one + if (CurrentID.empty() == false && ID != CurrentID) + { + Fail("Wrong CD",true); + return true; + } + + string CDROM = _config->FindDir("Acquire::cdrom::mount","/cdrom/"); + string NewID; + while (1) + { + if (IdentCdrom(CDROM,NewID) == false) + return false; + + // A hit + if (NewID == ID) + break; + + UnmountCdrom(CDROM); + MediaFail(Get.Host,CDROM); + MountCdrom(CDROM); + } + + // ID matches + if (NewID == ID) + { + Res.Filename = CDROM + File; + if (FileExists(Res.Filename) == false) + return _error->Error("File not found"); + + CurrentID = ID; + Res.LastModified = Itm->LastModified; + Res.IMSHit = true; + URIDone(Res); + return true; + } + + return _error->Error("CDROM not found"); +} + /*}}}*/ + +int main() +{ + CDROMMethod Mth; + return Mth.Run(); +} -- cgit v1.2.3