apt @VERSION@

acquire-item.h

Go to the documentation of this file.
00001 // -*- mode: cpp; mode: fold -*-
00002 // Description                                                          /*{{{*/
00003 // $Id: acquire-item.h,v 1.26.2.3 2004/01/02 18:51:00 mdz Exp $
00004 /* ######################################################################
00005 
00006    Acquire Item - Item to acquire
00007 
00008    When an item is instantiated it will add it self to the local list in
00009    the Owner Acquire class. Derived classes will then call QueueURI to 
00010    register all the URI's they wish to fetch at the initial moment.   
00011    
00012    Three item classes are provided to provide functionality for
00013    downloading of Index, Translation and Packages files.
00014    
00015    A Archive class is provided for downloading .deb files. It does Hash
00016    checking and source location as well as a retry algorithm.
00017    
00018    ##################################################################### */
00019                                                                         /*}}}*/
00020 #ifndef PKGLIB_ACQUIRE_ITEM_H
00021 #define PKGLIB_ACQUIRE_ITEM_H
00022 
00023 #include <apt-pkg/acquire.h>
00024 #include <apt-pkg/indexfile.h>
00025 #include <apt-pkg/vendor.h>
00026 #include <apt-pkg/sourcelist.h>
00027 #include <apt-pkg/pkgrecords.h>
00028 #include <apt-pkg/indexrecords.h>
00029 #include <apt-pkg/hashes.h>
00030 #include <apt-pkg/weakptr.h>
00031 
00050 class pkgAcquire::Item : public WeakPointable
00051 {  
00052    protected:
00053    
00055    pkgAcquire *Owner;
00056 
00062    inline void QueueURI(ItemDesc &Item)
00063                  {Owner->Enqueue(Item);};
00064 
00066    inline void Dequeue() {Owner->Dequeue(this);};
00067    
00077    void Rename(string From,string To);
00078    
00079    public:
00080 
00082    enum ItemState
00083      {
00085        StatIdle,
00086 
00088        StatFetching,
00089 
00091        StatDone,
00092 
00096        StatError,
00097 
00101        StatAuthError,
00102 
00106        StatTransientNetworkError
00107      } Status;
00108 
00112    string ErrorText;
00113 
00115    unsigned long long FileSize;
00116 
00118    unsigned long long PartialSize;
00119 
00123    const char *Mode;
00124 
00132    unsigned long ID;
00133 
00138    bool Complete;
00139 
00145    bool Local;
00146    string UsedMirror;
00147 
00156    unsigned int QueueCounter;
00157    
00161    string DestFile;
00162 
00176    virtual void Failed(string Message,pkgAcquire::MethodConfig *Cnf);
00177 
00197    virtual void Done(string Message,unsigned long Size,string Hash,
00198                      pkgAcquire::MethodConfig *Cnf);
00199 
00209    virtual void Start(string Message,unsigned long Size);
00210 
00219    virtual string Custom600Headers() {return string();};
00220 
00225    virtual string DescURI() = 0;
00230    virtual string ShortDesc() {return DescURI();}
00231 
00233    virtual void Finished() {};
00234    
00240    virtual string HashSum() {return string();};
00241 
00243    pkgAcquire *GetOwner() {return Owner;};
00244 
00246    virtual bool IsTrusted() {return false;};
00247    
00248    // report mirror problems
00256    void ReportMirrorFailure(string FailCode);
00257 
00258 
00270    Item(pkgAcquire *Owner);
00271 
00275    virtual ~Item();
00276 };
00277                                                                         /*}}}*/         /*{{{*/
00279 struct DiffInfo {
00281    string file;
00282 
00284    string sha1;
00285 
00287    unsigned long size;
00288 };
00289                                                                         /*}}}*/
00296 class pkgAcqSubIndex : public pkgAcquire::Item
00297 {
00298  protected:
00300    bool Debug;
00301 
00303    pkgAcquire::ItemDesc Desc;
00304 
00307    HashString ExpectedHash;
00308 
00309  public:
00310    // Specialized action members
00311    virtual void Failed(string Message,pkgAcquire::MethodConfig *Cnf);
00312    virtual void Done(string Message,unsigned long Size,string Md5Hash,
00313                      pkgAcquire::MethodConfig *Cnf);
00314    virtual string DescURI() {return Desc.URI;};
00315    virtual string Custom600Headers();
00316    virtual bool ParseIndex(string const &IndexFile);
00317 
00330    pkgAcqSubIndex(pkgAcquire *Owner, string const &URI,string const &URIDesc,
00331                    string const &ShortDesc, HashString const &ExpectedHash);
00332 };
00333                                                                         /*}}}*/
00343 class pkgAcqDiffIndex : public pkgAcquire::Item
00344 {
00345  protected:
00347    bool Debug;
00348 
00350    pkgAcquire::ItemDesc Desc;
00351 
00355    string RealURI;
00356 
00360    HashString ExpectedHash;
00361 
00365    string CurrentPackagesFile;
00366 
00370    string Description;
00371 
00372  public:
00373    // Specialized action members
00374    virtual void Failed(string Message,pkgAcquire::MethodConfig *Cnf);
00375    virtual void Done(string Message,unsigned long Size,string Md5Hash,
00376                      pkgAcquire::MethodConfig *Cnf);
00377    virtual string DescURI() {return RealURI + "Index";};
00378    virtual string Custom600Headers();
00379 
00390    bool ParseDiffIndex(string IndexDiffFile);
00391    
00392 
00405    pkgAcqDiffIndex(pkgAcquire *Owner,string URI,string URIDesc,
00406                    string ShortDesc, HashString ExpectedHash);
00407 };
00408                                                                         /*}}}*/
00420 class pkgAcqIndexDiffs : public pkgAcquire::Item
00421 {
00422    private:
00423 
00433    bool QueueNextDiff();
00434 
00446    void Finish(bool allDone=false);
00447 
00448    protected:
00449 
00453    bool Debug;
00454 
00458    pkgAcquire::ItemDesc Desc;
00459 
00463    string RealURI;
00464 
00468    HashString ExpectedHash;
00469 
00471    string Description;
00472 
00481    vector<DiffInfo> available_patches;
00482 
00484    string ServerSha1;
00485 
00487    enum DiffState
00488      {
00490          StateFetchUnkown,
00491 
00493          StateFetchDiff,
00494          
00496          StateUnzipDiff, // FIXME: No longer used
00497 
00499          StateApplyDiff
00500    } State;
00501 
00502    public:
00503    
00509    virtual void Failed(string Message,pkgAcquire::MethodConfig *Cnf);
00510 
00511    virtual void Done(string Message,unsigned long Size,string Md5Hash,
00512                      pkgAcquire::MethodConfig *Cnf);
00513    virtual string DescURI() {return RealURI + "Index";};
00514 
00537    pkgAcqIndexDiffs(pkgAcquire *Owner,string URI,string URIDesc,
00538                     string ShortDesc, HashString ExpectedHash,
00539                     string ServerSha1,
00540                     vector<DiffInfo> diffs=vector<DiffInfo>());
00541 };
00542                                                                         /*}}}*/
00550 class pkgAcqIndex : public pkgAcquire::Item
00551 {
00552    protected:
00553 
00555    bool Decompression;
00556 
00560    bool Erase;
00561 
00565    pkgAcquire::ItemDesc Desc;
00566 
00570    string RealURI;
00571 
00573    HashString ExpectedHash;
00574 
00578    string CompressionExtension;
00579 
00580    public:
00581    
00582    // Specialized action members
00583    virtual void Failed(string Message,pkgAcquire::MethodConfig *Cnf);
00584    virtual void Done(string Message,unsigned long Size,string Md5Hash,
00585                      pkgAcquire::MethodConfig *Cnf);
00586    virtual string Custom600Headers();
00587    virtual string DescURI() {return Desc.URI;};
00588    virtual string HashSum() {return ExpectedHash.toStr(); };
00589 
00609    pkgAcqIndex(pkgAcquire *Owner,string URI,string URIDesc,
00610                string ShortDesc, HashString ExpectedHash, 
00611                string compressExt="");
00612    pkgAcqIndex(pkgAcquire *Owner, struct IndexTarget const * const Target,
00613                          HashString const &ExpectedHash, indexRecords const *MetaIndexParser);
00614    void Init(string const &URI, string const &URIDesc, string const &ShortDesc);
00615 };
00616                                                                         /*}}}*/
00624 class pkgAcqIndexTrans : public pkgAcqIndex
00625 {
00626    public:
00627   
00628    virtual void Failed(string Message,pkgAcquire::MethodConfig *Cnf);
00629    virtual string Custom600Headers();
00630 
00642    pkgAcqIndexTrans(pkgAcquire *Owner,string URI,string URIDesc,
00643                     string ShortDesc);
00644    pkgAcqIndexTrans(pkgAcquire *Owner, struct IndexTarget const * const Target,
00645                     HashString const &ExpectedHash, indexRecords const *MetaIndexParser);
00646 };
00647                                                                         /*}}}*/                         /*{{{*/
00649 struct IndexTarget
00650 {
00652    string URI;
00653 
00655    string Description;
00656 
00658    string ShortDesc;
00659 
00663    string MetaKey;
00664 
00665    //FIXME: We should use virtual methods here instead…
00666    bool IsOptional() const;
00667    bool IsSubIndex() const;
00668 };
00669                                                                         /*}}}*/                 /*{{{*/
00671 struct OptionalIndexTarget : public IndexTarget
00672 {
00673 };
00674                                                                         /*}}}*/
00675 
00684 class pkgAcqMetaSig : public pkgAcquire::Item
00685 {
00686    protected:
00688    string LastGoodSig;
00689 
00691    pkgAcquire::ItemDesc Desc;
00692 
00697    string RealURI;
00698 
00700    string MetaIndexURI;
00701 
00705    string MetaIndexURIDesc;
00706 
00710    string MetaIndexShortDesc;
00711 
00713    indexRecords* MetaIndexParser;
00714 
00720    const vector<struct IndexTarget*>* IndexTargets;
00721 
00722    public:
00723    
00724    // Specialized action members
00725    virtual void Failed(string Message,pkgAcquire::MethodConfig *Cnf);
00726    virtual void Done(string Message,unsigned long Size,string Md5Hash,
00727                      pkgAcquire::MethodConfig *Cnf);
00728    virtual string Custom600Headers();
00729    virtual string DescURI() {return RealURI; };
00730 
00732    pkgAcqMetaSig(pkgAcquire *Owner,string URI,string URIDesc, string ShortDesc,
00733                  string MetaIndexURI, string MetaIndexURIDesc, string MetaIndexShortDesc,
00734                  const vector<struct IndexTarget*>* IndexTargets,
00735                  indexRecords* MetaIndexParser);
00736 };
00737                                                                         /*}}}*/
00748 class pkgAcqMetaIndex : public pkgAcquire::Item
00749 {
00750    protected:
00752    pkgAcquire::ItemDesc Desc;
00753 
00757    string RealURI;
00758 
00764    string SigFile;
00765 
00767    const vector<struct IndexTarget*>* IndexTargets;
00768 
00770    indexRecords* MetaIndexParser;
00771 
00774    bool AuthPass;
00775    // required to deal gracefully with problems caused by incorrect ims hits
00776    bool IMSHit; 
00777 
00783    bool VerifyVendor(string Message);
00784 
00794    void RetrievalDone(string Message);
00795 
00805    void AuthDone(string Message);
00806 
00815    void QueueIndexes(bool verify);
00816    
00817    public:
00818    
00819    // Specialized action members
00820    virtual void Failed(string Message,pkgAcquire::MethodConfig *Cnf);
00821    virtual void Done(string Message,unsigned long Size, string Hash,
00822                      pkgAcquire::MethodConfig *Cnf);
00823    virtual string Custom600Headers();
00824    virtual string DescURI() {return RealURI; };
00825 
00827    pkgAcqMetaIndex(pkgAcquire *Owner,
00828                    string URI,string URIDesc, string ShortDesc,
00829                    string SigFile,
00830                    const vector<struct IndexTarget*>* IndexTargets,
00831                    indexRecords* MetaIndexParser);
00832 };
00833                                                                         /*}}}*/
00835 class pkgAcqMetaClearSig : public pkgAcqMetaIndex
00836 {
00838    string MetaIndexURI;
00839 
00841    string MetaIndexURIDesc;
00842 
00844    string MetaIndexShortDesc;
00845 
00847    string MetaSigURI;
00848 
00850    string MetaSigURIDesc;
00851 
00853    string MetaSigShortDesc;
00854 
00855 public:
00856    void Failed(string Message,pkgAcquire::MethodConfig *Cnf);
00857    virtual string Custom600Headers();
00858 
00860    pkgAcqMetaClearSig(pkgAcquire *Owner,
00861                 string const &URI, string const &URIDesc, string const &ShortDesc,
00862                 string const &MetaIndexURI, string const &MetaIndexURIDesc, string const &MetaIndexShortDesc,
00863                 string const &MetaSigURI, string const &MetaSigURIDesc, string const &MetaSigShortDesc,
00864                 const vector<struct IndexTarget*>* IndexTargets,
00865                 indexRecords* MetaIndexParser);
00866 };
00867                                                                         /*}}}*/
00873 class pkgAcqArchive : public pkgAcquire::Item
00874 {
00875    protected:
00877    pkgCache::VerIterator Version;
00878 
00880    pkgAcquire::ItemDesc Desc;
00881 
00885    pkgSourceList *Sources;
00886 
00890    pkgRecords *Recs;
00891 
00893    HashString ExpectedHash;
00894 
00898    string &StoreFilename;
00899 
00901    pkgCache::VerFileIterator Vf;
00902 
00908    unsigned int Retries;
00909 
00913    bool Trusted; 
00914 
00916    bool QueueNext();
00917    
00918    public:
00919    
00920    virtual void Failed(string Message,pkgAcquire::MethodConfig *Cnf);
00921    virtual void Done(string Message,unsigned long Size,string Hash,
00922                      pkgAcquire::MethodConfig *Cnf);
00923    virtual string DescURI() {return Desc.URI;};
00924    virtual string ShortDesc() {return Desc.ShortDesc;};
00925    virtual void Finished();
00926    virtual string HashSum() {return ExpectedHash.toStr(); };
00927    virtual bool IsTrusted();
00928    
00947    pkgAcqArchive(pkgAcquire *Owner,pkgSourceList *Sources,
00948                  pkgRecords *Recs,pkgCache::VerIterator const &Version,
00949                  string &StoreFilename);
00950 };
00951                                                                         /*}}}*/
00958 class pkgAcqFile : public pkgAcquire::Item
00959 {
00961    pkgAcquire::ItemDesc Desc;
00962 
00964    HashString ExpectedHash;
00965 
00969    unsigned int Retries;
00970    
00972    bool IsIndexFile;
00973 
00974    public:
00975    
00976    // Specialized action members
00977    virtual void Failed(string Message,pkgAcquire::MethodConfig *Cnf);
00978    virtual void Done(string Message,unsigned long Size,string CalcHash,
00979                      pkgAcquire::MethodConfig *Cnf);
00980    virtual string DescURI() {return Desc.URI;};
00981    virtual string HashSum() {return ExpectedHash.toStr(); };
00982    virtual string Custom600Headers();
00983 
01015    pkgAcqFile(pkgAcquire *Owner, string URI, string Hash, unsigned long Size,
01016               string Desc, string ShortDesc,
01017               const string &DestDir="", const string &DestFilename="",
01018               bool IsIndexFile=false);
01019 };
01020                                                                         /*}}}*/
01023 #endif