User:Alsroot/trash/Object Bundles: Difference between revisions

Line 88: Line 88:
* [http://git.sugarlabs.org/projects/sugar-toolkit/repos/objectbundle sugar-toolkit]
* [http://git.sugarlabs.org/projects/sugar-toolkit/repos/objectbundle sugar-toolkit]
* [http://git.sugarlabs.org/projects/browse/repos/objectbundle Browse]
* [http://git.sugarlabs.org/projects/browse/repos/objectbundle Browse]
Example of PHP code which could be used on server side to unpack object bundles to get metadata (like title, description, preview etc.)
require_once('Archive/Zip.php');
function rmtree($dir) {
    $dir = "$dir";
    if ($dh = opendir($dir)) {
        while (FALSE !== ($item = readdir($dh))) {
            if ($item != '.' && $item != '..') {
                $subdir = $dir . '/' . "$item";
                if (is_dir($subdir))
                    rmtree($subdir);
                else
                    unlink($subdir);
            }
        }
        closedir($dh);
        rmdir($dir);
    }
}
function unbundle($bundle) {
    $zip = new Archive_Zip($bundle);
    $tmpdir = tempnam('/tmp', 'sugar');
    if (file_exists($tmpdir))
        unlink($tmpdir);
    if (!mkdir($tmpdir)) {
        return null;
    }
    $out = $zip->extract(array('add_path' => $tmpdir, 'by_name' => array('METADATA')));
    if (empty($out)) {
        rmtree($tmpdir);
        return null;
    }
    $metadata = parse_ini_file($out[0]['filename'], true);
    if (!$metadata) {
        rmtree($tmpdir);
        return null;
    }
    $result = array();
    foreach ($metadata as $section => $items) {
        if (!(substr($section, 0, 5) == 'Entry' || $section == 'Bundle'))
            continue;
        foreach ($items as $name => $value) {
            if (substr($name, -5) == '_file') {
                $name = substr($name, 0, -5);
                $out = $zip->extract(array('add_path' => $tmpdir, 'by_name' => array($value)));
                if (empty($out)) {
                    rmtree($tmpdir);
                    return null;
                }
                $value = file_get_contents($tmpdir.'/'.$value);
            }
            $result[$name] = $value;
        }
        break;
    }
    echo $tmpdir."\n";
    rmtree($tmpdir);
    return $result;
}
$bundle = 'foo.xo';
$metadata = unbundle($bundle);
if (!$metadata)
    echo 'Can not open '.$bundle."\n";
else
    foreach ($metadata as $name => $value)
        echo $name.'='.$value."\n";


== How To Test ==
== How To Test ==