From 19c81a4ef5a24492d55e61f87b77214e19d8d943 Mon Sep 17 00:00:00 2001 From: Charlie Fenton Date: Mon, 28 Jul 2008 13:09:02 +0000 Subject: [PATCH] MGR: async GUI RPCs: All periodic RPCs for Advanced View implemented. svn path=/workspaces/charlief/; revision=15695 --- checkin_notes | 26 ++- clientgui/AdvancedFrame.cpp | 56 +++++-- clientgui/AdvancedFrame.h | 3 +- clientgui/AsyncRPC.cpp | 53 +++++-- clientgui/BOINCBaseFrame.cpp | 1 + clientgui/BOINCBaseFrame.h | 3 + clientgui/BOINCBaseView.cpp | 3 + clientgui/MainDocument.cpp | 300 ++++++++++++++++++++++------------- clientgui/MainDocument.h | 32 ++-- 9 files changed, 326 insertions(+), 151 deletions(-) diff --git a/checkin_notes b/checkin_notes index c6c5fd444e..c893ff16f8 100644 --- a/checkin_notes +++ b/checkin_notes @@ -6042,7 +6042,7 @@ David 25 July 2008 assimilator.C tools/ pymw_setup - + Charlie 25 July 2008 - MGR: async GUI RPCs: Implement first Periodic RPCs called from a timer event for CachedStateUpdate(), ForceCacheUpdate(), @@ -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 diff --git a/clientgui/AdvancedFrame.cpp b/clientgui/AdvancedFrame.cpp index 856c21e74c..c7427ddad0 100644 --- a/clientgui/AdvancedFrame.cpp +++ b/clientgui/AdvancedFrame.cpp @@ -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(); } diff --git a/clientgui/AdvancedFrame.h b/clientgui/AdvancedFrame.h index 79af768f4b..870975b78f 100644 --- a/clientgui/AdvancedFrame.h +++ b/clientgui/AdvancedFrame.h @@ -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: diff --git a/clientgui/AsyncRPC.cpp b/clientgui/AsyncRPC.cpp index 869699f301..52d5544a93 100644 --- a/clientgui/AsyncRPC.cpp +++ b/clientgui/AsyncRPC.cpp @@ -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); } diff --git a/clientgui/BOINCBaseFrame.cpp b/clientgui/BOINCBaseFrame.cpp index c04806ecb4..d86b121b87 100644 --- a/clientgui/BOINCBaseFrame.cpp +++ b/clientgui/BOINCBaseFrame.cpp @@ -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) diff --git a/clientgui/BOINCBaseFrame.h b/clientgui/BOINCBaseFrame.h index f4e5054135..9c3ec5a863 100644 --- a/clientgui/BOINCBaseFrame.h +++ b/clientgui/BOINCBaseFrame.h @@ -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 diff --git a/clientgui/BOINCBaseView.cpp b/clientgui/BOINCBaseView.cpp index 78a4b5fe4a..a7d1e51b93 100644 --- a/clientgui/BOINCBaseView.cpp +++ b/clientgui/BOINCBaseView.cpp @@ -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 } diff --git a/clientgui/MainDocument.cpp b/clientgui/MainDocument.cpp index ad28817df0..630ee62d26 100644 --- a/clientgui/MainDocument.cpp +++ b/clientgui/MainDocument.cpp @@ -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); - ForceCacheUpdate(); - } - - m_fProjectTotalResourceShare = 0.0; - for (i=0; i < (long)state.projects.size(); i++) { - m_fProjectTotalResourceShare += state.projects.at(i)->resource_share; - } - } - } else { - iRetVal = -1; + 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; } - return iRetVal; + m_fProjectTotalResourceShare = 0.0; + for (i=0; i < (long)state.projects.size(); i++) { + m_fProjectTotalResourceShare += state.projects.at(i)->resource_share; + } + + 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); - ForceCacheUpdate(); - } - } - } else { - iRetVal = -1; + if (m_iGet_results_rpc_result) { + wxLogTrace(wxT("Function Status"), wxT("CMainDocument::CachedResultsStatusUpdate - Get Result Status Failed '%d'"), m_iGet_results_rpc_result); + ForceCacheUpdate(); } - 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,12 +1589,13 @@ 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); - ForceCacheUpdate(); - } - } - } else { - iRetVal = -1; + if (m_iGet_dsk_usage_rpc_result) { + wxLogTrace(wxT("Function Status"), wxT("Get Disk Usage Failed '%d'"), m_iGet_dsk_usage_rpc_result); + ForceCacheUpdate(); } - 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); - ForceCacheUpdate(); - } - } - } else { - iRetVal = -1; + if (m_iGet_statistics_rpc_result) { + wxLogTrace(wxT("Function Status"), wxT("CMainDocument::CachedStatisticsStatusUpdate - Get Statistics Failed '%d'"), m_iGet_statistics_rpc_result); + ForceCacheUpdate(); } - return iRetVal; + return m_iGet_state_rpc_result; } diff --git a/clientgui/MainDocument.h b/clientgui/MainDocument.h index 53b08bcae0..560046b70e 100644 --- a/clientgui/MainDocument.h +++ b/clientgui/MainDocument.h @@ -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(); @@ -319,8 +331,10 @@ private: wxDateTime m_dtStatisticsStatusTimestamp; public: - PROJECTS statistics_status; + PROJECTS statistics_status; + PROJECTS async_statistics_status_buf; PROJECT* statistic(unsigned int); + int m_iGet_statistics_rpc_result; int GetStatisticsCount();