Reorganized the stuff which allows editing the config file when the

authentication server is not found.
closes #1658;
related to #1627
This commit is contained in:
fgerlits 2006-06-02 16:46:08 +00:00
parent 18ad289b0f
commit 31b06e2911
8 changed files with 183 additions and 45 deletions

View file

@ -82,7 +82,10 @@ class OptionsContainer
authenticationPath,
storageServer,
storagePort,
storagePath } OptionItemString;
storagePath,
schedulerServer,
schedulerPort,
schedulerPath } OptionItemString;
private:

View file

@ -214,6 +214,24 @@ OptionsContainer :: selectNode(OptionItemString optionItem,
"webStorage/location/@path");
isAttribute = true;
break;
case schedulerServer :
targetNode = getNode("schedulerClientFactory/"
"schedulerDaemonXmlRpcClient/@xmlRpcHost");
isAttribute = true;
break;
case schedulerPort :
targetNode = getNode("schedulerClientFactory/"
"schedulerDaemonXmlRpcClient/@xmlRpcPort");
isAttribute = true;
break;
case schedulerPath :
targetNode = getNode("schedulerClientFactory/"
"schedulerDaemonXmlRpcClient/@xmlRpcUri");
isAttribute = true;
break;
}
return targetNode;

View file

@ -445,17 +445,15 @@ GLiveSupport :: checkConfiguration(void) throw ()
return false;
}
// === NON-FATAL ERRORS ===
// check if the authentication server is available
try {
authentication->getVersion();
authenticationAvailable = true;
} catch (XmlRpcException &e) {
authenticationAvailable = false;
displayMessageWindow(getResourceUstring(authenticationNotReachableKey));
displayAuthenticationServerMissingMessage();
return false;
}
// === NON-FATAL ERRORS ===
// check if the storage server is available
try {
@ -488,10 +486,10 @@ LiveSupport :: GLiveSupport ::
GLiveSupport :: displayMessageWindow(Ptr<Glib::ustring>::Ref message)
throw ()
{
DialogWindow * window = widgetFactory->createDialogWindow(message,
getBundle());
Ptr<DialogWindow>::Ref window(widgetFactory->createDialogWindow(
message,
getBundle()));
window->run();
delete window;
}
@ -1629,9 +1627,53 @@ GLiveSupport :: stopSchedulerClient(void) throw ()
void
LiveSupport :: GLiveSupport ::
GLiveSupport :: uploadToHub(Ptr<Playable>::Ref playable)
throw ()
throw ()
{
masterPanel->uploadToHub(playable);
}
/*------------------------------------------------------------------------------
* Display a message that the authentication server is not available.
*----------------------------------------------------------------------------*/
void
LiveSupport :: GLiveSupport ::
GLiveSupport :: displayAuthenticationServerMissingMessage(void) throw ()
{
Ptr<Glib::ustring>::Ref message;
try {
message = getResourceUstring("authenticationNotReachableMsg");
} catch (std::invalid_argument &e) {
std::cerr << e.what() << std::endl;
std::exit(1);
}
// "authentication not available -- would you like to edit the options?"
Ptr<DialogWindow>::Ref question(widgetFactory->createDialogWindow(
message,
getBundle(),
DialogWindow::noButton
| DialogWindow::yesButton ));
DialogWindow::ButtonType answer = question->run();
if (answer == DialogWindow::yesButton) {
Ptr<ResourceBundle>::Ref bundle;
try {
bundle = getBundle("optionsWindow");
} catch (std::invalid_argument &e) {
std::cerr << e.what() << std::endl;
return;
}
Ptr<OptionsWindow>::Ref optionsWindow(new OptionsWindow(
shared_from_this(),
bundle,
0));
optionsWindow->run();
if (optionsContainer->isTouched()) {
optionsContainer->writeToFile();
}
}
}

View file

@ -327,11 +327,6 @@ class GLiveSupport : public LocalizedConfigurable,
*/
Ptr<OptionsContainer>::Ref optionsContainer;
/**
* Whether the authentication component is available.
*/
bool authenticationAvailable;
/**
* Whether the storage component is available.
*/
@ -342,6 +337,13 @@ class GLiveSupport : public LocalizedConfigurable,
*/
bool schedulerAvailable;
/**
* Display a message that the authentication server is not available.
* And offer a chance to edit the options to fix it.
*/
void
displayAuthenticationServerMissingMessage(void) throw ();
protected:
/**
@ -1174,15 +1176,6 @@ class GLiveSupport : public LocalizedConfigurable,
void
loadWindowContents(ContentsStorable * window) throw ();
/**
* Return whether the authentication component is available.
*/
bool
isAuthenticationAvailable(void) throw()
{
return authenticationAvailable;
}
/**
* Return whether the storage component is available.
*/

View file

@ -311,22 +311,33 @@ MasterPanelWindow :: changeLanguage(Ptr<ResourceBundle>::Ref bundle)
Gtk::SHRINK|Gtk::FILL, Gtk::SHRINK|Gtk::FILL,
5, 0);
// re-bind events to the buttons
liveModeButton->signal_clicked().connect(sigc::mem_fun(*this,
&MasterPanelWindow::onLiveModeButtonClicked));
uploadFileButton->signal_clicked().connect(sigc::mem_fun(*this,
&MasterPanelWindow::onUploadFileButtonClicked));
scratchpadButton->signal_clicked().connect(sigc::mem_fun(*this,
&MasterPanelWindow::onScratchpadButtonClicked));
simplePlaylistMgmtButton->signal_clicked().connect(
sigc::mem_fun(*this,
&MasterPanelWindow::onSimplePlaylistMgmtButtonClicked));
schedulerButton->signal_clicked().connect(sigc::mem_fun(*this,
&MasterPanelWindow::onSchedulerButtonClicked));
searchButton->signal_clicked().connect(sigc::mem_fun(*this,
&MasterPanelWindow::onSearchButtonClicked));
if (gLiveSupport->isStorageAvailable()) {
// re-bind events to the buttons
liveModeButton->signal_clicked().connect(sigc::mem_fun(*this,
&MasterPanelWindow::onLiveModeButtonClicked));
uploadFileButton->signal_clicked().connect(sigc::mem_fun(*this,
&MasterPanelWindow::onUploadFileButtonClicked));
scratchpadButton->signal_clicked().connect(sigc::mem_fun(*this,
&MasterPanelWindow::onScratchpadButtonClicked));
simplePlaylistMgmtButton->signal_clicked().connect(
sigc::mem_fun(*this,
&MasterPanelWindow::onSimplePlaylistMgmtButtonClicked));
schedulerButton->signal_clicked().connect(sigc::mem_fun(*this,
&MasterPanelWindow::onSchedulerButtonClicked));
searchButton->signal_clicked().connect(sigc::mem_fun(*this,
&MasterPanelWindow::onSearchButtonClicked));
} else {
// gray out all the buttons except Options
liveModeButton->set_sensitive(false);
uploadFileButton->set_sensitive(false);
scratchpadButton->set_sensitive(false);
simplePlaylistMgmtButton->set_sensitive(false);
schedulerButton->set_sensitive(false);
searchButton->set_sensitive(false);
}
optionsButton->signal_clicked().connect(sigc::mem_fun(*this,
&MasterPanelWindow::onOptionsButtonClicked));
&MasterPanelWindow::onOptionsButtonClicked));
}
@ -645,6 +656,7 @@ MasterPanelWindow :: showAnonymousUI(void) throw ()
simplePlaylistMgmtButton->hide();
schedulerButton->hide();
searchButton->hide();
optionsButton->hide();
if (liveModeWindow.get()) {
if (liveModeWindow->is_visible()) {

View file

@ -163,9 +163,8 @@ OptionsWindow :: OptionsWindow (Ptr<GLiveSupport>::Ref gLiveSupport,
// show everything
set_name(windowName);
set_default_size(700, 450);
set_default_size(700, 500);
set_modal(false);
property_window_position().set_value(Gtk::WIN_POS_NONE);
show_all_children();
}
@ -677,10 +676,56 @@ OptionsWindow :: constructServersSection(void) throw ()
storageTable->attach(*storagePortEntry, 2, 3, 1, 2);
storageTable->attach(*storagePathEntry, 2, 3, 2, 3);
// the settings for the scheduler
Gtk::Table * schedulerTable = Gtk::manage(new Gtk::Table);
schedulerTable->set_row_spacings(5);
schedulerTable->set_col_spacings(5);
Gtk::Label * schedulerLabel;
Gtk::Label * schedulerServerLabel;
Gtk::Label * schedulerPortLabel;
Gtk::Label * schedulerPathLabel;
try {
schedulerLabel = Gtk::manage(new Gtk::Label(
*getResourceUstring("schedulerLabel") ));
schedulerServerLabel = Gtk::manage(new Gtk::Label(
*getResourceUstring("serverLabel") ));
schedulerPortLabel = Gtk::manage(new Gtk::Label(
*getResourceUstring("portLabel") ));
schedulerPathLabel = Gtk::manage(new Gtk::Label(
*getResourceUstring("pathLabel") ));
} catch (std::invalid_argument &e) {
// TODO: signal error
std::cerr << e.what() << std::endl;
std::exit(1);
}
schedulerTable->attach(*schedulerLabel,
0, 1, 0, 1, Gtk::SHRINK, Gtk::SHRINK, 5, 0);
schedulerTable->attach(*schedulerServerLabel,
1, 2, 0, 1, Gtk::SHRINK, Gtk::SHRINK);
schedulerTable->attach(*schedulerPortLabel,
1, 2, 1, 2, Gtk::SHRINK, Gtk::SHRINK);
schedulerTable->attach(*schedulerPathLabel,
1, 2, 2, 3, Gtk::SHRINK, Gtk::SHRINK);
EntryBin * schedulerServerEntry = createEntry(
OptionsContainer::schedulerServer);
EntryBin * schedulerPortEntry = createEntry(
OptionsContainer::schedulerPort);
EntryBin * schedulerPathEntry = createEntry(
OptionsContainer::schedulerPath);
schedulerTable->attach(*schedulerServerEntry, 2, 3, 0, 1);
schedulerTable->attach(*schedulerPortEntry, 2, 3, 1, 2);
schedulerTable->attach(*schedulerPathEntry, 2, 3, 2, 3);
// make a new box and pack the components into it
Gtk::VBox * section = Gtk::manage(new Gtk::VBox);
section->pack_start(*authenticationTable, Gtk::PACK_SHRINK, 10);
section->pack_start(*storageTable, Gtk::PACK_SHRINK, 10);
section->pack_start(*schedulerTable, Gtk::PACK_SHRINK, 10);
return section;
}
@ -867,3 +912,16 @@ OptionsWindow :: resetEditedKeyBinding(void) throw ()
}
}
/*------------------------------------------------------------------------------
* Show the window and return when the user hides it.
*----------------------------------------------------------------------------*/
void
OptionsWindow :: run(void) throw ()
{
mainNotebook->activatePage(2); // "Servers"
property_window_position().set_value(Gtk::WIN_POS_CENTER_ALWAYS);
show_all();
Gtk::Main::run(*this);
}

