// ... // // 1.3 // ... // // // ... // // // // and // // // 4 // // ... (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("RUN_ON_BATTERIES_DESC", "Do work while computer is running on batteries?
(matters only for portable computers)" ); define("RUN_IF_USER_ACTIVE_DESC", "Do work while computer is in use?" ); define("IDLE_TIME_TO_RUN_DESC", "Do work only after computer is idle for"); define("IDLE_TIME_TO_RUN_DESC2", "
(applies only if above is 'no')"); 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 preempted?
(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 use a modem)" ); define("HANGUP_IF_DIALED_DESC", "Disconnect when done?
(matters only if you use a modem)" ); define("WORK_BUF_DESC", "Connect to network about every
(determines size of work cache; maximum 10 days) " ); define("MAX_CPUS_DESC", "On multiprocessors, use at most"); define("MAX_CPUS_DESC2", "processors"); define("DISK_INTERVAL_DESC", "Write to disk at most every"); define("DISK_LIMIT_DESC", "Disk and memory usage"); define("DISK_MAX_USED_GB_DESC", "Use no more than"); define("DISK_MIN_FREE_GB_DESC", "Leave at least"); define("DISK_MAX_USED_PCT_DESC", "Use no more than"); define("DISK_MAX_USED_PCT_DESC2", "% of total disk space"); define("VM_MAX_USED_PCT_DESC", "Use no more than"); define("VM_MAX_USED_PCT_DESC2", "% of total virtual memory"); 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("BYTE_CONVERSION", 1000.0); define("BYTE_UNITS", "Kbytes/sec"); define("BYTE_ABBR", "KB/s"); define("MISC_DESC", "Miscellaneous"); global $text; global $parse_result; global $top_parse_result; global $in_project_specific; global $venue_name; 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 = null; 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 = null; 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": $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 "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; 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": $parse_result->run_on_batteries = true; break; case "run_if_user_active": $parse_result->run_if_user_active = true; break; case "idle_time_to_run": $parse_result->idle_time_to_run = $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 "max_cpus": $parse_result->max_cpus = $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 "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 "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->run_on_batteries = false; $p->run_if_user_active = true; $p->idle_time_to_run = 3; $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 = .1; $p->max_cpus = 2; $p->disk_interval = 60; $p->disk_max_used_gb = 100; $p->disk_max_used_pct = 50; $p->disk_min_free_gb = 0.1; $p->vm_max_used_pct = 75; $p->max_bytes_sec_down = 0; $p->max_bytes_sec_up = 0; return $p; } function default_prefs_project() { $p = null; $p->resource_share = 100; $p->project_specific = project_specific_prefs_default(); return $p; } // state of prefs before parsing; initialize all booleans to false // function initialize_prefs_before_parsing_global() { $p = default_prefs_global(); $p->run_on_batteries = false; $p->run_if_user_active = false; $p->leave_apps_in_memory = false; $p->confirm_before_connecting = false; $p->hangup_if_dialed = 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(); $xml_parser = xml_parser_create(); xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 0); xml_set_element_handler($xml_parser, "element_start_global", "element_end_global"); xml_set_character_data_handler($xml_parser, "char_handler"); xml_parse($xml_parser, $prefs_xml, 1); return $parse_result; } function hour_str($x) { return "$x:00"; } function hour_select($x, $name) { $s = ""; $s = $s. "\n"; return $s; } //////////////////////////////////////////// // // display preference subsets // function row_top($x, $ncols=6, $class="heading") { echo "$x"; echo "GeneralHomeSchoolWork"; echo "
\n"; } // // hour_range - Produce range string for given venue // function hour_range($venue) { if ($venue->start_hour == $venue->end_hour) { $x = "(no restriction)"; } else { $s = hour_str($venue->start_hour); $e = hour_str($venue->end_hour); $x = "$s
to $e"; } return $x; } // // row_defs - Display a value for all 4 venues in one row // function row_defs($pre, $item, $post, $type) { $gen = $global_prefs->$line; $hom = $project_prefs->home ? $global_prefs->home->$line : "--"; $schl = $project_prefs->school ? $global_prefs->school->$line : "--"; $wrk = $project_prefs->work ? $global_prefs->work->$line : "--"; echo "$pre"; row_field($gen, $type); row_field($hom, $type); row_field($schl, $type); row_field($wrk, $type); echo "$post\n"; } // // row_hours - Display start & end hours for all venues in 1 row // function row_hours($pre) { $gen = hour_range($global_prefs); $hom = $project_prefs->home ? hour_range($global_prefs->home) : "--"; $schl = $project_prefs->school ? hour_range($global_prefs->school) : "--"; $wrk = $project_prefs->work ? hour_range($global_prefs->work) : "--"; echo "$pre"; row_field($gen, ""); row_field($hom, ""); row_field($schl, ""); row_field($wrk, ""); echo "
\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 ?"yes":"no"; break; case "limit": $x = max_bytes_display_mode($value); $y = "$x " . BYTE_ABBR; echo $x ? "$y" : "no limit"; break; case "--"; default: echo $value; break; } echo ""; } // // row_links - Display start & end hours for all venues in 1 row // function row_links($page, $text, $subset) { $pre = "home ? $hom :"
"; $schl = $project_prefs->school ? $schl:"
"; $wrk = $project_prefs->work ? $wrk :"
"; } echo "$pre"; echo "$gen"; echo "$hom"; echo "$schl"; echo "$wrk"; echo "
\n"; } // // prefs_show_columns - Display all venues as columns next to descriptions // function prefs_show_columns() { row_top(CPU_LIMIT_DESC); row_defs(RUN_ON_BATTERIES_DESC, "run_on_batteries", "", "yesno"); row_defs(RUN_IF_USER_ACTIVE_DESC, "run_if_user_active", "", "yesno"); row_defs(IDLE_TIME_TO_RUN_DESC, "idle_time_to_run", " minutes", ""); row_hours(START_END_DESC); row_defs(LEAVE_APPS_IN_MEMORY_DESC, "leave_apps_in_memory", "", "yesno"); row_defs(CPU_SCHEDULING_DESC, "cpu_scheduling_period_minutes", " minutes", ""); row_defs(MAX_CPUS_DESC, "max_cpus", MAX_CPUS_DESC2, ""); row_top(DISK_LIMIT_DESC); row_defs(DISK_MAX_USED_GB_DESC, "disk_max_used_gb", " GB disk space", ""); row_defs(DISK_MIN_FREE_GB_DESC, "disk_min_free_gb", " GB disk space free", ""); row_defs(DISK_MAX_USED_PCT_DESC, "disk_max_used_pct", DISK_MAX_USED_PCT_DESC2, ""); row_defs(DISK_INTERVAL_DESC, "disk_interval", " seconds", ""); row_defs(VM_MAX_USED_PCT_DESC, "vm_max_used_pct", VM_MAX_USED_PCT_DESC2, ""); row_top(NETWORK_LIMIT_DESC); row_defs(WORK_BUF_DESC, "work_buf_min_days", " days", ""); row_defs(CONFIRM_BEFORE_CONNECTING_DESC, "confirm_before_connecting", "", "yesno"); row_defs(HANGUP_IF_DIALED_DESC, "hangup_if_dialed", "", "yesno"); row_defs(MAX_BYTES_SEC_DOWN_DESC, "max_bytes_sec_down", "", "limit"); row_defs(MAX_BYTES_SEC_UP_DESC, "max_bytes_sec_up", "", "limit"); row_links("prefs_edit.php","Edit", "project"); row_links("prefs_remove.php","Remove", "project"); } function prefs_show_resource($prefs) { row2( "Resource share
If you participate in multiple BOINC projects, this is the proportion of your resources used by ".PROJECT."", $prefs->resource_share ); } function prefs_show_privacy($user) { row1(MISC_DESC); row2("Should ".PROJECT." send you email newsletters?", $user->send_email?"yes":"no"); row2("Should ".PROJECT." show your computers on its web site?", $user->show_hosts?"yes":"no"); } function prefs_show_project($prefs) { $project_specific_prefs = project_specific_prefs_parse($prefs->project_specific); project_specific_prefs_show($project_specific_prefs); } function subset_name($subset) { if ($subset == "global") return "General"; return PROJECT; } function prefs_display_venue($prefs, $venue, $subset) { $x = $prefs->$venue; if ($x) { row1("Separate preferences for $venue", 2, "heading2"); echo ""; start_table(); if ($subset == "global") { prefs_show_global($x); } else { prefs_show_resource($x); prefs_show_project($x); } row2("
", "
Edit preferences | Remove"); end_table(); echo "\n"; } else { //$x = subset_name($subset); row1("Add separate preferences for $venue", 2, "heading2"); } } function print_prefs_display_project($user) { $project_prefs = prefs_parse_project($user->project_prefs); start_table(); if ($project_prefs->home || $project_prefs->work || $project_prefs->school) { row1("Primary (default) preferences", 2, "heading2"); } echo ""; start_table("width=100% border=4"); prefs_show_resource($project_prefs); prefs_show_project($project_prefs); prefs_show_privacy($user); venue_show($user); row2("", "Edit ".PROJECT." preferences"); 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(); } // // print_prefs_display_global - Display all of user's venue preferences in columns // function print_prefs_display_global($user) { $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.


