Class Communication and Inheritance graph

Key
  -> Creates, Contains or Uses this other class
  --- Inheritance

Graph
  Base Classes ---------> Derived Classes
  Admin --- DebAdmin
         |- RpmAdmin
         \- Deb3Admin
        -> PackageList
        -> ConfigData
  
  PkgList --- PkgListDbm
          --- PkgListOrdered --- PkgListVect
           -> PkgCtrlInfo
  
  PkgCntInfo 
            -> PkgElement
  
  PackageFile --- PackageDebFile
           |- PackageRpmFile
           \- PackageDeb3File
	   -> PkgFullInfo
	        
  Method --- FTPMethod
           |- DiskMethod --- MountMethod
           |- SMBMethod
           |- NFSMethod
           \- URLMethod 
           ->  ConfigData

  pkgCache (pkgCacheMerge)

Descriptions
  Admin - Abstractly Contains the administrion directory, basically 
          constructs the other classes which abstract the specific things 
	  about the directory. It's job is to decide and dictate how all the 
	  information is stored persistantly. 
	  
  DebAdmin - This is the administration directory format we have now

  RpmAdmin - This is the administration directory format that RPM uses

  Deb3Admin - This is some of the ideas we have been juggling around to 
              speed admin processing up.
  
  PkgList - Abstract base class which allows manipulation of a list of
            packages.
	    
  PkgListOrdered - An Order sensitive package list
  
  ConfigData - Provides uniform controlled persistant storage for the 
               install methods. It is used primarily by the install methods
	       to access their persistant data in such a way that they are
	       oblivious to it's storage method and location Possibly libgdb 
	       or dbm based.
	       
  PkgListDbm - This is a type of package list were the primary backing 
               storage is in a database file. (libgdb/dbm again)
		   
  PkgListVect - This is a type of package list were the primary backing
                storage is memory, it implements a vector of packages and is
		order sensitive
		    
  PkgCtrlInfo - Package Control Info. This describes the package's
                control block. It's control file, avail list entry and status
		list entry are all versions of the control block.
		
  PkgElement - Individual item in the control block, pair of strings,
               tag/value style.
		   
  Package - Abstract base package type, describes the basic operations that
            can be performed on a package, unpacking, control file expansion
	    etc.
	    
  PackageDebFile - Debian implementation of the requirements of the Package 
                   class
  
  PackageDeb3File - Debian version 3.0 implementation of the requirements of 
                    the Package Class. IF we ever upgrade the package storage 
		    format for some reason this will be written. VERY FUTURE
		
  PackageRpmFile - RPM implementation of a package
  
  Method - Abstract base for the install methods
  *Method - An actual implementation of an install method

  Cache - Manages the binary package cache file, it's sub class CacheMerge
          is used to generate the disk file. The cache file is the
	  important element of the system for the GUI, it contains a pre-linked
	  tree of everything that is important to it. See cache.sgml for info
  
Algorithm Functions

  Like STL this layout makes extensive use of external helper functions to
  do some high level PackageList processing. 
  
  Sort(PkgListOrdered &List,string Key);
     Sort the package list by a specific key in the elements list.
     
  Depends(PkgList &List,PackageList const &Packs,PacakgeList const &From);
     Generates a list of Packages into List that are depended by packages
     in From and includes from
     
  SetOfStatus(PkgList &To,PkgList const &From,int TrueFlags,int FalseFlags);
     Generates a sub list of packages with TrueFlags set and FalseFlags 
     cleared from the status field.
     
  DependsSort(vector<PkgListOrdered> Passes,PkgList const &Packs);
     Performs install dependancy ordering on the Packages in Packs. It outputs
     a list of PackageLists, each list being a set of packages that must be
     installed and configured in the order given. By moving through the list
     from the 0..n item the entire set of package can be installed in order.
     
  More...
  
Eg,
  Pre install dependancy ordering can be done with:
  
  PkgList PackageSet;
  Depends(PackageSet,InstallSet,Availible);
  SetOfStatus(PackageSet,INSTALL,REMOVE | INSTALLED);

  vector<PkgListOrdered> Passes;
  DependsSort(Passes,PackageSet);
  
The net effect of this is that the low level library does not ever need to
distinguish between an availible package, an installed package or lists of
the two. The client is responsible for all of that management, making the
low level library alot more flexible and giving the client alot more
possibilities for what a list of packages will contain.
