summaryrefslogtreecommitdiff
path: root/apt-pkg/acquire-method.h
blob: 664b95c18f6e3c1b47c79498eb5e30864793d1e9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
// -*- mode: cpp; mode: fold -*-
// Description								/*{{{*/
/* ######################################################################

   Acquire Method - Method helper class + functions
   
   These functions are designed to be used within the method task to
   ease communication with APT.
   
   ##################################################################### */
									/*}}}*/

/** \addtogroup acquire
 *  @{
 *
 *  \file acquire-method.h
 */

#ifndef PKGLIB_ACQUIRE_METHOD_H
#define PKGLIB_ACQUIRE_METHOD_H

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

#include <stdarg.h>
#include <time.h>

#include <string>
#include <unordered_map>
#include <vector>

#ifndef APT_8_CLEANER_HEADERS
#include <apt-pkg/configuration.h>
#include <apt-pkg/strutl.h>
#endif

class pkgAcqMethod
{
   protected:

   struct FetchItem
   {
      FetchItem *Next;

      std::string Uri;
      std::string DestFile;
      int DestFileFd;
      time_t LastModified;
      bool IndexFile;
      bool FailIgnore;
      HashStringList ExpectedHashes;
      // a maximum size we will download, this can be the exact filesize
      // for when we know it or a arbitrary limit when we don't know the
      // filesize (like a InRelease file)
      unsigned long long MaximumSize;

      FetchItem();
      virtual ~FetchItem();
      std::string Proxy(); // For internal use only.
      void Proxy(std::string const &Proxy) APT_HIDDEN;

      private:
      struct Private;
      Private *const d;
   };

   struct FetchResult
   {
      HashStringList Hashes;
      std::vector<std::string> GPGVOutput;
      time_t LastModified;
      bool IMSHit;
      std::string Filename;
      unsigned long long Size;
      unsigned long long ResumePoint;
      
      void TakeHashes(class Hashes &Hash);
      FetchResult();
      virtual ~FetchResult();
      private:
      void * const d;
   };

   // State
   std::vector<std::string> Messages;
   FetchItem *Queue;
   FetchItem *QueueBack;
   std::string FailReason;
   std::string UsedMirror;
   std::string IP;

   // Handlers for messages
   virtual bool Configuration(std::string Message);
   virtual bool Fetch(FetchItem * /*Item*/) {return true;};
   virtual bool URIAcquire(std::string const &/*Message*/, FetchItem *Itm) { return Fetch(Itm); };

   // Outgoing messages
   void Fail(bool Transient = false);
   inline void Fail(const char *Why, bool Transient = false) {Fail(std::string(Why),Transient);};
   virtual void Fail(std::string Why, bool Transient = false);
   virtual void URIStart(FetchResult &Res);
   virtual void URIDone(FetchResult &Res,FetchResult *Alt = 0);
   void SendMessage(std::string const &header, std::unordered_map<std::string, std::string> &&fields);

   bool MediaFail(std::string Required,std::string Drive);
   virtual void Exit() {};

   void PrintStatus(char const * const header, const char* Format, va_list &args) const;

   public:
   enum CnfFlags
   {
      SingleInstance = (1 << 0),
      Pipeline = (1 << 1),
      SendConfig = (1 << 2),
      LocalOnly = (1 << 3),
      NeedsCleanup = (1 << 4),
      Removable = (1 << 5),
      AuxRequests = (1 << 6)
   };

   void Log(const char *Format,...);
   void Status(const char *Format,...);
   
   void Redirect(const std::string &NewURI);
 
   int Run(bool Single = false);
   inline void SetFailReason(std::string Msg) {FailReason = Msg;};
   inline void SetIP(std::string aIP) {IP = aIP;};
   
   pkgAcqMethod(const char *Ver,unsigned long Flags = 0);
   virtual ~pkgAcqMethod();
   void DropPrivsOrDie();
   private:
   APT_HIDDEN void Dequeue();
};

/** @} */

#endif