mirror of https://github.com/BOINC/boinc.git
- client: Add plumbing to support passing the remote desktop
connection information to the manager - MGR: Add a "Show VM Console" button for those tasks which report a remote desktop port number. client/ app.cpp, .h app_control.cpp clientgui/ Events.h MainDocument.cpp, .h ViewWork.cpp, .h lib/ gui_rpc_client.h gui_rpc_client_ops.cpp svn path=/trunk/boinc/; revision=25036
This commit is contained in:
parent
2c54c9735a
commit
3bc326db3e
|
@ -414,3 +414,20 @@ Rom 12 Jan 2012
|
||||||
samples/vboxwrapper
|
samples/vboxwrapper
|
||||||
vbox.cpp, .h
|
vbox.cpp, .h
|
||||||
vboxwrapper.cpp, .h
|
vboxwrapper.cpp, .h
|
||||||
|
|
||||||
|
Rom 12 Jan 2012
|
||||||
|
- client: Add plumbing to support passing the remote desktop
|
||||||
|
connection information to the manager
|
||||||
|
- MGR: Add a "Show VM Console" button for those tasks which
|
||||||
|
report a remote desktop port number.
|
||||||
|
|
||||||
|
client/
|
||||||
|
app.cpp, .h
|
||||||
|
app_control.cpp
|
||||||
|
clientgui/
|
||||||
|
Events.h
|
||||||
|
MainDocument.cpp, .h
|
||||||
|
ViewWork.cpp, .h
|
||||||
|
lib/
|
||||||
|
gui_rpc_client.h
|
||||||
|
gui_rpc_client_ops.cpp
|
||||||
|
|
|
@ -121,6 +121,7 @@ ACTIVE_TASK::ACTIVE_TASK() {
|
||||||
overdue_checkpoint = false;
|
overdue_checkpoint = false;
|
||||||
last_deadline_miss_time = 0;
|
last_deadline_miss_time = 0;
|
||||||
strcpy(web_graphics_url, "");
|
strcpy(web_graphics_url, "");
|
||||||
|
strcpy(remote_desktop_connection, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
// preempt this task;
|
// preempt this task;
|
||||||
|
@ -593,6 +594,12 @@ int ACTIVE_TASK::write_gui(MIOFILE& fout) {
|
||||||
web_graphics_url
|
web_graphics_url
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
if (strlen(remote_desktop_connection)) {
|
||||||
|
fout.printf(
|
||||||
|
" <remote_desktop_connection>%s</remote_desktop_connection>\n",
|
||||||
|
remote_desktop_connection
|
||||||
|
);
|
||||||
|
}
|
||||||
fout.printf("</active_task>\n");
|
fout.printf("</active_task>\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -151,6 +151,7 @@ struct ACTIVE_TASK {
|
||||||
// (e.g. VMs created by vboxwrapper)
|
// (e.g. VMs created by vboxwrapper)
|
||||||
// These are communicated via the app_status message channel
|
// These are communicated via the app_status message channel
|
||||||
char web_graphics_url[256];
|
char web_graphics_url[256];
|
||||||
|
char remote_desktop_connection[256];
|
||||||
|
|
||||||
void set_task_state(int, const char*);
|
void set_task_state(int, const char*);
|
||||||
inline int task_state() {
|
inline int task_state() {
|
||||||
|
|
|
@ -1206,6 +1206,7 @@ void ACTIVE_TASK::get_graphics_msg() {
|
||||||
if (!app_client_shm.shm) return;
|
if (!app_client_shm.shm) return;
|
||||||
if (app_client_shm.shm->graphics_reply.get_msg(msg_buf)) {
|
if (app_client_shm.shm->graphics_reply.get_msg(msg_buf)) {
|
||||||
parse_str(msg_buf, "<web_graphics_url>", web_graphics_url, sizeof(web_graphics_url));
|
parse_str(msg_buf, "<web_graphics_url>", web_graphics_url, sizeof(web_graphics_url));
|
||||||
|
parse_str(msg_buf, "<remote_desktop_connection>", remote_desktop_connection, sizeof(remote_desktop_connection));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -125,6 +125,7 @@
|
||||||
#define ID_TASK_WORK_SHOWGRAPHICS 9202
|
#define ID_TASK_WORK_SHOWGRAPHICS 9202
|
||||||
#define ID_TASK_WORK_ABORT 9203
|
#define ID_TASK_WORK_ABORT 9203
|
||||||
#define ID_TASK_SHOW_PROPERTIES 9204
|
#define ID_TASK_SHOW_PROPERTIES 9204
|
||||||
|
#define ID_TASK_WORK_VMCONSOLE 9205
|
||||||
#define ID_TASK_TRANSFERS_RETRYNOW 9300
|
#define ID_TASK_TRANSFERS_RETRYNOW 9300
|
||||||
#define ID_TASK_TRANSFERS_ABORT 9301
|
#define ID_TASK_TRANSFERS_ABORT 9301
|
||||||
#define ID_TASK_MESSAGES_COPYALL 9400
|
#define ID_TASK_MESSAGES_COPYALL 9400
|
||||||
|
|
|
@ -1738,7 +1738,7 @@ int CMainDocument::WorkShowGraphics(RESULT* result) {
|
||||||
// If graphics app is already running, don't launch a second instance
|
// If graphics app is already running, don't launch a second instance
|
||||||
//
|
//
|
||||||
if (previous_gfx_app) return 0;
|
if (previous_gfx_app) return 0;
|
||||||
argv[0] =0;
|
argv[0] = 0;
|
||||||
|
|
||||||
iRetVal = run_program(
|
iRetVal = run_program(
|
||||||
result->slot_path,
|
result->slot_path,
|
||||||
|
@ -1761,6 +1761,23 @@ int CMainDocument::WorkShowGraphics(RESULT* result) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int CMainDocument::WorkShowVMConsole(RESULT* result) {
|
||||||
|
int iRetVal = 0;
|
||||||
|
|
||||||
|
if (strlen(result->remote_desktop_connection)) {
|
||||||
|
wxString strConnection(result->remote_desktop_connection, wxConvUTF8);
|
||||||
|
|
||||||
|
#ifdef __WXMSW__
|
||||||
|
wxString strCommand;
|
||||||
|
strCommand = wxT("mstsc.exe /v:") + strConnection + wxT(" /admin /w:640 /h:480");
|
||||||
|
wxExecute(strCommand);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
return iRetVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int CMainDocument::WorkAbort(char* url, char* name) {
|
int CMainDocument::WorkAbort(char* url, char* name) {
|
||||||
int iRetVal = 0;
|
int iRetVal = 0;
|
||||||
|
|
||||||
|
|
|
@ -270,6 +270,7 @@ public:
|
||||||
int WorkSuspend(char* url, char* name);
|
int WorkSuspend(char* url, char* name);
|
||||||
int WorkResume(char* url, char* name);
|
int WorkResume(char* url, char* name);
|
||||||
int WorkShowGraphics(RESULT* result);
|
int WorkShowGraphics(RESULT* result);
|
||||||
|
int WorkShowVMConsole(RESULT* result);
|
||||||
int WorkAbort(char* url, char* name);
|
int WorkAbort(char* url, char* name);
|
||||||
CC_STATE* GetState() { return &state; };
|
CC_STATE* GetState() { return &state; };
|
||||||
|
|
||||||
|
|
|
@ -52,9 +52,10 @@
|
||||||
// buttons in the "tasks" area
|
// buttons in the "tasks" area
|
||||||
#define BTN_ACTIVE_ONLY 0
|
#define BTN_ACTIVE_ONLY 0
|
||||||
#define BTN_GRAPHICS 1
|
#define BTN_GRAPHICS 1
|
||||||
#define BTN_SUSPEND 2
|
#define BTN_VMCONSOLE 2
|
||||||
#define BTN_ABORT 3
|
#define BTN_SUSPEND 3
|
||||||
#define BTN_PROPERTIES 4
|
#define BTN_ABORT 4
|
||||||
|
#define BTN_PROPERTIES 5
|
||||||
|
|
||||||
|
|
||||||
CWork::CWork() {
|
CWork::CWork() {
|
||||||
|
@ -83,6 +84,7 @@ IMPLEMENT_DYNAMIC_CLASS(CViewWork, CBOINCBaseView)
|
||||||
BEGIN_EVENT_TABLE (CViewWork, CBOINCBaseView)
|
BEGIN_EVENT_TABLE (CViewWork, CBOINCBaseView)
|
||||||
EVT_BUTTON(ID_TASK_WORK_SUSPEND, CViewWork::OnWorkSuspend)
|
EVT_BUTTON(ID_TASK_WORK_SUSPEND, CViewWork::OnWorkSuspend)
|
||||||
EVT_BUTTON(ID_TASK_WORK_SHOWGRAPHICS, CViewWork::OnWorkShowGraphics)
|
EVT_BUTTON(ID_TASK_WORK_SHOWGRAPHICS, CViewWork::OnWorkShowGraphics)
|
||||||
|
EVT_BUTTON(ID_TASK_WORK_VMCONSOLE, CViewWork::OnWorkShowVMConsole)
|
||||||
EVT_BUTTON(ID_TASK_WORK_ABORT, CViewWork::OnWorkAbort)
|
EVT_BUTTON(ID_TASK_WORK_ABORT, CViewWork::OnWorkAbort)
|
||||||
EVT_BUTTON(ID_TASK_SHOW_PROPERTIES, CViewWork::OnShowItemProperties)
|
EVT_BUTTON(ID_TASK_SHOW_PROPERTIES, CViewWork::OnShowItemProperties)
|
||||||
EVT_BUTTON(ID_TASK_ACTIVE_ONLY, CViewWork::OnActiveTasksOnly)
|
EVT_BUTTON(ID_TASK_ACTIVE_ONLY, CViewWork::OnActiveTasksOnly)
|
||||||
|
@ -194,6 +196,13 @@ CViewWork::CViewWork(wxNotebook* pNotebook) :
|
||||||
);
|
);
|
||||||
pGroup->m_Tasks.push_back( pItem );
|
pGroup->m_Tasks.push_back( pItem );
|
||||||
|
|
||||||
|
pItem = new CTaskItem(
|
||||||
|
_("Show VM Console"),
|
||||||
|
_("Show VM Console in a window."),
|
||||||
|
ID_TASK_WORK_VMCONSOLE
|
||||||
|
);
|
||||||
|
pGroup->m_Tasks.push_back( pItem );
|
||||||
|
|
||||||
pItem = new CTaskItem(
|
pItem = new CTaskItem(
|
||||||
_("Suspend"),
|
_("Suspend"),
|
||||||
_("Suspend work for this result."),
|
_("Suspend work for this result."),
|
||||||
|
@ -361,6 +370,7 @@ void CViewWork::OnWorkSuspend( wxCommandEvent& WXUNUSED(event) ) {
|
||||||
wxLogTrace(wxT("Function Start/End"), wxT("CViewWork::OnWorkSuspend - Function End"));
|
wxLogTrace(wxT("Function Start/End"), wxT("CViewWork::OnWorkSuspend - Function End"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CViewWork::OnWorkShowGraphics( wxCommandEvent& WXUNUSED(event) ) {
|
void CViewWork::OnWorkShowGraphics( wxCommandEvent& WXUNUSED(event) ) {
|
||||||
wxLogTrace(wxT("Function Start/End"), wxT("CViewWork::OnWorkShowGraphics - Function Begin"));
|
wxLogTrace(wxT("Function Start/End"), wxT("CViewWork::OnWorkShowGraphics - Function Begin"));
|
||||||
|
|
||||||
|
@ -398,6 +408,43 @@ void CViewWork::OnWorkShowGraphics( wxCommandEvent& WXUNUSED(event) ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CViewWork::OnWorkShowVMConsole( wxCommandEvent& WXUNUSED(event) ) {
|
||||||
|
wxLogTrace(wxT("Function Start/End"), wxT("CViewWork::OnWorkShowVMConsole - Function Begin"));
|
||||||
|
|
||||||
|
CMainDocument* pDoc = wxGetApp().GetDocument();
|
||||||
|
CAdvancedFrame* pFrame = wxDynamicCast(GetParent()->GetParent()->GetParent(), CAdvancedFrame);
|
||||||
|
RESULT* result;
|
||||||
|
int row;
|
||||||
|
|
||||||
|
wxASSERT(pDoc);
|
||||||
|
wxASSERT(wxDynamicCast(pDoc, CMainDocument));
|
||||||
|
wxASSERT(pFrame);
|
||||||
|
wxASSERT(wxDynamicCast(pFrame, CAdvancedFrame));
|
||||||
|
wxASSERT(m_pListPane);
|
||||||
|
|
||||||
|
pFrame->UpdateStatusText(_("Showing VM console for task..."));
|
||||||
|
|
||||||
|
row = -1;
|
||||||
|
while (1) {
|
||||||
|
// Step through all selected items
|
||||||
|
row = m_pListPane->GetNextItem(row, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
|
||||||
|
if (row < 0) break;
|
||||||
|
|
||||||
|
result = pDoc->result(m_iSortedIndexes[row]);
|
||||||
|
if (result) {
|
||||||
|
pDoc->WorkShowVMConsole(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pFrame->UpdateStatusText(wxT(""));
|
||||||
|
|
||||||
|
UpdateSelection();
|
||||||
|
pFrame->FireRefreshView();
|
||||||
|
|
||||||
|
wxLogTrace(wxT("Function Start/End"), wxT("CViewWork::OnWorkShowVMConsole - Function End"));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void CViewWork::OnWorkAbort( wxCommandEvent& WXUNUSED(event) ) {
|
void CViewWork::OnWorkAbort( wxCommandEvent& WXUNUSED(event) ) {
|
||||||
wxLogTrace(wxT("Function Start/End"), wxT("CViewWork::OnWorkAbort - Function Begin"));
|
wxLogTrace(wxT("Function Start/End"), wxT("CViewWork::OnWorkAbort - Function Begin"));
|
||||||
|
|
||||||
|
@ -671,8 +718,10 @@ void CViewWork::UpdateSelection() {
|
||||||
CMainDocument* pDoc = wxGetApp().GetDocument();
|
CMainDocument* pDoc = wxGetApp().GetDocument();
|
||||||
std::string first_project_url;
|
std::string first_project_url;
|
||||||
wxString strMachineName;
|
wxString strMachineName;
|
||||||
bool wasSuspended=false, all_same_project=false;
|
bool wasSuspended=false;
|
||||||
|
bool all_same_project=false;
|
||||||
bool enableShowGraphics = false;
|
bool enableShowGraphics = false;
|
||||||
|
bool enableShowVMConsole = false;
|
||||||
bool enableSuspendResume = false;
|
bool enableSuspendResume = false;
|
||||||
bool enableAbort = false;
|
bool enableAbort = false;
|
||||||
bool enableProperties = false;
|
bool enableProperties = false;
|
||||||
|
@ -688,17 +737,20 @@ void CViewWork::UpdateSelection() {
|
||||||
n = m_pListPane->GetSelectedItemCount();
|
n = m_pListPane->GetSelectedItemCount();
|
||||||
if (n > 0) {
|
if (n > 0) {
|
||||||
enableShowGraphics = true;
|
enableShowGraphics = true;
|
||||||
|
enableShowVMConsole = true;
|
||||||
enableSuspendResume = true;
|
enableSuspendResume = true;
|
||||||
enableAbort = true;
|
enableAbort = true;
|
||||||
|
|
||||||
pDoc->GetCoreClientStatus(status);
|
pDoc->GetCoreClientStatus(status);
|
||||||
if (status.task_suspend_reason & ~(SUSPEND_REASON_CPU_THROTTLE)) {
|
if (status.task_suspend_reason & ~(SUSPEND_REASON_CPU_THROTTLE)) {
|
||||||
enableShowGraphics = false;
|
enableShowGraphics = false;
|
||||||
|
enableShowVMConsole = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
pDoc->GetConnectedComputerName(strMachineName);
|
pDoc->GetConnectedComputerName(strMachineName);
|
||||||
if (!pDoc->IsComputerNameLocal(strMachineName)) {
|
if (!pDoc->IsComputerNameLocal(strMachineName)) {
|
||||||
enableShowGraphics = false;
|
enableShowGraphics = false;
|
||||||
|
enableShowVMConsole = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -747,6 +799,13 @@ void CViewWork::UpdateSelection() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Disable Show VM console if the selected task hasn't registered a remote
|
||||||
|
// desktop connection
|
||||||
|
//
|
||||||
|
if (!strlen(result->remote_desktop_connection)) {
|
||||||
|
enableShowVMConsole = false;
|
||||||
|
}
|
||||||
|
|
||||||
// Disable Show Graphics button if the selected task can't display graphics
|
// Disable Show Graphics button if the selected task can't display graphics
|
||||||
//
|
//
|
||||||
if (!strlen(result->web_graphics_url) && !strlen(result->graphics_exec_path)) {
|
if (!strlen(result->web_graphics_url) && !strlen(result->graphics_exec_path)) {
|
||||||
|
@ -785,6 +844,13 @@ void CViewWork::UpdateSelection() {
|
||||||
|
|
||||||
// To minimize flicker, set each button only once to the final desired state
|
// To minimize flicker, set each button only once to the final desired state
|
||||||
pGroup->m_Tasks[BTN_GRAPHICS]->m_pButton->Enable(enableShowGraphics);
|
pGroup->m_Tasks[BTN_GRAPHICS]->m_pButton->Enable(enableShowGraphics);
|
||||||
|
if (enableShowVMConsole) {
|
||||||
|
pGroup->m_Tasks[BTN_VMCONSOLE]->m_pButton->Enable();
|
||||||
|
pGroup->m_Tasks[BTN_VMCONSOLE]->m_pButton->Show();
|
||||||
|
} else {
|
||||||
|
pGroup->m_Tasks[BTN_VMCONSOLE]->m_pButton->Disable();
|
||||||
|
pGroup->m_Tasks[BTN_VMCONSOLE]->m_pButton->Hide();
|
||||||
|
}
|
||||||
pGroup->m_Tasks[BTN_SUSPEND]->m_pButton->Enable(enableSuspendResume);
|
pGroup->m_Tasks[BTN_SUSPEND]->m_pButton->Enable(enableSuspendResume);
|
||||||
pGroup->m_Tasks[BTN_ABORT]->m_pButton->Enable(enableAbort);
|
pGroup->m_Tasks[BTN_ABORT]->m_pButton->Enable(enableAbort);
|
||||||
pGroup->m_Tasks[BTN_PROPERTIES]->m_pButton->Enable(enableProperties);
|
pGroup->m_Tasks[BTN_PROPERTIES]->m_pButton->Enable(enableProperties);
|
||||||
|
|
|
@ -69,6 +69,7 @@ public:
|
||||||
|
|
||||||
void OnWorkSuspend( wxCommandEvent& event );
|
void OnWorkSuspend( wxCommandEvent& event );
|
||||||
void OnWorkShowGraphics( wxCommandEvent& event );
|
void OnWorkShowGraphics( wxCommandEvent& event );
|
||||||
|
void OnWorkShowVMConsole( wxCommandEvent& event );
|
||||||
void OnWorkAbort( wxCommandEvent& event );
|
void OnWorkAbort( wxCommandEvent& event );
|
||||||
void OnShowItemProperties( wxCommandEvent& event );
|
void OnShowItemProperties( wxCommandEvent& event );
|
||||||
void OnActiveTasksOnly( wxCommandEvent& event );
|
void OnActiveTasksOnly( wxCommandEvent& event );
|
||||||
|
|
|
@ -277,6 +277,7 @@ public:
|
||||||
bool edf_scheduled;
|
bool edf_scheduled;
|
||||||
char graphics_exec_path[512];
|
char graphics_exec_path[512];
|
||||||
char web_graphics_url[256];
|
char web_graphics_url[256];
|
||||||
|
char remote_desktop_connection[256];
|
||||||
char slot_path[512];
|
char slot_path[512];
|
||||||
// only present if graphics_exec_path is
|
// only present if graphics_exec_path is
|
||||||
char resources[256];
|
char resources[256];
|
||||||
|
|
|
@ -535,6 +535,7 @@ int RESULT::parse(XML_PARSER& xp) {
|
||||||
if (xp.parse_bool("edf_scheduled", edf_scheduled)) continue;
|
if (xp.parse_bool("edf_scheduled", edf_scheduled)) continue;
|
||||||
if (xp.parse_str("graphics_exec_path", graphics_exec_path, sizeof(graphics_exec_path))) continue;
|
if (xp.parse_str("graphics_exec_path", graphics_exec_path, sizeof(graphics_exec_path))) continue;
|
||||||
if (xp.parse_str("web_graphics_url", web_graphics_url, sizeof(web_graphics_url))) continue;
|
if (xp.parse_str("web_graphics_url", web_graphics_url, sizeof(web_graphics_url))) continue;
|
||||||
|
if (xp.parse_str("remote_desktop_connection", remote_desktop_connection, sizeof(remote_desktop_connection))) continue;
|
||||||
if (xp.parse_str("slot_path", slot_path, sizeof(slot_path))) continue;
|
if (xp.parse_str("slot_path", slot_path, sizeof(slot_path))) continue;
|
||||||
if (xp.parse_str("resources", resources, sizeof(resources))) continue;
|
if (xp.parse_str("resources", resources, sizeof(resources))) continue;
|
||||||
}
|
}
|
||||||
|
@ -549,6 +550,7 @@ void RESULT::clear() {
|
||||||
strcpy(project_url, "");
|
strcpy(project_url, "");
|
||||||
strcpy(graphics_exec_path, "");
|
strcpy(graphics_exec_path, "");
|
||||||
strcpy(web_graphics_url, "");
|
strcpy(web_graphics_url, "");
|
||||||
|
strcpy(remote_desktop_connection, "");
|
||||||
strcpy(slot_path, "");
|
strcpy(slot_path, "");
|
||||||
strcpy(resources, "");
|
strcpy(resources, "");
|
||||||
report_deadline = 0;
|
report_deadline = 0;
|
||||||
|
|
Loading…
Reference in New Issue