public function pack($data, array $opts = array())
{
$opts = array_merge(array('compress' => true), $opts);
if (!isset($opts['phpob'])) {
$auto = new Horde_Pack_Autodetermine($data);
$opts['phpob'] = $auto->phpob;
}
foreach (self::$_drivers as $key => $val) {
if (!empty($opts['phpob']) && !$val->phpob) {
continue;
}
if (isset($opts['drivers'])) {
if (!in_array(get_class($val), $opts['drivers'])) {
continue;
}
}
/* Format of data:
* First-byte:
* 1,2,4,8,16,32 - Reserved for pack format.
* 64 - Packed data has been compressed.
* 128 - RESERVED for future use (if set, indicates that initial
* byte will extend into next byte).
* Packed (and compressed data) follows this byte. */
try {
$packed = $val->pack($data);
} catch (Horde_Pack_Exception $e) {
continue;
}
if ($opts['compress'] !== false) {
if ($opts['compress'] === 0) {
$compress = true;
} else {
if ($opts['compress'] === true) {
$opts['compress'] = self::DEFAULT_COMPRESS;
}
$compress = strlen($packed) > $opts['compress'];
}
if ($compress) {
$packed = self::$_compress->compress($packed);
$key |= self::COMPRESS_MASK;
}
}
return pack('C', $key) . $packed;
}
throw new Horde_Pack_Exception('Could not pack data.');
}