MGR: async GUI RPCs: All periodic RPCs for Advanced View implemented.

svn path=/workspaces/charlief/; revision=15695
This commit is contained in:
Charlie Fenton 2008-07-28 13:09:02 +00:00
parent 4e64023aef
commit 19c81a4ef5
9 changed files with 326 additions and 151 deletions

View File

@ -6055,6 +6055,12 @@ Charlie 25 July 2008
Events.h
MainDocument.cpp,.h
David 25 July 2008
- web: escape text on edit thread title
html/user/
forum_moderate_thread_action.php
Charlie 26 July 2008
- MGR: async GUI RPCs: Simulate handling of CRPCFinishedEvent but
don't allow any other events (so allow no user activity) while
@ -6081,3 +6087,21 @@ Charlie 26 July 2008
mac_build/
boinc.xcodeproj/
project.pbxproj
David 27 July 2008
- API: small additions to graphics stderr messages
api/
graphics2.h
graphics2_unix.C
graphics2_win.C
Charlie 28 July 2008
- MGR: async GUI RPCs: All periodic RPCs for Advanced View implemented.
clientgui/
AdvancedFrame.cpp,.h
AsyncRPC.cpp
BOINCBaseView.cpp
BOINCBaseFrame.cpp,h
MainDocument.cpp,.h

View File

