| 1 | // -*- mode: cpp; mode: fold -*- |
| 2 | // Description /*{{{*/ |
| 3 | // $Id: pkgsystem.h,v 1.6 2002/11/11 06:55:50 doogie 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 | |
| 41 | #include <apt-pkg/depcache.h> |
| 42 | #include <vector> |
| 43 | |
| 44 | class pkgPackageManager; |
| 45 | class pkgVersioningSystem; |
| 46 | class Configuration; |
| 47 | class pkgIndexFile; |
| 48 | |
| 49 | class pkgSystem |
| 50 | { |
| 51 | public: |
| 52 | |
| 53 | // Global list of supported systems |
| 54 | static pkgSystem **GlobalList; |
| 55 | static unsigned long GlobalListLen; |
| 56 | static pkgSystem *GetSystem(const char *Label); |
| 57 | |
| 58 | const char *Label; |
| 59 | pkgVersioningSystem *VS; |
| 60 | |
| 61 | /* Prevent other programs from touching shared data not covered by |
| 62 | other locks (cache or state locks) */ |
| 63 | virtual bool Lock() = 0; |
| 64 | virtual bool UnLock(bool NoErrors = false) = 0; |
| 65 | |
| 66 | /* Various helper classes to interface with specific bits of this |
| 67 | environment */ |
| 68 | virtual pkgPackageManager *CreatePM(pkgDepCache *Cache) const = 0; |
| 69 | |
| 70 | /* Load environment specific configuration and perform any other setup |
| 71 | necessary */ |
| 72 | virtual bool Initialize(Configuration &/*Cnf*/) {return true;}; |
| 73 | |
| 74 | /* Type is some kind of Globally Unique way of differentiating |
| 75 | archive file types.. */ |
| 76 | virtual bool ArchiveSupported(const char *Type) = 0; |
| 77 | |
| 78 | // Return a list of system index files.. |
| 79 | virtual bool AddStatusFiles(std::vector<pkgIndexFile *> &List) = 0; |
| 80 | virtual bool FindIndex(pkgCache::PkgFileIterator File, |
| 81 | pkgIndexFile *&Found) const = 0; |
| 82 | |
| 83 | /* Evauluate how 'right' we are for this system based on the filesystem |
| 84 | etc.. */ |
| 85 | virtual signed Score(Configuration const &/*Cnf*/) {return 0;}; |
| 86 | |
| 87 | pkgSystem(); |
| 88 | virtual ~pkgSystem() {}; |
| 89 | }; |
| 90 | |
| 91 | // The environment we are operating in. |
| 92 | extern pkgSystem *_system; |
| 93 | |
| 94 | #endif |