]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/acquire-item.h
refactor calculation of final lists/ name from URI
[apt.git] / apt-pkg / acquire-item.h
index bab2cc0d79990e772559810ba9bebc6509aa7b79..c2759b792e291b08a791c270f6e7c69b0dcaab5d 100644 (file)
@@ -63,6 +63,8 @@ class pkgAcqMetaBase;
  */
 class pkgAcquire::Item : public WeakPointable
 {  
+   friend class pkgAcqMetaBase;
+
    void *d;
 
    protected:
@@ -75,12 +77,11 @@ class pkgAcquire::Item : public WeakPointable
     *  \param Item Metadata about this item (its URI and
     *  description).
     */
-   inline void QueueURI(ItemDesc &Item)
-                 {Owner->Enqueue(Item);};
+   void QueueURI(ItemDesc &Item);
 
    /** \brief Remove this item from its owner's queue. */
-   inline void Dequeue() {Owner->Dequeue(this);};
-   
+   void Dequeue();
+
    /** \brief Rename a file without modifying its timestamp.
     *
     *  Many item methods call this as their final action.
@@ -92,6 +93,9 @@ class pkgAcquire::Item : public WeakPointable
     */
    bool Rename(std::string From,std::string To);
 
+   /** \brief Get the full pathname of the final file for the current URI */
+   virtual std::string GetFinalFilename() const;
+
    public:
 
    /** \brief The current status of this item. */
@@ -253,7 +257,11 @@ class pkgAcquire::Item : public WeakPointable
     *  line, so they should (if nonempty) have a leading newline and
     *  no trailing newline.
     */
+#if APT_PKG_ABI >= 413
    virtual std::string Custom600Headers() const {return std::string();};
+#else
+   virtual std::string Custom600Headers() {return std::string();};
+#endif
 
    /** \brief A "descriptive" URI-like string.
     *
@@ -279,9 +287,16 @@ class pkgAcquire::Item : public WeakPointable
 
    /** \return the acquire process with which this item is associated. */
    pkgAcquire *GetOwner() const {return Owner;};
+#if APT_PKG_ABI < 413
+   pkgAcquire *GetOwner() {return Owner;};
+#endif
 
    /** \return \b true if this object is being fetched from a trusted source. */
+#if APT_PKG_ABI >= 413
    virtual bool IsTrusted() const {return false;};
+#else
+   virtual bool IsTrusted() {return false;};
+#endif
    
    /** \brief Report mirror problem
     * 
@@ -324,6 +339,7 @@ class pkgAcquire::Item : public WeakPointable
       InvalidFormat,
       SignatureError,
       NotClearsigned,
+      MaximumSizeExceeded
    };
 
    /** \brief Rename failed file and set error
@@ -340,20 +356,24 @@ class pkgAcquire::Item : public WeakPointable
 };
                                                                        /*}}}*/
 /** \brief Information about an index patch (aka diff). */             /*{{{*/
-struct DiffInfo {
+struct APT_HIDDEN DiffInfo {
    /** The filename of the diff. */
    std::string file;
 
-   /** The sha1 hash of the diff. */
-   std::string sha1;
+   /** The hashes of the diff */
+   HashStringList result_hashes;
+
+   /** The hashes of the file after the diff is applied */
+   HashStringList patch_hashes;
 
-   /** The size of the diff. */
-   unsigned long size;
+   /** The size of the file after the diff is applied */
+   unsigned long long result_size;
+
+   /** The size of the diff itself */
+   unsigned long long patch_size;
 };
                                                                        /*}}}*/
-                                                                       /*}}}*/
-
-class pkgAcqMetaBase  : public pkgAcquire::Item
+class pkgAcqMetaBase  : public pkgAcquire::Item                                /*{{{*/
 {
    void *d;
 
@@ -373,7 +393,13 @@ class pkgAcqMetaBase  : public pkgAcquire::Item
    bool AuthPass;
 
    // required to deal gracefully with problems caused by incorrect ims hits
-   bool IMSHit; 
+   bool IMSHit;
+
+   /** \brief The URI of the signature file.  Unlike Desc.URI, this is
+    *  never modified; it is used to determine the file that is being
+    *  downloaded.
+    */
+   std::string RealURI;
 
    /** \brief Starts downloading the individual index files.
     *
@@ -385,37 +411,80 @@ class pkgAcqMetaBase  : public pkgAcquire::Item
     */
    void QueueIndexes(bool verify);
 
+   /** \brief Called when a file is finished being retrieved.
+    *
+    *  If the file was not downloaded to DestFile, a copy process is
+    *  set up to copy it to DestFile; otherwise, Complete is set to \b
+    *  true and the file is moved to its final location.
+    *
+    *  \param Message The message block received from the fetch
+    *  subprocess.
+    */
+   bool CheckDownloadDone(const std::string &Message);
+
+   /** \brief Queue the downloaded Signature for verification */
+   void QueueForSignatureVerify(const std::string &MetaIndexFile,
+                                const std::string &MetaIndexFileSignature);
+
+#if APT_PKG_ABI >= 413
+   virtual std::string Custom600Headers() const;
+#else
+   virtual std::string Custom600Headers();
+#endif
+
+   /** \brief Called when authentication succeeded.
+    *
+    *  Sanity-checks the authenticated file, queues up the individual
+    *  index files for download, and saves the signature in the lists
+    *  directory next to the authenticated list file.
+    *
+    *  \param Message The message block received from the fetch
+    *  subprocess.
+    */
+   bool CheckAuthDone(std::string Message);
+
+   /** Check if the current item should fail at this point */
+   bool CheckStopAuthentication(const std::string &Message);
+
+   /** \brief Check that the release file is a release file for the
+    *  correct distribution.
+    *
+    *  \return \b true if no fatal errors were encountered.
+    */
+   bool VerifyVendor(std::string Message);
+
+   /** \brief Get the full pathname of the final file for the current URI */
+   virtual std::string GetFinalFilename() const;
+
  public:
+   virtual std::string DescURI() {return RealURI; };
+
    // transaction code
    void Add(Item *I);
    void AbortTransaction();
    bool TransactionHasError() APT_PURE;
    void CommitTransaction();
 
-   /** \brief Stage (queue) a copy action when the transaction is commited
+   /** \brief Stage (queue) a copy action when the transaction is committed
     */
    void TransactionStageCopy(Item *I,
                              const std::string &From, 
                              const std::string &To);
-   /** \brief Stage (queue) a removal action when the transaction is commited
+   /** \brief Stage (queue) a removal action when the transaction is committed
     */
    void TransactionStageRemoval(Item *I, const std::string &FinalFile);
 
-   // helper for the signature warning
-   bool GenerateAuthWarning(const std::string &RealURI,
-                            const std::string &Message);
-
-
    pkgAcqMetaBase(pkgAcquire *Owner,
                   const std::vector<IndexTarget*>* IndexTargets,
                   indexRecords* MetaIndexParser,
+                 std::string const &RealURI,
                   HashStringList const &ExpectedHashes=HashStringList(),
                   pkgAcqMetaBase *TransactionManager=NULL)
       : Item(Owner, ExpectedHashes, TransactionManager),
         MetaIndexParser(MetaIndexParser), IndexTargets(IndexTargets),
-        AuthPass(false), IMSHit(false) {};
+        AuthPass(false), IMSHit(false), RealURI(RealURI) {};
 };
-
+                                                                       /*}}}*/
 /** \brief An acquire item that downloads the detached signature       {{{
  *  of a meta-index (Release) file, then queues up the release
  *  file itself.
@@ -424,18 +493,12 @@ class pkgAcqMetaBase  : public pkgAcquire::Item
  *
  *  \sa pkgAcqMetaIndex
  */
-class pkgAcqMetaSig : public pkgAcqMetaBase
+class APT_HIDDEN pkgAcqMetaSig : public pkgAcqMetaBase
 {
    void *d;
 
    protected:
 
-   /** \brief The URI of the signature file.  Unlike Desc.URI, this is
-    *  never modified; it is used to determine the file that is being
-    *  downloaded.
-    */
-   std::string RealURI;
-
    /** \brief The file we need to verify */
    std::string MetaIndexFile;
 
@@ -449,14 +512,12 @@ class pkgAcqMetaSig : public pkgAcqMetaBase
    std::string ShortDesc;
 
    public:
-   
+
    // Specialized action members
    virtual void Failed(std::string Message,pkgAcquire::MethodConfig *Cnf);
    virtual void Done(std::string Message,unsigned long long Size,
                      HashStringList const &Hashes,
                     pkgAcquire::MethodConfig *Cnf);
-   virtual std::string Custom600Headers() const;
-   virtual std::string DescURI() {return RealURI; };
 
    /** \brief Create a new pkgAcqMetaSig. */
    pkgAcqMetaSig(pkgAcquire *Owner,
@@ -468,7 +529,6 @@ class pkgAcqMetaSig : public pkgAcqMetaBase
    virtual ~pkgAcqMetaSig();
 };
                                                                        /*}}}*/
-
 /** \brief An item that is responsible for downloading the meta-index  {{{
  *  file (i.e., Release) itself and verifying its signature.
  *
@@ -479,52 +539,11 @@ class pkgAcqMetaSig : public pkgAcqMetaBase
  *  otherwise, the expected hashsums will be "" (causing the
  *  authentication of the index files to be bypassed).
  */
-class pkgAcqMetaIndex : public pkgAcqMetaBase
+class APT_HIDDEN pkgAcqMetaIndex : public pkgAcqMetaBase
 {
    void *d;
 
    protected:
-   /** \brief The URI that is actually being downloaded; never
-    *  modified by pkgAcqMetaIndex.
-    */
-   std::string RealURI;
-
-   /** \brief The file in which the signature for this index was stored.
-    *
-    *  If empty, the signature and the md5sums of the individual
-    *  indices will not be checked.
-    */
-   std::string SigFile;
-
-   /** \brief Check that the release file is a release file for the
-    *  correct distribution.
-    *
-    *  \return \b true if no fatal errors were encountered.
-    */
-   bool VerifyVendor(std::string Message);
-
-   /** \brief Called when a file is finished being retrieved.
-    *
-    *  If the file was not downloaded to DestFile, a copy process is
-    *  set up to copy it to DestFile; otherwise, Complete is set to \b
-    *  true and the file is moved to its final location.
-    *
-    *  \param Message The message block received from the fetch
-    *  subprocess.
-    */
-   void RetrievalDone(std::string Message);
-
-   /** \brief Called when authentication succeeded.
-    *
-    *  Sanity-checks the authenticated file, queues up the individual
-    *  index files for download, and saves the signature in the lists
-    *  directory next to the authenticated list file.
-    *
-    *  \param Message The message block received from the fetch
-    *  subprocess.
-    */
-   void AuthDone(std::string Message);
-
    std::string URIDesc;
    std::string ShortDesc;
 
@@ -546,8 +565,6 @@ class pkgAcqMetaIndex : public pkgAcqMetaBase
    virtual void Failed(std::string Message,pkgAcquire::MethodConfig *Cnf);
    virtual void Done(std::string Message,unsigned long long Size, HashStringList const &Hashes,
                     pkgAcquire::MethodConfig *Cnf);
-   virtual std::string Custom600Headers() const;
-   virtual std::string DescURI() {return RealURI; };
    virtual void Finished();
 
    /** \brief Create a new pkgAcqMetaIndex. */
@@ -560,7 +577,7 @@ class pkgAcqMetaIndex : public pkgAcqMetaBase
 };
                                                                        /*}}}*/
 /** \brief An item repsonsible for downloading clearsigned metaindexes {{{*/
-class pkgAcqMetaClearSig : public pkgAcqMetaIndex
+class APT_HIDDEN pkgAcqMetaClearSig : public pkgAcqMetaIndex
 {
    void *d;
 
@@ -584,7 +601,11 @@ class pkgAcqMetaClearSig : public pkgAcqMetaIndex
 
 public:
    virtual void Failed(std::string Message,pkgAcquire::MethodConfig *Cnf);
+#if APT_PKG_ABI >= 413
    virtual std::string Custom600Headers() const;
+#else
+   virtual std::string Custom600Headers();
+#endif
    virtual void Done(std::string Message,unsigned long long Size,
                      HashStringList const &Hashes,
                     pkgAcquire::MethodConfig *Cnf);
@@ -599,8 +620,6 @@ public:
    virtual ~pkgAcqMetaClearSig();
 };
                                                                        /*}}}*/
-
-
 /** \brief Common base class for all classes that deal with fetching   {{{
            indexes
  */
@@ -626,6 +645,9 @@ class pkgAcqBaseIndex : public pkgAcquire::Item
 
    bool VerifyHashByMetaKey(HashStringList const &Hashes);
 
+   /** \brief Get the full pathname of the final file for the current URI */
+   virtual std::string GetFinalFilename() const;
+
    pkgAcqBaseIndex(pkgAcquire *Owner,
                    pkgAcqMetaBase *TransactionManager,
                    struct IndexTarget const * const Target,
@@ -644,7 +666,7 @@ class pkgAcqBaseIndex : public pkgAcquire::Item
  *
  *  \sa pkgAcqIndexDiffs, pkgAcqIndex
  */
-class pkgAcqDiffIndex : public pkgAcqBaseIndex
+class APT_HIDDEN pkgAcqDiffIndex : public pkgAcqBaseIndex
 {
    void *d;
 
@@ -666,13 +688,20 @@ class pkgAcqDiffIndex : public pkgAcqBaseIndex
     */
    bool PackagesFileReadyInPartial;
 
+   /** \brief Get the full pathname of the final file for the current URI */
+   virtual std::string GetFinalFilename() const;
+
  public:
    // Specialized action members
    virtual void Failed(std::string Message,pkgAcquire::MethodConfig *Cnf);
    virtual void Done(std::string Message,unsigned long long Size, HashStringList const &Hashes,
                     pkgAcquire::MethodConfig *Cnf);
    virtual std::string DescURI() {return RealURI + "Index";};
+#if APT_PKG_ABI >= 413
    virtual std::string Custom600Headers() const;
+#else
+   virtual std::string Custom600Headers();
+#endif
 
    /** \brief Parse the Index file for a set of Packages diffs.
     *
@@ -717,7 +746,7 @@ class pkgAcqDiffIndex : public pkgAcqBaseIndex
  *
  *  \sa pkgAcqDiffIndex, pkgAcqIndex
  */
-class pkgAcqIndexMergeDiffs : public pkgAcqBaseIndex
+class APT_HIDDEN pkgAcqIndexMergeDiffs : public pkgAcqBaseIndex
 {
    void *d;
 
@@ -805,7 +834,7 @@ class pkgAcqIndexMergeDiffs : public pkgAcqBaseIndex
  *
  *  \sa pkgAcqDiffIndex, pkgAcqIndex
  */
-class pkgAcqIndexDiffs : public pkgAcqBaseIndex
+class APT_HIDDEN pkgAcqIndexDiffs : public pkgAcqBaseIndex
 {
    void *d;
 
@@ -820,7 +849,7 @@ class pkgAcqIndexDiffs : public pkgAcqBaseIndex
     *  \return \b true if an applicable diff was found, \b false
     *  otherwise.
     */
-   bool QueueNextDiff();
+   APT_HIDDEN bool QueueNextDiff();
 
    /** \brief Handle tasks that must be performed after the item
     *  finishes downloading.
@@ -833,7 +862,7 @@ class pkgAcqIndexDiffs : public pkgAcqBaseIndex
     *  \param allDone If \b true, the file was entirely reconstructed,
     *  and its md5sum is verified. 
     */
-   void Finish(bool allDone=false);
+   APT_HIDDEN void Finish(bool allDone=false);
 
    protected:
 
@@ -855,9 +884,6 @@ class pkgAcqIndexDiffs : public pkgAcqBaseIndex
     */
    std::vector<DiffInfo> available_patches;
 
-   /** Stop applying patches when reaching that sha1 */
-   std::string ServerSha1;
-
    /** The current status of this patch. */
    enum DiffState
      {
@@ -901,12 +927,10 @@ class pkgAcqIndexDiffs : public pkgAcqBaseIndex
     *
     *  \param ShortDesc A brief description of this item.
     *
-    *  \param ExpectedHashes The expected md5sum of the completely
+    *  \param ExpectedHashes The expected hashsums of the completely
     *  reconstructed package index file; the index file will be tested
     *  against this value when it is entirely reconstructed.
     *
-    *  \param ServerSha1 is the sha1sum of the current file on the server
-    *
     *  \param diffs The remaining diffs from the index of diffs.  They
     *  should be ordered so that each diff appears before any diff
     *  that depends on it.
@@ -916,7 +940,6 @@ class pkgAcqIndexDiffs : public pkgAcqBaseIndex
                     struct IndexTarget const * const Target,
                     HashStringList const &ExpectedHash,
                     indexRecords *MetaIndexParser,
-                   std::string ServerSha1,
                    std::vector<DiffInfo> diffs=std::vector<DiffInfo>());
 };
                                                                        /*}}}*/
@@ -927,7 +950,7 @@ class pkgAcqIndexDiffs : public pkgAcqBaseIndex
  *
  *  \todo Why does pkgAcqIndex have protected members?
  */
-class pkgAcqIndex : public pkgAcqBaseIndex
+class APT_HIDDEN pkgAcqIndex : public pkgAcqBaseIndex
 {
    void *d;
 
@@ -975,16 +998,15 @@ class pkgAcqIndex : public pkgAcqBaseIndex
    /** \brief Auto select the right compression to use */
    void AutoSelectCompression();
 
-   /** \brief Get the full pathname of the final file for the current URI
-    */
-   std::string GetFinalFilename() const;
-
    /** \brief Schedule file for verification after a IMS hit */
    void ReverifyAfterIMS();
 
    /** \brief Validate the downloaded index file */
    bool ValidateFile(const std::string &FileName);
 
+   /** \brief Get the full pathname of the final file for the current URI */
+   virtual std::string GetFinalFilename() const;
+
    public:
    
    // Specialized action members
@@ -992,7 +1014,11 @@ class pkgAcqIndex : public pkgAcqBaseIndex
    virtual void Done(std::string Message,unsigned long long Size, 
                      HashStringList const &Hashes,
                     pkgAcquire::MethodConfig *Cnf);
+#if APT_PKG_ABI >= 413
    virtual std::string Custom600Headers() const;
+#else
+   virtual std::string Custom600Headers();
+#endif
    virtual std::string DescURI() {return Desc.URI;};
 
    /** \brief Create a pkgAcqIndex.
@@ -1025,45 +1051,8 @@ class pkgAcqIndex : public pkgAcqBaseIndex
              std::string const &ShortDesc);
 };
                                                                        /*}}}*/
-/** \brief An acquire item that is responsible for fetching a          {{{
- *  translated index file.
- *
- *  The only difference from pkgAcqIndex is that transient failures
- *  are suppressed: no error occurs if the translated index file is
- *  missing.
- */
-class pkgAcqIndexTrans : public pkgAcqIndex
-{
-   void *d;
-
-   public:
-  
-   virtual void Failed(std::string Message,pkgAcquire::MethodConfig *Cnf);
-   virtual std::string Custom600Headers() const;
-
-   /** \brief Create a pkgAcqIndexTrans.
-    *
-    *  \param Owner The pkgAcquire object with which this item is
-    *  associated.
-    *
-    *  \param URI The URI of the index file that is to be downloaded.
-    *
-    *  \param URIDesc A "URI-style" description of this index file.
-    *
-    *  \param ShortDesc A brief description of this index file.
-    */
-   pkgAcqIndexTrans(pkgAcquire *Owner,
-                    std::string URI,std::string URIDesc,
-                   std::string ShortDesc);
-   pkgAcqIndexTrans(pkgAcquire *Owner,
-                    pkgAcqMetaBase *TransactionManager,
-                    IndexTarget const * const Target,
-                    HashStringList const &ExpectedHashes,
-                    indexRecords *MetaIndexParser);
-};
-                                                                       /*}}}*/
 /** \brief Information about an index file. */                         /*{{{*/
-class IndexTarget
+class APT_HIDDEN IndexTarget
 {
    void *d;
 
@@ -1088,7 +1077,7 @@ class IndexTarget
 };
                                                                        /*}}}*/
 /** \brief Information about an optional index file. */                        /*{{{*/
-class OptionalIndexTarget : public IndexTarget
+class APT_HIDDEN OptionalIndexTarget : public IndexTarget
 {
    void *d;
 
@@ -1142,17 +1131,24 @@ class pkgAcqArchive : public pkgAcquire::Item
 
    /** \brief Queue up the next available file for this version. */
    bool QueueNext();
-   
+
+   /** \brief Get the full pathname of the final file for the current URI */
+   virtual std::string GetFinalFilename() const;
+
    public:
-   
+
    virtual void Failed(std::string Message,pkgAcquire::MethodConfig *Cnf);
    virtual void Done(std::string Message,unsigned long long Size, HashStringList const &Hashes,
                     pkgAcquire::MethodConfig *Cnf);
    virtual std::string DescURI() {return Desc.URI;};
    virtual std::string ShortDesc() {return Desc.ShortDesc;};
    virtual void Finished();
+#if APT_PKG_ABI >= 413
    virtual bool IsTrusted() const;
-   
+#else
+   virtual bool IsTrusted();
+#endif
+
    /** \brief Create a new pkgAcqArchive.
     *
     *  \param Owner The pkgAcquire object with which this item is
@@ -1201,7 +1197,11 @@ class pkgAcqFile : public pkgAcquire::Item
    virtual void Done(std::string Message,unsigned long long Size, HashStringList const &CalcHashes,
                     pkgAcquire::MethodConfig *Cnf);
    virtual std::string DescURI() {return Desc.URI;};
+#if APT_PKG_ABI >= 413
    virtual std::string Custom600Headers() const;
+#else
+   virtual std::string Custom600Headers();
+#endif
 
    /** \brief Create a new pkgAcqFile object.
     *