View file

@ -409,6 +409,14 @@ class OptionsWindow : public GuiWindow
{
return backupView ? backupView->getBackupList() : 0;
}
/**
* Show the window and return when the user hides it.
* This is used by GLiveSupport when the authentication server
* address is wrong. It opens the window to the "Servers" tab.
*/
void
run(void) throw ();
};
/* ================================================= external data structures */

View file

@ -21,11 +21,14 @@ root:table
elapsedTimeLabel:string { "elapsed" }
remainingTimeLabel:string { "remaining" }
localeNotAvailableMsg:string { "Locale {0} not available" }
schedulerNotReachableMsg:string { "Scheduler server not available" }
storageNotReachableMsg:string { "Storage server not available" }
localeNotAvailableMsg:string { "Locale {0} is not available." }
schedulerNotReachableMsg:string { "The scheduler server is not available." }
storageNotReachableMsg:string { "The storage server is not available." }
authenticationNotReachableMsg:string
{ "Authentication server not available" }
{ "The authentication server is not "
"available.\n"
"Would you like to edit the server "
"settings?" }
audioErrorMsg { "Audio player error: " }
sureToExitMsg:string { "Are you sure you want to exit?" }
@ -283,6 +286,7 @@ root:table
authenticationLabel:string { "Authentication server" }
storageLabel:string { "Storage server" }
schedulerLabel:string { "Scheduler server" }
serverLabel:string { "address:" }
portLabel:string { "port:" }
pathLabel:string { "path:" }