@ -186,9 +186,11 @@ BEGIN_EVENT_TABLE (CAdvancedFrame, CBOINCBaseFrame)
EVT_FRAME_REFRESH(CAdvancedFrame::OnRefreshView)
EVT_FRAME_CONNECT(CAdvancedFrame::OnConnect)
EVT_FRAME_UPDATESTATUS(CAdvancedFrame::OnUpdateStatus)
EVT_FRAME_UPDATEMESSAGES(CAdvancedFrame::OnUpdateMessages)
EVT_TIMER(ID_REFRESHSTATETIMER, CAdvancedFrame::OnRefreshState)
EVT_TIMER(ID_FRAMERENDERTIMER, CAdvancedFrame::OnFrameRender)
EVT_TIMER(ID_FRAMELISTRENDERTIMER, CAdvancedFrame::OnListPanelRender)
// TODO: Remove ID_FRAMELISTRENDERTIMER and all related code
// EVT_TIMER(ID_FRAMELISTRENDERTIMER, CAdvancedFrame::OnListPanelRender)
EVT_NOTEBOOK_PAGE_CHANGED(ID_FRAMENOTEBOOK, CAdvancedFrame::OnNotebookSelectionChanged)
END_EVENT_TABLE ()
@ -237,12 +239,12 @@ CAdvancedFrame::CAdvancedFrame(wxString title, wxIcon* icon, wxIcon* icon32) :
m_pFrameRenderTimer = new wxTimer(this, ID_FRAMERENDERTIMER);
wxASSERT(m_pFrameRenderTimer);
m_pFrameListPanelRenderTimer = new wxTimer(this, ID_FRAMELISTRENDERTIMER);
wxASSERT(m_pFrameListPanelRenderTimer);
// m_pFrameListPanelRenderTimer = new wxTimer(this, ID_FRAMELISTRENDERTIMER); // CAF
// wxASSERT(m_pFrameListPanelRenderTimer);
m_pRefreshStateTimer->Start(300000); // Send event every 5 minutes
m_pFrameRenderTimer->Start(1000); // Send event every 1 second
m_pFrameListPanelRenderTimer->Start(1000); // Send event every 1 second
// m_pFrameListPanelRenderTimer->Start(1000); // Send event every 1 second
// Limit the number of times the UI can update itself to two times a second
// NOTE: Linux and Mac were updating several times a second and eating
@ -258,7 +260,7 @@ CAdvancedFrame::~CAdvancedFrame() {
wxASSERT(m_pRefreshStateTimer);
wxASSERT(m_pFrameRenderTimer);
wxASSERT(m_pFrameListPanelRenderTimer);
// wxASSERT(m_pFrameListPanelRenderTimer);
wxASSERT(m_pMenubar);
wxASSERT(m_pNotebook);
wxASSERT(m_pStatusbar);
@ -278,11 +280,11 @@ CAdvancedFrame::~CAdvancedFrame() {
m_pFrameRenderTimer = NULL;
}
if (m_pFrameListPanelRenderTimer) {
m_pFrameListPanelRenderTimer->Stop();
delete m_pFrameListPanelRenderTimer;
m_pFrameListPanelRenderTimer = NULL;
}
// if (m_pFrameListPanelRenderTimer) {
// m_pFrameListPanelRenderTimer->Stop();
// delete m_pFrameListPanelRenderTimer;
// m_pFrameListPanelRenderTimer = NULL;
// }
if (m_pStatusbar)
wxCHECK_RET(DeleteStatusbar(), _T("Failed to delete status bar."));
@ -1057,7 +1059,6 @@ void CAdvancedFrame::OnActivitySelection(wxCommandEvent& event) {
wxASSERT(pDoc);
wxASSERT(wxDynamicCast(pDoc, CMainDocument));
switch(event.GetId()) {
case ID_FILEACTIVITYRUNALWAYS:
pDoc->SetActivityRunMode(RUN_MODE_ALWAYS, 0);
@ -1493,6 +1494,7 @@ void CAdvancedFrame::OnOptionsOptions(wxCommandEvent& WXUNUSED(event)) {
wxASSERT(wxDynamicCast(pDoc, CMainDocument));
wxASSERT(wxDynamicCast(pSkinAdvanced, CSkinAdvanced));
pDoc->TestAsyncRPC(); return; // TEMPORARY FOR TESTING ASYNC RPCs -- CAF
// General Tab
dlg.m_LanguageSelectionCtrl->Append(wxGetApp().GetSupportedLanguages());
@ -1843,6 +1845,22 @@ void CAdvancedFrame::OnUpdateStatus(CFrameEvent& event) {
}
void CAdvancedFrame::OnUpdateMessages(CFrameEvent& event) {
wxLogTrace(wxT("Function Start/End"), wxT("CAdvancedFrame::OnUpdateMessages - Function Begin"));
CMainDocument* pDoc = wxGetApp().GetDocument();
wxASSERT(pDoc);
wxASSERT(wxDynamicCast(pDoc, CMainDocument));
pDoc->CachedMessageUpdate();
FireRefreshView();
wxLogTrace(wxT("Function Start/End"), wxT("CAdvancedFrame::OnUpdateMessages - Function End"));
}
void CAdvancedFrame::OnRefreshState(wxTimerEvent &event) {
static bool bAlreadyRunningLoop = false;
@ -1969,6 +1987,8 @@ void CAdvancedFrame::OnNotebookSelectionChanged(wxNotebookEvent& event) {
if ((-1 != event.GetSelection())) {
UpdateRefreshTimerInterval(event.GetSelection());
wxTimerEvent event (wxEVT_TIMER, ID_PERIODICRPCTIMER);
AddPendingEvent(event);
FireRefreshView();
}
@ -2048,7 +2068,6 @@ void CAdvancedFrame::UpdateRefreshTimerInterval( wxInt32 iCurrentNotebookPage )
if (IsShown()) {
wxWindow* pwndNotebookPage = NULL;
CBOINCBaseView* pView = NULL;
CMainDocument* pDoc = wxGetApp().GetDocument();
wxASSERT(m_pNotebook);
@ -2059,6 +2078,10 @@ void CAdvancedFrame::UpdateRefreshTimerInterval( wxInt32 iCurrentNotebookPage )
pView = wxDynamicCast(pwndNotebookPage, CBOINCBaseView);
wxASSERT(pView);
// TODO: Confirm we don't need to do something like the following for m_pPeriodicRPCTimer.
#if 0
CMainDocument* pDoc = wxGetApp().GetDocument();
if (m_pFrameListPanelRenderTimer && m_pFrameListPanelRenderTimer->IsRunning()) {
m_pFrameListPanelRenderTimer->Stop();
@ -2076,6 +2099,7 @@ void CAdvancedFrame::UpdateRefreshTimerInterval( wxInt32 iCurrentNotebookPage )
}
}
}
#endif
}
wxLogTrace(wxT("Function Start/End"), wxT("CAdvancedFrame::UpdateRefreshTimerInterval - Function End"));
@ -2085,22 +2109,22 @@ void CAdvancedFrame::UpdateRefreshTimerInterval( wxInt32 iCurrentNotebookPage )
void CAdvancedFrame::StartTimers() {
wxASSERT(m_pRefreshStateTimer);
wxASSERT(m_pFrameRenderTimer);
wxASSERT(m_pFrameListPanelRenderTimer);
// wxASSERT(m_pFrameListPanelRenderTimer);
CBOINCBaseFrame::StartTimers();
m_pRefreshStateTimer->Start();
m_pFrameRenderTimer->Start();
m_pFrameListPanelRenderTimer->Start();
// m_pFrameListPanelRenderTimer->Start();
}
void CAdvancedFrame::StopTimers() {
wxASSERT(m_pRefreshStateTimer);
wxASSERT(m_pFrameRenderTimer);
wxASSERT(m_pFrameListPanelRenderTimer);
// wxASSERT(m_pFrameListPanelRenderTimer);
CBOINCBaseFrame::StopTimers();
m_pRefreshStateTimer->Stop();
m_pFrameRenderTimer->Stop();
m_pFrameListPanelRenderTimer->Stop();
// m_pFrameListPanelRenderTimer->Stop();
}

View File

@ -91,12 +91,13 @@ public:
void OnRefreshView( CFrameEvent& event );
void OnConnect( CFrameEvent& event );
void OnUpdateStatus( CFrameEvent& event );
void OnUpdateMessages( CFrameEvent& event );
void ResetReminderTimers();
wxTimer* m_pRefreshStateTimer;
wxTimer* m_pFrameRenderTimer;
wxTimer* m_pFrameListPanelRenderTimer;
// wxTimer* m_pFrameListPanelRenderTimer;
private:

View File

@ -404,7 +404,7 @@ int CMainDocument::RequestRPC(ASYNC_RPC_REQUEST& request, bool hasPriority) {
if (iter->isSameAs(request)) return 0;
}
if ((request.event == NULL) && (request.resultPtr == NULL)) {
if ((request.event == 0) && (request.resultPtr == NULL)) {
request.resultPtr = &retval;
}
@ -433,7 +433,7 @@ int CMainDocument::RequestRPC(ASYNC_RPC_REQUEST& request, bool hasPriority) {
// If no completion event specified, this is a user-initiated event so
// wait for completion but show a dialog allowing the user to cancel.
if (request.event == NULL) {
if (request.event == 0) {
// TODO: proper handling if a second user request is received while first is pending
// if (inUserRequest) {
if (m_bWaitingForRPC) {
@ -567,7 +567,7 @@ void CMainDocument::OnRPCComplete(CRPCFinishedEvent& event) {
RPC_requests[i].event = NULL; // Is this needed to prevent calling the event's destructor?
RPC_requests.erase(RPC_requests.begin()+i);
} else {
if (RPC_requests[i].event == NULL) {
if (RPC_requests[i].event == 0) {
stillWaitingForPendingRequests = true;
}
}
@ -601,15 +601,13 @@ void CMainDocument::OnRPCComplete(CRPCFinishedEvent& event) {
*(completed_RPC_requests[i].resultPtr) = retval;
}
#if 1 // Post-processing
// Post-processing
switch (completed_RPC_requests[i].which_rpc) {
case RPC_AUTHORIZE:
break;
case RPC_EXCHANGE_VERSIONS:
break;
case RPC_GET_STATE:
// m_iGet_state_RPC_retval = retval;
// TODO: Implement buffer swapping, buffer time stamp
if (completed_RPC_requests[i].exchangeBuf) {
CC_STATE* arg1 = (CC_STATE*)completed_RPC_requests[i].arg1;
CC_STATE* exchangeBuf = (CC_STATE*)completed_RPC_requests[i].exchangeBuf;
@ -625,8 +623,6 @@ void CMainDocument::OnRPCComplete(CRPCFinishedEvent& event) {
}
break;
case RPC_GET_RESULTS:
// m_iGet_results_RPC_retval = retval;
// TODO: Implement buffer swapping, buffer time stamp
if (completed_RPC_requests[i].exchangeBuf) {
RESULTS* arg1 = (RESULTS*)completed_RPC_requests[i].arg1;
RESULTS* exchangeBuf = (RESULTS*)completed_RPC_requests[i].exchangeBuf;
@ -634,18 +630,26 @@ void CMainDocument::OnRPCComplete(CRPCFinishedEvent& event) {
}
break;
case RPC_GET_FILE_TRANSFERS:
if (completed_RPC_requests[i].exchangeBuf) {
FILE_TRANSFERS* arg1 = (FILE_TRANSFERS*)completed_RPC_requests[i].arg1;
FILE_TRANSFERS* exchangeBuf = (FILE_TRANSFERS*)completed_RPC_requests[i].exchangeBuf;
arg1->file_transfers.swap(exchangeBuf->file_transfers);
}
break;
case RPC_GET_SIMPLE_GUI_INFO1:
break;
case RPC_GET_SIMPLE_GUI_INFO2:
break;
case RPC_GET_PROJECT_STATUS1:
if (completed_RPC_requests[i].exchangeBuf) {
CC_STATE* arg1 = (CC_STATE*)completed_RPC_requests[i].arg1;
CC_STATE* exchangeBuf = (CC_STATE*)completed_RPC_requests[i].exchangeBuf;
arg1->projects.swap(exchangeBuf->projects);
}
break;
case RPC_GET_PROJECT_STATUS2:
break;
case RPC_GET_ALL_PROJECTS_LIST:
// m_iGet_all_projects_list_RPC_retval = retval;
// TODO: Implement buffer swapping, buffer time stamp
if (completed_RPC_requests[i].exchangeBuf) {
ALL_PROJECTS_LIST* arg1 = (ALL_PROJECTS_LIST*)completed_RPC_requests[i].arg1;
ALL_PROJECTS_LIST* exchangeBuf = (ALL_PROJECTS_LIST*)completed_RPC_requests[i].exchangeBuf;
@ -653,6 +657,13 @@ void CMainDocument::OnRPCComplete(CRPCFinishedEvent& event) {
}
break;
case RPC_GET_DISK_USAGE:
DISK_USAGE* arg1 = (DISK_USAGE*)completed_RPC_requests[i].arg1;
DISK_USAGE* exchangeBuf = (DISK_USAGE*)completed_RPC_requests[i].exchangeBuf;
arg1->projects.swap(exchangeBuf->projects);
exchangeBuf->d_total = arg1->d_total;
exchangeBuf->d_free = arg1->d_free;
exchangeBuf->d_boinc = arg1->d_boinc;
exchangeBuf->d_allowed = arg1->d_allowed;
break;
case RPC_SHOW_GRAPHICS:
break;
@ -671,6 +682,11 @@ void CMainDocument::OnRPCComplete(CRPCFinishedEvent& event) {
case RPC_GET_PROXY_SETTINGS:
break;
case RPC_GET_MESSAGES:
if (completed_RPC_requests[i].exchangeBuf) {
MESSAGES* arg2 = (MESSAGES*)completed_RPC_requests[i].arg2;
MESSAGES* exchangeBuf = (MESSAGES*)completed_RPC_requests[i].exchangeBuf;
arg2->messages.swap(exchangeBuf->messages);
}
break;
case RPC_FILE_TRANSFER_OP:
break;
@ -688,6 +704,11 @@ void CMainDocument::OnRPCComplete(CRPCFinishedEvent& event) {
case RPC_ACCT_MGR_INFO:
break;
case RPC_GET_STATISTICS:
if (completed_RPC_requests[i].exchangeBuf) {
PROJECTS* arg1 = (PROJECTS*)completed_RPC_requests[i].arg1;
PROJECTS* exchangeBuf = (PROJECTS*)completed_RPC_requests[i].exchangeBuf;
arg1->projects.swap(exchangeBuf->projects);
}
break;
case RPC_NETWORK_AVAILABLE:
break;
@ -747,11 +768,11 @@ void CMainDocument::OnRPCComplete(CRPCFinishedEvent& event) {
default:
break;
}
#endif // Post-processing
if ( (completed_RPC_requests[i].event) && (completed_RPC_requests[i].event != (wxEvent*)-1) ) {
if (completed_RPC_requests[i].eventHandler) {
completed_RPC_requests[i].eventHandler->ProcessEvent(*completed_RPC_requests[i].event);
} else {
// We must get the frame immediately before using it,
// since it may have been changed by SetActiveGUI().
@ -845,7 +866,7 @@ void CMainDocument::TestAsyncRPC() { // TEMPORARY FOR TESTING ASYNC RPCs
ALL_PROJECTS_LIST pl;
ASYNC_RPC_REQUEST request;
wxDateTime completionTime = wxDateTime((time_t)0);
int retval = 0;
int req_retval = 0, rpc_result = 0;
completionTime.ResetTime();
@ -859,17 +880,17 @@ void CMainDocument::TestAsyncRPC() { // TEMPORARY FOR TESTING ASYNC RPCs
request.eventHandler = NULL;
request.completionTime = &completionTime;
// request.result = NULL;
request.resultPtr = &m_iGet_state_RPC_retval; // TEMPORARY FOR TESTING ASYNC RPCs -- CAF
request.resultPtr = &rpc_result; // TEMPORARY FOR TESTING ASYNC RPCs -- CAF
request.isActive = false;
//retval = rpcClient.get_all_projects_list(pl);
retval = RequestRPC(request, true);
req_retval = RequestRPC(request, true);
wxString s = completionTime.FormatTime();
wxLogMessage(wxT("Completion time = %s"), s.c_str());
wxLogMessage(wxT("RequestRPC returned %d\n"), retval);
wxLogMessage(wxT("RequestRPC returned %d\n"), req_retval);
::wxSafeYield(NULL, true); // Allow processing of RPC_FINISHED event
wxLogMessage(wxT("rpcClient.get_all_projects_list returned %d\n"), m_iGet_state_RPC_retval);
wxLogMessage(wxT("rpcClient.get_all_projects_list returned %d\n"), rpc_result);
}

View File

@ -45,6 +45,7 @@ DEFINE_EVENT_TYPE(wxEVT_FRAME_INITIALIZED)
DEFINE_EVENT_TYPE(wxEVT_FRAME_REFRESHVIEW)
DEFINE_EVENT_TYPE(wxEVT_FRAME_UPDATESTATUS)
DEFINE_EVENT_TYPE(wxEVT_FRAME_RELOADSKIN)
DEFINE_EVENT_TYPE(wxEVT_FRAME_UPDATEMESSAGES)
IMPLEMENT_DYNAMIC_CLASS(CBOINCBaseFrame, wxFrame)

View File

@ -184,6 +184,8 @@ DECLARE_EVENT_TYPE( wxEVT_FRAME_INITIALIZED, 10004 )
DECLARE_EVENT_TYPE( wxEVT_FRAME_REFRESHVIEW, 10005 )
DECLARE_EVENT_TYPE( wxEVT_FRAME_UPDATESTATUS, 10006 )
DECLARE_EVENT_TYPE( wxEVT_FRAME_RELOADSKIN, 10007 )
DECLARE_EVENT_TYPE( wxEVT_FRAME_UPDATEMESSAGES, 10008 )
END_DECLARE_EVENT_TYPES()
#define EVT_FRAME_ALERT(fn) DECLARE_EVENT_TABLE_ENTRY(wxEVT_FRAME_ALERT, -1, -1, (wxObjectEventFunction) (wxEventFunction) &fn, NULL),
@ -192,6 +194,7 @@ END_DECLARE_EVENT_TYPES()
#define EVT_FRAME_REFRESH(fn) DECLARE_EVENT_TABLE_ENTRY(wxEVT_FRAME_REFRESHVIEW, -1, -1, (wxObjectEventFunction) (wxEventFunction) &fn, NULL),
#define EVT_FRAME_UPDATESTATUS(fn) DECLARE_EVENT_TABLE_ENTRY(wxEVT_FRAME_UPDATESTATUS, -1, -1, (wxObjectEventFunction) (wxEventFunction) &fn, NULL),
#define EVT_FRAME_RELOADSKIN(fn) DECLARE_EVENT_TABLE_ENTRY(wxEVT_FRAME_RELOADSKIN, -1, -1, (wxObjectEventFunction) (wxEventFunction) &fn, NULL),
#define EVT_FRAME_UPDATEMESSAGES(fn) DECLARE_EVENT_TABLE_ENTRY(wxEVT_FRAME_UPDATEMESSAGES, -1, -1, (wxObjectEventFunction) (wxEventFunction) &fn, NULL),
#endif

View File

@ -189,7 +189,10 @@ int CBOINCBaseView::GetListRowCount() {
void CBOINCBaseView::FireOnListRender(wxTimerEvent& event) {
extern bool LogRPCs;
LogRPCs = true; // TEMPORARY FOR TESTING ASYNC RPCs -- CAF
OnListRender(event);
LogRPCs=false; // TEMPORARY FOR TESTING ASYNC RPCs -- CAF
}

View File

@ -350,16 +350,25 @@ CMainDocument::CMainDocument() : rpc(this) {
m_iMessageSequenceNumber = 0;
m_dtCachedStateTimestamp = wxDateTime((time_t)0);
cc_state_rpc_result = 0;
host_info_rpc_result = 0;
m_iGet_state_rpc_result = 0;
m_iGet_host_info_rpc_result = 0;
m_dtCachedCCStatusTimestamp = wxDateTime((time_t)0);
cc_status_rpc_result = 0;
m_iGet_status_rpc_result = 0;
m_dtProjecStatusTimestamp = wxDateTime((time_t)0);
m_iGet_project_status1_rpc_result = -1;
m_dtResultsTimestamp = wxDateTime((time_t)0);
m_iGet_results_rpc_result = 0;
m_dtKillInactiveGfxTimestamp = wxDateTime((time_t)0);
m_dtFileTransfersTimestamp = wxDateTime((time_t)0);
m_iGet_file_transfers_rpc_result = 0;
m_iGet_messages_rpc_result = 0;
m_dtDiskUsageTimestamp = wxDateTime((time_t)0);
m_dtStatisticsStatusTimestamp = wxDateTime((time_t)0);
m_dtCachedSimpleGUITimestamp = wxDateTime((time_t)0);
@ -485,8 +494,8 @@ int CMainDocument::CachedStateUpdate() {
// Most of this is now handled by RunPeriodicRPCs() and ForceCacheUpdate()
int retval = 0;
if (cc_state_rpc_result) retval = cc_state_rpc_result;
if (host_info_rpc_result) retval = host_info_rpc_result;
if (m_iGet_state_rpc_result) retval = m_iGet_state_rpc_result;
if (m_iGet_host_info_rpc_result) retval = m_iGet_host_info_rpc_result;
if (retval) m_pNetworkConnection->SetStateDisconnected();
@ -589,13 +598,13 @@ int CMainDocument::GetCoreClientStatus(CC_STATUS& ccs, bool bForce) {
if (0 == iRetVal) {
status = ccs;
} else {
cc_status_rpc_result = iRetVal;
m_iGet_status_rpc_result = iRetVal;
}
} else {
ccs = status;
}
if (cc_status_rpc_result) {
if (m_iGet_status_rpc_result) {
m_pNetworkConnection->SetStateDisconnected();
} else {
if (ccs.manager_must_quit) {
@ -653,28 +662,32 @@ int CMainDocument::SetNetworkRunMode(int iMode, int iTimeout) {
}
// TODO: RunPeriodicRPCs()
void CMainDocument::RunPeriodicRPCs() {
ASYNC_RPC_REQUEST request;
wxDateTime dtNow(wxDateTime::Now());
// int retval = 0;
if (!IsConnected()) return;
int currentTabView = wxGetApp().GetCurrentViewPage();
if (!IsConnected()) return;
CBOINCBaseFrame* pFrame = wxGetApp().GetFrame();
wxASSERT(wxDynamicCast(pFrame, CBOINCBaseFrame));
wxDateTime dtNow(wxDateTime::Now());
// *********** RPC_GET_CC_STATUS **************
wxTimeSpan ts(dtNow - m_dtCachedCCStatusTimestamp);
if (ts.GetSeconds() > 0) {
m_dtCachedCCStatusTimestamp = wxDateTime::Now();
// m_dtCachedCCStatusTimestamp = wxDateTime::Now();
request.clear();
request.which_rpc = RPC_GET_CC_STATUS;
request.arg1 = &status_altbuf;
request.arg1 = &async_status_buf;
request.exchangeBuf = &status;
request.event = (wxEvent*)-1;
request.completionTime = &m_dtCachedCCStatusTimestamp;
request.resultPtr = &cc_status_rpc_result;
request.resultPtr = &m_iGet_status_rpc_result;
RequestRPC(request);
}
@ -686,10 +699,10 @@ void CMainDocument::RunPeriodicRPCs() {
request.clear();
request.which_rpc = RPC_GET_STATE;
request.arg1 = &state_altbuf;
request.arg1 = &async_state_buf;
request.exchangeBuf = &state;
request.event = (wxEvent*)-1;
request.resultPtr = &cc_state_rpc_result;
request.resultPtr = &m_iGet_state_rpc_result;
RequestRPC(request);
@ -697,14 +710,135 @@ void CMainDocument::RunPeriodicRPCs() {
request.clear();
request.which_rpc = RPC_GET_HOST_INFO;
request.arg1 = &host_altbuf;
request.arg1 = &async_host_buf;
request.exchangeBuf = &host;
request.event = (wxEvent*)-1;
request.completionTime = &m_dtCachedStateTimestamp;
request.resultPtr = &host_info_rpc_result;
request.resultPtr = &m_iGet_host_info_rpc_result;
RequestRPC(request);
}
// *********** RPC_GET_PROJECT_STATUS1 **************
if (currentTabView & VW_PROJ) {
wxTimeSpan ts(dtNow - m_dtProjecStatusTimestamp);
if (ts.GetSeconds() > 0) {
request.clear();
request.which_rpc = RPC_GET_PROJECT_STATUS1;
request.arg1 = &async_state_buf.projects;
request.exchangeBuf = &state.projects;
request.event = new CFrameEvent(wxEVT_FRAME_REFRESHVIEW, pFrame);
// NULL request.eventHandler means use CBOINCBaseFrame when RPC has
// finished, which may have changed since request was made
request.completionTime = &m_dtProjecStatusTimestamp;
request.resultPtr = &m_iGet_project_status1_rpc_result;
RequestRPC(request);
}
}
// *********** RPC_GET_RESULTS **************
if (currentTabView & VW_TASK) {
wxTimeSpan ts(dtNow - m_dtResultsTimestamp);
if (ts.GetSeconds() > 0) {
request.clear();
request.which_rpc = RPC_GET_RESULTS;
request.arg1 = &async_results_buf;
request.exchangeBuf = &results;
request.event = new CFrameEvent(wxEVT_FRAME_REFRESHVIEW, pFrame);
// NULL request.eventHandler means use CBOINCBaseFrame when RPC has
// finished, which may have changed since request was made
request.completionTime = &m_dtResultsTimestamp;
request.resultPtr = &m_iGet_results_rpc_result;
RequestRPC(request);
}
}
// *********** RPC_GET_FILE_TRANSFERS **************
if (currentTabView & VW_XFER) {
wxTimeSpan ts(dtNow - m_dtFileTransfersTimestamp);
if (ts.GetSeconds() > 0) {
request.clear();
request.which_rpc = RPC_GET_FILE_TRANSFERS;
request.arg1 = &async_ft_buf;
request.exchangeBuf = &ft;
request.event = new CFrameEvent(wxEVT_FRAME_REFRESHVIEW, pFrame);
// NULL request.eventHandler means use CBOINCBaseFrame when RPC has
// finished, which may have changed since request was made
request.completionTime = &m_dtFileTransfersTimestamp;
request.resultPtr = &m_iGet_file_transfers_rpc_result;
RequestRPC(request);
}
}
// *********** RPC_GET_MESSAGES **************
if (currentTabView & VW_MSGS) {
request.clear();
request.which_rpc = RPC_GET_MESSAGES;
// m_iMessageSequenceNumber could change between request and execution
// of RPC, so pass in a pointer rather than its value
request.arg1 = &m_iMessageSequenceNumber;
request.arg2 = &messages;
// request.arg2 = &async_messages_buf;
// request.exchangeBuf = &messages;
request.event = new CFrameEvent(wxEVT_FRAME_UPDATEMESSAGES, pFrame);
// NULL request.eventHandler means use CBOINCBaseFrame when RPC has
// finished, which may have changed since request was made
request.completionTime = NULL;
request.resultPtr = &m_iGet_messages_rpc_result;
RequestRPC(request);
}
// *********** RPC_GET_STATISTICS **************
if (currentTabView & VW_STAT) {
wxTimeSpan ts(dtNow - m_dtStatisticsStatusTimestamp);
if (ts.GetSeconds() > 60) {
request.clear();
request.which_rpc = RPC_GET_STATISTICS;
request.arg1 = &async_statistics_status_buf;
request.exchangeBuf = &statistics_status;
request.event = new CFrameEvent(wxEVT_FRAME_REFRESHVIEW, pFrame);
// NULL request.eventHandler means use CBOINCBaseFrame when RPC has
// finished, which may have changed since request was made
request.completionTime = &m_dtStatisticsStatusTimestamp;
request.resultPtr = &m_iGet_statistics_rpc_result;
RequestRPC(request);
}
}
// *********** RPC_GET_DISK_USAGE **************
if (currentTabView & VW_DISK) {
wxTimeSpan ts(dtNow - m_dtDiskUsageTimestamp);
if ((ts.GetSeconds() > 60) || disk_usage.projects.empty()) {
request.clear();
request.which_rpc = RPC_GET_DISK_USAGE;
request.arg1 = &async_disk_usage_buf;
request.exchangeBuf = &disk_usage;
request.event = new CFrameEvent(wxEVT_FRAME_REFRESHVIEW, pFrame);
// NULL request.eventHandler means use CBOINCBaseFrame when RPC has
// finished, which may have changed since request was made
request.completionTime = &m_dtDiskUsageTimestamp;
request.resultPtr = &m_iGet_dsk_usage_rpc_result;
RequestRPC(request);
}
}
// *********** GET_SIMPLE_GUI_INFO1, GET_SIMPLE_GUI_INFO2, etc. **************
if (currentTabView & VW_SGUI) {
}
}
@ -731,7 +865,7 @@ int CMainDocument::ForceCacheUpdate() {
m_dtCachedStateTimestamp = wxDateTime::Now();
retval = rpc.get_state(state);
if (retval) {
cc_state_rpc_result = retval;
m_iGet_state_rpc_result = retval;
wxLogTrace(wxT("Function Status"), wxT("CMainDocument::ForceCacheUpdate - Get State Failed '%d'"), retval);
m_pNetworkConnection->SetStateDisconnected();
}
@ -739,7 +873,7 @@ int CMainDocument::ForceCacheUpdate() {
retval = rpc.get_host_info(host);
if (retval) {
host_info_rpc_result = retval;
m_iGet_host_info_rpc_result = retval;
wxLogTrace(wxT("Function Status"), wxT("CMainDocument::ForceCacheUpdate - Get Host Information Failed '%d'"), retval);
m_pNetworkConnection->SetStateDisconnected();
}
@ -817,30 +951,22 @@ bool CMainDocument::IsUserAuthorized() {
int CMainDocument::CachedProjectStatusUpdate() {
int iRetVal = 0;
int i = 0;
if (IsConnected()) {
wxTimeSpan ts(wxDateTime::Now() - m_dtProjecStatusTimestamp);
if (ts.GetSeconds() > 0) {
m_dtProjecStatusTimestamp = wxDateTime::Now();
if (! IsConnected()) return -1;
iRetVal = rpc.get_project_status(state);
if (iRetVal) {
wxLogTrace(wxT("Function Status"), wxT("CMainDocument::CachedProjectStatusUpdate - Get Project Status Failed '%d'"), iRetVal);
if (m_iGet_project_status1_rpc_result) {
wxLogTrace(wxT("Function Status"), wxT("CMainDocument::CachedProjectStatusUpdate - Get Project Status Failed '%d'"), m_iGet_project_status1_rpc_result);
ForceCacheUpdate();
// return m_iGet_project_status1_rpc_result;
}
m_fProjectTotalResourceShare = 0.0;
for (i=0; i < (long)state.projects.size(); i++) {
m_fProjectTotalResourceShare += state.projects.at(i)->resource_share;
}
}
} else {
iRetVal = -1;
}
return iRetVal;
return m_iGet_project_status1_rpc_result;
}
@ -1056,24 +1182,14 @@ int CMainDocument::ProjectAllowMoreWork(const wxString& projectname) {
int CMainDocument::CachedResultsStatusUpdate() {
int iRetVal = 0;
if (! IsConnected()) return -1;
if (IsConnected()) {
wxTimeSpan ts(wxDateTime::Now() - m_dtResultsTimestamp);
if (ts.GetSeconds() > 0) {
m_dtResultsTimestamp = wxDateTime::Now();
iRetVal = rpc.get_results(results);
if (iRetVal) {
wxLogTrace(wxT("Function Status"), wxT("CMainDocument::CachedResultsStatusUpdate - Get Result Status Failed '%d'"), iRetVal);
if (m_iGet_results_rpc_result) {
wxLogTrace(wxT("Function Status"), wxT("CMainDocument::CachedResultsStatusUpdate - Get Result Status Failed '%d'"), m_iGet_results_rpc_result);
ForceCacheUpdate();
}
}
} else {
iRetVal = -1;
}
return iRetVal;
return m_iGet_results_rpc_result;
}
@ -1424,7 +1540,6 @@ int CMainDocument::WorkAbort(std::string& strProjectURL, std::string& strName) {
int CMainDocument::CachedMessageUpdate() {
int retval;
static bool in_this_func = false;
static bool was_connected = false;
@ -1436,9 +1551,10 @@ int CMainDocument::CachedMessageUpdate() {
ResetMessageState();
was_connected = true;
}
retval = rpc.get_messages(m_iMessageSequenceNumber, messages);
if (retval) {
wxLogTrace(wxT("Function Status"), wxT("CMainDocument::CachedMessageUpdate - Get Messages Failed '%d'"), retval);
// rpc.get_messages is now called from
// retval = rpc.get_messages(m_iMessageSequenceNumber, messages);
if (m_iGet_messages_rpc_result) {
wxLogTrace(wxT("Function Status"), wxT("CMainDocument::CachedMessageUpdate - Get Messages Failed '%d'"), m_iGet_messages_rpc_result);
m_pNetworkConnection->SetStateDisconnected();
goto done;
}
@ -1473,11 +1589,12 @@ MESSAGE* CMainDocument::message(unsigned int i) {
int CMainDocument::GetMessageCount() {
int iCount = -1;
CachedMessageUpdate();
// CachedMessageUpdate() is now called from CAdvancedFrame::OnUpdateMessages();
CachedStateUpdate();
if (!messages.messages.empty())
if (!messages.messages.empty()) {
iCount = (int)messages.messages.size();
}
return iCount;
}
@ -1486,29 +1603,20 @@ int CMainDocument::GetMessageCount() {
int CMainDocument::ResetMessageState() {
messages.clear();
m_iMessageSequenceNumber = 0;
// m_iGet_messages_rpc_result = -1;
return 0;
}
int CMainDocument::CachedFileTransfersUpdate() {
int iRetVal = 0;
if (! IsConnected()) return -1;
if (IsConnected()) {
wxTimeSpan ts(wxDateTime::Now() - m_dtFileTransfersTimestamp);
if (ts.GetSeconds() > 0) {
m_dtFileTransfersTimestamp = wxDateTime::Now();
iRetVal = rpc.get_file_transfers(ft);
if (iRetVal) {
wxLogTrace(wxT("Function Status"), wxT("CMainDocument::CachedFileTransfersUpdate - Get File Transfers Failed '%d'"), iRetVal);
if (m_iGet_file_transfers_rpc_result) {
wxLogTrace(wxT("Function Status"), wxT("CMainDocument::CachedFileTransfersUpdate - Get File Transfers Failed '%d'"), m_iGet_file_transfers_rpc_result);
ForceCacheUpdate();
}
}
} else {
iRetVal = -1;
}
return iRetVal;
return m_iGet_file_transfers_rpc_result;
}
@ -1616,28 +1724,14 @@ int CMainDocument::TransferAbort(const wxString& fileName, const wxString& proje
int CMainDocument::CachedDiskUsageUpdate() {
int iRetVal = 0;
if (! IsConnected()) return -1;
if (IsConnected()) {
wxTimeSpan ts(wxDateTime::Now() - m_dtDiskUsageTimestamp);
// don't get disk usage more than once per minute
// unless we just connected to a client
//
if ((ts.GetSeconds() > 60) || disk_usage.projects.empty()) {
m_dtDiskUsageTimestamp = wxDateTime::Now();
iRetVal = rpc.get_disk_usage(disk_usage);
if (iRetVal) {
wxLogTrace(wxT("Function Status"), wxT("Get Disk Usage Failed '%d'"), iRetVal);
if (m_iGet_dsk_usage_rpc_result) {
wxLogTrace(wxT("Function Status"), wxT("Get Disk Usage Failed '%d'"), m_iGet_dsk_usage_rpc_result);
ForceCacheUpdate();
}
}
} else {
iRetVal = -1;
}
return iRetVal;
return m_iGet_dsk_usage_rpc_result;
}
@ -1657,24 +1751,14 @@ PROJECT* CMainDocument::DiskUsageProject(unsigned int i) {
}
int CMainDocument::CachedStatisticsStatusUpdate() {
int iRetVal = 0;
if (! IsConnected()) return -1;
if (IsConnected()) {
wxTimeSpan ts(wxDateTime::Now() - m_dtStatisticsStatusTimestamp);
if ((ts.GetSeconds() > 0) || statistics_status.projects.empty()) {
m_dtStatisticsStatusTimestamp = wxDateTime::Now();
iRetVal = rpc.get_statistics(statistics_status);
if (iRetVal) {
wxLogTrace(wxT("Function Status"), wxT("CMainDocument::CachedStatisticsStatusUpdate - Get Statistics Failed '%d'"), iRetVal);
if (m_iGet_statistics_rpc_result) {
wxLogTrace(wxT("Function Status"), wxT("CMainDocument::CachedStatisticsStatusUpdate - Get Statistics Failed '%d'"), m_iGet_statistics_rpc_result);
ForceCacheUpdate();
}
}
} else {
iRetVal = -1;
}
return iRetVal;
return m_iGet_state_rpc_result;
}

View File

@ -158,14 +158,16 @@ public:
AsyncRPC rpc;
RPC_CLIENT rpcClient;
CC_STATE state;
CC_STATE state_altbuf;
int cc_state_rpc_result;
CC_STATE async_state_buf;
int m_iGet_state_rpc_result;
CC_STATUS status;
CC_STATUS status_altbuf;
int cc_status_rpc_result;
CC_STATUS async_status_buf;
int m_iGet_status_rpc_result;
HOST_INFO host;
HOST_INFO host_altbuf;
int host_info_rpc_result;
HOST_INFO async_host_buf;
int m_iGet_host_info_rpc_result;
wxDateTime m_dtCachedStateTimestamp;
//
@ -193,6 +195,7 @@ private:
//
private:
int CachedProjectStatusUpdate();
int m_iGet_project_status1_rpc_result;
wxDateTime m_dtProjecStatusTimestamp;
public:
@ -239,8 +242,8 @@ private:
public:
RESULTS results;
RESULTS async_results_buf;
int m_iGet_state_RPC_retval;
int m_iGet_results_RPC_retval;
int m_iGet_results_rpc_result;
RESULT* result(unsigned int);
RESULT* result(const wxString& name, const wxString& project_url);
@ -270,6 +273,9 @@ private:
public:
MESSAGES messages;
MESSAGES async_messages_buf;
int m_iGet_messages_rpc_result;
MESSAGE* message(unsigned int);
int CachedMessageUpdate();
@ -289,6 +295,9 @@ private:
public:
FILE_TRANSFERS ft;
FILE_TRANSFERS async_ft_buf;
int m_iGet_file_transfers_rpc_result;
FILE_TRANSFER* file_transfer(unsigned int);
FILE_TRANSFER* file_transfer(const wxString& fileName, const wxString& project_url);
@ -308,6 +317,9 @@ private:
public:
DISK_USAGE disk_usage;
DISK_USAGE async_disk_usage_buf;
int m_iGet_dsk_usage_rpc_result;
PROJECT* DiskUsageProject(unsigned int);
int CachedDiskUsageUpdate();
@ -320,7 +332,9 @@ private:
public:
PROJECTS statistics_status;
PROJECTS async_statistics_status_buf;
PROJECT* statistic(unsigned int);
int m_iGet_statistics_rpc_result;
int GetStatisticsCount();