]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/edsp/edspsystem.cc
Avoid temporary strings in SubstVar.
[apt.git] / apt-pkg / edsp / edspsystem.cc
index c8e417b1d9e7f7079ebcda9aab138a0d9daa12d7..95abc15277e79d42a10c2e244a254a13bc271821 100644 (file)
@@ -2,41 +2,78 @@
 // Description                                                         /*{{{*/
 /* ######################################################################
 
-   This system provides the abstraction to use the universe file as the
+   This system provides the abstraction to use the scenario file as the
    only source of package information to be able to feed the created file
    back to APT for its own consumption (eat your own dogfood).
 
    ##################################################################### */
                                                                        /*}}}*/
 // Include Files                                                       /*{{{*/
-#include <apt-pkg/edspsystem.h>
+#include <config.h>
+
+#include <apt-pkg/configuration.h>
 #include <apt-pkg/debversion.h>
 #include <apt-pkg/edspindexfile.h>
-#include <apt-pkg/configuration.h>
-#include <apt-pkg/error.h>
+#include <apt-pkg/edspsystem.h>
+#include <apt-pkg/pkgcache.h>
+#include <apt-pkg/cacheiterators.h>
 #include <apt-pkg/fileutl.h>
-#include <apti18n.h>
-#include <sys/types.h>
+
+#include <stddef.h>
 #include <unistd.h>
-#include <dirent.h>
-#include <errno.h>
+
+#include <string>
+#include <vector>
+
                                                                        /*}}}*/
 
-edspSystem edspSys;
+class edspSystemPrivate {
+   std::string tempDir;
+   std::string tempStatesFile;
+   std::string tempPrefsFile;
 
-// System::debSystem - Constructor                                     /*{{{*/
-edspSystem::edspSystem()
-{
-   StatusFile = 0;
+public:
+   edspSystemPrivate() {}
 
-   Label = "Debian APT solver interface";
-   VS = &debVS;
+   void Initialize(Configuration &Cnf)
+   {
+      DeInitialize();
+      Cnf.Set("Dir::State::extended_states", "/dev/null");
+      Cnf.Set("Dir::Etc::preferences", "/dev/null");
+      std::string const tmp = GetTempDir();
+      char tmpname[100];
+      snprintf(tmpname, sizeof(tmpname), "%s/apt-edsp-solver-XXXXXX", tmp.c_str());
+      if (NULL == mkdtemp(tmpname))
+        return;
+      tempDir = tmpname;
+      tempStatesFile = flCombine(tempDir, "extended_states");
+      Cnf.Set("Dir::State::extended_states", tempStatesFile);
+      tempPrefsFile = flCombine(tempDir, "apt_preferences");
+      Cnf.Set("Dir::Etc::preferences", tempPrefsFile);
+   }
+
+   void DeInitialize()
+   {
+      if (tempDir.empty())
+        return;
+
+      RemoveFile("DeInitialize", tempStatesFile);
+      RemoveFile("DeInitialize", tempPrefsFile);
+      rmdir(tempDir.c_str());
+   }
+
+   ~edspSystemPrivate() { DeInitialize(); }
+};
+// System::edspSystem - Constructor                                    /*{{{*/
+edspSystem::edspSystem() : pkgSystem("Debian APT solver interface", &debVS), d(new edspSystemPrivate()), StatusFile(NULL)
+{
 }
                                                                        /*}}}*/
 // System::~debSystem - Destructor                                     /*{{{*/
 edspSystem::~edspSystem()
 {
    delete StatusFile;
+   delete d;
 }
                                                                        /*}}}*/
 // System::Lock - Get the lock                                         /*{{{*/
@@ -46,7 +83,7 @@ bool edspSystem::Lock()
 }
                                                                        /*}}}*/
 // System::UnLock - Drop a lock                                                /*{{{*/
-bool edspSystem::UnLock(bool NoErrors)
+bool edspSystem::UnLock(bool /*NoErrors*/)
 {
    return true;
 }
@@ -55,7 +92,7 @@ bool edspSystem::UnLock(bool NoErrors)
 // ---------------------------------------------------------------------
 /* we can't use edsp input as input for real installations - just a
    simulation can work, but everything else will fail bigtime */
-pkgPackageManager *edspSystem::CreatePM(pkgDepCache *Cache) const
+pkgPackageManager *edspSystem::CreatePM(pkgDepCache * /*Cache*/) const
 {
    return NULL;
 }
@@ -63,7 +100,8 @@ pkgPackageManager *edspSystem::CreatePM(pkgDepCache *Cache) const
 // System::Initialize - Setup the configuration space..                        /*{{{*/
 bool edspSystem::Initialize(Configuration &Cnf)
 {
-   Cnf.Set("Dir::State::extended_states", "/dev/null");
+   d->Initialize(Cnf);
+   Cnf.Set("Dir::Etc::preferencesparts", "/dev/null");
    Cnf.Set("Dir::State::status","/dev/null");
    Cnf.Set("Dir::State::lists","/dev/null");
 
@@ -78,30 +116,25 @@ bool edspSystem::Initialize(Configuration &Cnf)
 }
                                                                        /*}}}*/
 // System::ArchiveSupported - Is a file format supported               /*{{{*/
-bool edspSystem::ArchiveSupported(const char *Type)
+bool edspSystem::ArchiveSupported(const char * /*Type*/)
 {
    return false;
 }
                                                                        /*}}}*/
-// System::Score - Determine if we should use the edsp system          /*{{{*/
-signed edspSystem::Score(Configuration const &Cnf)
+// System::Score - Never use the EDSP system automatically             /*{{{*/
+signed edspSystem::Score(Configuration const &)
 {
-   if (Cnf.Find("Dir::State::universe", "") == "stdin")
-      return 1000;
-   if (FileExists(Cnf.FindFile("Dir::State::universe","")) == true)
-      return 1000;
    return -1000;
 }
                                                                        /*}}}*/
-// System::AddStatusFiles - Register the status files                  /*{{{*/
-bool edspSystem::AddStatusFiles(vector<pkgIndexFile *> &List)
+bool edspSystem::AddStatusFiles(std::vector<pkgIndexFile *> &List)     /*{{{*/
 {
    if (StatusFile == 0)
    {
-      if (_config->Find("Dir::State::universe", "") == "stdin")
-        StatusFile = new edspIndex("stdin");
+      if (_config->Find("edsp::scenario", "") == "/nonexistent/stdin")
+        StatusFile = new edspIndex("/nonexistent/stdin");
       else
-        StatusFile = new edspIndex(_config->FindFile("Dir::State::universe"));
+        StatusFile = new edspIndex(_config->FindFile("edsp::scenario"));
    }
    List.push_back(StatusFile);
    return true;
@@ -122,3 +155,5 @@ bool edspSystem::FindIndex(pkgCache::PkgFileIterator File,
    return false;
 }
                                                                        /*}}}*/
+
+APT_HIDDEN edspSystem edspSys;