// ...
//
// 1.3
// ...
//
//
// ...
//
//
//
// and
//
//
// 4
// [ 0|1 ]
//
// ... (arbitrary project-specific XML)
//
//
// ...
//
//
//
// In addition there are some fields of the user table
// (send_email and show_hosts) that are treated as project preferences
// Various functions are defined below for converting between these forms,
// and also to/from HTML form elements
include_once("../project/project_specific_prefs.inc");
// strings describing various preference fields
//
define("CPU_LIMIT_DESC", "Processor usage");
define("SUSPEND_WHILE_ON_BATTERIES_DESC",
"Suspend work while computer is on battery power?
(matters only for portable computers)"
);
define("RUN_IF_USER_ACTIVE_DESC",
"Suspend work while computer is in use?"
);
define("IDLE_TIME_TO_RUN_DESC", "'In use' means mouse/keyboard activity in last");
define("SUSPEND_IF_NO_RECENT_INPUT_DESC",
"Suspend work if no mouse/keyboard activity in last
(Needed to enter low-power mode on some computers)
Enforced by version 5.10.14+"
);
define("START_END_DESC", "Do work only between the hours of");
define("START_END_DESC2", " (no restriction if equal)");
define("LEAVE_APPS_IN_MEMORY_DESC",
"Leave applications in memory while suspended?
(suspended applications will consume swap space if 'yes')");
define("CPU_SCHEDULING_DESC", "Switch between applications every
(recommended: 60 minutes)");
define("CONFIRM_BEFORE_CONNECTING_DESC",
"Confirm before connecting to Internet?
(matters only if you have a modem, ISDN or VPN connection)"
);
define("HANGUP_IF_DIALED_DESC",
"Disconnect when done?
(matters only if you have a modem, ISDN or VPN connection)"
);
define("WORK_BUF_MIN_DAYS_DESC",
"Computer is connected to the Internet about every
(Leave blank or 0 if always connected.
BOINC will try to maintain at least this much work.)
"
);
define("WORK_BUF_ADDITIONAL_DAYS_DESC",
"Maintain enough work for an additional
Enforced by version 5.10+
"
);
define("MAX_NCPUS_PCT_DESC", "On multiprocessors, use at most Enforced by version 6.1+");
define("MAX_NCPUS_PCT_DESC2", "% of the processors");
define("MAX_CPUS_DESC", "On multiprocessors, use at most Enforced by version 5.10 and earlier");
define("MAX_CPUS_DESC2", "processors");
define("USE_AT_MOST", "Use at most");
define("USE_AT_MOST2", "Use at most (Can be used to reduce CPU heat) Enforced by version 5.6+");
define("USE_AT_MOST3", "Use at most Enforced by version 5.8+");
define("CPU_USAGE_LIMIT_DESC2", "percent of CPU time");
define("DISK_INTERVAL_DESC", "Write to disk at most every");
define("DISK_LIMIT_DESC", "Disk and memory usage");
define("DISK_MIN_FREE_GB_DESC", "Leave at least");
define("DISK_SCHED_MIN_FREE_DESC1", " (Values smaller than ");
define("DISK_SCHED_MIN_FREE_DESC2", " are ignored)");
define("DISK_MAX_USED_PCT_DESC2", "% of total disk space");
define("VM_MAX_USED_PCT_DESC2", "% of page file (swap space)");
define("RAM_MAX_USED_BUSY_PCT_DESC2", "% of memory when computer is in use");
define("RAM_MAX_USED_IDLE_PCT_DESC2", "% of memory when computer is not in use");
define("NETWORK_LIMIT_DESC", "Network usage");
define("MAX_BYTES_SEC_DOWN_DESC", "Maximum download rate:");
define("MAX_BYTES_SEC_UP_DESC", "Maximum upload rate:");
define("NET_START_END_DESC",
"Use network only between the hours of
Enforced by version 4.46+"
);
define("DONT_VERIFY_IMAGES_DESC",
"Skip image file verification?
Check this ONLY if your Internet provider
modifies image files (UMTS does this, for example).
Skipping verification reduces the security of BOINC."
);
define("BYTE_CONVERSION", 1000.0);
define("BYTE_UNITS", "Kbytes/sec");
define("BYTE_ABBR", "KB/s");
define("ALLOW_BETA_WORK",
"Run test applications? This helps us develop applications,
but may cause jobs to fail on your computer"
);
// These texts are used in multiple places in prefs_edit.php and add_venue.php
define("PREFS_FORM_DESC1", "These preferences apply to all the BOINC projects in which you participate.
");
define("PREFS_FORM_ERROR_DESC", "Unable to update preferences. The values marked in red below were out of range or not numeric.
");
global $text;
global $parse_result;
global $top_parse_result;
global $in_project_specific;
global $venue_name;
global $disk_prefs;
// get default settings for disk space usage so the default user
// preferences match the settings used by the scheduler.
// Defaults are set if the tags are missing, they depend on
// which scheduler is running:
// - 'old' has the default hardcoded
// - 'new' uses config settings
// if running the old scheduler, set
// in config.xml so the right default is set for minimum free disk space
//
$disk_prefs = null;
function get_disk_space_config() {
global $disk_prefs;
global $config;
if ($disk_prefs == null) {
$config = get_config();
$disk_prefs->disk_max_used_gb = parse_config($config, "");
$disk_prefs->disk_max_used_pct = parse_config($config, "");
$disk_prefs->disk_min_free_gb = parse_config($config, "");
// set some defaults if not found
if (!$disk_prefs->disk_max_used_gb) $disk_prefs->disk_max_used_gb = 100; // 100 gb
if (!$disk_prefs->disk_max_used_pct) $disk_prefs->disk_max_used_pct = 50; // 50 percent
if (!$disk_prefs->disk_min_free_gb) $disk_prefs->disk_min_free_gb=.001; // 1 megabyte
// set mininimum free space scheduler allows
// - depends on which scheduler is running
$disk_prefs->new_sched_flag = 1;
$disk_prefs->sched_disk_min_free_gb = $disk_prefs->disk_min_free_gb;
if (parse_config($config, "scheduler_disk_space_check_hardcoded>")) {
$disk_prefs->new_sched_flag = 0;
$disk_prefs->sched_disk_min_free_gb = 0;
}
}
return $disk_prefs;
}
function check_venue($x) {
if ($x == "home") return;
if ($x == "work") return;
if ($x == "school") return;
error_page("bad venue: $x");
}
function check_subset($x) {
if ($x == "global") return;
if ($x == "project") return;
error_page("bad subset: $x");
}
// functions to convert between max_bytes_sec_* as stored in the
// database and max_bytes_sec_* as displayed/entered on the web
// pages. Currently max_bytes_sec_* is stored in bytes and
// displayed/entered in Kbytes.
//
function max_bytes_display_mode($db_bytes) {
$disp_bytes = 0;
if ($db_bytes) {
$disp_bytes = $db_bytes / BYTE_CONVERSION;
}
return $disp_bytes;
}
function max_bytes_db_mode($disp_bytes) {
$db_bytes = 0;
if ($disp_bytes) {
$db_bytes = $disp_bytes * BYTE_CONVERSION;
}
return $db_bytes;
}
// functions to parse preferences XML into a struct
//
function element_start_project($parser, $name, $attrs) {
global $top_parse_result;
global $parse_result;
global $text;
global $in_project_specific;
global $venue_name;
switch($name) {
case "venue":
$venue_name = $attrs["name"];
$top_parse_result = $parse_result;
$parse_result = default_prefs_project();
break;
case "project_specific":
$in_project_specific = 1;
$text = "";
break;
default:
if ($in_project_specific) {
$text= $text."<$name>";
} else {
$text = "";
}
}
}
function element_start_global($parser, $name, $attrs) {
global $top_parse_result;
global $parse_result;
global $text;
global $venue_name;
switch($name) {
case "venue":
$venue_name = $attrs["name"];
$top_parse_result = $parse_result;
$parse_result = initialize_prefs_before_parsing_global();
//echo "VENUE PREFS AFTER INIT:
";
//var_dump($parse_result);
//echo "
";
break;
}
$text = "";
}
function element_end_project($parser, $name) {
global $text;
global $parse_result;
global $in_project_specific;
global $top_parse_result;
global $venue_name;
switch($name) {
case "venue":
//echo "VENUE PREFS AFTER PARSE:
";
//var_dump($parse_result);
//echo "
";
$top_parse_result->$venue_name = $parse_result;
$parse_result = $top_parse_result;
break;
case "project_specific":
$parse_result->project_specific = $text;
$in_project_specific = false;
break;
case "resource_share":
$parse_result->resource_share = $text;
break;
case "allow_beta_work":
$parse_result->allow_beta_work = $text;
$parse_result->allow_beta_work_text = $parse_result->allow_beta_work?"yes":"no";
break;
case "project_preferences":
break;
default:
if ($in_project_specific) {
$text = $text."$name>";
} else {
//echo "Unknown tag: $name\n";
}
}
}
function get_bool() {
global $text;
return (trim($text) != '0');
}
function element_end_global($parser, $name) {
global $text;
global $parse_result;
global $top_parse_result;
global $venue_name;
switch($name) {
case "venue":
$top_parse_result->$venue_name = $parse_result;
$parse_result = $top_parse_result;
break;
case "run_on_batteries":
// deprecated, but parse anyway
$parse_result->suspend_while_on_batteries = !get_bool();
break;
case "suspend_while_on_batteries":
$parse_result->suspend_while_on_batteries = get_bool();
break;
case "run_if_user_active":
$parse_result->suspend_if_user_active = false;
break;
case "idle_time_to_run":
$parse_result->idle_time_to_run = $text;
break;
case "suspend_if_no_recent_input":
$parse_result->suspend_if_no_recent_input = $text;
break;
case "start_hour":
$parse_result->start_hour = $text;
break;
case "end_hour":
$parse_result->end_hour = $text;
break;
case "leave_apps_in_memory":
$parse_result->leave_apps_in_memory = true;
break;
case "cpu_scheduling_period_minutes":
$parse_result->cpu_scheduling_period_minutes = $text;
break;
case "confirm_before_connecting":
$parse_result->confirm_before_connecting = true;
break;
case "hangup_if_dialed":
$parse_result->hangup_if_dialed = true;
break;
case "work_buf_min_days":
$parse_result->work_buf_min_days = $text;
break;
case "work_buf_additional_days":
$parse_result->work_buf_additional_days = $text;
break;
case "max_cpus":
$parse_result->max_cpus = $text;
break;
case "max_ncpus_pct":
$parse_result->max_ncpus_pct = $text;
break;
case "cpu_usage_limit":
if (!$text) $text=100;
$parse_result->cpu_usage_limit = $text;
break;
case "disk_interval":
$parse_result->disk_interval = $text;
break;
case "disk_max_used_gb":
$parse_result->disk_max_used_gb = $text;
break;
case "disk_max_used_pct":
$parse_result->disk_max_used_pct = $text;
break;
case "disk_min_free_gb":
$parse_result->disk_min_free_gb = $text;
break;
case "vm_max_used_pct":
$parse_result->vm_max_used_pct = $text;
break;
case "ram_max_used_busy_pct":
$parse_result->ram_max_used_busy_pct = $text;
break;
case "ram_max_used_idle_pct":
$parse_result->ram_max_used_idle_pct = $text;
break;
case "max_bytes_sec_down":
$parse_result->max_bytes_sec_down = $text;
break;
case "max_bytes_sec_up":
$parse_result->max_bytes_sec_up = $text;
break;
case "net_start_hour":
$parse_result->net_start_hour = $text;
break;
case "net_end_hour":
$parse_result->net_end_hour = $text;
break;
case "dont_verify_images":
$parse_result->dont_verify_images = true;
break;
case "mod_time":
$parse_result->mod_time = $text;
break;
case "global_preferences":
break;
default:
//echo "Unknown tag: $name\n";
}
}
function char_handler($parser, $x) {
global $text;
$text = $text.$x;
}
// state of prefs for new users
//
function default_prefs_global() {
$p = null;
$p->suspend_while_on_batteries = true;
$p->suspend_if_user_active = false;
$p->idle_time_to_run = 3;
$p->suspend_if_no_recent_input = 0;
$p->start_hour = 0;
$p->end_hour = 0;
$p->leave_apps_in_memory = false;
$p->cpu_scheduling_period_minutes = 60;
$p->confirm_before_connecting = false;
$p->hangup_if_dialed = true;
$p->work_buf_min_days = 0;
$p->work_buf_additional_days = 0.25;
$p->max_cpus = 16;
$p->max_ncpus_pct = 100;
$p->cpu_usage_limit = 100;
$p->disk_interval = 60;
$dp = get_disk_space_config();
$p->disk_max_used_gb = $dp->disk_max_used_gb;
$p->disk_max_used_pct = $dp->disk_max_used_pct;
$p->disk_min_free_gb = $dp->disk_min_free_gb;
$p->vm_max_used_pct = 75;
$p->ram_max_used_busy_pct = 50;
$p->ram_max_used_idle_pct = 90;
$p->max_bytes_sec_down = 0;
$p->max_bytes_sec_up = 0;
$p->net_start_hour = 0;
$p->net_end_hour = 0;
$p->dont_verify_images = false;
return $p;
}
function default_prefs_project() {
$p = null;
$p->resource_share = 100;
$p->allow_beta_work = false;
$p->allow_beta_work_text = "no";
$p->project_specific = project_specific_prefs_default();
return $p;
}
// state of prefs before parsing; initialize booleans
//
function initialize_prefs_before_parsing_global() {
$p = default_prefs_global();
$p->suspend_while_on_batteries = true;
$p->suspend_if_user_active = true;
$p->leave_apps_in_memory = false;
$p->confirm_before_connecting = false;
$p->hangup_if_dialed = false;
$p->dont_verify_images = false;
return $p;
}
function initialize_prefs_before_parsing_project() {
$p = default_prefs_project();
return $p;
}
// parse prefs from XML to a struct
//
function prefs_parse_project($prefs_xml) {
global $parse_result;
$parse_result = initialize_prefs_before_parsing_project();
$xml_parser = xml_parser_create();
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 0);
xml_set_element_handler($xml_parser, "element_start_project", "element_end_project");
xml_set_character_data_handler($xml_parser, "char_handler");
xml_parse($xml_parser, $prefs_xml, 1);
return $parse_result;
}
function prefs_parse_global($prefs_xml) {
global $parse_result;
$parse_result = initialize_prefs_before_parsing_global();
//echo "AFTER INIT:
\n";
prefs_display_venue($project_prefs, "home", "project");
prefs_display_venue($project_prefs, "school", "project");
prefs_display_venue($project_prefs, "work", "project");
}
end_table();
}
function print_prefs_display_global($user, $columns=false) {
$global_prefs = prefs_parse_global($user->global_prefs);
echo "
These apply to all BOINC projects in which you participate.
On computers attached to multiple projects,
the most recently modified preferences will be used.
";
if (isset($global_prefs->mod_time)) {
echo "
Preferences last modified: ", pretty_time_str($global_prefs->mod_time), "
";
}
echo "
\n";
print_prefs_display_global($user);
}
// This functions is used in prefs_edit.php to be able to display
// the prefs form in case of an error again.
// $error and $project_error should be an object of the form:
// $error->idle_time_to_run=true if an error occurred
// otherwise false
//
function print_prefs_form(
$action, $subset, $venue, $user, $prefs, $cols, $error=false,
$project_error=false
){
global $project_has_beta;
if ($action == "add") {
$script = "add_venue.php";
$submit_value = "Add preferences";
}
if ($action == "edit") {
$script = "prefs_edit.php";
$submit_value = "Update preferences";
}
echo "\n";
}
////////////////////////////////////////////
//
// Functions to display preference subsets as forms
//
function prefs_form_global($user, $prefs, $error=false) {
//echo "IN PREFS_FORM_GLOBAL:
";
//var_dump($prefs);
//echo "
";
row1(CPU_LIMIT_DESC);
$y = "yes suspend_while_on_batteries?"checked":"")
."> no suspend_while_on_batteries?"":"checked")
.">
";
row2(SUSPEND_WHILE_ON_BATTERIES_DESC, $y);
$y = "yes suspend_if_user_active?"checked":"")
."> no suspend_if_user_active?"":"checked")
.">
";
row2(RUN_IF_USER_ACTIVE_DESC, $y);
$y = " minutes ";
$show_error = false;
if (isset($error->idle_time_to_run)) $show_error= true;
row2(IDLE_TIME_TO_RUN_DESC, $y, $show_error);
$y = " minutes ";
$show_error = false;
if (isset($error->suspend_if_no_recent_input)) $show_error= true;
row2(SUSPEND_IF_NO_RECENT_INPUT_DESC, $y, $show_error);
$x = START_END_DESC.START_END_DESC2;
$y = hour_select($prefs->start_hour, "start_hour")."and".hour_select($prefs->end_hour, "end_hour");
row2($x, $y);
$x = LEAVE_APPS_IN_MEMORY_DESC;
$y = "yes leave_apps_in_memory?"checked":"")
."> no leave_apps_in_memory?"":"checked")
.">
";
row2($x, $y);
$y = " minutes ";
$show_error = false;
if (isset($error->cpu_scheduling_period_minutes)) $show_error= true;
row2(CPU_SCHEDULING_DESC, $y, $show_error);
$show_error = false;
if (isset($error->max_cpus)) $show_error= true;
row2(MAX_CPUS_DESC,
"max_cpus> ".MAX_CPUS_DESC2,
$show_error
);
$show_error = false;
if (isset($error->max_ncpus_pct)) $show_error= true;
row2(MAX_NCPUS_PCT_DESC,
"max_ncpus_pct> ".MAX_NCPUS_PCT_DESC2,
$show_error
);
$show_error = false;
if (isset($error->cpu_usage_limit)) $show_error= true;
row2(USE_AT_MOST2,
"cpu_usage_limit> ".CPU_USAGE_LIMIT_DESC2,
$show_error
);
row1(DISK_LIMIT_DESC);
$show_error = false;
if (isset($error->disk_max_used_gb)) $show_error= true;
row2(USE_AT_MOST,
" Gbytes",
$show_error
);
$dp = get_disk_space_config();
$msg=null;
if ($dp->new_sched_flag) {
$msg = DISK_SCHED_MIN_FREE_DESC1.$dp->sched_disk_min_free_gb.DISK_SCHED_MIN_FREE_DESC2;
}
$show_error = false;
if (isset($error->disk_min_free_gb)) $show_error= true;
row2(DISK_MIN_FREE_GB_DESC.$msg,
" Gbytes free",
$show_error
);
$show_error = false;
if (isset($error->disk_max_used_pct)) $show_error= true;
row2(USE_AT_MOST,
" ".DISK_MAX_USED_PCT_DESC2,
$show_error
);
$show_error = false;
if (isset($error->disk_interval)) $show_error= true;
row2(DISK_INTERVAL_DESC,
"disk_interval> seconds",
$show_error
);
$show_error = false;
if (isset($error->vm_max_used_pct)) $show_error= true;
row2(USE_AT_MOST,
" ".VM_MAX_USED_PCT_DESC2,
$show_error
);
$show_error = false;
if (isset($error->ram_max_used_busy_pct)) $show_error= true;
row2(USE_AT_MOST3,
" ".RAM_MAX_USED_BUSY_PCT_DESC2,
$show_error
);
$show_error = false;
if (isset($error->ram_max_used_idle_pct)) $show_error= true;
row2(USE_AT_MOST3,
" ".RAM_MAX_USED_IDLE_PCT_DESC2,
$show_error
);
row1(NETWORK_LIMIT_DESC);
$x = WORK_BUF_MIN_DAYS_DESC;
$y = " days";
$show_error = false;
if (isset($error->work_buf_min_days)) $show_error= true;
row2($x, $y, $show_error);
$x = WORK_BUF_ADDITIONAL_DAYS_DESC;
$y = " days";
$show_error = false;
if (isset($error->work_buf_additional_days)) $show_error= true;
row2($x, $y, $show_error);
$x = CONFIRM_BEFORE_CONNECTING_DESC;
$y = "yes confirm_before_connecting?"checked":"")
."> no confirm_before_connecting?"":"checked")
.">
";
row2($x, $y);
$x = HANGUP_IF_DIALED_DESC;
$y = "yes hangup_if_dialed?"checked":"")
."> no hangup_if_dialed?"":"checked")
.">
";
row2($x, $y);
$d = max_bytes_display_mode($prefs->max_bytes_sec_down);
$dt = $d?"$d":"";
$u = max_bytes_display_mode($prefs->max_bytes_sec_up);
$ut = $u?"$u":"";
$show_error = false;
if (isset($error->max_bytes_sec_down)) $show_error= true;
row2(MAX_BYTES_SEC_DOWN_DESC,
" " . BYTE_UNITS,
$show_error
);
$show_error = false;
if (isset($error->max_bytes_sec_up)) $show_error= true;
row2(MAX_BYTES_SEC_UP_DESC,
" " . BYTE_UNITS,
$show_error
);
$x = NET_START_END_DESC.START_END_DESC2;
$y = hour_select($prefs->net_start_hour, "net_start_hour")."and".hour_select($prefs->net_end_hour, "net_end_hour");
row2($x, $y);
$x = DONT_VERIFY_IMAGES_DESC;
$y = "yes dont_verify_images?"checked":"")
."> no dont_verify_images?"":"checked")
.">
";
row2($x, $y);
}
function prefs_form_privacy($user) {
$y = "yes send_email?"checked":"")
."> no send_email?"":"checked")
.">
";
row2("Is it OK for ".PROJECT." and your team (if any) to email you?", $y);
$y = "yes show_hosts?"checked":"")
."> no show_hosts?"":"checked")
.">
";
row2("Should ".PROJECT." show your computers on its web site?", $y);
}
function prefs_form_resource($prefs, $error=false) {
$show_error = false;
if (isset($error->resource_share)) $show_error= true;
row2(
"Resource share: Determines the proportion of your computer's resources
allocated to this project.
Example: if you participate in two BOINC projects with
resource shares of 100 and 200,
the first will get 1/3 of your resources and the second will get 2/3.
",
"",
$show_error
);
}
function prefs_form_beta($prefs, $error=false) {
$ychecked = $prefs->allow_beta_work?"checked":"";
$nchecked = $prefs->allow_beta_work?"":"checked";
row2(
ALLOW_BETA_WORK,
"yes
no "
);
}
function prefs_form_project($prefs_xml, $error=false) {
$prefs = project_specific_prefs_parse($prefs_xml);
project_specific_prefs_edit($prefs, $error);
}
function venue_show($user) {
$venue = $user->venue;
if ($venue =='') $venue = '---';
row2("Default computer location", $venue);
}
function venue_form($user) {
$n=$h=$w=$s='';
if ($user->venue == '') $n = 'selected';
if ($user->venue == 'home') $h = 'selected';
if ($user->venue == 'work') $w = 'selected';
if ($user->venue == 'school') $s = 'selected';
row2('Default computer location',
""
);
}
function venue_parse_form(&$user) {
$user->venue = $_GET['default_venue'];
}
function venue_update($user) {
mysql_query("update user set venue='$user->venue' where id=$user->id");
}
////////////////////////////////////////////
//
// Functions to parse form elements, modifying a preferences structure
// prefs is preferences object to modify
// returns an object with errorvalues or false in success case
//
function prefs_global_parse_form(&$prefs) {
$error = false;
$suspend_while_on_batteries = $_GET["suspend_while_on_batteries"];
$suspend_if_user_active = $_GET["suspend_if_user_active"];
$idle_time_to_run = $_GET["idle_time_to_run"];
$suspend_if_no_recent_input = $_GET["suspend_if_no_recent_input"];
$start_hour = $_GET["start_hour"];
$end_hour = $_GET["end_hour"];
$leave_apps_in_memory = $_GET["leave_apps_in_memory"];
$cpu_scheduling_period_minutes = $_GET["cpu_scheduling_period_minutes"];
$max_cpus = $_GET["max_cpus"];
$max_ncpus_pct = $_GET["max_ncpus_pct"];
$cpu_usage_limit = $_GET["cpu_usage_limit"];
$disk_max_used_gb = $_GET["disk_max_used_gb"];
$disk_min_free_gb = $_GET["disk_min_free_gb"];
$disk_max_used_pct = $_GET["disk_max_used_pct"];
$disk_interval = $_GET["disk_interval"];
$vm_max_used_pct = $_GET["vm_max_used_pct"];
$ram_max_used_busy_pct = $_GET["ram_max_used_busy_pct"];
$ram_max_used_idle_pct = $_GET["ram_max_used_idle_pct"];
$work_buf_min_days = $_GET["work_buf_min_days"];
$work_buf_additional_days = $_GET["work_buf_additional_days"];
$confirm_before_connecting = $_GET["confirm_before_connecting"];
$hangup_if_dialed = $_GET["hangup_if_dialed"];
$max_bytes_sec_down = $_GET["max_bytes_sec_down"];
$max_bytes_sec_up = $_GET["max_bytes_sec_up"];
$net_start_hour = $_GET["net_start_hour"];
$net_end_hour = $_GET["net_end_hour"];
$dont_verify_images = $_GET["dont_verify_images"];
// Verification of all user input values
if (!verify_numeric($idle_time_to_run, 1)) $error->idle_time_to_run = true;
if (!verify_numeric($suspend_if_no_recent_input, 0)) $error->suspend_if_no_recent_input = true;
if (!verify_numeric($start_hour, 0)) $error->start_hour = true;
if (!verify_numeric($end_hour, 0)) $error->end_hour = true;
if (!verify_numeric($cpu_scheduling_period_minutes, 1)) $error->cpu_scheduling_period_minutes = true;;
if (!verify_numeric($max_cpus, 0)) $error->max_cpus = true;
if (!verify_numeric($max_ncpus_pct, 0, 100)) $error->max_ncpus_pct = true;
if (!verify_numeric($cpu_usage_limit, 0, 100)) $error->cpu_usage_limit = true;
if (!verify_numeric($disk_max_used_gb, 0)) $error->disk_max_used_gb = true;
if (!verify_numeric($disk_min_free_gb, 0.001)) $error->disk_min_free_gb = true;
if (!verify_numeric($disk_max_used_pct, 0, 100)) $error->disk_max_used_pct = true;
if (!verify_numeric($disk_interval, 0)) $error->disk_interval = true;
if (!verify_numeric($vm_max_used_pct, 0, 100)) $error->vm_max_used_pct = true;
if (!verify_numeric($ram_max_used_busy_pct, 0, 100)) $error->ram_max_used_busy_pct = true;
if (!verify_numeric($ram_max_used_idle_pct, 0, 100)) $error->ram_max_used_idle_pct = true;
if (!verify_numeric($work_buf_min_days, 0, 10)) $error->work_buf_min_days = true;
if (!verify_numeric($work_buf_additional_days, 0, 10)) $error->work_buf_additional_days = true;
if (!verify_numeric($max_bytes_sec_down, '')) $error->max_bytes_sec_down = true;
if (!verify_numeric($max_bytes_sec_up, '')) $error->max_bytes_sec_up = true;
if (!verify_numeric($net_start_hour, 0)) $error->net_start_hour = true;
if (!verify_numeric($net_end_hour, 0)) $error->net_end_hour = true;
// Modify all values within the supplied Object
$prefs->suspend_while_on_batteries = ($suspend_while_on_batteries == "yes");
$prefs->suspend_if_user_active = ($suspend_if_user_active == "yes");
$prefs->idle_time_to_run = $idle_time_to_run;
$prefs->suspend_if_no_recent_input = $suspend_if_no_recent_input;
$prefs->start_hour = $start_hour;
$prefs->end_hour = $end_hour;
$prefs->leave_apps_in_memory = ($leave_apps_in_memory == "yes");
$prefs->cpu_scheduling_period_minutes = $cpu_scheduling_period_minutes;
$prefs->max_cpus = $max_cpus;
$prefs->max_ncpus_pct = $max_ncpus_pct;
$prefs->cpu_usage_limit = $cpu_usage_limit;
$prefs->disk_max_used_gb = $disk_max_used_gb;
$prefs->disk_min_free_gb = $disk_min_free_gb;
$prefs->disk_max_used_pct = $disk_max_used_pct;
$prefs->disk_interval = $disk_interval;
$prefs->vm_max_used_pct = $vm_max_used_pct;
$prefs->ram_max_used_busy_pct = $ram_max_used_busy_pct;
$prefs->ram_max_used_idle_pct = $ram_max_used_idle_pct;
$prefs->work_buf_min_days = $work_buf_min_days;
$prefs->work_buf_additional_days = $work_buf_additional_days;
$prefs->confirm_before_connecting = ($confirm_before_connecting == "yes");
$prefs->hangup_if_dialed = ($hangup_if_dialed == "yes");
$prefs->max_bytes_sec_down = max_bytes_db_mode($max_bytes_sec_down);
$prefs->max_bytes_sec_up = max_bytes_db_mode($max_bytes_sec_up);
$prefs->net_start_hour = $net_start_hour;
$prefs->net_end_hour = $net_end_hour;
$prefs->dont_verify_images = ($dont_verify_images == "yes");
return $error;
}
// This functions parses and verifies the resource value
// @param object &$prefs reference to object that stores prefs
// @return object an object with errorvalues or false in success case
function prefs_resource_parse_form(&$prefs) {
$error = false;
$resource_share = $_GET['resource_share'];
if (!verify_numeric($resource_share, 0)) $error->resource_share = true;
$prefs->resource_share = $resource_share;
return $error;
}
function prefs_beta_parse_form(&$prefs) {
$prefs->allow_beta_work = false;
$prefs->allow_beta_work_text = "no";
$x = $_GET['allow_beta_work'];
if ($x) {
$prefs->allow_beta_work = true;
$prefs->allow_beta_work_text = "yes";
}
}
function prefs_privacy_parse_form(&$user) {
$user->send_email = ($_GET['send_email'] == "yes")?1:0;
$user->show_hosts = ($_GET['show_hosts'] == "yes")?1:0;
}
// This function parses the project specific prefs form.
// For details look into project/project_specific_prefs.inc
// @param object &$prefs refernce to preference object
// @return object an object with errorvalues or false in success case
function prefs_project_parse_form(&$prefs) {
$error = false;
$prefs->project_specific = project_specific_prefs_parse_form($error);
return $error;
}
////////////////////////////////////////////
//
// convert prefs from structure to XML
//
function global_prefs_make_xml($prefs, $primary=true) {
// N.B.: each XML entry must end with \n due to the sloppy parsing by the
// BOINC client!!
$xml = "";
if ($primary) {
$xml = "\n";
$now = time();
$xml = $xml."$now\n";
}
if (!$prefs->suspend_while_on_batteries) {
$xml = $xml."\n";
}
if (!$prefs->suspend_if_user_active) {
$xml = $xml."\n";
}
$xml = $xml."$prefs->idle_time_to_run\n";
$xml = $xml."$prefs->suspend_if_no_recent_input\n";
if ($prefs->start_hour != $prefs->end_hour) {
$xml = $xml."$prefs->start_hour\n"
."$prefs->end_hour\n";
}
if ($prefs->leave_apps_in_memory) {
$xml = $xml."\n";
}
$xml = $xml."$prefs->cpu_scheduling_period_minutes\n";
if ($prefs->confirm_before_connecting) {
$xml = $xml."\n";
}
if ($prefs->hangup_if_dialed) {
$xml = $xml."\n";
}
$xml = $xml
."$prefs->work_buf_min_days\n"
."$prefs->work_buf_additional_days\n"
."$prefs->max_cpus\n"
."$prefs->max_ncpus_pct\n"
."$prefs->cpu_usage_limit\n"
."$prefs->disk_interval\n";
$xml = $xml
."$prefs->disk_max_used_gb\n"
."$prefs->disk_max_used_pct\n"
."$prefs->disk_min_free_gb\n"
."$prefs->vm_max_used_pct\n"
."$prefs->ram_max_used_busy_pct\n"
."$prefs->ram_max_used_idle_pct\n"
."$prefs->max_bytes_sec_down\n"
."$prefs->max_bytes_sec_up\n";
if ($prefs->net_start_hour != $prefs->net_end_hour) {
$xml = $xml."$prefs->net_start_hour\n"
."$prefs->net_end_hour\n";
}
if ($prefs->dont_verify_images) {
$xml = $xml."\n";
}
if (isset($prefs->home)) {
$xml = $xml."\n".global_prefs_make_xml($prefs->home, false)."\n";
}
if (isset($prefs->work)) {
$xml = $xml."\n".global_prefs_make_xml($prefs->work, false)."\n";
}
if (isset($prefs->school)) {
$xml = $xml."\n".global_prefs_make_xml($prefs->school, false)."\n";
}
if ($primary) {
$xml = $xml."\n";
}
return $xml;
}
// given a prefs structure, return the corresponding XML string
//
function project_prefs_make_xml($prefs, $primary=true) {
$xml = "";
if ($primary) {
$xml = "\n";
}
if ($prefs->resource_share) {
$xml = $xml
."$prefs->resource_share\n";
}
if ($prefs->allow_beta_work) {
$xml = $xml . "1\n";
}
if ($prefs->project_specific) {
$x = trim($prefs->project_specific);
$xml = $xml
."\n$x\n\n";
}
if (isset($prefs->home)) {
$xml = $xml."\n".project_prefs_make_xml($prefs->home, false)."\n";
}
if (isset($prefs->work)) {
$xml = $xml."\n".project_prefs_make_xml($prefs->work, false)."\n";
}
if (isset($prefs->school)) {
$xml = $xml."\n".project_prefs_make_xml($prefs->school, false)."\n";
}
if ($primary) {
$xml = $xml."\n";
}
return $xml;
}
////////////////////////////////////////////
//
// Update user's prefs in database, from a given structure
//
function global_prefs_update(&$user, $prefs) {
$prefs_xml = global_prefs_make_xml($prefs);
$query = "update user set global_prefs='$prefs_xml' where id=$user->id";
$retval = mysql_query($query);
if (!$retval) {
echo "Update failed: ".htmlspecialchars($query)."\n";
echo mysql_error();
exit();
}
$user->global_prefs = $prefs_xml;
return $retval;
}
function project_prefs_update(&$user, $prefs) {
$prefs_xml = project_prefs_make_xml($prefs);
$retval = mysql_query("update user set project_prefs='$prefs_xml', send_email=$user->send_email, show_hosts=$user->show_hosts where id=$user->id");
$user->project_prefs = $prefs_xml;
return $retval;
}
?>