// -*- mode: cpp; mode: fold -*-
// Description								/*{{{*/
/* ######################################################################
   
   Source Package Records - Allows access to source package records
   
   Parses and allows access to the list of source records and searching by
   source name on that list.
   
   ##################################################################### */
									/*}}}*/
#ifndef PKGLIB_SRCRECORDS_H
#define PKGLIB_SRCRECORDS_H

#include <apt-pkg/hashes.h>
#include <apt-pkg/macros.h>

#include <string>
#include <vector>

#ifndef APT_8_CLEANER_HEADERS
using std::string;
using std::vector;
#endif

class pkgSourceList;
class pkgIndexFile;
class pkgSrcRecords
{
   public:

APT_IGNORE_DEPRECATED_PUSH
   // Describes a single file
   struct File
   {
      APT_DEPRECATED_MSG("Use Hashes member instead of hardcoded hash algorithm") std::string MD5Hash;
      APT_DEPRECATED_MSG("Use FileSize member instead") unsigned long Size;
      std::string Path;
      std::string Type;
   };
   struct File2 : public File
   {
      unsigned long long FileSize;
      HashStringList Hashes;
   };
APT_IGNORE_DEPRECATED_POP

   // Abstract parser for each source record
   class Parser
   {
      void * const d;
      protected:
      
      const pkgIndexFile *iIndex;
      
      public:

      enum BuildDep {BuildDepend=0x0,BuildDependIndep=0x1,
	             BuildConflict=0x2,BuildConflictIndep=0x3,
	             BuildDependArch=0x4,BuildConflictArch=0x5};

      struct BuildDepRec 
      {
	 std::string Package;
	 std::string Version;
	 unsigned int Op;
	 unsigned char Type;
      };
	
      inline const pkgIndexFile &Index() const {return *iIndex;};
      
      virtual bool Restart() = 0;
      virtual bool Step() = 0;
      virtual bool Jump(unsigned long const &Off) = 0;
      virtual unsigned long Offset() = 0;
      virtual std::string AsStr() = 0;
      
      virtual std::string Package() const = 0;
      virtual std::string Version() const = 0;
      virtual std::string Maintainer() const = 0;
      virtual std::string Section() const = 0;
      virtual const char **Binaries() = 0;   // Ownership does not transfer

      //FIXME: Add a parameter to specify which architecture to use for [wildcard] matching
      virtual bool BuildDepends(std::vector<BuildDepRec> &BuildDeps, bool const &ArchOnly, bool const &StripMultiArch = true) = 0;
      static const char *BuildDepType(unsigned char const &Type) APT_PURE;

      virtual bool Files(std::vector<pkgSrcRecords::File> &F) = 0;
      bool Files2(std::vector<pkgSrcRecords::File2> &F);

      explicit Parser(const pkgIndexFile *Index);
      virtual ~Parser();
   };
   
   private:
   /** \brief dpointer placeholder (for later in case we need it) */
   void * const d;
   
   // The list of files and the current parser pointer
   std::vector<Parser*> Files;
   std::vector<Parser *>::iterator Current;
   
   public:

   // Reset the search
   bool Restart();

   // Step to the next SourcePackage and return pointer to the 
   // next SourceRecord. The pointer is owned by libapt.
   const Parser* Step();

   // Locate a package by name and return pointer to the Parser.
   // The pointer is owned by libapt.
   Parser* Find(const char *Package,bool const &SrcOnly = false);

   explicit pkgSrcRecords(pkgSourceList &List);
   virtual ~pkgSrcRecords();
};

#endif
