1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */
4 * Copyright (C) 2000-2002 Ximian, Inc.
5 * Copyright (C) 2005 SUSE Linux Products GmbH
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License,
9 * version 2, as published by the Free Software Foundation.
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
22 #ifndef ZYPP_SOLVER_DETAIL_RESOLVER_H
23 #define ZYPP_SOLVER_DETAIL_RESOLVER_H
30 #include "zypp/base/ReferenceCounted.h"
31 #include "zypp/base/PtrTypes.h"
33 #include "zypp/ResPool.h"
35 #include "zypp/solver/detail/Types.h"
36 #include "zypp/solver/detail/ResolverQueue.h"
37 #include "zypp/solver/detail/ResolverContext.h"
39 #include "zypp/ProblemTypes.h"
40 #include "zypp/ResolverProblem.h"
41 #include "zypp/ProblemSolution.h"
42 #include "zypp/UpgradeStatistics.h"
44 #include "zypp/CapSet.h"
47 /////////////////////////////////////////////////////////////////////////
49 { ///////////////////////////////////////////////////////////////////////
50 ///////////////////////////////////////////////////////////////////////
52 { /////////////////////////////////////////////////////////////////////
53 /////////////////////////////////////////////////////////////////////
55 { ///////////////////////////////////////////////////////////////////
57 ///////////////////////////////////////////////////////////////////
59 // CLASS NAME : Resolver
61 class Resolver : public base::ReferenceCounted, private base::NonCopyable {
70 QueueItemList _initial_items;
71 PoolItemList _items_to_install;
72 PoolItemList _items_to_establish;
73 PoolItemList _items_to_remove;
74 PoolItemList _items_to_verify;
77 CapSet _extra_conflicts;
79 //typedef std::multimap<PoolItem_Ref,Capability> IgnoreMap;
81 // These conflict should be ignored of the concering item
82 IgnoreMap _ignoreConflicts;
83 // These requires should be ignored of the concering item
84 IgnoreMap _ignoreRequires;
85 // These obsoletes should be ignored of the concering item
86 IgnoreMap _ignoreObsoletes;
87 // Ignore architecture of the item
88 PoolItemList _ignoreArchitecture;
89 // Ignore the status "installed" of the item
90 PoolItemList _ignoreInstalledItem;
92 ResolverQueueList _pending_queues;
93 ResolverQueueList _pruned_queues;
94 ResolverQueueList _complete_queues;
95 ResolverQueueList _deferred_queues;
96 ResolverQueueList _invalid_queues;
98 int _valid_solution_count;
100 ResolverContext_Ptr _best_context;
103 std::set<Source_Ref> _subscribed;
107 bool _forceResolve; // remove items which are conflicts with others or
108 // have unfulfilled requirements.
109 // This behaviour is favourited by ZMD
110 bool _upgradeMode; // Resolver has been called with doUpgrade
113 bool doesObsoleteCapability (PoolItem_Ref candidate, const Capability & cap);
114 bool doesObsoleteItem (PoolItem_Ref candidate, PoolItem_Ref installed);
118 Resolver (const ResPool & pool);
121 // ---------------------------------- I/O
123 virtual std::ostream & dumpOn( std::ostream & str ) const;
124 friend std::ostream& operator<<(std::ostream& str, const Resolver & obj)
125 { return obj.dumpOn (str); }
127 // ---------------------------------- accessors
129 QueueItemList initialItems () const { return _initial_items; }
131 ResolverQueueList pendingQueues () const { return _pending_queues; }
132 ResolverQueueList prunedQueues () const { return _pruned_queues; }
133 ResolverQueueList completeQueues () const { return _complete_queues; }
134 ResolverQueueList deferredQueues () const { return _deferred_queues; }
135 ResolverQueueList invalidQueues () const { return _invalid_queues; }
137 ResolverContext_Ptr bestContext (void) const { return _best_context; }
139 /** depending on the last solver result, either return bestContext()
140 of the first invalid context */
141 ResolverContext_Ptr context (void) const;
143 // ---------------------------------- methods
145 void setTimeout (int seconds) { _timeout_seconds = seconds; }
147 ResPool pool (void) const;
148 void setPool (const ResPool & pool) { _pool = pool; }
150 void addSubscribedSource (Source_Ref source);
152 void addPoolItemToInstall (PoolItem_Ref item);
153 void addPoolItemsToInstallFromList (PoolItemList & rl);
155 void addPoolItemToRemove (PoolItem_Ref item);
156 void addPoolItemsToRemoveFromList (PoolItemList & rl);
158 void addPoolItemToEstablish (PoolItem_Ref item);
159 void addPoolItemsToEstablishFromList (PoolItemList & rl);
161 void addPoolItemToVerify (PoolItem_Ref item);
163 void addExtraCapability (const Capability & capability);
164 void addExtraConflict (const Capability & capability);
166 void addIgnoreConflict (const PoolItem_Ref item,
167 const Capability & capability);
168 void addIgnoreRequires (const PoolItem_Ref item,
169 const Capability & capability);
170 void addIgnoreObsoletes (const PoolItem_Ref item,
171 const Capability & capability);
172 void addIgnoreInstalledItem (const PoolItem_Ref item);
174 void setForceResolve (const bool force) { _forceResolve = force; }
175 const bool forceResolve() { return _forceResolve; }
177 bool verifySystem (void);
178 void establishState (const ResolverContext_Ptr context = NULL);
179 bool establishPool (void);
180 bool resolveDependencies (const ResolverContext_Ptr context = NULL);
181 bool resolvePool (void);
183 bool transactResObject( ResObject::constPtr robj, bool install = true);
185 void doUpgrade( zypp::UpgradeStatistics & opt_stats_r );
187 ResolverProblemList problems (void) const;
188 void applySolutions (const ProblemSolutionList &solutions);
190 // reset all SOLVER transaction in pool
193 // only for testsuite
196 Arch architecture() const { return _architecture; }
197 void setArchitecture( const Arch & arch) { _architecture = arch; }
199 bool testing(void) const { return _testing; }
200 void setTesting( bool testing ) { _testing = testing; }
203 ///////////////////////////////////////////////////////////////////
204 };// namespace detail
205 /////////////////////////////////////////////////////////////////////
206 /////////////////////////////////////////////////////////////////////
207 };// namespace solver
208 ///////////////////////////////////////////////////////////////////////
209 ///////////////////////////////////////////////////////////////////////
211 /////////////////////////////////////////////////////////////////////////
213 #endif // ZYPP_SOLVER_DETAIL_RESOLVER_H