Texas Instruments matrix-gui-2.0 hacking -- generate.php
<?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. * */ function get_contents($field_name,$filestring) { # stripos(string,find,start) # 返回字符串在另一个字符串中第一次出现的位置。 # ------------------------------------------ # | 参数 | 描述 | # ------------------------------------------ # | string | 必需。规定被搜索的字符串。 | # | find | 必需。规定要查找的字符。 | # | start | 可选。规定开始搜索的位置。 | # ------------------------------------------ # 如果没有找到该字符串,则返回 false。 $pos = stripos($filestring,$field_name."="); if($pos != false) { $pos += strlen($field_name."="); # 找到当前行结束的地方 $newlinepos = stripos($filestring,"\n",$pos); if($newlinepos == -1) $newlinepos = stripos($filestring,"\r",$pos); # substr(string,start,length) # --------------------------------------------------- # | 参数 | 描述 | # --------------------------------------------------- # | string | 必需。规定要返回其中一部分的字符串。 | # | start | 必需。规定在字符串的何处开始。 | # --------------------------------------------------- $returnedstring = substr($filestring,$pos,$newlinepos-$pos); return $returnedstring; } return -1; } # 每个app都有一个这样的对应文件 system("find -name '*.desktop' -print > catdesktop.txt"); if(filesize("catdesktop.txt") == 0) { echo "No .desktop files found"; return; } # 读取文件 $handle = fopen("catdesktop.txt", "rb"); $contents = fread($handle,filesize("catdesktop.txt")); fclose($handle); # unlink() 函数删除文件。 # 若成功,则返回 true,失败则返回 false。 unlink('catdesktop.txt'); # 函数把字符串打散为数组。 # explode(separator,string,limit) # --------------------------------------------------------------------------------- # | 参数 | 描述 | # |-------------------------------------------------------------------------------- # | separator | 必需。规定在哪里分割字符串。 | # |-------------------------------------------------------------------------------| # | string | 必需。要分割的字符串。 | # |-------------------------------------------------------------------------------| # | limit | 可选。规定所返回的数组元素的数目。 | # | | 可能的值: | # | | 大于 0 - 返回包含最多 limit 个元素的数组 | # | | 小于 0 - 返回包含除了最后的 -limit 个元素以外的所有元素的数组 | # | | 0 - 返回包含一个元素的数组 | # --------------------------------------------------------------------------------- $contents = explode("\n",$contents); # 这里strlen($contents[$x])>0限制了数据之间不能出现空行 for($x = 0;$x<count($contents)&&strlen($contents[$x])>0;$x++) { # 从这里可以看出catdesktop.txt文件里是一些文件路径的配置 $handle = fopen($contents[$x], "rb"); $dotdesktop = fread($handle,filesize($contents[$x])); fclose($handle); # 应用名 $top["Name"] = get_contents("Name",$dotdesktop); # 序号 if(get_contents("X-MATRIX-DisplayPriority",$dotdesktop)!=-1) $top["Order"] = get_contents("X-MATRIX-DisplayPriority",$dotdesktop); else $top["Order"] = 999; # 图标的绝对路径 $icon_path = get_contents("Icon",$dotdesktop); $webserver_root = "/usr/share/matrix-gui-2.0/"; # 获取Icon的相对路径 $top["Icon"] = substr($icon_path,strlen($webserver_root)); # 类型 $type = strtolower(get_contents("Type",$dotdesktop)); $top["Type"] = $type; # 分类 $category = get_contents("Categories",$dotdesktop); $category = trim(strtolower($category)); if($type == "directory") { $top["Category"] = get_contents("X-MATRIX-CategoryTarget",$dotdesktop); }elseif($type == "application") { # 可执行程序的执行命令 $top["Exec"] = get_contents("Exec",$dotdesktop); # 可执行程序的类型 $top["ProgramType"] = get_contents("ProgramType",$dotdesktop); # 连接描述 $top["Description_Link"] = get_contents("X-MATRIX-Description",$dotdesktop); # 锁 $top["Lock"] = get_contents("X-MATRIX-LOCK",$dotdesktop); } # 非分类放在主菜单中,其他的放在对应的分类中 # 这里采用PHP的动态添加数组成员的方法 if($category == -1) $application["main_menu"]["apps"][] = $top; else $application[$category]["apps"][] = $top; # 用来销毁变量的,但很多时候,这个函数只把变量给销毁了,内存中存放的该变量的值 # 仍然没有销毁,也就是没能达到我们想要的释放内存的效果。 unset($top); } # 主要是完成数字大小的比较 function cmp($a, $b) { if($a["Order"] < $b["Order"]) return -1; elseif($a["Order"] == $b["Order"]) return 0; elseif($a["Order"] > $b["Order"]) return 1; } foreach ($application as $key => $value) { # 使用用户自定义的函数对数组排序,自动的函数名叫cmp, # 其实就是前面那个数字比较函数 usort($application[$key]["apps"], "cmp"); } # 将php对象编码成json对象,写到json.txt文件里面去 $ourFileName = "json.txt"; # die() 函数输出一条消息,并退出当前脚本。 # 该函数是 exit() 函数的别名。 $ourFileHandle = fopen($ourFileName, 'w') or die("can't open file"); fwrite($ourFileHandle,json_encode($application)); fclose($ourFileHandle); ?>