Ticket #139: trac139_trunk.patch
File trac139_trunk.patch, 47.6 KB (added by , 15 years ago) |
---|
-
client/boinc_cmd.cpp
74 74 --result url result_name op job operation\n\ 75 75 op = suspend | resume | abort | graphics_window | graphics_fullscreen\n\ 76 76 --project URL op project operation\n\ 77 op = reset | detach | update | suspend | resume | n omorework | allowmorework\n\77 op = reset | detach | update | suspend | resume | network_suspend | network_resume | nomorework | allowmorework\n\ 78 78 --file_transfer URL filename op file transfer operation\n\ 79 79 op = retry | abort\n\ 80 80 --set_run_mode mode duration set run mode for given duration\n\ … … 270 270 retval = rpc.project_op(project, "suspend"); 271 271 } else if (!strcmp(op, "resume")) { 272 272 retval = rpc.project_op(project, "resume"); 273 } else if (!strcmp(op, "network_suspend")) { 274 retval = rpc.project_op(project, "network_suspend"); 275 } else if (!strcmp(op, "network_resume")) { 276 retval = rpc.project_op(project, "network_resume"); 273 277 } else if (!strcmp(op, "detach")) { 274 278 retval = rpc.project_op(project, "detach"); 275 279 } else if (!strcmp(op, "update")) { 276 280 retval = rpc.project_op(project, "update"); 277 } else if (!strcmp(op, "suspend")) {278 retval = rpc.project_op(project, "suspend");279 } else if (!strcmp(op, "resume")) {280 retval = rpc.project_op(project, "resume");281 281 } else if (!strcmp(op, "nomorework")) { 282 282 retval = rpc.project_op(project, "nomorework"); 283 283 } else if (!strcmp(op, "allowmorework")) { -
client/client_types.cpp
103 103 send_time_stats_log = 0; 104 104 send_job_log = 0; 105 105 suspended_via_gui = false; 106 network_suspended_via_gui = false; 106 107 dont_request_more_work = false; 107 108 detach_when_done = false; 108 109 attached_via_acct_mgr = false; … … 182 183 if (parse_bool(buf, "non_cpu_intensive", non_cpu_intensive)) continue; 183 184 if (parse_bool(buf, "verify_files_on_app_start", verify_files_on_app_start)) continue; 184 185 if (parse_bool(buf, "suspended_via_gui", suspended_via_gui)) continue; 186 if (parse_bool(buf, "network_suspended_via_gui", network_suspended_via_gui)) continue; 185 187 if (parse_bool(buf, "dont_request_more_work", dont_request_more_work)) continue; 186 188 if (parse_bool(buf, "detach_when_done", detach_when_done)) continue; 187 189 if (parse_bool(buf, "ended", ended)) continue; … … 254 256 " <sched_rpc_pending>%d</sched_rpc_pending>\n" 255 257 " <send_time_stats_log>%d</send_time_stats_log>\n" 256 258 " <send_job_log>%d</send_job_log>\n" 257 "%s%s%s%s%s%s%s%s%s%s%s%s ",259 "%s%s%s%s%s%s%s%s%s%s%s%s%s", 258 260 master_url, 259 261 project_name, 260 262 symstore, … … 290 292 non_cpu_intensive?" <non_cpu_intensive/>\n":"", 291 293 verify_files_on_app_start?" <verify_files_on_app_start/>\n":"", 292 294 suspended_via_gui?" <suspended_via_gui/>\n":"", 295 network_suspended_via_gui?" <network_suspended_via_gui/>\n":"", 293 296 dont_request_more_work?" <dont_request_more_work/>\n":"", 294 297 detach_when_done?" <detach_when_done/>\n":"", 295 298 ended?" <ended/>\n":"", … … 378 381 non_cpu_intensive = p.non_cpu_intensive; 379 382 verify_files_on_app_start = p.verify_files_on_app_start; 380 383 suspended_via_gui = p.suspended_via_gui; 384 network_suspended_via_gui = p.network_suspended_via_gui; 381 385 dont_request_more_work = p.dont_request_more_work; 382 386 detach_when_done = p.detach_when_done; 383 387 attached_via_acct_mgr = p.attached_via_acct_mgr; -
client/client_types.h
288 288 int send_job_log; 289 289 290 290 bool suspended_via_gui; 291 bool network_suspended_via_gui; 291 292 /// Return work, but don't request more 292 293 /// Used for a clean exit to a project, 293 294 /// or if a user wants to pause doing work for the project -
client/cs_files.cpp
262 262 fip->pers_file_xfer = pfx; 263 263 pers_file_xfers->insert(fip->pers_file_xfer); 264 264 action = true; 265 } else if (fip->upload_when_present && fip->status == FILE_PRESENT && !fip->uploaded) { 265 } else if (!fip->project->network_suspended_via_gui && 266 fip->upload_when_present && 267 fip->status == FILE_PRESENT && 268 !fip->uploaded) { 266 269 pfx = new PERS_FILE_XFER; 267 270 pfx->init(fip, true); 268 271 fip->pers_file_xfer = pfx; … … 279 282 iter = pers_file_xfers->pers_file_xfers.begin(); 280 283 while (iter != pers_file_xfers->pers_file_xfers.end()) { 281 284 pfx = *iter; 285 fip = pfx->fip; 282 286 283 287 // If the transfer finished, remove the PERS_FILE_XFER object 284 288 // from the set and delete it 285 289 // 286 290 if (pfx->pers_xfer_done) { 287 fip = pfx->fip;288 291 if (fip->generated_locally || fip->upload_when_present) { 289 292 // file has been uploaded - delete if not sticky 290 293 // … … 331 334 action = true; 332 335 // `delete pfx' should have set pfx->fip->pfx to NULL 333 336 assert (fip == NULL || fip->pers_file_xfer == NULL); 337 } else if ((!pfx->fxp || pfx->fxp->http_op_done()) && 338 pfx->is_upload && 339 fip->project->network_suspended_via_gui) { 340 // Reset persistent file upload if networking 341 // has been disabled for the project 342 msg_printf(fip->project, MSG_INFO, 343 "Project networking suspended, suspend upload and reset timer for %s", fip->name 344 ); 345 iter = pers_file_xfers->pers_file_xfers.erase(iter); 346 delete pfx; 347 action = true; 348 // `delete pfx' should have set pfx->fip->pfx to NULL 349 assert (fip == NULL || fip->pers_file_xfer == NULL); 334 350 } else { 335 351 iter++; 336 352 } -
client/cs_scheduler.cpp
1008 1008 p = projects[i]; 1009 1009 if (p->waiting_until_min_rpc_time()) continue; 1010 1010 if (p->suspended_via_gui) continue; 1011 if (p->network_suspended_via_gui) continue; 1011 1012 if (p->master_url_fetch_pending) { 1012 1013 return p; 1013 1014 } … … 1060 1061 if (honor_suspend && p->suspended_via_gui) { 1061 1062 continue; 1062 1063 } 1064 if (honor_suspend && p->network_suspended_via_gui) { 1065 continue; 1066 } 1063 1067 if (p->sched_rpc_pending) { 1064 1068 return p; 1065 1069 } … … 1075 1079 p = projects[i]; 1076 1080 if (p->waiting_until_min_rpc_time()) continue; 1077 1081 if (p->suspended_via_gui) continue; 1082 if (p->network_suspended_via_gui) continue; 1078 1083 if (p->trickle_up_pending) { 1079 1084 return p; 1080 1085 } … … 1101 1106 PROJECT* p = r->project; 1102 1107 if (p->waiting_until_min_rpc_time()) continue; 1103 1108 if (p->suspended_via_gui) continue; 1109 if (p->network_suspended_via_gui) continue; 1104 1110 1105 1111 if (config.report_results_immediately) { 1106 1112 return p; -
client/gui_rpc_server_ops.cpp
258 258 p->suspended_via_gui = false; 259 259 gstate.request_schedule_cpus("project resumed by user"); 260 260 gstate.request_work_fetch("project resumed by user"); 261 } else if (!strcmp(op, "network_suspend")) { 262 msg_printf(p, MSG_INFO, "network activity suspended by user"); 263 p->network_suspended_via_gui = true; 264 } else if (!strcmp(op, "network_resume")) { 265 msg_printf(p, MSG_INFO, "network activity resumed by user"); 266 p->network_suspended_via_gui = false; 261 267 } else if (!strcmp(op, "detach")) { 262 268 if (p->attached_via_acct_mgr) { 263 269 msg_printf(p, MSG_USER_ERROR, … … 1183 1189 handle_project_op(request_msg, mf, "suspend"); 1184 1190 } else if (match_tag(request_msg, "<project_resume")) { 1185 1191 handle_project_op(request_msg, mf, "resume"); 1192 } else if (match_tag(request_msg, "<project_network_suspend")) { 1193 handle_project_op(request_msg, mf, "network_suspend"); 1194 } else if (match_tag(request_msg, "<project_network_resume")) { 1195 handle_project_op(request_msg, mf, "network_resume"); 1186 1196 } else if (match_tag(request_msg, "<set_run_mode")) { 1187 1197 handle_set_run_mode(request_msg, mf); 1188 1198 } else if (match_tag(request_msg, "<quit")) { -
client/scheduler_op.cpp
211 211 int SCHEDULER_OP::start_rpc(PROJECT* p) { 212 212 int retval; 213 213 char request_file[1024], reply_file[1024], buf[256]; 214 char *trickle_up_msg; 214 215 215 216 safe_strcpy(scheduler_url, p->get_scheduler_url(url_index, url_random)); 216 217 if (log_flags.sched_ops) { 217 218 msg_printf(p, MSG_INFO, 218 219 "Sending scheduler request: %s.", rpc_reason_string(reason) 219 220 ); 221 if (p->trickle_up_pending && reason != RPC_REASON_TRICKLE_UP) { 222 trickle_up_msg = ", sending trickle-up message"; 223 } else { 224 trickle_up_msg = ""; 225 } 220 226 if (cpu_work_fetch.req_secs || cuda_work_fetch.req_secs) { 221 227 if (coproc_cuda) { 222 228 if (cpu_work_fetch.req_secs && cuda_work_fetch.req_secs) { … … 231 237 } 232 238 if (p->nresults_returned) { 233 239 msg_printf(p, MSG_INFO, 234 "Reporting %d completed tasks, requesting new tasks%s ",235 p->nresults_returned, buf 240 "Reporting %d completed tasks, requesting new tasks%s%s", 241 p->nresults_returned, buf, trickle_up_msg 236 242 ); 237 243 } else { 238 msg_printf(p, MSG_INFO, "Requesting new tasks%s ", buf);244 msg_printf(p, MSG_INFO, "Requesting new tasks%s%s", buf, trickle_up_msg); 239 245 } 240 246 } else { 241 247 if (p->nresults_returned) { 242 248 msg_printf(p, MSG_INFO, 243 "Reporting %d completed tasks, not requesting new tasks ",244 p->nresults_returned 249 "Reporting %d completed tasks, not requesting new tasks%s", 250 p->nresults_returned, trickle_up_msg 245 251 ); 246 252 } else { 247 msg_printf(p, MSG_INFO, "Not reporting or requesting tasks ");253 msg_printf(p, MSG_INFO, "Not reporting or requesting tasks%s", trickle_up_msg); 248 254 } 249 255 } 250 256 } -
client/sim_util.cpp
141 141 short_term_debt = 0; 142 142 send_file_list = false; 143 143 suspended_via_gui = false; 144 network_suspended_via_gui = false; 144 145 dont_request_more_work = false; 145 146 detach_when_done = false; 146 147 attached_via_acct_mgr = false; -
client/work_fetch.cpp
106 106 bool PROJECT_WORK_FETCH::compute_can_fetch_work(PROJECT* p) { 107 107 if (p->non_cpu_intensive) return false; 108 108 if (p->suspended_via_gui) return false; 109 if (p->network_suspended_via_gui && p->sched_rpc_pending != RPC_REASON_USER_REQ) return false; 109 110 if (p->master_url_fetch_pending) return false; 110 111 if (p->min_rpc_time > gstate.now) return false; 111 112 if (p->dont_request_more_work) return false; … … 308 309 RSC_PROJECT_WORK_FETCH& pwf = project_state(p); 309 310 double bt = pwf.backoff_time>gstate.now?pwf.backoff_time-gstate.now:0; 310 311 msg_printf(p, MSG_INFO, 311 "[wfd] %s: fetch share %.2f debt %.2f backoff dt %.2f int %.2f%s%s%s%s%s%s ",312 "[wfd] %s: fetch share %.2f debt %.2f backoff dt %.2f int %.2f%s%s%s%s%s%s%s", 312 313 name, 313 314 pwf.fetchable_share, pwf.debt, bt, pwf.backoff_interval, 314 315 p->suspended_via_gui?" (susp via GUI)":"", 316 p->network_suspended_via_gui?" (net susp via GUI)":"", 315 317 p->master_url_fetch_pending?" (master fetch pending)":"", 316 318 p->min_rpc_time > gstate.now?" (comm deferred)":"", 317 319 p->dont_request_more_work?" (no new tasks)":"", … … 829 831 830 832 bool PROJECT::can_request_work() { 831 833 if (suspended_via_gui) return false; 834 if (network_suspended_via_gui && sched_rpc_pending != RPC_REASON_USER_REQ) return false; 832 835 if (master_url_fetch_pending) return false; 833 836 if (min_rpc_time > gstate.now) return false; 834 837 if (dont_request_more_work) return false; -
clientgui/DlgItemProperties.cpp
120 120 addProperty(_("Computer ID"), wxString::Format(wxT("%d"), project->hostid)); 121 121 addProperty(_("Non CPU intensive"),project->non_cpu_intensive ? _("yes") : _("no")); 122 122 addProperty(_("Suspended via GUI"),project->suspended_via_gui ? _("yes") : _("no")); 123 addProperty(_("Network activity suspended via GUI"),project->network_suspended_via_gui ? _("yes") : _("no")); 123 124 addProperty(_("Don't request more work"),project->dont_request_more_work ? _("yes") : _("no")); 124 125 addProperty(_("Scheduler call in progress"),project->scheduler_rpc_in_progress ? _("yes") : _("no")); 126 addProperty(_("Trickle-up pending"),project->trickle_up_pending ? _("yes") : _("no")); 125 127 addProperty(_("Attached via account manager"),project->attached_via_acct_mgr ? _("yes") : _("no")); 126 128 addProperty(_("Detach when done"),project->detach_when_done ? _("yes") : _("no")); 127 129 addProperty(_("Ended"),project->ended ? _("yes") : _("no")); -
clientgui/Events.h
91 91 #define ID_TASK_PROJECT_RESET 9006 92 92 #define ID_TASK_PROJECT_DETACH 9007 93 93 #define ID_TASK_PROJECT_SHOW_PROPERTIES 9008 94 #define ID_TASK_PROJECT_SUSPEND_NETWORK 9009 95 #define ID_TASK_PROJECT_RESUME_NETWORK 9010 94 96 #define ID_TASK_PROJECT_WEB_PROJDEF_MIN 9100 95 97 #define ID_TASK_PROJECT_WEB_PROJDEF_MAX 9150 96 98 #define ID_TASK_ACTIVE_ONLY 9200 -
clientgui/MainDocument.cpp
1337 1337 return iRetVal; 1338 1338 } 1339 1339 1340 int CMainDocument::ProjectSuspendNetwork(int iIndex) { 1341 PROJECT* pProject = NULL; 1342 int iRetVal = -1; 1343 1344 pProject = project(iIndex); 1345 1346 if (pProject) 1347 iRetVal = rpc.project_op((*pProject), "network_suspend"); 1348 1349 return iRetVal; 1350 } 1351 1352 int CMainDocument::ProjectSuspendNetwork(const wxString& projectname) { 1353 PROJECT* pProject = NULL; 1354 int iRetVal = -1; 1355 1356 pProject = project(projectname); 1357 1358 if (pProject) 1359 iRetVal = rpc.project_op((*pProject), "network_suspend"); 1360 1361 return iRetVal; 1362 } 1363 1364 int CMainDocument::ProjectResumeNetwork(int iIndex) { 1365 PROJECT* pProject = NULL; 1366 int iRetVal = -1; 1367 1368 pProject = project(iIndex); 1369 1370 if (pProject) 1371 iRetVal = rpc.project_op((*pProject), "network_resume"); 1372 1373 return iRetVal; 1374 } 1375 1376 int CMainDocument::ProjectResumeNetwork(const wxString& projectname) { 1377 PROJECT* pProject = NULL; 1378 int iRetVal = -1; 1379 1380 pProject = project(projectname); 1381 1382 if (pProject) 1383 iRetVal = rpc.project_op((*pProject), "network_resume"); 1384 1385 return iRetVal; 1386 } 1387 1340 1388 int CMainDocument::ProjectNoMoreWork(int iIndex) { 1341 1389 PROJECT* pProject = NULL; 1342 1390 int iRetVal = -1; -
clientgui/MainDocument.h
230 230 int ProjectSuspend(const wxString& projectname); 231 231 int ProjectResume(int iIndex); 232 232 int ProjectResume(const wxString& projectname); 233 int ProjectSuspendNetwork(int iIndex); 234 int ProjectSuspendNetwork(const wxString& projectname); 235 int ProjectResumeNetwork(int iIndex); 236 int ProjectResumeNetwork(const wxString& projectname); 233 237 234 238 235 239 // -
clientgui/ViewProjects.cpp
48 48 #define GRP_WEBSITES 1 49 49 50 50 // buttons in the "tasks" area 51 #define BTN_UPDATE 0 52 #define BTN_SUSPEND 1 53 #define BTN_NOWORK 2 54 #define BTN_RESET 3 55 #define BTN_DETACH 4 56 #define BTN_PROPERTIES 5 51 #define BTN_UPDATE 0 52 #define BTN_SUSPEND 1 53 #define BTN_SUSPEND_NETWORK 2 54 #define BTN_NOWORK 3 55 #define BTN_RESET 4 56 #define BTN_DETACH 5 57 #define BTN_PROPERTIES 6 57 58 58 59 59 60 CProject::CProject() { … … 77 78 BEGIN_EVENT_TABLE (CViewProjects, CBOINCBaseView) 78 79 EVT_BUTTON(ID_TASK_PROJECT_UPDATE, CViewProjects::OnProjectUpdate) 79 80 EVT_BUTTON(ID_TASK_PROJECT_SUSPEND, CViewProjects::OnProjectSuspend) 81 EVT_BUTTON(ID_TASK_PROJECT_SUSPEND_NETWORK, CViewProjects::OnProjectSuspendNetwork) 80 82 EVT_BUTTON(ID_TASK_PROJECT_NONEWWORK, CViewProjects::OnProjectNoNewWork) 81 83 EVT_BUTTON(ID_TASK_PROJECT_RESET, CViewProjects::OnProjectReset) 82 84 EVT_BUTTON(ID_TASK_PROJECT_DETACH, CViewProjects::OnProjectDetach) … … 183 185 ); 184 186 pGroup->m_Tasks.push_back( pItem ); 185 187 188 pItem = new CTaskItem( 189 _("Suspend network"), 190 _("Suspend network activity for this project. Stop uploads and reset their timers, block scheduler requests. Downloads will be completed."), 191 ID_TASK_PROJECT_SUSPEND_NETWORK 192 ); 193 pGroup->m_Tasks.push_back( pItem ); 194 186 195 pItem = new CTaskItem( 187 196 _("No new tasks"), 188 197 _("Don't get new tasks for this project."), … … 354 363 } 355 364 356 365 366 void CViewProjects::OnProjectSuspendNetwork( wxCommandEvent& WXUNUSED(event) ) { 367 wxLogTrace(wxT("Function Start/End"), wxT("CViewProjects::OnProjectSuspendNetwork - Function Begin")); 368 369 CMainDocument* pDoc = wxGetApp().GetDocument(); 370 CAdvancedFrame* pFrame = wxDynamicCast(GetParent()->GetParent()->GetParent(), CAdvancedFrame); 371 int row; 372 373 wxASSERT(pDoc); 374 wxASSERT(wxDynamicCast(pDoc, CMainDocument)); 375 wxASSERT(pFrame); 376 wxASSERT(wxDynamicCast(pFrame, CAdvancedFrame)); 377 wxASSERT(m_pListPane); 378 379 row = -1; 380 while (1) { 381 // Step through all selected items 382 row = m_pListPane->GetNextItem(row, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); 383 if (row < 0) break; 384 385 PROJECT* project = pDoc->project(m_iSortedIndexes[row]); 386 if (project) { 387 if (project->network_suspended_via_gui) { 388 pFrame->UpdateStatusText(_("Resuming project network activity...")); 389 pDoc->ProjectResumeNetwork(m_iSortedIndexes[row]); 390 pFrame->UpdateStatusText(wxT("")); 391 } else { 392 pFrame->UpdateStatusText(_("Suspending project network activity...")); 393 pDoc->ProjectSuspendNetwork(m_iSortedIndexes[row]); 394 pFrame->UpdateStatusText(wxT("")); 395 } 396 } 397 } 398 399 m_bForceUpdateSelection = true; 400 UpdateSelection(); 401 pFrame->FireRefreshView(); 402 403 wxLogTrace(wxT("Function Start/End"), wxT("CViewProjects::OnProjectSuspendNetwork - Function End")); 404 } 405 406 357 407 void CViewProjects::OnProjectNoNewWork( wxCommandEvent& WXUNUSED(event) ) { 358 408 wxLogTrace(wxT("Function Start/End"), wxT("CViewProjects::OnProjectNoNewWork - Function Begin")); 359 409 … … 652 702 PROJECT* project = NULL; 653 703 CMainDocument* pDoc = wxGetApp().GetDocument(); 654 704 int i, n, row; 655 bool wasSuspended=false, wasN oNewWork=false;705 bool wasSuspended=false, wasNetworkSuspended=false, wasNoNewWork=false; 656 706 bool enableUpdate = false; 657 707 bool enableSuspendResume = false; 708 bool enableNetworkSuspendResume = false; 658 709 bool enableNoNewTasks = false; 659 710 bool enableReset = false; 660 711 bool enableDetach = false; … … 675 726 if (n > 0) { 676 727 enableUpdate = true; 677 728 enableSuspendResume = true; 729 enableNetworkSuspendResume = true; 678 730 enableNoNewTasks = true; 679 731 enableReset = true; 680 732 enableDetach = true; … … 715 767 } 716 768 717 769 if (i == 0) { 770 wasNetworkSuspended = project->network_suspended_via_gui; 771 if (project->network_suspended_via_gui) { 772 m_pTaskPane->UpdateTask( 773 pGroup->m_Tasks[BTN_SUSPEND_NETWORK], _("Resume network"), _("Resume network activity for this project.") 774 ); 775 } else { 776 m_pTaskPane->UpdateTask( 777 pGroup->m_Tasks[BTN_SUSPEND_NETWORK], 778 _("Suspend network"), 779 _("Suspend network activity for this project. Stop uploads and reset their timers, block scheduler requests. Downloads will be completed.") 780 ); 781 } 782 } else { 783 if (wasNetworkSuspended != project->network_suspended_via_gui) { 784 // Disable Suspend / Resume button if the multiple selection 785 // has a mix of suspended and not suspended projects 786 enableNetworkSuspendResume = false; 787 } 788 } 789 790 if (i == 0) { 718 791 wasNoNewWork = project->dont_request_more_work; 719 792 if (project->dont_request_more_work) { 720 793 m_pTaskPane->UpdateTask( … … 755 828 // To minimize flicker, set each button only once to the final desired state 756 829 pGroup->m_Tasks[BTN_UPDATE]->m_pButton->Enable(enableUpdate); 757 830 pGroup->m_Tasks[BTN_SUSPEND]->m_pButton->Enable(enableSuspendResume); 831 pGroup->m_Tasks[BTN_SUSPEND_NETWORK]->m_pButton->Enable(enableNetworkSuspendResume); 758 832 pGroup->m_Tasks[BTN_NOWORK]->m_pButton->Enable(enableNoNewTasks); 759 833 pGroup->m_Tasks[BTN_RESET]->m_pButton->Enable(enableReset); 760 834 pGroup->m_Tasks[BTN_DETACH]->m_pButton->Enable(enableDetach); … … 1050 1124 if (project->suspended_via_gui) { 1051 1125 append_to_status(strBuffer, _("Suspended by user")); 1052 1126 } 1127 else if (project->network_suspended_via_gui && project->sched_rpc_pending != RPC_REASON_USER_REQ) { 1128 append_to_status(strBuffer, _("Network activity suspended by user")); 1129 } 1053 1130 if (project->dont_request_more_work) { 1054 1131 append_to_status(strBuffer, _("Won't get new tasks")); 1055 1132 } … … 1061 1138 } 1062 1139 if (project->sched_rpc_pending) { 1063 1140 append_to_status(strBuffer, _("Scheduler request pending")); 1064 1141 append_to_status(strBuffer, wxString(rpc_reason_string(project->sched_rpc_pending), wxConvUTF8)); 1065 1142 } 1143 if (project->trickle_up_pending && 1144 !project->scheduler_rpc_in_progress && 1145 project->sched_rpc_pending != RPC_REASON_TRICKLE_UP) { 1146 append_to_status(strBuffer, _("Trickle upload pending")); 1147 } 1066 1148 if (project->scheduler_rpc_in_progress) { 1067 1149 append_to_status(strBuffer, _("Scheduler request in progress")); 1068 1150 } -
clientgui/ViewProjects.h
65 65 66 66 void OnProjectUpdate( wxCommandEvent& event ); 67 67 void OnProjectSuspend( wxCommandEvent& event ); 68 void OnProjectSuspendNetwork( wxCommandEvent& event ); 68 69 void OnProjectNoNewWork( wxCommandEvent& event ); 69 70 void OnProjectReset( wxCommandEvent& event ); 70 71 void OnProjectDetach( wxCommandEvent& event ); -
clientgui/ViewProjectsBase.cpp
47 47 #define GRP_WEBSITES 1 48 48 49 49 // buttons in the "tasks" area 50 #define BTN_UPDATE 0 51 #define BTN_SUSPEND 1 52 #define BTN_NOWORK 2 53 #define BTN_RESET 3 54 #define BTN_DETACH 4 50 #define BTN_UPDATE 0 51 #define BTN_SUSPEND 1 52 #define BTN_SUSPEND_NETWORK 2 53 #define BTN_NOWORK 3 54 #define BTN_RESET 4 55 #define BTN_DETACH 5 55 56 56 57 57 58 CProject::CProject() { … … 74 75 BEGIN_EVENT_TABLE (CViewProjects, CBOINCBaseView) 75 76 EVT_BUTTON(ID_TASK_PROJECT_UPDATE, CViewProjects::OnProjectUpdate) 76 77 EVT_BUTTON(ID_TASK_PROJECT_SUSPEND, CViewProjects::OnProjectSuspend) 78 EVT_BUTTON(ID_TASK_PROJECT_SUSPEND_NETWORK, CViewProjects::OnProjectSuspendNetwork) 77 79 EVT_BUTTON(ID_TASK_PROJECT_NONEWWORK, CViewProjects::OnProjectNoNewWork) 78 80 EVT_BUTTON(ID_TASK_PROJECT_RESET, CViewProjects::OnProjectReset) 79 81 EVT_BUTTON(ID_TASK_PROJECT_DETACH, CViewProjects::OnProjectDetach) … … 118 120 ); 119 121 pGroup->m_Tasks.push_back( pItem ); 120 122 123 pItem = new CTaskItem( 124 _("Suspend network"), 125 _("Suspend network activity for this project. Stop uploads and reset their timers, block scheduler requests. Downloads will be completed."), 126 ID_TASK_PROJECT_SUSPEND_NETWORK 127 ); 128 pGroup->m_Tasks.push_back( pItem ); 129 121 130 pItem = new CTaskItem( 122 131 _("No new tasks"), 123 132 _("Don't get new tasks for this project."), … … 238 247 } 239 248 240 249 250 void CViewProjects::OnProjectSuspendNetwork( wxCommandEvent& WXUNUSED(event) ) { 251 wxLogTrace(wxT("Function Start/End"), wxT("CViewProjects::OnProjectSuspendNetwork - Function Begin")); 252 253 CMainDocument* pDoc = wxGetApp().GetDocument(); 254 CAdvancedFrame* pFrame = wxDynamicCast(GetParent()->GetParent()->GetParent(), CAdvancedFrame); 255 256 wxASSERT(pDoc); 257 wxASSERT(wxDynamicCast(pDoc, CMainDocument)); 258 wxASSERT(pFrame); 259 wxASSERT(wxDynamicCast(pFrame, CAdvancedFrame)); 260 wxASSERT(m_pListPane); 261 262 PROJECT* project = pDoc->project(m_pListPane->GetFirstSelected()); 263 if (project->network_suspended_via_gui) { 264 pFrame->UpdateStatusText(_("Resuming project network activity...")); 265 pDoc->ProjectResumeNetwork(m_pListPane->GetFirstSelected()); 266 pFrame->UpdateStatusText(wxT("")); 267 } else { 268 pFrame->UpdateStatusText(_("Suspending project network activity...")); 269 pDoc->ProjectSuspendNetwork(m_pListPane->GetFirstSelected()); 270 pFrame->UpdateStatusText(wxT("")); 271 } 272 273 m_bForceUpdateSelection = true; 274 UpdateSelection(); 275 pFrame->FireRefreshView(); 276 277 wxLogTrace(wxT("Function Start/End"), wxT("CViewProjects::OnProjectSuspendNetwork - Function End")); 278 } 279 280 241 281 void CViewProjects::OnProjectNoNewWork( wxCommandEvent& WXUNUSED(event) ) { 242 282 wxLogTrace(wxT("Function Start/End"), wxT("CViewProjects::OnProjectNoNewWork - Function Begin")); 243 283 … … 561 601 ); 562 602 } 563 603 } 604 m_pTaskPane->EnableTask(pGroup->m_Tasks[BTN_SUSPEND_NETWORK]); 605 if (project) { 606 if (project->suspended_via_gui) { 607 m_pTaskPane->UpdateTask( 608 pGroup->m_Tasks[BTN_SUSPEND_NETWORK], _("Resume network"), _("Resume network activity for this project.") 609 ); 610 } else { 611 m_pTaskPane->UpdateTask( 612 pGroup->m_Tasks[BTN_SUSPEND_NETWORK], 613 _("Suspend network"), 614 _("Suspend network activity for this project. Stop uploads and reset their timers, block scheduler requests. Downloads will be completed.") 615 ); 616 } 617 } 564 618 m_pTaskPane->EnableTask(pGroup->m_Tasks[BTN_NOWORK]); 565 619 if (project) { 566 620 if (project->dont_request_more_work) { … … 673 727 if (project->suspended_via_gui) { 674 728 append_to_status(status, _("Suspended by user")); 675 729 } 730 else if (project->network_suspended_via_gui && project->sched_rpc_pending != RPC_REASON_USER_REQ) { 731 append_to_status(status, _("Network activity suspended by user")); 732 } 676 733 if (project->dont_request_more_work) { 677 734 append_to_status(status, _("Won't get new tasks")); 678 735 } … … 684 741 } 685 742 if (project->sched_rpc_pending) { 686 743 append_to_status(status, _("Scheduler request pending")); 687 744 append_to_status(status, wxString(rpc_reason_string(project->sched_rpc_pending), wxConvUTF8)); 688 745 } 746 if (project->trickle_up_pending && 747 !project->scheduler_rpc_in_progress && 748 project->sched_rpc_pending != RPC_REASON_TRICKLE_UP) { 749 append_to_status(status, _("Trickle upload pending")); 750 } 689 751 if (project->scheduler_rpc_in_progress) { 690 752 append_to_status(status, _("Scheduler request in progress")); 691 753 } -
clientgui/ViewProjectsBase.h
58 58 59 59 void OnProjectUpdate( wxCommandEvent& event ); 60 60 void OnProjectSuspend( wxCommandEvent& event ); 61 void OnProjectSuspendNetwork( wxCommandEvent& event ); 61 62 void OnProjectNoNewWork( wxCommandEvent& event ); 62 63 void OnProjectReset( wxCommandEvent& event ); 63 64 void OnProjectDetach( wxCommandEvent& event ); -
clientgui/ViewProjectsGrid.cpp
49 49 #define GRP_WEBSITES 1 50 50 51 51 // buttons in the "tasks" area 52 #define BTN_UPDATE 0 53 #define BTN_SUSPEND 1 54 #define BTN_NOWORK 2 55 #define BTN_RESET 3 56 #define BTN_DETACH 4 52 #define BTN_UPDATE 0 53 #define BTN_SUSPEND 1 54 #define BTN_SUSPEND_NETWORK 2 55 #define BTN_NOWORK 3 56 #define BTN_RESET 4 57 #define BTN_DETACH 5 57 58 58 59 59 60 IMPLEMENT_DYNAMIC_CLASS(CViewProjectsGrid, CBOINCBaseView) … … 61 62 BEGIN_EVENT_TABLE (CViewProjectsGrid, CBOINCBaseView) 62 63 EVT_BUTTON(ID_TASK_PROJECT_UPDATE, CViewProjectsGrid::OnProjectUpdate) 63 64 EVT_BUTTON(ID_TASK_PROJECT_SUSPEND, CViewProjectsGrid::OnProjectSuspend) 65 EVT_BUTTON(ID_TASK_PROJECT_SUSPEND_NETWORK, CViewProjectsGrid::OnProjectSuspendNetwork) 64 66 EVT_BUTTON(ID_TASK_PROJECT_NONEWWORK, CViewProjectsGrid::OnProjectNoNewWork) 65 67 EVT_BUTTON(ID_TASK_PROJECT_RESET, CViewProjectsGrid::OnProjectReset) 66 68 EVT_BUTTON(ID_TASK_PROJECT_DETACH, CViewProjectsGrid::OnProjectDetach) … … 130 132 ); 131 133 pGroup->m_Tasks.push_back( pItem ); 132 134 135 pItem = new CTaskItem( 136 _("Suspend network"), 137 _("Suspend network activity for this project. Stop uploads and reset their timers, block scheduler requests. Downloads will be completed."), 138 ID_TASK_PROJECT_SUSPEND_NETWORK 139 ); 140 pGroup->m_Tasks.push_back( pItem ); 141 133 142 pItem = new CTaskItem( 134 143 _("No new tasks"), 135 144 _("Don't get new tasks for this project."), … … 285 294 } 286 295 287 296 297 void CViewProjectsGrid::OnProjectSuspendNetwork( wxCommandEvent& WXUNUSED(event) ) { 298 wxLogTrace(wxT("Function Start/End"), wxT("CViewProjectsGrid::OnProjectSuspendNetwork - Function Begin")); 299 300 wxString strProjectURL = wxEmptyString; 301 CMainDocument* pDoc = wxGetApp().GetDocument(); 302 CAdvancedFrame* pFrame = wxDynamicCast(GetParent()->GetParent()->GetParent(), CAdvancedFrame); 303 int i, n; 304 305 wxASSERT(pDoc); 306 wxASSERT(wxDynamicCast(pDoc, CMainDocument)); 307 wxASSERT(pFrame); 308 wxASSERT(wxDynamicCast(pFrame, CAdvancedFrame)); 309 wxASSERT(m_pGridPane); 310 311 wxArrayInt arrSelRows = m_pGridPane->GetSelectedRows2(); 312 n = (int)arrSelRows.GetCount(); 313 for(i=0; i<n; i++) { 314 strProjectURL = 315 HtmlEntityEncode( 316 m_pGridPane->GetCellValue( 317 arrSelRows[i], 318 COLUMN_HIDDEN_URL 319 ).Trim(false) 320 ); 321 PROJECT* project = pDoc->project(strProjectURL); 322 323 if (project->network_suspended_via_gui) { 324 pFrame->UpdateStatusText(_("Resuming project network activity...")); 325 pDoc->ProjectResumeNetwork(strProjectURL); 326 } else { 327 pFrame->UpdateStatusText(_("Suspending project network activity...")); 328 pDoc->ProjectSuspendNetwork(strProjectURL); 329 } 330 } 331 pFrame->UpdateStatusText(wxT("")); 332 333 m_bForceUpdateSelection = true; 334 UpdateSelection(); 335 pFrame->FireRefreshView(); 336 337 wxLogTrace(wxT("Function Start/End"), wxT("CViewProjectsGrid::OnProjectSuspendNetwork - Function End")); 338 } 339 340 288 341 void CViewProjectsGrid::OnProjectNoNewWork( wxCommandEvent& WXUNUSED(event) ) { 289 342 wxLogTrace(wxT("Function Start/End"), wxT("CViewProjectsGrid::OnProjectNoNewWork - Function Begin")); 290 343 … … 496 549 PROJECT* project = NULL; 497 550 CMainDocument* pDoc = wxGetApp().GetDocument(); 498 551 int i, n; 499 bool wasSuspended=false, wasN oNewWork=false;552 bool wasSuspended=false, wasNetworkSuspended=false, wasNoNewWork=false; 500 553 static int lastCount = 0; 501 554 502 555 wxASSERT(pDoc); … … 569 622 } 570 623 571 624 if (i == 0) { 625 wasNetworkSuspended = project->network_suspended_via_gui; 626 if (project->network_suspended_via_gui) { 627 m_pTaskPane->UpdateTask( 628 pGroup->m_Tasks[BTN_SUSPEND_NETWORK], _("Resume network"), _("Resume network activity for this project.") 629 ); 630 } else { 631 m_pTaskPane->UpdateTask( 632 pGroup->m_Tasks[BTN_SUSPEND_NETWORK], 633 _("Suspend network"), 634 _("Suspend network activity for this project. Stop uploads and reset their timers, block scheduler requests. Downloads will be completed.") 635 ); 636 } 637 } else { 638 if (wasNetworkSuspended != project->network_suspended_via_gui) { 639 // Disable Suspend / Resume button if the multiple selection 640 // has a mix of suspended and not suspended projects 641 m_pTaskPane->DisableTask(pGroup->m_Tasks[BTN_SUSPEND_NETWORK]); 642 } 643 } 644 645 if (i == 0) { 572 646 wasNoNewWork = project->dont_request_more_work; 573 647 if (project->dont_request_more_work) { 574 648 m_pTaskPane->UpdateTask( … … 727 801 if (project->suspended_via_gui) { 728 802 append_to_status(strBuffer, _("Suspended by user")); 729 803 } 804 else if (project->network_suspended_via_gui && project->sched_rpc_pending != RPC_REASON_USER_REQ) { 805 append_to_status(strBuffer, _("Network activity suspended by user")); 806 } 730 807 if (project->dont_request_more_work) { 731 808 append_to_status(strBuffer, _("Won't get new tasks")); 732 809 } … … 738 815 } 739 816 if (project->sched_rpc_pending) { 740 817 append_to_status(strBuffer, _("Scheduler request pending")); 741 818 append_to_status(strBuffer, wxString(rpc_reason_string(project->sched_rpc_pending), wxConvUTF8)); 742 819 } 820 if (project->trickle_up_pending && 821 !project->scheduler_rpc_in_progress && 822 project->sched_rpc_pending != RPC_REASON_TRICKLE_UP) { 823 append_to_status(strBuffer, _("Trickle upload pending")); 824 } 743 825 if (project->scheduler_rpc_in_progress) { 744 826 append_to_status(strBuffer, _("Scheduler request in progress")); 745 827 } -
clientgui/ViewProjectsGrid.h
47 47 void OnProjectUpdate( wxCommandEvent& event ); 48 48 void OnProjectSuspend( wxCommandEvent& event ); 49 49 void OnProjectNoNewWork( wxCommandEvent& event ); 50 void OnProjectSuspendNetwork( wxCommandEvent& event ); 50 51 void OnProjectReset( wxCommandEvent& event ); 51 52 void OnProjectDetach( wxCommandEvent& event ); 52 53 -
clientgui/ViewTransfers.cpp
440 440 441 441 void CViewTransfers::UpdateSelection() { 442 442 CTaskItemGroup* pGroup = m_TaskGroups[0]; 443 CMainDocument* pDoc = wxGetApp().GetDocument(); 444 FILE_TRANSFER* transfer; 445 int i, n, row; 446 bool enableButtons = false; 443 447 448 wxASSERT(pDoc); 449 wxASSERT(wxDynamicCast(pDoc, CMainDocument)); 450 wxASSERT(m_pTaskPane); 451 wxASSERT(m_pListPane); 452 444 453 CBOINCBaseView::PreUpdateSelection(); 445 454 446 if (m_pListPane->GetSelectedItemCount()) { 455 n = m_pListPane->GetSelectedItemCount(); 456 if (n > 0) { 457 enableButtons = true; 458 } 459 460 row = -1; 461 for (i=0; i<n; i++) { 462 // Step through all selected items 463 row = m_pListPane->GetNextItem(row, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); 464 if (row < 0) break; // Should never happen 465 466 transfer = pDoc->file_transfer(m_iSortedIndexes[row]); 467 if (transfer && 468 transfer->project && 469 transfer->project->network_suspended_via_gui) { 470 enableButtons = false; 471 break; 472 } 473 } 474 475 if (enableButtons) { 447 476 m_pTaskPane->EnableTaskGroupTasks(pGroup); 448 477 } else { 449 478 m_pTaskPane->DisableTaskGroupTasks(pGroup); … … 758 787 } else { 759 788 if (transfer->xfer_active) { 760 789 strBuffer = transfer->generated_locally? _("Uploading") : _("Downloading"); 790 } else if (transfer->generated_locally) { 791 strBuffer = _("Upload pending"); 792 if (transfer->project != NULL && transfer->project->network_suspended_via_gui) { 793 strBuffer += _(", project networking suspended"); 794 } 761 795 } else { 762 strBuffer = transfer->generated_locally? _("Upload pending") :_("Download pending");796 strBuffer = _("Download pending"); 763 797 } 764 798 } 765 799 } … … 784 818 785 819 if (transfer) { 786 820 strBuffer = wxString(transfer->project_url.c_str(), wxConvUTF8); 821 transfer->project = pDoc->state.lookup_project(transfer->project_url); 787 822 } 788 823 } 789 824 -
clientgui/ViewTransfersGrid.cpp
253 253 254 254 void CViewTransfersGrid::UpdateSelection() { 255 255 CTaskItemGroup* pGroup = m_TaskGroups[0]; 256 CMainDocument* pDoc = wxGetApp().GetDocument(); 257 FILE_TRANSFER* transfer; 258 int i, n, row; 259 bool enableButtons = false; 256 260 261 wxASSERT(pDoc); 262 wxASSERT(wxDynamicCast(pDoc, CMainDocument)); 263 wxASSERT(m_pTaskPane); 264 wxASSERT(m_pListPane); 265 257 266 CBOINCBaseView::PreUpdateSelection(); 258 267 259 if (m_pGridPane->GetSelectedRows2().size() > 0) { 268 n = m_pListPane->GetSelectedItemCount(); 269 if (n > 0) { 270 enableButtons = true; 271 } 272 273 row = -1; 274 for (i=0; i<n; i++) { 275 // Step through all selected items 276 row = m_pListPane->GetNextItem(row, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); 277 if (row < 0) break; // Should never happen 278 279 transfer = pDoc->file_transfer(m_iSortedIndexes[row]); 280 if (transfer && 281 transfer->project && 282 transfer->project->network_suspended_via_gui) { 283 enableButtons = false; 284 break; 285 } 286 } 287 288 if (enableButtons) { 260 289 m_pTaskPane->EnableTaskGroupTasks(pGroup); 261 290 } else { 262 291 m_pTaskPane->DisableTaskGroupTasks(pGroup); … … 427 456 } else { 428 457 if (transfer->xfer_active) { 429 458 strBuffer = transfer->generated_locally? _("Uploading") : _("Downloading"); 459 } else if (transfer->generated_locally) { 460 strBuffer = _("Upload pending"); 461 if (transfer->project != NULL && transfer->project->network_suspended_via_gui) { 462 strBuffer += _(", project networking suspended"); 463 } 430 464 } else { 431 strBuffer = transfer->generated_locally? _("Upload pending") :_("Download pending");465 strBuffer = _("Download pending"); 432 466 } 433 467 } 434 468 } … … 447 481 448 482 if (transfer) { 449 483 strBuffer = wxString(transfer->project_url.c_str(), wxConvUTF8); 484 transfer->project = pDoc->state.lookup_project(transfer->project_url); 450 485 } 451 486 452 487 return 0; -
clientgui/ViewWork.cpp
1179 1179 if (result->ready_to_report) { 1180 1180 strBuffer += _("Upload failed"); 1181 1181 } else { 1182 PROJECT* project; 1183 1182 1184 strBuffer += _("Uploading"); 1185 project = doc->state.lookup_project(result->project_url); 1186 if (project->network_suspended_via_gui) 1187 { 1188 strBuffer += _(", project networking suspended"); 1189 } 1183 1190 } 1184 1191 break; 1185 1192 case RESULT_ABORTED: -
clientgui/ViewWorkGrid.cpp
838 838 if (result->ready_to_report) { 839 839 strBuffer = _("Upload failed"); 840 840 } else { 841 strBuffer = _("Uploading"); 841 PROJECT* project; 842 843 strBuffer += _("Uploading"); 844 project = doc->state.lookup_project(result->project_url); 845 if (project->network_suspended_via_gui) 846 { 847 strBuffer += _(", project networking suspended"); 848 } 842 849 } 843 850 break; 844 851 case RESULT_ABORTED: -
lib/gui_rpc_client.h
133 133 134 134 bool master_url_fetch_pending; // need to fetch and parse the master URL 135 135 int sched_rpc_pending; // need to contact scheduling server 136 bool trickle_up_pending; // need to upload trickles 136 137 bool non_cpu_intensive; 137 138 bool suspended_via_gui; 139 bool network_suspended_via_gui; 138 140 bool dont_request_more_work; 139 141 bool scheduler_rpc_in_progress; 140 142 bool attached_via_acct_mgr; -
lib/gui_rpc_client_ops.cpp
248 248 if (parse_double(buf, "<duration_correction_factor>", duration_correction_factor)) continue; 249 249 if (parse_bool(buf, "master_url_fetch_pending", master_url_fetch_pending)) continue; 250 250 if (parse_int(buf, "<sched_rpc_pending>", sched_rpc_pending)) continue; 251 if (parse_bool(buf, "trickle_up_pending", trickle_up_pending)) continue; 251 252 if (parse_bool(buf, "non_cpu_intensive", non_cpu_intensive)) continue; 252 253 if (parse_bool(buf, "suspended_via_gui", suspended_via_gui)) continue; 254 if (parse_bool(buf, "network_suspended_via_gui", network_suspended_via_gui)) continue; 253 255 if (parse_bool(buf, "dont_request_more_work", dont_request_more_work)) continue; 254 256 if (parse_bool(buf, "ended", ended)) continue; 255 257 if (parse_bool(buf, "scheduler_rpc_in_progress", scheduler_rpc_in_progress)) continue; … … 300 302 duration_correction_factor = 0; 301 303 master_url_fetch_pending = false; 302 304 sched_rpc_pending = 0; 305 trickle_up_pending = false; 303 306 ended = false; 304 307 non_cpu_intensive = false; 305 308 suspended_via_gui = false; 309 network_suspended_via_gui = false; 306 310 dont_request_more_work = false; 307 311 scheduler_rpc_in_progress = false; 308 312 attached_via_acct_mgr = false; … … 1512 1516 } else if (!strcmp(op, "resume")) { 1513 1517 tag = "project_resume"; 1514 1518 project.suspended_via_gui = false; 1519 } else if (!strcmp(op, "network_suspend")) { 1520 tag = "project_network_suspend"; 1521 project.network_suspended_via_gui = true; 1522 } else if (!strcmp(op, "network_resume")) { 1523 tag = "project_network_resume"; 1524 project.network_suspended_via_gui = false; 1515 1525 } else if (!strcmp(op, "allowmorework")) { 1516 1526 tag = "project_allowmorework"; 1517 1527 project.dont_request_more_work = false; -
lib/gui_rpc_client_print.cpp
74 74 printf(" master_fetch_failures: %d\n", master_fetch_failures); 75 75 printf(" master fetch pending: %s\n", master_url_fetch_pending?"yes":"no"); 76 76 printf(" scheduler RPC pending: %s\n", sched_rpc_pending?"yes":"no"); 77 printf(" trickle upload pending: %s\n", trickle_up_pending?"yes":"no"); 77 78 printf(" attached via Account Manager: %s\n", attached_via_acct_mgr?"yes":"no"); 78 79 printf(" ended: %s\n", ended?"yes":"no"); 79 80 printf(" suspended via GUI: %s\n", suspended_via_gui?"yes":"no"); 81 printf(" network activity suspended via GUI: %s\n", network_suspended_via_gui?"yes":"no"); 80 82 printf(" don't request more work: %s\n", dont_request_more_work?"yes":"no"); 81 83 printf(" disk usage: %f\n", disk_usage); 82 84 printf(" last RPC: %f\n", last_rpc_time);