$end) ? $end : $c_end; // Validate the requested range and return an error if it's not correct. if ($c_start > $c_end || $c_start > $size - 1 || $c_end >= $size) { header('HTTP/1.1 416 Requested Range Not Satisfiable'); header("Content-Range: bytes $start-$end/$size"); // (?) Echo some info to the client? exit; } $start = $c_start; $end = $c_end; $length = $end - $start + 1; // Calculate new content length fseek($fp, $start); header('HTTP/1.1 206 Partial Content'); } // Notify the client the byte range we'll be outputting header("Content-Range: bytes $start-$end/$size"); header("Content-Length: $length"); header("Content-disposition: inline; filename=\"".$filename."\"\n"); header("Content-Type: ".$type."\n"); // Start buffered download $buffer = 1024 * 8; while(!feof($fp) && ($p = ftell($fp)) <= $end) { if ($p + $buffer > $end) { // In case we're only outputtin a chunk, make sure we don't // read past the length $buffer = $end - $p + 1; } set_time_limit(0); // Reset time limit for big files echo fread($fp, $buffer); flush(); // Free up memory. Otherwise large files will trigger PHP's memory limit. } fclose($fp); } function even_odd($reset = false) { static $counter = 1; if ($reset) { $counter = 1; } if ($counter++%2 == 0) { return 'even'; } else { return 'odd'; } } // Source: http://hu.php.net/manual/en/function.str-pad.php#71558 // This is a multibyte enabled str_pad function mb_str_pad($ps_input, $pn_pad_length, $ps_pad_string = " ", $pn_pad_type = STR_PAD_RIGHT, $ps_encoding = NULL) { $ret = ""; if (is_null($ps_encoding)) $ps_encoding = mb_internal_encoding(); $hn_length_of_padding = $pn_pad_length - mb_strlen($ps_input, $ps_encoding); $hn_psLength = mb_strlen($ps_pad_string, $ps_encoding); // pad string length if ($hn_psLength <= 0 || $hn_length_of_padding <= 0) { // Padding string equal to 0: // $ret = $ps_input; } else { $hn_repeatCount = floor($hn_length_of_padding / $hn_psLength); // how many times repeat if ($pn_pad_type == STR_PAD_BOTH) { $hs_lastStrLeft = ""; $hs_lastStrRight = ""; $hn_repeatCountLeft = $hn_repeatCountRight = ($hn_repeatCount - $hn_repeatCount % 2) / 2; $hs_lastStrLength = $hn_length_of_padding - 2 * $hn_repeatCountLeft * $hn_psLength; // the rest length to pad $hs_lastStrLeftLength = $hs_lastStrRightLength = floor($hs_lastStrLength / 2); // the rest length divide to 2 parts $hs_lastStrRightLength += $hs_lastStrLength % 2; // the last char add to right side $hs_lastStrLeft = mb_substr($ps_pad_string, 0, $hs_lastStrLeftLength, $ps_encoding); $hs_lastStrRight = mb_substr($ps_pad_string, 0, $hs_lastStrRightLength, $ps_encoding); $ret = str_repeat($ps_pad_string, $hn_repeatCountLeft) . $hs_lastStrLeft; $ret .= $ps_input; $ret .= str_repeat($ps_pad_string, $hn_repeatCountRight) . $hs_lastStrRight; } else { $hs_lastStr = mb_substr($ps_pad_string, 0, $hn_length_of_padding % $hn_psLength, $ps_encoding); // last part of pad string if ($pn_pad_type == STR_PAD_LEFT) $ret = str_repeat($ps_pad_string, $hn_repeatCount) . $hs_lastStr . $ps_input; else $ret = $ps_input . str_repeat($ps_pad_string, $hn_repeatCount) . $hs_lastStr; } } return $ret; } function is_cli_client() { // official client uses "fb-client/$version" as useragent $clients = array("fb-client", "libcurl", "pyfb"); foreach ($clients as $client) { if (isset($_SERVER['HTTP_USER_AGENT']) && strpos($_SERVER['HTTP_USER_AGENT'], $client) !== false) { return true; } } return false; } function random_id($min_length, $max_length) { $random = ''; $char_list = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; $char_list .= "abcdefghijklmnopqrstuvwxyz"; $char_list .= "1234567890"; $length = rand()%($max_length-$min_length) + $min_length; for($i = 0; $i < $max_length; $i++) { if (strlen($random) == $length) break; $random .= substr($char_list,(rand()%(strlen($char_list))), 1); } return $random; } # vim: set noet: