diff --git a/html/inc/prefs.inc b/html/inc/prefs.inc index 98f7e66b06..b4433b75b2 100644 --- a/html/inc/prefs.inc +++ b/html/inc/prefs.inc @@ -1,7 +1,7 @@ . -// This file contains support functions for display and editing -// preferences (global and project). +// functions for display and editing global preferences. // Preferences are represented in two ways: // - As a PHP structure (usually called $prefs) // This has fields run_if_user_active, etc. -// The fields "project_specific" is plain XML // - As XML (usually called $prefs_xml) // // This XML has the general structure @@ -37,25 +35,6 @@ // // // -// and -// -// -// 4 -// [ 0|1 ] -// [ 1 ] -// [ 1 ] -// [ 1 ] -// [ 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 @@ -65,11 +44,6 @@ ini_set('display_errors', true); ini_set('display_startup_errors', true); include_once("../inc/prefs_util.inc"); -include_once("../project/project_specific_prefs.inc"); - -$app_types = get_app_types(); - -$venues = array("home", "school", "work"); $cpu_prefs = array( new PREF_BOOL( @@ -279,105 +253,6 @@ $net_prefs = array( ), ); -$project_pref_descs = array( - new PREF_NUM( - $x = tra("Resource share") - ."
" - .tra("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. %2") - ."", - "resource_share", - new NUM_SPEC("", 0, 9999999, 100) - ), -); - -if (isset($accelerate_gpu_apps_pref) && $accelerate_gpu_apps_pref) { - $project_pref_descs[] = new PREF_BOOL( - tra("Accelerate GPU tasks by dedicating a CPU to each one?"), - "accelerate_gpu_apps", - false - ); -} - -//if ($app_types->count > 1) { - if ($app_types->cpu) { - $project_pref_descs[] = new PREF_BOOL ( - tra("Use CPU") - ."
" - .tra("Enforced by version 6.10+") - ."", - "no_cpu", - false, - true - ); - } - if ($app_types->ati) { - $project_pref_descs[] = new PREF_BOOL ( - tra("Use ATI GPU") - ."
" - .tra("Enforced by version 6.10+") - ."", - "no_ati", - false, - true - ); - } - if ($app_types->cuda) { - $project_pref_descs[] = new PREF_BOOL ( - tra("Use NVIDIA GPU") - ."
" - .tra("Enforced by version 6.10+") - ."", - "no_cuda", - false, - true - ); - } - if ($app_types->intel_gpu) { - $project_pref_descs[] = new PREF_BOOL ( - tra("Use Intel GPU") - ."
" - .tra("Enforced by version 7.2+") - ."", - "no_intel_gpu", - false, - true - ); - } -//} - -if (isset($project_has_beta) && $project_has_beta) { - $project_pref_descs[] = new PREF_BOOL( - tra("Run test applications?") - ."
" - .tra("This helps us develop applications, but may cause jobs to fail on your computer") - ."", - "allow_beta_work", - false - ); -} -if (defined("EMAIL_FROM")) { - $x = "
" - .tra("Emails will be sent from %1; make sure your spam filter accepts this address.", EMAIL_FROM) - .""; -} else { - $x = ""; -} - -$privacy_pref_descs = array ( - new PREF_BOOL( - tra("Is it OK for %1 and your team (if any) to email you?", PROJECT).$x, - "send_email", - true, - false - ), - new PREF_BOOL( - tra("Should %1 show your computers on its web site?", PROJECT), - "show_hosts", - true, - false - ), -); - define("DISK_LIMIT_DESC", tra("Disk and memory usage")); define("CPU_LIMIT_DESC", tra("Processor usage")); define("NETWORK_LIMIT_DESC", tra("Network usage")); @@ -396,7 +271,6 @@ define("PREFS_FORM_ERROR_DESC", global $text; global $parse_result; global $top_parse_result; -global $in_project_specific; global $venue_name; // get default settings for disk space usage so the default user @@ -409,7 +283,7 @@ global $venue_name; // in config.xml so the right default is set for minimum free disk space // function get_disk_space_config() { - global $config; + global $config; $config = get_config(); $dp = new StdClass; $dp->disk_max_used_gb = parse_config($config, ""); @@ -431,47 +305,8 @@ function get_disk_space_config() { return $dp; } -function check_venue($x) { - if ($x == "") return; - if ($x == "home") return; - if ($x == "work") return; - if ($x == "school") return; - error_page(tra("bad venue: %1", $x)); -} - -function check_subset($x) { - if ($x == "global") return; - if ($x == "project") return; - error_page(tra("bad subset: %1", $x)); -} - // 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; @@ -489,39 +324,6 @@ function element_start_global($parser, $name, $attrs) { $text = ""; } -function element_end_project($parser, $name) { - global $text; - global $parse_result; - global $in_project_specific; - global $top_parse_result; - global $venue_name; - global $project_pref_descs; - - foreach($project_pref_descs as $p) { - if ($p->xml_parse($parse_result, $name, $text)) { - return; - } - } - switch($name) { - case "venue": - $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 "project_preferences": - break; - default: - if ($in_project_specific) { - $text = $text.""; - } else { - //echo "Unknown tag: $name\n"; - } - } -} - function element_end_global($parser, $name) { global $text; global $parse_result; @@ -588,29 +390,8 @@ function default_prefs_global() { return $p; } -function default_prefs_project() { - global $project_pref_descs; - - $p = new StdClass; - foreach ($project_pref_descs as $pref) { - $pref->set_default($p); - } - $p->project_specific = project_specific_prefs_default(); - return $p; -} - // parse prefs from XML to a struct // -function prefs_parse_project($prefs_xml) { - global $parse_result; - $parse_result = default_prefs_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; @@ -623,106 +404,6 @@ function prefs_parse_global($prefs_xml) { return $parse_result; } -//////////////////////////////////////////// -// -// display preference subsets as Columns -// -function row_top($x, $ncols=6, $class="heading") { - echo "$x"; - echo "".tra("Default")." - ".tra("Home")." - ".tra("School")." - ".tra("Work")." - "; - echo "
\n"; -} - -// -// row_defs - Display a value for all 4 venues in one row -// -function row_defs($pre, $item, $post, $type, $prefs) { - $gen = $prefs->$item; - $hom = (isset($prefs->home) && isset($prefs->home->$item)) ? $prefs->home->$item : "--"; - $schl = (isset($prefs->school) && isset($prefs->school->$item)) ? $prefs->school->$item : "--"; - $wrk = (isset($prefs->work) && isset($prefs->work->$item)) ? $prefs->work->$item : "--"; - - echo "$pre"; - row_field($gen, $type); - row_field($hom, $type); - row_field($schl, $type); - row_field($wrk, $type); - echo "$post\n"; -} - -// -// row_field - Display each field value, with selectable display modes -// -function row_field($value, $type) { - echo ""; - $type = $value === "--" ? "--" : $type; - switch($type) { - case "yesno": - echo $value ?tra("yes"):tra("no"); - break; - case "noyes": - echo $value ?tra("no"):tra("yes"); - break; - case "limit": - $x = max_bytes_display_mode($value); - $y = "$x " . BYTE_ABBR; - echo $x ? "$y" : tra("no limit"); - break; - case "minutes": - if ($value) { - echo $value; - } else { - echo '--'; - } - break; - default: - echo $value; - break; - } - echo ""; -} - -// -// row_links - Display Edit/Add/Remove links for all venues in 1 row -// -function row_links($subset, $prefs) { - global $g_logged_in_user; - $tokens = url_tokens($g_logged_in_user->authenticator); - $pre_add = ""; - $post_edit = "&subset=$subset&cols=1$tokens>".tra("Edit").""; - $post_remove = "&subset=$subset&cols=1$tokens>".tra("Remove").""; - $gen = "".tra("Edit").""; - - $hom = isset($prefs->home) ? $pre_edit."home".$post_edit : $pre_add."home".$post_add; - $schl = isset($prefs->school) ? $pre_edit."school".$post_edit : $pre_add."school".$post_add; - $wrk = isset($prefs->work) ? $pre_edit."work".$post_edit : $pre_add."work".$post_add; - - echo " "; - echo "$gen"; - echo "$hom"; - echo "$schl"; - echo "$wrk"; - echo "
\n"; - - $hom = isset($prefs->home) ? $pre_remove."home".$post_remove : "
"; - $schl = isset($prefs->school) ? $pre_remove."school".$post_remove : "
"; - $wrk = isset($prefs->work) ? $pre_remove."work".$post_remove : "
"; - - echo " "; - echo " "; - echo "$hom"; - echo "$schl"; - echo "$wrk"; - echo "
\n"; -} - // Display all venues as columns next to descriptions // function prefs_show_columns_global($prefs) { @@ -764,44 +445,6 @@ function prefs_show_global($prefs) { } } -function prefs_show_project($prefs, $columns=false) { - global $project_pref_descs; - if ($columns) { - foreach ($project_pref_descs as $p) { - $p->show_cols($prefs); - } - } else { - foreach ($project_pref_descs as $p) { - $p->show($prefs); - } - } -} - -function prefs_show_privacy($user, $columns) { - global $privacy_pref_descs; - if ($columns) { - foreach ($privacy_pref_descs as $p) { - $p->show_cols($user); - } - } else { - foreach ($privacy_pref_descs as $p) { - $p->show($user); - } - } -} - -function prefs_show_project_specific($prefs, $columns=false) { - if ($columns) { - $project_specific_prefs = project_specific_prefs_parse($prefs->project_specific); - $project_specific_prefs->home = isset($prefs->home) ? project_specific_prefs_parse($prefs->home->project_specific) : ""; - $project_specific_prefs->work = isset($prefs->work) ? project_specific_prefs_parse($prefs->work->project_specific) : ""; - $project_specific_prefs->school = isset($prefs->school) ? project_specific_prefs_parse($prefs->school->project_specific) : ""; - } else { - $project_specific_prefs = project_specific_prefs_parse($prefs->project_specific); - } - project_specific_prefs_show($project_specific_prefs, $columns); -} - function subset_name($subset) { if ($subset == "global") return tra("Computing"); return PROJECT; @@ -834,44 +477,6 @@ function prefs_display_venue($prefs, $venue, $subset) { } } -function print_prefs_display_project($user, $columns=false) { - $project_prefs = prefs_parse_project($user->project_prefs); - - start_table(); - $switch_link = " ".tra("(Switch View)").""; - if ($columns) { - row1(tra("Combined preferences").$switch_link, 2, "heading"); - echo ""; - start_table(); - prefs_show_privacy($user, true); - venue_show($user); - row_top(tra("Project specific settings")); - prefs_show_project($project_prefs, true); - prefs_show_project_specific($project_prefs, true); - row_links("project", $project_prefs); - end_table(); - echo "\n"; - } else { - if (isset($project_prefs->home) || isset($project_prefs->work) || isset($project_prefs->school)) { - row1(tra("Primary (default) preferences").$switch_link, 2, "heading"); - } - echo ""; - start_table(); - prefs_show_project($project_prefs, false); - prefs_show_privacy($user, false); - venue_show($user); - prefs_show_project_specific($project_prefs, false); - $tokens = url_tokens($user->authenticator); - row2("", "".tra("Edit %1 preferences", PROJECT).""); - end_table(); - echo "\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); @@ -916,12 +521,6 @@ function print_prefs_display_global($user, $columns=false) { end_table(); } -function print_prefs_display($user) { - print_prefs_display_project($user); - 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: @@ -989,25 +588,6 @@ function prefs_form_global($user, $prefs, $error=false) { } } -function prefs_form_privacy($user) { - global $privacy_pref_descs; - foreach ($privacy_pref_descs as $p) { - $p->show_form_row($user, false); - } -} - -function prefs_form_project($prefs, $error=false) { - global $project_pref_descs; - foreach ($project_pref_descs as $p) { - $p->show_form_row($prefs, $error); - } -} - -function prefs_form_project_specific($prefs_xml, $error=false) { - $prefs = project_specific_prefs_parse($prefs_xml); - project_specific_prefs_edit($prefs, $error); -} - // returns a set of translated yes/no radio buttons for editing prefs forms // Example: prefs_form_radio_buttons("allow_beta_work", $user->allow_beta_work); // @@ -1073,33 +653,6 @@ function prefs_global_parse_form(&$prefs) { return $error; } -function prefs_resource_parse_form(&$prefs) { - global $project_pref_descs; - $error = false; - foreach ($project_pref_descs as $p) { - $p->parse_form($prefs, $error); - } - return $error; -} - -function prefs_privacy_parse_form(&$user) { - global $privacy_pref_descs; - $error = false; - foreach ($privacy_pref_descs as $p) { - $p->parse_form($user, $error); - } - return $error; -} - -// Parse the project specific prefs form. -// For details see project/project_specific_prefs.inc -// -function prefs_project_parse_form(&$prefs) { - $error = false; - $prefs->project_specific = project_specific_prefs_parse_form($error); - return $error; -} - //////////////////////////////////////////// // @@ -1142,37 +695,6 @@ function global_prefs_make_xml($prefs, $primary=true) { return $xml; } -// given a prefs structure, return the corresponding XML string -// -function project_prefs_make_xml($prefs, $primary=true) { - global $project_pref_descs; - $xml = ""; - if ($primary) { - $xml = "\n"; - } - foreach ($project_pref_descs as $p) { - $xml .= $p->xml_string($prefs); - } - 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 @@ -1187,16 +709,4 @@ function global_prefs_update(&$user, $prefs) { return 0; } -function project_prefs_update(&$user, $prefs) { - $prefs_xml = BoincDb::escape_string(project_prefs_make_xml($prefs)); - $send_email = $user->send_email?1:0; - $show_hosts = $user->show_hosts?1:0; - $retval = $user->update("project_prefs='$prefs_xml', send_email=$send_email, show_hosts=$show_hosts"); - if (!$retval) { - return 1; - } - $user->project_prefs = $prefs_xml; - return 0; -} - ?> diff --git a/html/inc/prefs_project.inc b/html/inc/prefs_project.inc new file mode 100644 index 0000000000..a69438859b --- /dev/null +++ b/html/inc/prefs_project.inc @@ -0,0 +1,421 @@ +. + +// functions for display and editing project preferences +// Preferences are represented in two ways: +// - As a PHP structure (usually called $prefs) +// The field "project_specific" is plain XML +// - As XML (usually called $prefs_xml) +// +// This XML has the general structure +// +// +// 4 +// [ 0|1 ] +// [ 1 ] +// [ 1 ] +// [ 1 ] +// [ 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 + +error_reporting(E_ALL); +ini_set('display_errors', true); +ini_set('display_startup_errors', true); + +include_once("../inc/prefs_util.inc"); +include_once("../project/project_specific_prefs.inc"); + +$app_types = get_app_types(); + +$project_pref_descs = array( + new PREF_NUM( + $x = tra("Resource share") + ."
" + .tra("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. %2") + ."", + "resource_share", + new NUM_SPEC("", 0, 9999999, 100) + ), +); + +if (!empty($accelerate_gpu_apps_pref)) { + $project_pref_descs[] = new PREF_BOOL( + tra("Accelerate GPU tasks by dedicating a CPU to each one?"), + "accelerate_gpu_apps", + false + ); +} + +if ($app_types->cpu) { + $project_pref_descs[] = new PREF_BOOL ( + tra("Use CPU") + ."
" + .tra("Enforced by version 6.10+") + ."", + "no_cpu", + false, + true + ); +} +if ($app_types->ati) { + $project_pref_descs[] = new PREF_BOOL ( + tra("Use ATI GPU") + ."
" + .tra("Enforced by version 6.10+") + ."", + "no_ati", + false, + true + ); +} +if ($app_types->cuda) { + $project_pref_descs[] = new PREF_BOOL ( + tra("Use NVIDIA GPU") + ."
" + .tra("Enforced by version 6.10+") + ."", + "no_cuda", + false, + true + ); +} +if ($app_types->intel_gpu) { + $project_pref_descs[] = new PREF_BOOL ( + tra("Use Intel GPU") + ."
" + .tra("Enforced by version 7.2+") + ."", + "no_intel_gpu", + false, + true + ); +} + +if (isset($project_has_beta) && $project_has_beta) { + $project_pref_descs[] = new PREF_BOOL( + tra("Run test applications?") + ."
" + .tra("This helps us develop applications, but may cause jobs to fail on your computer") + ."", + "allow_beta_work", + false + ); +} +if (defined("EMAIL_FROM")) { + $x = "
" + .tra("Emails will be sent from %1; make sure your spam filter accepts this address.", EMAIL_FROM) + .""; +} else { + $x = ""; +} + +$privacy_pref_descs = array ( + new PREF_BOOL( + tra("Is it OK for %1 and your team (if any) to email you?", PROJECT).$x, + "send_email", + true, + false + ), + new PREF_BOOL( + tra("Should %1 show your computers on its web site?", PROJECT), + "show_hosts", + true, + false + ), +); + +global $text; +global $parse_result; +global $top_parse_result; +global $in_project_specific; +global $venue_name; + +// 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_end_project($parser, $name) { + global $text; + global $parse_result; + global $in_project_specific; + global $top_parse_result; + global $venue_name; + global $project_pref_descs; + + foreach($project_pref_descs as $p) { + if ($p->xml_parse($parse_result, $name, $text)) { + return; + } + } + switch($name) { + case "venue": + $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 "project_preferences": + break; + default: + if ($in_project_specific) { + $text = $text.""; + } else { + //echo "Unknown tag: $name\n"; + } + } +} + +function default_prefs_project() { + global $project_pref_descs; + + $p = new StdClass; + foreach ($project_pref_descs as $pref) { + $pref->set_default($p); + } + $p->project_specific = project_specific_prefs_default(); + return $p; +} + +// parse prefs from XML to a struct +// +function prefs_parse_project($prefs_xml) { + global $parse_result; + $parse_result = default_prefs_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_show_project($prefs, $columns=false) { + global $project_pref_descs; + if ($columns) { + foreach ($project_pref_descs as $p) { + $p->show_cols($prefs); + } + } else { + foreach ($project_pref_descs as $p) { + $p->show($prefs); + } + } +} + +function prefs_show_privacy($user, $columns) { + global $privacy_pref_descs; + if ($columns) { + foreach ($privacy_pref_descs as $p) { + $p->show_cols($user); + } + } else { + foreach ($privacy_pref_descs as $p) { + $p->show($user); + } + } +} + +function prefs_show_project_specific($prefs, $columns=false) { + if ($columns) { + $project_specific_prefs = project_specific_prefs_parse($prefs->project_specific); + $project_specific_prefs->home = isset($prefs->home) ? project_specific_prefs_parse($prefs->home->project_specific) : ""; + $project_specific_prefs->work = isset($prefs->work) ? project_specific_prefs_parse($prefs->work->project_specific) : ""; + $project_specific_prefs->school = isset($prefs->school) ? project_specific_prefs_parse($prefs->school->project_specific) : ""; + } else { + $project_specific_prefs = project_specific_prefs_parse($prefs->project_specific); + } + project_specific_prefs_show($project_specific_prefs, $columns); +} + +function print_prefs_display_project($user, $columns=false) { + $project_prefs = prefs_parse_project($user->project_prefs); + + start_table(); + $switch_link = " ".tra("(Switch View)").""; + if ($columns) { + row1(tra("Combined preferences").$switch_link, 2, "heading"); + echo ""; + start_table(); + prefs_show_privacy($user, true); + venue_show($user); + row_top(tra("Project specific settings")); + prefs_show_project($project_prefs, true); + prefs_show_project_specific($project_prefs, true); + row_links("project", $project_prefs); + end_table(); + echo "\n"; + } else { + if (isset($project_prefs->home) || isset($project_prefs->work) || isset($project_prefs->school)) { + row1(tra("Primary (default) preferences").$switch_link, 2, "heading"); + } + echo ""; + start_table(); + prefs_show_project($project_prefs, false); + prefs_show_privacy($user, false); + venue_show($user); + prefs_show_project_specific($project_prefs, false); + $tokens = url_tokens($user->authenticator); + row2("", "".tra("Edit %1 preferences", PROJECT).""); + end_table(); + echo "\n"; + prefs_display_venue($project_prefs, "home", "project"); + prefs_display_venue($project_prefs, "school", "project"); + prefs_display_venue($project_prefs, "work", "project"); + } + end_table(); +} + +//////////////////////////////////////////// +// +// Functions to display preference subsets as forms +// + +function prefs_form_privacy($user) { + global $privacy_pref_descs; + foreach ($privacy_pref_descs as $p) { + $p->show_form_row($user, false); + } +} + +function prefs_form_project($prefs, $error=false) { + global $project_pref_descs; + foreach ($project_pref_descs as $p) { + $p->show_form_row($prefs, $error); + } +} + +function prefs_form_project_specific($prefs_xml, $error=false) { + $prefs = project_specific_prefs_parse($prefs_xml); + project_specific_prefs_edit($prefs, $error); +} + +function prefs_resource_parse_form(&$prefs) { + global $project_pref_descs; + $error = false; + foreach ($project_pref_descs as $p) { + $p->parse_form($prefs, $error); + } + return $error; +} + +function prefs_privacy_parse_form(&$user) { + global $privacy_pref_descs; + $error = false; + foreach ($privacy_pref_descs as $p) { + $p->parse_form($user, $error); + } + return $error; +} + +// Parse the project specific prefs form. +// For details see project/project_specific_prefs.inc +// +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 +// + +// given a prefs structure, return the corresponding XML string +// +function project_prefs_make_xml($prefs, $primary=true) { + global $project_pref_descs; + $xml = ""; + if ($primary) { + $xml = "\n"; + } + foreach ($project_pref_descs as $p) { + $xml .= $p->xml_string($prefs); + } + 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 project_prefs_update(&$user, $prefs) { + $prefs_xml = BoincDb::escape_string(project_prefs_make_xml($prefs)); + $send_email = $user->send_email?1:0; + $show_hosts = $user->show_hosts?1:0; + $retval = $user->update("project_prefs='$prefs_xml', send_email=$send_email, show_hosts=$show_hosts"); + if (!$retval) { + return 1; + } + $user->project_prefs = $prefs_xml; + return 0; +} + +?> diff --git a/html/inc/prefs_util.inc b/html/inc/prefs_util.inc index 1f954e7042..c1c2edf65a 100644 --- a/html/inc/prefs_util.inc +++ b/html/inc/prefs_util.inc @@ -17,7 +17,27 @@ // You should have received a copy of the GNU Lesser General Public License // along with BOINC. If not, see . -// classes for different kinds of preferences. See prefs.inc +// classes for different kinds of global preferences. See prefs.inc +// PREF_BOOL: boolean +// PREF_NUM: a number, possibly constrained to a range +// PREF_NUM2: a pair of numbers (e.g. transfer limit) +// PREF_HOUR_RANGE: a range of hours + +$venues = array("home", "school", "work"); + +function check_venue($x) { + if ($x == "") return; + if ($x == "home") return; + if ($x == "work") return; + if ($x == "school") return; + error_page(tra("bad venue: %1", $x)); +} + +function check_subset($x) { + if ($x == "global") return; + if ($x == "project") return; + error_page(tra("bad subset: %1", $x)); +} abstract class PREF { public $desc; @@ -352,4 +372,104 @@ class PREF_HOUR_RANGE extends PREF { } } +//////////////////////////////////////////// +// +// display preference subsets as Columns +// +function row_top($x, $ncols=6, $class="heading") { + echo "$x"; + echo "".tra("Default")." + ".tra("Home")." + ".tra("School")." + ".tra("Work")." + "; + echo "
\n"; +} + +// +// row_defs - Display a value for all 4 venues in one row +// +function row_defs($pre, $item, $post, $type, $prefs) { + $gen = $prefs->$item; + $hom = (isset($prefs->home) && isset($prefs->home->$item)) ? $prefs->home->$item : "--"; + $schl = (isset($prefs->school) && isset($prefs->school->$item)) ? $prefs->school->$item : "--"; + $wrk = (isset($prefs->work) && isset($prefs->work->$item)) ? $prefs->work->$item : "--"; + + echo "$pre"; + row_field($gen, $type); + row_field($hom, $type); + row_field($schl, $type); + row_field($wrk, $type); + echo "$post\n"; +} + +// +// row_field - Display each field value, with selectable display modes +// +function row_field($value, $type) { + echo ""; + $type = $value === "--" ? "--" : $type; + switch($type) { + case "yesno": + echo $value ?tra("yes"):tra("no"); + break; + case "noyes": + echo $value ?tra("no"):tra("yes"); + break; + case "limit": + $x = max_bytes_display_mode($value); + $y = "$x " . BYTE_ABBR; + echo $x ? "$y" : tra("no limit"); + break; + case "minutes": + if ($value) { + echo $value; + } else { + echo '--'; + } + break; + default: + echo $value; + break; + } + echo ""; +} + +// +// row_links - Display Edit/Add/Remove links for all venues in 1 row +// +function row_links($subset, $prefs) { + global $g_logged_in_user; + $tokens = url_tokens($g_logged_in_user->authenticator); + $pre_add = ""; + $post_edit = "&subset=$subset&cols=1$tokens>".tra("Edit").""; + $post_remove = "&subset=$subset&cols=1$tokens>".tra("Remove").""; + $gen = "".tra("Edit").""; + + $hom = isset($prefs->home) ? $pre_edit."home".$post_edit : $pre_add."home".$post_add; + $schl = isset($prefs->school) ? $pre_edit."school".$post_edit : $pre_add."school".$post_add; + $wrk = isset($prefs->work) ? $pre_edit."work".$post_edit : $pre_add."work".$post_add; + + echo " "; + echo "$gen"; + echo "$hom"; + echo "$schl"; + echo "$wrk"; + echo "
\n"; + + $hom = isset($prefs->home) ? $pre_remove."home".$post_remove : "
"; + $schl = isset($prefs->school) ? $pre_remove."school".$post_remove : "
"; + $wrk = isset($prefs->work) ? $pre_remove."work".$post_remove : "
"; + + echo " "; + echo " "; + echo "$hom"; + echo "$schl"; + echo "$wrk"; + echo "
\n"; +} + ?> diff --git a/html/user/add_venue.php b/html/user/add_venue.php index 2783c72c28..5dec83b082 100644 --- a/html/user/add_venue.php +++ b/html/user/add_venue.php @@ -18,6 +18,7 @@ require_once("../inc/util.inc"); require_once("../inc/prefs.inc"); +require_once("../inc/prefs_project.inc"); $user = get_logged_in_user(); check_tokens($user->authenticator); diff --git a/html/user/prefs.php b/html/user/prefs.php index 64cddcac6b..144b0284e9 100644 --- a/html/user/prefs.php +++ b/html/user/prefs.php @@ -18,6 +18,7 @@ require_once("../inc/util.inc"); require_once("../inc/prefs.inc"); +require_once("../inc/prefs_project.inc"); $user = get_logged_in_user(); diff --git a/html/user/prefs_edit.php b/html/user/prefs_edit.php index 305deaf49e..d99abcab30 100644 --- a/html/user/prefs_edit.php +++ b/html/user/prefs_edit.php @@ -19,6 +19,7 @@ include_once("../inc/db.inc"); include_once("../inc/util.inc"); include_once("../inc/prefs.inc"); +include_once("../inc/prefs_project.inc"); $user = get_logged_in_user(); diff --git a/html/user/prefs_remove.php b/html/user/prefs_remove.php index 0e53eb0e27..fa4109e29b 100644 --- a/html/user/prefs_remove.php +++ b/html/user/prefs_remove.php @@ -18,6 +18,7 @@ include_once("../inc/util.inc"); include_once("../inc/prefs.inc"); +include_once("../inc/prefs_project.inc"); check_get_args(array("subset", "venue", "confirmed", "cols", "tnow", "ttok"));