<?php /* * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/ * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * Neither the name of Texas Instruments Incorporated nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ # 函数规定报告哪个错误,该函数设置当前脚本的错误报告级别 # 该函数返回旧的错误报告级别 error_reporting(E_ALL); # 加载那些需要的函数 require("helper_functions.php"); $i = 0; $lock_string = ""; $currently_locked = false; $var = read_desktop_file(); # 加载json对象 if($var==null) { echo "Json.txt file is empty or doesn't exist."; return; } $submenu = isset($_GET["submenu"]) == true ? $_GET["submenu"] : "main_menu" ; # $link = "run_script.php?&submenu=".urlencode($submenu)."&app=".urlencode($app_title); # 获取对应的app $found_app = get_application($var,$submenu,$_GET["app"]); # 查看当前的json.txt文件,其中的Lock字段的内容都是-1 # 所以这一部分的其中很多内容可以不分析 $lock_list = $found_app["Lock"]; //Verify that there is a lock specified for this application # 应用有锁 if($lock_list != -1 ) { //Convert the string into an array. //This might be backwards*********CHECKOUT******** # explode(): 把字符串分割为数组 $lock_list_array = explode($lock_list," "); //Check if the lock list only has one lock. If so add to the array //Since index 0 will be empty if(count($lock_list_array) == 1) $lock_list_array[0] = $lock_list; //Check to see if any of the locks exist. for($x = 0;$x<count($lock_list_array);$x++) { # 这里貌似是锁文件,是否存在的意思 if(file_exists ("lock/".$lock_list_array[$x])==true) { $currently_locked = true; break; } } } else $lock_list = ""; # 就当前的json.txt文件而言,都是采用这种方式 if($currently_locked==false) { $script_link = $found_app["Exec"]; # strval(): 用于获取变量对应的字符串值 # rand(): 返回随机整数 $random_string = strval(rand()); $random_string .= strval(rand()); # addslashes(): 在指定的预定义字符前添加反斜杠 $script_command = "./execute_command.sh \"".addslashes($script_link). "\" ".$random_string.".txt ".$lock_list; # 获取系统执行结果最后一行 # system()第二个参数:如果提供的return_var参数,则外部命令执行后的 # 返回状态将会被设置到此变量中 $last_line = system($script_command." > /dev/null 2>/dev/null & ", $retval); } # 菜单标题采用app的名字 $menu_title = $found_app["Name"]; ?> <!-- 这里需要区分web的程序还是gui程序 --> <!-- 这里是没有锁,并且是程序类型不是web,也就是说gui程序会走接下来的这种方式 --> <?php if($currently_locked==false && $found_app["ProgramType"]!="web"){ ?> <!-- 加入菜单 --> <?php include "menubar.php"; ?> <div id="container"></div> <script> <?php echo "var uri_link = \"$random_string\";"; ?> // 仅仅是一个随机数 var fail_count = 0; // 这个函数的主要功能好像是,获取app的输出内容显示到网页上来, // 但这个函数是有时间限制的,如果在规定的时间内不能获取到相应的数据, // 那么就会提示出错了 function update() { //This is a fix for IE browsers. IE likes to cache Ajax results. Therefore, adding a random string will prevent the browser from caching the Ajax request. // 防止浏览器缓存页面导致不访问web服务器 var uri = "tmp/"+uri_link+".txt?rand="+Math.round((Math.random()*2356))+Math.round((Math.random()*4321))+Math.round((Math.random()*3961)); $.get(uri, function(data) { fail_count = 0; data = jQuery.trim(data); //The execute_command script adds the text "_?!!MATRIX_SCRIPT_COMPLETED!!?_" to the end of the file to mark that the command is done executing // 获取系统返回的数据,并查找字符串 var script_complete = data.indexOf("_?!!MATRIX_SCRIPT_COMPLETED!!?_"); if(script_complete != -1) { //Just replace the end of file text to Script Complete which data = data.replace("_?!!MATRIX_SCRIPT_COMPLETED!!?_", "Script Complete"); } <?php //GUI applications shouldn't have any output that needs to be displayed. Therefore, don't include the code that will update the HTML container //with the program's output. This prevents some flickering problems that occur in some GUI applications even if the HTML container is being passed no information. // GUI程序没有任何输出需要显示,所以不需要将程序输出显示出来, // 这里主要是为了防止一些无输出的问题 if($found_app["ProgramType"]!="gui"){ ?> $('#container').html("<pre>"+data+"</pre>"); $('#container').scrollTop(document.getElementById("container").scrollHeight); <?php } ?> if(script_complete != -1) { //Display the exit and back button. $('#main_menu_link').removeClass("hide_link"); $('#back_link').removeClass("hide_link"); <?php if($found_app["ProgramType"]=="gui"){ ?> $('#back_link').click(); // 这里为什么会需要自动点击返回? <?php } ?> } else setTimeout("update()",1000); }) //If a file cant be read or some other error related to trying to retrieve this file then JQuery executes the error function. //This sometimes occurs when the browser tries to read the output file before output file is even created. .error(function() { //This function will attempt to read the file 3 times with an increase delay for each attempt. If the file still hasn't //been able to be read then an error is displayed and the Exit and Back Link is enabled. fail_count++; if(fail_count==3) { $('#container').html("Failed to read output file"); $('#main_menu_link').removeClass("hide_link"); $('#back_link').removeClass("hide_link"); } else { //Every time it fails wait a signifcantly longer amount of time setTimeout("update()",fail_count*1500); } }); } //Wait 500ms before trying to read the application output // 从这里开始开始调用前面的update()函数 setTimeout("update()",500); </script> <?php }if($currently_locked==false && $found_app["ProgramType"]=="web"){ ?> <?php include "menubar.php"; ?> <script> $('#main_menu_link').removeClass("hide_link"); $('#back_link').removeClass("hide_link"); $("#menubar").outerHeight(true) $("#menubar").outerWidth(true) // 在后面给调用 function scrollbarWidth() { var $inner = jQuery('<div style="width: 100%; height:200px;">test</div>'), $outer = jQuery('<div style="width:200px;height:150px; position: absolute; top: 0; left: 0; visibility: hidden; overflow:hidden;"></div>').append($inner), inner = $inner[0], outer = $outer[0]; jQuery('body').append(outer); var width1 = inner.offsetWidth; $outer.css('overflow', 'scroll'); var width2 = outer.clientWidth; $outer.remove(); return (width1 - width2); } $("#html5-frame").width($("#menubar").width()-scrollbarWidth()); $("#html5-frame").height($(window).height() - $("#menubar").outerHeight(true)-scrollbarWidth()) </script> <!-- 用一个框架来显示一些东西 --> <iframe id = "html5-frame" src = "<?php echo $found_app["Exec"]; ?>"scrolling = "auto" style = "padding:5px;"> <!-- 就目前的json.txt文本内容而言,currently_locked一直都是等于false --> <?php }if($currently_locked==true){?> <?php include "menubar.php"; ?> This program can't run since a program is already running that contains a lock that this program is trying to use <script> //Display the back and exit button since the application couldn't run $('#main_menu_link').removeClass("hide_link"); $('#back_link').removeClass("hide_link"); </script> <?php } ?>