apt @VERSION@
|
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