a296e69aec4bc79e0fcd127d59d698935de57b5b
[apt.git] / apt-pkg / pkgsystem.h
1 // -*- mode: cpp; mode: fold -*-
2 // Description                                                          /*{{{*/
3 // $Id: pkgsystem.h,v 1.4 2003/01/29 18:43:48 niemeyer Exp $
4 /* ######################################################################
5
6    System - Abstraction for running on different systems.
7    
8    Instances of this class can be thought of as factories or meta-classes
9    for a variety of more specialized classes. Together this class and 
10    it's speciallized offspring completely define the environment and how
11    to access resources for a specific system. There are several sub
12    areas that are all orthogonal - each system has a unique combination of
13    these sub areas:
14        - Versioning. Different systems have different ideas on versions.
15          Within a system all sub classes must follow the same versioning 
16          rules.
17        - Local tool locking to prevent multiple tools from accessing the
18          same database.
19        - Candidate Version selection policy - this is probably almost always
20          managed using a standard APT class
21        - Actual Package installation 
22          * Indication of what kind of binary formats are supported
23        - Selection of local 'status' indexes that make up the pkgCache.
24       
25    It is important to note that the handling of index files is not a 
26    function of the system. Index files are handled through a seperate 
27    abstraction - the only requirement is that the index files have the
28    same idea of versioning as the target system.
29    
30    Upon startup each supported system instantiates an instance of the
31    pkgSystem class (using a global constructor) which will make itself
32    available to the main APT init routine. That routine will select the
33    proper system and make it the global default.
34    
35    ##################################################################### */
36                                                                         /*}}}*/
37 #ifndef PKGLIB_PKGSYSTEM_H
38 #define PKGLIB_PKGSYSTEM_H
39
40 #ifdef __GNUG__
41 #pragma interface "apt-pkg/pkgsystem.h"
42 #endif
43
44 #include <apt-pkg/depcache.h>
45 #include <vector>
46     
47 class pkgPackageManager;
48 class pkgVersioningSystem;
49 class Configuration;
50 class pkgIndexFile;
51
52 // CNC:2002-07-05
53 class pkgProblemResolver;
54
55 class pkgSystem
56 {   
57    public:
58
59    // Global list of supported systems
60    static pkgSystem **GlobalList;
61    static unsigned long GlobalListLen;
62    static pkgSystem *GetSystem(const char *Label);
63    
64    const char *Label;
65    pkgVersioningSystem *VS;
66    
67    /* Prevent other programs from touching shared data not covered by
68       other locks (cache or state locks) */
69    virtual bool Lock() = 0;
70    virtual bool UnLock(bool NoErrors = false) = 0;
71
72    // CNC:2002-07-06
73    virtual bool LockRead() {return true;};
74
75    // CNC:2003-03-07 - Signal to system that the cache has been built.
76    virtual void CacheBuilt() {};
77    
78    /* Various helper classes to interface with specific bits of this
79       environment */
80    virtual pkgPackageManager *CreatePM(pkgDepCache *Cache) const = 0;
81
82    /* Load environment specific configuration and perform any other setup
83       necessary */
84    virtual bool Initialize(Configuration &/*Cnf*/) {return true;};
85    
86    /* Type is some kind of Globally Unique way of differentiating
87       archive file types.. */
88    virtual bool ArchiveSupported(const char *Type) = 0;
89
90    // Return a list of system index files..
91    virtual bool AddStatusFiles(std::vector<pkgIndexFile *> &List) = 0;   
92    // CNC:2003-11-21
93    virtual bool AddSourceFiles(std::vector<pkgIndexFile *> &List) {return true;};
94    virtual bool FindIndex(pkgCache::PkgFileIterator File,
95                           pkgIndexFile *&Found) const = 0;
96    
97    /* Evauluate how 'right' we are for this system based on the filesystem
98       etc.. */
99    virtual signed Score(Configuration const &/*Cnf*/) {return 0;};
100
101    // LORG:2006-02-06 Distro version from package system
102    virtual string DistroVer(Configuration const &/*Cnf*/) {return "";};
103    
104    // CNC:2002-07-03
105    // Do environment specific pre-processing over the Index Files
106    virtual bool PreProcess(pkgIndexFile **Start,pkgIndexFile **End,
107                            OpProgress &Progress) {return true;};
108    virtual bool ProcessCache(pkgDepCache &Cache, pkgProblemResolver &Fix)
109         {return true;};
110    virtual bool IgnoreDep(pkgVersioningSystem &VS, pkgCache::DepIterator &Dep)
111         {return false;};
112
113    // CNC:2003-11-24
114    virtual unsigned long OptionsHash() const {return 0;};
115
116    pkgSystem();
117    virtual ~pkgSystem() {};
118 };
119
120 // The environment we are operating in.
121 extern pkgSystem *_system;
122
123 #endif