00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "zypp/solver/detail/Helper.h"
00025
00026 #include "zypp/CapSet.h"
00027 #include "zypp/base/Logger.h"
00028 #include "zypp/base/String.h"
00029 #include "zypp/base/Gettext.h"
00030
00031 #include "zypp/base/Algorithm.h"
00032 #include "zypp/ResPool.h"
00033 #include "zypp/ResFilters.h"
00034 #include "zypp/CapFilters.h"
00035
00036 using namespace std;
00037
00039 namespace zypp
00040 {
00041
00042 namespace solver
00043 {
00044
00045 namespace detail
00046 {
00047
00048 ostream &
00049 operator<< (ostream & os, const PoolItemList & itemlist)
00050 {
00051 for (PoolItemList::const_iterator iter = itemlist.begin(); iter != itemlist.end(); ++iter) {
00052 if (iter != itemlist.begin())
00053 os << ", ";
00054 os << *iter;
00055 }
00056 return os;
00057 }
00058
00059
00060 class LookFor : public resfilter::PoolItemFilterFunctor
00061 {
00062 public:
00063 PoolItem_Ref item;
00064
00065 bool operator()( PoolItem_Ref provider )
00066 {
00067 item = provider;
00068 return false;
00069 }
00070 };
00071
00072
00073
00074
00075 PoolItem_Ref
00076 Helper::findInstalledByNameAndKind (const ResPool & pool, const string & name, const Resolvable::Kind & kind)
00077 {
00078 LookFor info;
00079
00080 invokeOnEach( pool.byNameBegin( name ),
00081 pool.byNameEnd( name ),
00082 functor::chain (resfilter::ByInstalled (),
00083 resfilter::ByKind( kind ) ),
00084 functor::functorRef<bool,PoolItem> (info) );
00085
00086 _XDEBUG("Helper::findInstalledByNameAndKind (" << name << ", " << kind << ") => " << info.item);
00087 return info.item;
00088 }
00089
00090
00091
00092
00093 PoolItem_Ref
00094 Helper::findUninstalledByNameAndKind (const ResPool & pool, const string & name, const Resolvable::Kind & kind)
00095 {
00096 LookFor info;
00097
00098 invokeOnEach( pool.byNameBegin( name ),
00099 pool.byNameEnd( name ),
00100 functor::chain (resfilter::ByUninstalled (),
00101 resfilter::ByKind( kind ) ),
00102 functor::functorRef<bool,PoolItem> (info) );
00103
00104 _XDEBUG("Helper::findUninstalledByNameAndKind (" << name << ", " << kind << ") => " << info.item);
00105 return info.item;
00106 }
00107
00108
00109
00110
00111
00112 PoolItem_Ref
00113 Helper::findInstalledItem (const ResPool & pool, PoolItem_Ref item)
00114 {
00115 return findInstalledByNameAndKind (pool, item->name(), item->kind() );
00116 }
00117
00118
00119
00120 class LookForUpdate : public resfilter::PoolItemFilterFunctor
00121 {
00122 public:
00123 PoolItem_Ref uninstalled;
00124
00125 bool operator()( PoolItem_Ref provider )
00126 {
00127 if ((!uninstalled
00128 || (uninstalled->edition().compare( provider->edition() ) < 0)
00129 || (uninstalled->arch().compare( provider->arch() ) < 0) )
00130 && !provider.status().isLocked())
00131 {
00132 uninstalled = provider;
00133 }
00134 return true;
00135 }
00136 };
00137
00138
00139
00140
00141
00142 PoolItem_Ref
00143 Helper::findUpdateItem (const ResPool & pool, PoolItem_Ref item)
00144 {
00145 LookForUpdate info;
00146
00147 invokeOnEach( pool.byNameBegin( item->name() ),
00148 pool.byNameEnd( item->name() ),
00149 functor::chain (functor::chain (resfilter::ByUninstalled (),
00150 resfilter::ByKind( item->kind() ) ),
00151 resfilter::byEdition<CompareByGT<Edition> >( item->edition() )),
00152 functor::functorRef<bool,PoolItem> (info) );
00153
00154 _XDEBUG("Helper::findUpdateItem(" << item << ") => " << info.uninstalled);
00155 return info.uninstalled;
00156 }
00157
00158
00159
00160
00161 class LookForReinstall : public resfilter::PoolItemFilterFunctor
00162 {
00163 public:
00164 PoolItem_Ref uninstalled;
00165
00166 bool operator()( PoolItem_Ref provider )
00167 {
00168 if (provider.status().isLocked()) {
00169 return true;
00170 } else {
00171 uninstalled = provider;
00172 return false;
00173 }
00174 }
00175 };
00176
00177
00178 PoolItem_Ref
00179 Helper::findReinstallItem (const ResPool & pool, PoolItem_Ref item)
00180 {
00181 LookForReinstall info;
00182
00183 invokeOnEach( pool.byNameBegin( item->name() ),
00184 pool.byNameEnd( item->name() ),
00185 functor::chain (functor::chain (resfilter::ByUninstalled (),
00186 resfilter::ByKind( item->kind() ) ),
00187 resfilter::byEdition<CompareByEQ<Edition> >( item->edition() )),
00188 functor::functorRef<bool,PoolItem> (info) );
00189
00190 _XDEBUG("Helper::findReinstallItem(" << item << ") => " << info.uninstalled);
00191 return info.uninstalled;
00192 }
00193
00195 };
00198 };
00201 };
00203