Author: jreidinger
Date: Fri Mar 21 12:41:48 2008
New Revision: 9248
URL: http://svn.opensuse.org/viewcvs/zypp?rev=9248&view=rev
Log:
add new call for abort/request/ignore question with timeout
in media request callback add this call for temporary network problems, and first three run have retry as default and then abort is default (bnc #328822)
Modified:
trunk/zypper/src/zypper-media-callbacks.h
trunk/zypper/src/zypper-prompt.cc
trunk/zypper/src/zypper-prompt.h
Modified: trunk/zypper/src/zypper-media-callbacks.h
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/zypper/src/zypper-media-callbacks.h?rev=9248&r1=9247&r2=9248&view=diff
==============================================================================
--- trunk/zypper/src/zypper-media-callbacks.h (original)
+++ trunk/zypper/src/zypper-media-callbacks.h Fri Mar 21 12:41:48 2008
@@ -24,12 +24,34 @@
#include "zypper-prompt.h"
#include "output/prompt.h"
+#define REPEAT_LIMIT 3
+
using zypp::media::MediaChangeReport;
using zypp::media::DownloadProgressReport;
///////////////////////////////////////////////////////////////////
namespace ZmartRecipients
{
+ class repeat_counter_ {
+ private:
+ zypp::Url url;
+ unsigned counter;
+ public:
+ repeat_counter_():counter(0){}
+ bool counter_overrun(const zypp::Url & u){
+ if (u==url)
+ {
+ if (++counter==REPEAT_LIMIT)
+ return true;
+ }
+ else
+ {
+ url = u;
+ counter = 0;
+ }
+ return false;
+ }
+ };
struct MediaChangeReportReceiver : public zypp::callback::ReceiveReport<MediaChangeReport>
{
@@ -65,9 +87,20 @@
return MediaChangeReport::ABORT;
}
+ if (error == MediaChangeReport::IO_SOFT)
+ {
+ MediaChangeReport::Action action = MediaChangeReport::RETRY;
+ if (repeat_counter.counter_overrun(url))
+ action = MediaChangeReport::ABORT;
+ return (Action) read_action_ari_with_timeout(PROMPT_ARI_MEDIA_PROBLEM,
+ 30,action);
+ }
+
return (Action) read_action_ari(PROMPT_ARI_MEDIA_PROBLEM
,MediaChangeReport::ABORT);
}
+ private:
+ repeat_counter_ repeat_counter;
};
// progress for downloading a file
Modified: trunk/zypper/src/zypper-prompt.cc
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/zypper/src/zypper-prompt.cc?rev=9248&r1=9247&r2=9248&view=diff
==============================================================================
--- trunk/zypper/src/zypper-prompt.cc (original)
+++ trunk/zypper/src/zypper-prompt.cc Fri Mar 21 12:41:48 2008
@@ -1,5 +1,6 @@
#include
#include <sstream>
+#include
#include
@@ -39,6 +40,66 @@
// ----------------------------------------------------------------------------
+const std::string ari_mapping[] = { string(_("abort")),string(_("retry")),string(_("ignore"))};
+
+int read_action_ari_with_timeout (PromptId pid, unsigned timeout,
+ int default_action) {
+ Out & out = Zypper::instance()->out();
+
+ if (default_action >2 || default_action < 0)
+ {
+ WAR << "bad default action" << endl;
+ default_action = 0;
+ }
+
+ out.info (_("Abort,retry, ignore?\n"));
+
+ //FIXME XML output
+ cout << endl;
+
+ while (timeout)
+ {
+ char c = 0;
+ pollfd pollfds;
+ pollfds.fd = 0; //stdin
+ pollfds.events = POLLIN; //wait only for data to read
+
+ while (poll(&pollfds,1,5)){ //some user input, timeout 5msec
+ c = getchar();
+#define eat_rest_input() do {} while (getchar()!='\n')
+ switch (c){
+ case 'a':
+ case 'A':
+ eat_rest_input();
+ return 0;
+ case 'r':
+ case 'R':
+ eat_rest_input();
+ return 1;
+ case 'i':
+ case 'I':
+ eat_rest_input();
+ return 2;
+ default:
+ WAR << "Unknown char " << c << endl;
+ }
+ }
+
+ //FIXME XML output
+ cout << "\r";
+ cout << boost::str(format(_("autoselect %s after %u ")) % ari_mapping[default_action]
+ % timeout);
+ cout.flush();
+
+ sleep(1);
+ timeout--;
+ }
+
+ return default_action;
+}
+
+
+// ----------------------------------------------------------------------------
//template<typename Action>
//Action ...
int read_action_ari (PromptId pid, int default_action) {
@@ -46,7 +107,7 @@
// translators: "a/r/i" are the answers to the
// "Abort, retry, ignore?" prompt
// Translate the letters to whatever is suitable for your language.
- // the anserws must be separated by slash characters '/' and must
+ // the answers must be separated by slash characters '/' and must
// correspond to abort/retry/ignore in that order.
// The answers should be lower case letters.
PromptOptions popts(_("a/r/i"), 0);
Modified: trunk/zypper/src/zypper-prompt.h
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/zypper/src/zypper-prompt.h?rev=9248&r1=9247&r2=9248&view=diff
==============================================================================
--- trunk/zypper/src/zypper-prompt.h (original)
+++ trunk/zypper/src/zypper-prompt.h Fri Mar 21 12:41:48 2008
@@ -38,6 +38,16 @@
/**
+ * Abort, Retry, Ignore stdin prompt with timeout.
+ * \param default_action Answer to be returned in non-interactive mode. If none
+ * is specified, 0 (ABORT) is returned. In interactive mode, this parameter
+ * is ignored.
+ * \param timeout how many seconds wait until return default action
+ */
+int read_action_ari_with_timeout (PromptId pid, unsigned timeout,
+ int default_action = 0);
+
+/**
* Abort, Retry, Ignore stdin prompt.
* \param default_action Answer to be returned in non-interactive mode. If none
* is specified, 0 (ABORT) is returned. In interactive mode, this parameter
--
To unsubscribe, e-mail: zypp-commit+unsubscribe@opensuse.org
For additional commands, e-mail: zypp-commit+help@opensuse.org