Preferences last modified: ", pretty_time_str($global_prefs->mod_time), "

"; start_table(); row1("Combined preferences", 2, "heading2"); echo ""; start_table("width=100% border=4"); prefs_show_columns(); end_table(); echo "\n"; end_table(); } function print_prefs_display($user) { print_prefs_display_project($user); echo "

\n"; print_prefs_display_global($user); } //////////////////////////////////////////// // // Functions to display preference subsets as forms // function prefs_form_global($user, $prefs) { row1(CPU_LIMIT_DESC); $y = "yes run_on_batteries?"checked":"") ."> no run_on_batteries?"":"checked") ."> "; row2(RUN_ON_BATTERIES_DESC, $y); $y = "yes run_if_user_active?"checked":"") ."> no run_if_user_active?"":"checked") ."> "; row2(RUN_IF_USER_ACTIVE_DESC, $y); $y = " minutes "; row2(IDLE_TIME_TO_RUN_DESC.IDLE_TIME_TO_RUN_DESC2, $y); $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 "; row2(CPU_SCHEDULING_DESC, $y); row2(MAX_CPUS_DESC, "max_cpus> ".MAX_CPUS_DESC2 ); row1(DISK_LIMIT_DESC); row2(DISK_MAX_USED_GB_DESC, " Gbytes" ); row2(DISK_MIN_FREE_GB_DESC, " Gbytes free" ); row2(DISK_MAX_USED_PCT_DESC, " ".DISK_MAX_USED_PCT_DESC2 ); row2(DISK_INTERVAL_DESC, "disk_interval> seconds" ); row2(VM_MAX_USED_PCT_DESC, " ".VM_MAX_USED_PCT_DESC2 ); row1(NETWORK_LIMIT_DESC); $x = WORK_BUF_DESC; $y = " days"; row2($x, $y); $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":""; row2(MAX_BYTES_SEC_DOWN_DESC, " " . BYTE_UNITS ); row2(MAX_BYTES_SEC_UP_DESC, " " . BYTE_UNITS ); } function prefs_form_privacy($user) { row1(MISC_DESC); $y = "yes send_email?"checked":"") ."> no send_email?"":"checked") ."> "; row2("Should ".PROJECT." send you email newsletters?", $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) { row2( "Resource share:
The proportion of your computer's resources (processing time and disk space) allocated to ".PROJECT." relative to the other BOINC projects in which you participate. The default is 100. For example, if you participate in two projects and give them resource shares of 100 and 200, the first will get 1/3 of your resources and the second will get 2/3.
", "venue); } function venue_form($user) { 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 // function prefs_global_parse_form(&$prefs) { $run_on_batteries = $_GET["run_on_batteries"]; $run_if_user_active = $_GET["run_if_user_active"]; $idle_time_to_run = $_GET["idle_time_to_run"]; $leave_apps_in_memory = $_GET["leave_apps_in_memory"]; $confirm_before_connecting = $_GET["confirm_before_connecting"]; $hangup_if_dialed = $_GET["hangup_if_dialed"]; $work_buf_min_days = $_GET["work_buf_min_days"]; $max_cpus = $_GET["max_cpus"]; $disk_interval = $_GET["disk_interval"]; $disk_max_used_gb = $_GET["disk_max_used_gb"]; $disk_max_used_pct = $_GET["disk_max_used_pct"]; $disk_min_free_gb = $_GET["disk_min_free_gb"]; $vm_max_used_pct = $_GET["vm_max_used_pct"]; $max_bytes_sec_down = $_GET["max_bytes_sec_down"]; $max_bytes_sec_up = $_GET["max_bytes_sec_up"]; $prefs->run_on_batteries = ($run_on_batteries == "yes"); $prefs->run_if_user_active = ($run_if_user_active == "yes"); $prefs->idle_time_to_run = $idle_time_to_run; $prefs->start_hour = $_GET["start_hour"]; $prefs->end_hour = $_GET["end_hour"]; $prefs->leave_apps_in_memory = ($leave_apps_in_memory == "yes"); $prefs->cpu_scheduling_period_minutes = $_GET["cpu_scheduling_period_minutes"]; $prefs->confirm_before_connecting = ($confirm_before_connecting == "yes"); $prefs->hangup_if_dialed = ($hangup_if_dialed == "yes"); $prefs->confirm_eecutable = ($confirm_eecutable == "yes"); if ($work_buf_min_days<0) $work_buf_min_days = 0; if ($work_buf_min_days>10) $work_buf_min_days = 10; if ($max_cpus<1) $max_cpus = 1; if ($disk_interval<0) $disk_interval = 0; $prefs->work_buf_min_days = $work_buf_min_days; $prefs->max_cpus = $max_cpus; $prefs->disk_interval = $disk_interval; if ($disk_max_used_gb<0) $disk_max_used_gb = 0; if ($disk_max_used_pct<0) $disk_max_used_pct = 0; if ($disk_max_used_pct>100) $disk_max_used_pct = 100; if ($disk_min_free_gb<0) $disk_min_free_gb = 0; if ($vm_max_used_pct<0) $vm_max_used_pct = 0; if ($vm_max_used_pct>100) $vm_max_used_pct = 100; $prefs->disk_max_used_gb = $disk_max_used_gb; $prefs->disk_max_used_pct = $disk_max_used_pct; $prefs->disk_min_free_gb = $disk_min_free_gb; $prefs->vm_max_used_pct = $vm_max_used_pct; $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); } function prefs_resource_parse_form(&$prefs) { $prefs->resource_share = $_GET['resource_share']; } function prefs_privacy_parse_form(&$user) { $user->send_email = ($_GET['send_email'] == "yes")?1:0; $user->show_hosts = ($_GET['show_hosts'] == "yes")?1:0; } function prefs_project_parse_form(&$prefs) { $prefs->project_specific = project_specific_prefs_parse_form(); } //////////////////////////////////////////// // // 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!! if ($primary) { $xml = "\n"; $now = time(); $xml = $xml."$now\n"; } if ($prefs->run_on_batteries) { $xml = $xml."\n"; } if ($prefs->run_if_user_active) { $xml = $xml."\n"; } $xml = $xml."$prefs->idle_time_to_run\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->max_cpus\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->max_bytes_sec_down\n" ."$prefs->max_bytes_sec_up\n"; if ($prefs->home) { $xml = $xml."\n".global_prefs_make_xml($prefs->home, false)."\n"; } if ($prefs->work) { $xml = $xml."\n".global_prefs_make_xml($prefs->work, false)."\n"; } if ($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->project_specific) { $x = trim($prefs->project_specific); $xml = $xml ."\n$x\n\n"; } if ($prefs->home) { $xml = $xml."\n".project_prefs_make_xml($prefs->home, false)."\n"; } if ($prefs->work) { $xml = $xml."\n".project_prefs_make_xml($prefs->work, false)."\n"; } if ($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; } ?>