Ticket #139: trac139_6_8.patch
File trac139_6_8.patch, 48.1 KB (added by , 15 years ago) |
---|
-
client/boinc_cmd.cpp
72 72 --result url result_name op job operation\n\ 73 73 op = suspend | resume | abort | graphics_window | graphics_fullscreen\n\ 74 74 --project URL op project operation\n\ 75 op = reset | detach | update | suspend | resume | n omorework | allowmorework\n\75 op = reset | detach | update | suspend | resume | network_suspend | network_resume | nomorework | allowmorework\n\ 76 76 --file_transfer URL filename op file transfer operation\n\ 77 77 op = retry | abort\n\ 78 78 --set_run_mode mode duration set run mode for given duration\n\ … … 268 268 retval = rpc.project_op(project, "suspend"); 269 269 } else if (!strcmp(op, "resume")) { 270 270 retval = rpc.project_op(project, "resume"); 271 } else if (!strcmp(op, "network_suspend")) { 272 retval = rpc.project_op(project, "network_suspend"); 273 } else if (!strcmp(op, "network_resume")) { 274 retval = rpc.project_op(project, "network_resume"); 271 275 } else if (!strcmp(op, "detach")) { 272 276 retval = rpc.project_op(project, "detach"); 273 277 } else if (!strcmp(op, "update")) { 274 278 retval = rpc.project_op(project, "update"); 275 } else if (!strcmp(op, "suspend")) {276 retval = rpc.project_op(project, "suspend");277 } else if (!strcmp(op, "resume")) {278 retval = rpc.project_op(project, "resume");279 279 } else if (!strcmp(op, "nomorework")) { 280 280 retval = rpc.project_op(project, "nomorework"); 281 281 } else if (!strcmp(op, "allowmorework")) { -
client/client_types.cpp
102 102 send_time_stats_log = 0; 103 103 send_job_log = 0; 104 104 suspended_via_gui = false; 105 network_suspended_via_gui = false; 105 106 dont_request_more_work = false; 106 107 detach_when_done = false; 107 108 attached_via_acct_mgr = false; … … 181 182 if (parse_bool(buf, "non_cpu_intensive", non_cpu_intensive)) continue; 182 183 if (parse_bool(buf, "verify_files_on_app_start", verify_files_on_app_start)) continue; 183 184 if (parse_bool(buf, "suspended_via_gui", suspended_via_gui)) continue; 185 if (parse_bool(buf, "network_suspended_via_gui", network_suspended_via_gui)) continue; 184 186 if (parse_bool(buf, "dont_request_more_work", dont_request_more_work)) continue; 185 187 if (parse_bool(buf, "detach_when_done", detach_when_done)) continue; 186 188 if (parse_bool(buf, "ended", ended)) continue; … … 253 255 " <sched_rpc_pending>%d</sched_rpc_pending>\n" 254 256 " <send_time_stats_log>%d</send_time_stats_log>\n" 255 257 " <send_job_log>%d</send_job_log>\n" 256 "%s%s%s%s%s%s%s%s%s%s%s%s ",258 "%s%s%s%s%s%s%s%s%s%s%s%s%s", 257 259 master_url, 258 260 project_name, 259 261 symstore, … … 289 291 non_cpu_intensive?" <non_cpu_intensive/>\n":"", 290 292 verify_files_on_app_start?" <verify_files_on_app_start/>\n":"", 291 293 suspended_via_gui?" <suspended_via_gui/>\n":"", 294 network_suspended_via_gui?" <network_suspended_via_gui/>\n":"", 292 295 dont_request_more_work?" <dont_request_more_work/>\n":"", 293 296 detach_when_done?" <detach_when_done/>\n":"", 294 297 ended?" <ended/>\n":"", … … 365 368 non_cpu_intensive = p.non_cpu_intensive; 366 369 verify_files_on_app_start = p.verify_files_on_app_start; 367 370 suspended_via_gui = p.suspended_via_gui; 371 network_suspended_via_gui = p.network_suspended_via_gui; 368 372 dont_request_more_work = p.dont_request_more_work; 369 373 detach_when_done = p.detach_when_done; 370 374 attached_via_acct_mgr = p.attached_via_acct_mgr; -
client/client_types.h
266 266 int send_job_log; 267 267 268 268 bool suspended_via_gui; 269 bool network_suspended_via_gui; 269 270 /// Return work, but don't request more 270 271 /// Used for a clean exit to a project, 271 272 /// 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
1006 1006 p = projects[i]; 1007 1007 if (p->waiting_until_min_rpc_time()) continue; 1008 1008 if (p->suspended_via_gui) continue; 1009 if (p->network_suspended_via_gui) continue; 1009 1010 if (p->master_url_fetch_pending) { 1010 1011 return p; 1011 1012 } … … 1058 1059 if (honor_suspend && p->suspended_via_gui) { 1059 1060 continue; 1060 1061 } 1062 if (honor_suspend && p->network_suspended_via_gui) { 1063 continue; 1064 } 1061 1065 if (p->sched_rpc_pending) { 1062 1066 return p; 1063 1067 } … … 1073 1077 p = projects[i]; 1074 1078 if (p->waiting_until_min_rpc_time()) continue; 1075 1079 if (p->suspended_via_gui) continue; 1080 if (p->network_suspended_via_gui) continue; 1076 1081 if (p->trickle_up_pending) { 1077 1082 return p; 1078 1083 } … … 1099 1104 PROJECT* p = r->project; 1100 1105 if (p->waiting_until_min_rpc_time()) continue; 1101 1106 if (p->suspended_via_gui) continue; 1107 if (p->network_suspended_via_gui) continue; 1102 1108 1103 1109 if (config.report_results_immediately) { 1104 1110 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, … … 1173 1179 handle_project_op(request_msg, mf, "suspend"); 1174 1180 } else if (match_tag(request_msg, "<project_resume")) { 1175 1181 handle_project_op(request_msg, mf, "resume"); 1182 } else if (match_tag(request_msg, "<project_network_suspend")) { 1183 handle_project_op(request_msg, mf, "network_suspend"); 1184 } else if (match_tag(request_msg, "<project_network_resume")) { 1185 handle_project_op(request_msg, mf, "network_resume"); 1176 1186 } else if (match_tag(request_msg, "<set_run_mode")) { 1177 1187 handle_set_run_mode(request_msg, mf); 1178 1188 } else if (match_tag(request_msg, "<quit")) { -
client/scheduler_op.cpp
210 210 int SCHEDULER_OP::start_rpc(PROJECT* p) { 211 211 int retval; 212 212 char request_file[1024], reply_file[1024], buf[256]; 213 char *trickle_up_msg; 213 214 214 215 safe_strcpy(scheduler_url, p->get_scheduler_url(url_index, url_random)); 215 216 if (log_flags.sched_ops) { 216 217 msg_printf(p, MSG_INFO, 217 218 "Sending scheduler request: %s.", rpc_reason_string(reason) 218 219 ); 220 if (p->trickle_up_pending && reason != RPC_REASON_TRICKLE_UP) { 221 trickle_up_msg = ", sending trickle-up message"; 222 } else { 223 trickle_up_msg = ""; 224 } 219 225 if (cpu_work_fetch.req_secs || cuda_work_fetch.req_secs) { 220 226 if (coproc_cuda) { 221 227 if (cpu_work_fetch.req_secs && cuda_work_fetch.req_secs) { … … 230 236 } 231 237 if (p->nresults_returned) { 232 238 msg_printf(p, MSG_INFO, 233 "Reporting %d completed tasks, requesting new tasks%s ",234 p->nresults_returned, buf 239 "Reporting %d completed tasks, requesting new tasks%s%s", 240 p->nresults_returned, buf, trickle_up_msg 235 241 ); 236 242 } else { 237 msg_printf(p, MSG_INFO, "Requesting new tasks%s ", buf);243 msg_printf(p, MSG_INFO, "Requesting new tasks%s%s", buf, trickle_up_msg); 238 244 } 239 245 } else { 240 246 if (p->nresults_returned) { 241 247 msg_printf(p, MSG_INFO, 242 "Reporting %d completed tasks, not requesting new tasks ",243 p->nresults_returned 248 "Reporting %d completed tasks, not requesting new tasks%s", 249 p->nresults_returned, trickle_up_msg 244 250 ); 245 251 } else { 246 msg_printf(p, MSG_INFO, "Not reporting or requesting tasks ");252 msg_printf(p, MSG_INFO, "Not reporting or requesting tasks%s", trickle_up_msg); 247 253 } 248 254 } 249 255 } -
client/sim.h
194 194 bool possibly_schedule_cpus(); 195 195 void schedule_cpus(); 196 196 bool enforce_schedule(); 197 void append_unfinished_time_slice(vector<RESULT*>&); 197 198 bool no_work_for_a_cpu(); 198 199 void append_unfinished_time_slice(vector<RESULT*> &runnable_jobs); 199 200 void print_deadline_misses(); -
client/sim_util.cpp
138 138 short_term_debt = 0; 139 139 send_file_list = false; 140 140 suspended_via_gui = false; 141 network_suspended_via_gui = false; 141 142 dont_request_more_work = false; 142 143 detach_when_done = false; 143 144 attached_via_acct_mgr = false; -
client/work_fetch.cpp
105 105 bool PROJECT_WORK_FETCH::compute_can_fetch_work(PROJECT* p) { 106 106 if (p->non_cpu_intensive) return false; 107 107 if (p->suspended_via_gui) return false; 108 if (p->network_suspended_via_gui && p->sched_rpc_pending != RPC_REASON_USER_REQ) return false; 108 109 if (p->master_url_fetch_pending) return false; 109 110 if (p->min_rpc_time > gstate.now) return false; 110 111 if (p->dont_request_more_work) return false; … … 311 312 RSC_PROJECT_WORK_FETCH& pwf = project_state(p); 312 313 double bt = pwf.backoff_time>gstate.now?pwf.backoff_time-gstate.now:0; 313 314 msg_printf(p, MSG_INFO, 314 "[wfd] %s: fetch share %.2f debt %.2f backoff dt %.2f int %.2f%s%s%s%s%s ",315 "[wfd] %s: fetch share %.2f debt %.2f backoff dt %.2f int %.2f%s%s%s%s%s%s", 315 316 name, 316 317 pwf.fetchable_share, pwf.debt, bt, pwf.backoff_interval, 317 318 p->suspended_via_gui?" (susp via GUI)":"", 319 p->network_suspended_via_gui?" (net susp via GUI)":"", 318 320 p->master_url_fetch_pending?" (master fetch pending)":"", 319 321 p->min_rpc_time > gstate.now?" (comm deferred)":"", 320 322 p->dont_request_more_work?" (no new tasks)":"", … … 815 817 816 818 bool PROJECT::can_request_work() { 817 819 if (suspended_via_gui) return false; 820 if (network_suspended_via_gui && sched_rpc_pending != RPC_REASON_USER_REQ) return false; 818 821 if (master_url_fetch_pending) return false; 819 822 if (min_rpc_time > gstate.now) return false; 820 823 if (dont_request_more_work) return false; -
clientgui/DlgItemProperties.cpp
114 114 addProperty(_("Computer ID"), wxString::Format(wxT("%d"), project->hostid)); 115 115 addProperty(_("Non CPU intensive"),project->non_cpu_intensive ? _("yes") : _("no")); 116 116 addProperty(_("Suspended via GUI"),project->suspended_via_gui ? _("yes") : _("no")); 117 addProperty(_("Network activity suspended via GUI"),project->network_suspended_via_gui ? _("yes") : _("no")); 117 118 addProperty(_("Don't request more work"),project->dont_request_more_work ? _("yes") : _("no")); 118 119 addProperty(_("Scheduler call in progress"),project->scheduler_rpc_in_progress ? _("yes") : _("no")); 120 addProperty(_("Trickle-up pending"),project->trickle_up_pending ? _("yes") : _("no")); 119 121 addProperty(_("Attached via account manager"),project->attached_via_acct_mgr ? _("yes") : _("no")); 120 122 addProperty(_("Detach when done"),project->detach_when_done ? _("yes") : _("no")); 121 123 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_WORK_SUSPEND 9200 -
clientgui/MainDocument.cpp
1311 1311 return iRetVal; 1312 1312 } 1313 1313 1314 int CMainDocument::ProjectSuspendNetwork(int iIndex) { 1315 PROJECT* pProject = NULL; 1316 int iRetVal = -1; 1317 1318 pProject = project(iIndex); 1319 1320 if (pProject) 1321 iRetVal = rpc.project_op((*pProject), "network_suspend"); 1322 1323 return iRetVal; 1324 } 1325 1326 int CMainDocument::ProjectSuspendNetwork(const wxString& projectname) { 1327 PROJECT* pProject = NULL; 1328 int iRetVal = -1; 1329 1330 pProject = project(projectname); 1331 1332 if (pProject) 1333 iRetVal = rpc.project_op((*pProject), "network_suspend"); 1334 1335 return iRetVal; 1336 } 1337 1338 int CMainDocument::ProjectResumeNetwork(int iIndex) { 1339 PROJECT* pProject = NULL; 1340 int iRetVal = -1; 1341 1342 pProject = project(iIndex); 1343 1344 if (pProject) 1345 iRetVal = rpc.project_op((*pProject), "network_resume"); 1346 1347 return iRetVal; 1348 } 1349 1350 int CMainDocument::ProjectResumeNetwork(const wxString& projectname) { 1351 PROJECT* pProject = NULL; 1352 int iRetVal = -1; 1353 1354 pProject = project(projectname); 1355 1356 if (pProject) 1357 iRetVal = rpc.project_op((*pProject), "network_resume"); 1358 1359 return iRetVal; 1360 } 1361 1314 1362 int CMainDocument::ProjectNoMoreWork(int iIndex) { 1315 1363 PROJECT* pProject = NULL; 1316 1364 int iRetVal = -1; -
clientgui/MainDocument.h
229 229 int ProjectSuspend(const wxString& projectname); 230 230 int ProjectResume(int iIndex); 231 231 int ProjectResume(const wxString& projectname); 232 int ProjectSuspendNetwork(int iIndex); 233 int ProjectSuspendNetwork(const wxString& projectname); 234 int ProjectResumeNetwork(int iIndex); 235 int ProjectResumeNetwork(const wxString& projectname); 232 236 233 237 234 238 // -
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 } … … 779 813 780 814 if (transfer) { 781 815 strBuffer = wxString(transfer->project_url.c_str(), wxConvUTF8); 816 transfer->project = pDoc->state.lookup_project(transfer->project_url); 782 817 } 783 818 } 784 819 -
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
1085 1085 if (result->ready_to_report) { 1086 1086 strBuffer += _("Upload failed"); 1087 1087 } else { 1088 PROJECT* project; 1089 1088 1090 strBuffer += _("Uploading"); 1091 project = doc->state.lookup_project(result->project_url); 1092 if (project->network_suspended_via_gui) 1093 { 1094 strBuffer += _(", project networking suspended"); 1095 } 1089 1096 } 1090 1097 break; 1091 1098 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
119 119 120 120 bool master_url_fetch_pending; // need to fetch and parse the master URL 121 121 int sched_rpc_pending; // need to contact scheduling server 122 bool trickle_up_pending; // need to upload trickles 122 123 bool non_cpu_intensive; 123 124 bool suspended_via_gui; 125 bool network_suspended_via_gui; 124 126 bool dont_request_more_work; 125 127 bool scheduler_rpc_in_progress; 126 128 bool attached_via_acct_mgr; -
lib/gui_rpc_client_ops.cpp
206 206 if (parse_double(buf, "<duration_correction_factor>", duration_correction_factor)) continue; 207 207 if (parse_bool(buf, "master_url_fetch_pending", master_url_fetch_pending)) continue; 208 208 if (parse_int(buf, "<sched_rpc_pending>", sched_rpc_pending)) continue; 209 if (parse_bool(buf, "trickle_up_pending", trickle_up_pending)) continue; 209 210 if (parse_bool(buf, "non_cpu_intensive", non_cpu_intensive)) continue; 210 211 if (parse_bool(buf, "suspended_via_gui", suspended_via_gui)) continue; 212 if (parse_bool(buf, "network_suspended_via_gui", network_suspended_via_gui)) continue; 211 213 if (parse_bool(buf, "dont_request_more_work", dont_request_more_work)) continue; 212 214 if (parse_bool(buf, "ended", ended)) continue; 213 215 if (parse_bool(buf, "scheduler_rpc_in_progress", scheduler_rpc_in_progress)) continue; … … 256 258 duration_correction_factor = 0; 257 259 master_url_fetch_pending = false; 258 260 sched_rpc_pending = 0; 261 trickle_up_pending = false; 259 262 ended = false; 260 263 non_cpu_intensive = false; 261 264 suspended_via_gui = false; 265 network_suspended_via_gui = false; 262 266 dont_request_more_work = false; 263 267 scheduler_rpc_in_progress = false; 264 268 attached_via_acct_mgr = false; … … 1488 1492 } else if (!strcmp(op, "resume")) { 1489 1493 tag = "project_resume"; 1490 1494 project.suspended_via_gui = false; 1495 } else if (!strcmp(op, "network_suspend")) { 1496 tag = "project_network_suspend"; 1497 project.network_suspended_via_gui = true; 1498 } else if (!strcmp(op, "network_resume")) { 1499 tag = "project_network_resume"; 1500 project.network_suspended_via_gui = false; 1491 1501 } else if (!strcmp(op, "allowmorework")) { 1492 1502 tag = "project_allowmorework"; 1493 1503 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);