// Berkeley Open Infrastructure for Network Computing // http://boinc.berkeley.edu // Copyright (C) 2005 University of California // // This is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; // either version 2.1 of the License, or (at your option) any later version. // // This software is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU Lesser General Public License for more details. // // To view the GNU Lesser General Public License visit // http://www.gnu.org/copyleft/lesser.html // or write to the Free Software Foundation, Inc., // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // #ifdef _WIN32 #include "boinc_win.h" #endif #include "diagnostics.h" #include "common_defs.h" #include "util.h" #include "gui_rpc_client.h" #include "screensaver.h" // Determine if a task is active and executing // bool is_task_active(RESULT* result) { bool bIsActive = RESULT_FILES_DOWNLOADED == result->state; bool bIsDownloaded = CPU_SCHED_SCHEDULED == result->scheduler_state; bool bIsExecuting = result->active_task; if (bIsActive && bIsDownloaded && bIsExecuting) return true; return false; } int count_active_graphic_apps(RESULTS& results, std::string *exclude) { unsigned int i = 0; unsigned int graphics_app_count = 0; // Count the number of active graphics-capable apps excluding the specified result. // If exclude is NULL or an empty string, don't exclude any results. for (i = 0; i < results.results.size(); i++) { if (!is_task_active(results.results[i])) continue; BOINCTRACE(_T("get_random_graphics_app -- active task detected\n")); BOINCTRACE( _T("get_random_graphics_app -- name = '%s', path = '%s'\n"), results.results[i]->name.c_str(), results.results[i]->graphics_exec_path.c_str() ); if (results.results[i]->graphics_exec_path.size() == 0) continue; BOINCTRACE(_T("get_random_graphics_app -- active task detected w/graphics\n")); if ((exclude != NULL) && (*exclude == results.results[i]->name)) continue; graphics_app_count++; } return graphics_app_count; } // Choose a random graphics application out of the vector. // Exclude the specified result unless it is the only candidate. // If exclude is NULL or an empty string, don't exclude any results. // RESULT* get_random_graphics_app(RESULTS& results, std::string *exclude) { RESULT* rp = NULL; unsigned int i = 0; unsigned int graphics_app_count = 0; unsigned int random_selection = 0; unsigned int current_counter = 0; std::string *avoid = exclude; BOINCTRACE(_T("get_random_graphics_app -- Function Start\n")); graphics_app_count = count_active_graphic_apps(results, avoid); BOINCTRACE(_T("get_random_graphics_app -- graphics_app_count = '%d'\n"), graphics_app_count); // If no graphics app found other than the one excluded, count again without excluding any if ((0 == graphics_app_count) && (avoid != NULL) && avoid->length()) { avoid = NULL; graphics_app_count = count_active_graphic_apps(results, avoid); } // If no graphics app was found, return NULL if (0 == graphics_app_count) { goto CLEANUP; } // Choose which application to display. random_selection = (rand() % graphics_app_count) + 1; BOINCTRACE(_T("get_random_graphics_app -- random_selection = '%d'\n"), random_selection); // Lets find the chosen graphics application. for (i = 0; i < results.results.size(); i++) { if (!is_task_active(results.results[i])) continue; if (results.results[i]->graphics_exec_path.size() == 0) continue; if ((avoid != NULL) && (*avoid == results.results[i]->name)) continue; current_counter++; if (current_counter == random_selection) { rp = results.results[i]; break; } } CLEANUP: BOINCTRACE(_T("get_random_graphics_app -- Function End\n")); return rp; } // Launch the graphics application // #ifdef _WIN32 int launch_screensaver(RESULT* rp, HANDLE& graphics_application) #else int launch_screensaver(RESULT* rp, int& graphics_application) #endif { int retval = 0; char* argv[3]; argv[0] = "app_graphics"; // not used argv[1] = "--fullscreen"; argv[2] = 0; retval = run_program( rp->slot_path.c_str(), rp->graphics_exec_path.c_str(), 2, argv, 0, graphics_application ); return retval; } // Terminate the graphics application // #ifdef _WIN32 int terminate_screensaver(HANDLE& graphics_application) #else int terminate_screensaver(int& graphics_application) #endif { kill_program(graphics_application); return 0; }