2013-10-30 03:44:35 +00:00

118 lines
3.1 KiB
PHP

<?php
include_once dirname(__FILE__) . "/ApkStream.php";
/**
* Customized ZipArchive for .apk files.
* @author Tufan Baris YILDIRIM
* @TODO Add ->getResource('file_name'), or getIcon() directly.
* @todo Override the // extractTo() method. Rewrite all of XML files converted from Binary Xml to text based XML!
*/
class ApkArchive extends ZipArchive
{
/**
* @var string
*/
private $filePath;
/**
* @var string
*/
private $fileName;
public function __construct($file = false)
{
if($file && is_file($file))
{
$this->open($file);
$this->fileName = basename($this->filePath = $file);
}
else
throw new Exception($file . " not a regular file");
}
/**
* Get a file from apk Archive by name.
*
* @param string $name
* @param int $length
* @param int $flags
* @return mixed
*/
public function getFromName($name,$length = NULL,$flags = NULL)
{
if(strtolower(substr($name,-4)) == '.xml')
{
$xmlParser = new ApkXmlParser(new ApkStream($this->getStream($name)));
return $xmlParser->getXmlString();
}
else
return parent::getFromName($name,$length,$flags);
}
/**
* Returns an ApkStream whick contains AndroidManifest.xml
* @return ApkStream
*/
public function getManifestStream()
{
return new ApkStream($this->getStream('AndroidManifest.xml'));
}
/**
* Apk file path.
* @return string
*/
public function getApkPath()
{
return $this->filePath;
}
/**
* Apk file name
* @return string
*/
public function getApkName()
{
return $this->fileName;
}
public function extractTo($destination,$entries = NULL)
{
if($extResult = parent::extractTo($destination,$entries))
{
//TODO: ApkXmlParser can not parse the main.xml and others! only AndroidManifest.xml
//return $extResult;
$xmlFiles = $this->glob_recursive($destination . '/*.xml');
foreach($xmlFiles as $xmlFile)
{
// TODO : Remove this ifcheck , if ApkXml can parse! amk!
if($xmlFile == "AndroidManifest.xml")
ApkXmlParser::decompressFile($xmlFile);
}
}
return $extResult;
}
// Can Move to the Utils(???) class.
private function glob_recursive($pattern, $flags = 0)
{
$files = glob($pattern, $flags);
foreach (glob(dirname($pattern).'/*', GLOB_ONLYDIR|GLOB_NOSORT) as $dir)
{
$files = array_merge($files, $this->glob_recursive($dir.'/'.basename($pattern), $flags));
}
return $files;
}
}