* @category Horde
* @license http://www.horde.org/licenses/lgpl21 LGPL 2.1
* @package Compress
*/
class Horde_Compress_Rar extends Horde_Compress_Base
{
const BLOCK_START = "\x52\x61\x72\x21\x1a\x07\x00";
/**
*/
public $canDecompress = true;
/**
* Rar compression methods
*
* @var array
*/
protected $_methods = array(
0x30 => 'Store',
0x31 => 'Fastest',
0x32 => 'Fast',
0x33 => 'Normal',
0x34 => 'Good',
0x35 => 'Best'
);
/**
* @return array Info on the compressed file:
*
* KEY: Position in RAR archive
* VALUES:
* attr - File attributes
* date - File modification time
* csize - Compressed file size
* method - Compression method
* name - Filename
* size - Original file size
*
*
* @throws Horde_Compress_Exception
*/
public function decompress($data, array $params = array())
{
$blockStart = strpos($data, self::BLOCK_START);
if ($blockStart === false) {
throw new Horde_Compress_Exception(Horde_Compress_Translation::t("Invalid RAR data."));
}
$data_len = strlen($data);
$position = $blockStart + 7;
$return_array = array();
while ($position < $data_len) {
if ($position + 7 > $data_len) {
throw new Horde_Compress_Exception(Horde_Compress_Translation::t("Invalid RAR data."));
}
//$head_crc = substr($data, $position, 2);
$head_type = ord(substr($data, $position + 2, 1));
$head_flags = unpack('vFlags', substr($data, $position + 3, 2));
$head_flags = $head_flags['Flags'];
$head_size = unpack('vSize', substr($data, $position + 5, 2));
$head_size = $head_size['Size'];
$position += 7;
$head_size -= 7;
switch ($head_type) {
case 0x73:
/* Archive header */
$position += $head_size;
break;
case 0x74:
/* File Header */
$info = unpack('VPacked/VUnpacked/COS/VCRC32/VTime/CVersion/CMethod/vLength/vAttrib', substr($data, $position));
$return_array[] = array(
'name' => substr($data, $position + 25, $info['Length']),
'size' => $info['Unpacked'],
'csize' => $info['Packed'],
'date' => mktime((($info['Time'] >> 11) & 0x1f),
(($info['Time'] >> 5) & 0x3f),
(($info['Time'] << 1) & 0x3e),
(($info['Time'] >> 21) & 0x07),
(($info['Time'] >> 16) & 0x1f),
((($info['Time'] >> 25) & 0x7f) + 80)),
'method' => $this->_methods[$info['Method']],
'attr' => (($info['Attrib'] & 0x10) ? 'D' : '-') .
(($info['Attrib'] & 0x20) ? 'A' : '-') .
(($info['Attrib'] & 0x03) ? 'S' : '-') .
(($info['Attrib'] & 0x02) ? 'H' : '-') .
(($info['Attrib'] & 0x01) ? 'R' : '-')
);
$position += $head_size + $info['Packed'];
break;
default:
if ($head_size == -7) {
/* We've already added 7 bytes above. If we remove those
* same 7 bytes, we will enter an infinite loop. */
throw new Horde_Compress_Exception(Horde_Compress_Translation::t("Invalid RAR data."));
}
$position += $head_size;
break;
}
}
return $return_array;
}
}
Horde_Compress-2.0.7/lib/Horde/Compress/Tar.php 0000664 0000766 0000024 00000010006 12267642544 016227 0 ustar
* @author Michael Slusarz
* @category Horde
* @license http://www.horde.org/licenses/lgpl21 LGPL 2.1
* @package Compress
*/
class Horde_Compress_Tar extends Horde_Compress_Base
{
/**
*/
public $canDecompress = true;
/**
* Tar file types.
*
* @var array
*/
protected $_types = array(
0x0 => 'Unix file',
0x30 => 'File',
0x31 => 'Link',
0x32 => 'Symbolic link',
0x33 => 'Character special file',
0x34 => 'Block special file',
0x35 => 'Directory',
0x36 => 'FIFO special file',
0x37 => 'Contiguous file'
);
/**
* Tar file flags.
*
* @var array
*/
protected $_flags = array(
'FTEXT' => 0x01,
'FHCRC' => 0x02,
'FEXTRA' => 0x04,
'FNAME' => 0x08,
'FCOMMENT' => 0x10
);
/**
* @return array Tar file data:
*
* KEY: Position in the array
* VALUES:
* attr - File attributes
* data - Raw file contents
* date - File modification time
* name - Filename
* size - Original file size
* type - File type
*
*
* @throws Horde_Compress_Exception
*/
public function decompress($data, array $params = array())
{
$data_len = strlen($data);
$position = 0;
$return_array = array();
while ($position < $data_len) {
if (version_compare(PHP_VERSION, '5.5.0-dev', '>=')) {
$info = @unpack('Z100filename/Z8mode/Z8uid/Z8gid/Z12size/Z12mtime/Z8checksum/Ctypeflag/Z100link/Z6magic/Z2version/Z32uname/Z32gname/Z8devmajor/Z8devminor', substr($data, $position));
} else {
$info = @unpack('a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/a8checksum/Ctypeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor', substr($data, $position));
}
if (!$info) {
throw new Horde_Compress_Exception(Horde_Compress_Translation::t("Unable to decompress data."));
}
$position += 512;
$contents = substr($data, $position, octdec($info['size']));
$position += ceil(octdec($info['size']) / 512) * 512;
if ($info['filename']) {
$file = array(
'attr' => null,
'data' => null,
'date' => octdec($info['mtime']),
'name' => trim($info['filename']),
'size' => octdec($info['size']),
'type' => isset($this->_types[$info['typeflag']]) ? $this->_types[$info['typeflag']] : null
);
if (($info['typeflag'] == 0) ||
($info['typeflag'] == 0x30) ||
($info['typeflag'] == 0x35)) {
/* File or folder. */
$file['data'] = $contents;
$mode = hexdec(substr($info['mode'], 4, 3));
$file['attr'] =
(($info['typeflag'] == 0x35) ? 'd' : '-') .
(($mode & 0x400) ? 'r' : '-') .
(($mode & 0x200) ? 'w' : '-') .
(($mode & 0x100) ? 'x' : '-') .
(($mode & 0x040) ? 'r' : '-') .
(($mode & 0x020) ? 'w' : '-') .
(($mode & 0x010) ? 'x' : '-') .
(($mode & 0x004) ? 'r' : '-') .
(($mode & 0x002) ? 'w' : '-') .
(($mode & 0x001) ? 'x' : '-');
}
$return_array[] = $file;
}
}
return $return_array;
}
}
Horde_Compress-2.0.7/lib/Horde/Compress/Tnef.php 0000664 0000766 0000024 00000064336 12267642544 016414 0 ustar
* Original design by:
* Thomas Boll , Mark Simpson
*
* Copyright 2002-2013 Horde LLC (http://www.horde.org/)
*
* See the enclosed file COPYING for license information (LGPL). If you
* did not receive this file, see http://www.horde.org/licenses/lgpl21.
*
* @author Jan Schneider
* @author Michael Slusarz
* @author Michael J Rubinsky
* @category Horde
* @license http://www.horde.org/licenses/lgpl21 LGPL 2.1
* @package Compress
*/
class Horde_Compress_Tnef extends Horde_Compress_Base
{
const SIGNATURE = 0x223e9f78;
const LVL_MESSAGE = 0x01;
const LVL_ATTACHMENT = 0x02;
const RTF_COMPRESSED = 0x75465a4c;
const RTF_UNCOMPRESSED = 0x414c454d;
const ASUBJECT = 0x88004;
const AMCLASS = 0x78008;
const ATTACHDATA = 0x6800f;
const AFILENAME = 0x18010;
const ARENDDATA = 0x69002;
const AMAPIPROPS = 0x69003;
const AMAPIATTRS = 0x69005;
const OEMCODEPAGE = 0x69007;
const AVERSION = 0x89006;
const ID_REQUEST_RESP = 0x40009;
const ID_FROM = 0x8000;
const ID_DATE_START = 0x30006;
const ID_DATE_END = 0x30007;
const AIDOWNER = 0x50008;
const MAPI_NULL = 0x0001;
const MAPI_SHORT = 0x0002;
const MAPI_INT = 0x0003;
const MAPI_FLOAT = 0x0004;
const MAPI_DOUBLE = 0x0005;
const MAPI_CURRENCY = 0x0006;
const MAPI_APPTIME = 0x0007;
const MAPI_ERROR = 0x000a;
const MAPI_BOOLEAN = 0x000b;
const MAPI_OBJECT = 0x000d;
const MAPI_INT8BYTE = 0x0014;
const MAPI_STRING = 0x001e;
const MAPI_UNICODE_STRING = 0x001f;
const MAPI_SYSTIME = 0x0040;
const MAPI_CLSID = 0x0048;
const MAPI_BINARY = 0x0102;
// MAPI START and END should always be also set in ID_DATE_START and
// ID_DATE_END so no need to translate them?
const MAPI_MEETING_REQUEST_TYPE = 0x0026;
const MAPI_MEETING_INITIAL = 0x00000001;
const MAPI_MEETING_FULL_UPDATE = 0x00010000;
const MAPI_MEETING_INFO = 0x00020000;
const MAPI_START_DATE = 0x0060;
const MAPI_END_DATE = 0x0061;
const MAPI_COMPRESSED = 0x1009;
const MAPI_IN_REPLY_TO_ID = 0x1042;
const MAPI_MESSAGE_CLASS = 0x001A;
const MAPI_TAG_SUBJECT_PREFIX = 0x003D;
const MAPI_CONVERSATION_TOPIC = 0x0070;
const MAPI_CREATION_TIME = 0x3007;
const MAPI_MODIFICATION_TIME = 0x3008;
const MAPI_ATTACH_DATA = 0x3701;
const MAPI_ATTACH_LONG_FILENAME = 0x3707;
const MAPI_ATTACH_MIME_TAG = 0x370E;
const MAPI_ORIGINAL_CREATORID = 0x3FF9;
const MAPI_LAST_MODIFIER_NAME = 0x3FFA;
const MAPI_CODEPAGE = 0x3FFD;
const MAPI_APPOINTMENT_SEQUENCE = 0x8201;
// Do we need this?
const MAPI_BUSY_STATUS = 0x8205;
const MAPI_APPOINTMENT_LOCATION = 0x8208;
const MAPI_APPOINTMENT_URL = 0x8209;
const MAPI_APPOINTMENT_START_WHOLE = 0x820D; // Full datetime of start (FILETIME format)
const MAPI_APPOINTMENT_END_WHOLE = 0x820E; // Full datetime of end (FILETIME format)
const MAPI_APPOINTMENT_DURATION = 0x8213; // duration in minutes.
const MAPI_APPOINTMENT_SUBTYPE = 0x8215; // (Boolean - all day event?)
const MAPI_APPOINTMENT_RECUR = 0x8216; // This seems to be a combined property of MAPI_RECURRING, MAPI_RECURRING_TYPE etc...?
const MAPI_APPOINTMENT_STATE_FLAGS = 0x8217; // (bitmap for meeting, received, cancelled?)
const MAPI_RESPONSE_STATUS = 0x8218;
const MAPI_RECURRING = 0x8223;
const MAPI_RECURRENCE_TYPE = 0x8231;
// tz. Not sure when to use STRUCT vs DEFINITION_RECUR. Possible ok to always use STRUCT?
const MAPI_TIMEZONE_STRUCT = 0x8233; // Timezone for recurring mtg?
const MAPI_TIMEZONE_DESCRIPTION = 0x8234; // Description for tz_struct?
const MAPI_START_CLIP_START = 0x8235; // Start datetime in UTC
const MAPI_START_CLIP_END = 0x8236; // End datetime in UTC
const MAPI_CONFERENCING_TYPE = 0x8241;
const MAPI_ORGANIZER_ALIAS = 0x8243; // Supposed to be organizer email, but it seems to be empty?
const MAPI_APPOINTMENT_COUNTER_PROPOSAL = 0x8257; // Boolean
const MAPI_TIMEZONE_START = 0x825E; // Timezone of start_whole
const MAPI_TIMEZONE_END = 0x825F; // Timezone of end_whole
const MAPI_TIMEZONE_DEFINITION_RECUR = 0x8260; // Timezone for use in converting meeting date/time in recurring meeting???
const MAPI_REMINDER_DELTA = 0x8501; // Minutes between start of mtg and overdue.
const MAPI_SIGNAL_TIME = 0x8502; // Initial alarm time.
const MAPI_REMINDER_SIGNAL_TIME = 0x8560; // Time that item becomes overdue.
const MAPI_ENTRY_UID = 0x0003; // GOID??
const MAPI_MEETING_TYPE = 0x0026;
const MAPI_NAMED_TYPE_ID = 0x0000;
const MAPI_NAMED_TYPE_STRING = 0x0001;
const MAPI_MV_FLAG = 0x1000;
const IPM_MEETING_REQUEST = 'IPM.Microsoft Schedule.MtgReq';
const IPM_MEETING_RESPONSE_POS = 'IPM.Microsoft Schedule.MtgRespP';
const IPM_MEETING_RESPONSE_NEG = 'IPM.Microsoft Schedule.MtgRespN';
const IPM_MEETING_RESPONSE_TENT = 'IPM.Microsoft Schedule.MtgRespA';
const IPM_MEETING_REQUEST_CANCELLED = 'IPM.Microsoft Schedule.MtgCncl';
const RECUR_DAILY = 0x200A;
const RECUR_WEEKLY = 0x200B;
const RECUR_MONTHLY = 0x200C;
const RECUR_YEARLY = 0x200D;
const PATTERN_DAY = 0x0000;
const PATTERN_WEEK = 0x0001;
const PATTERN_MONTH = 0x0002;
const PATTERN_MONTH_END = 0x0004;
const PATTERN_MONTH_NTH = 0x0003;
const RECUR_END_DATE = 0x00002021;
const RECUR_END_N = 0x00002022;
/**
*/
public $canDecompress = true;
/**
* Temporary cache of data needed to build an iTip from the encoded
* MAPI appointment properties.
*
* @var array
*/
protected $_iTip = array();
protected $_conversation_topic;
protected $_lastModifier;
/**
* @return array The decompressed data.
* @throws Horde_Compress_Exception
*/
public function decompress($data, array $params = array())
{
$out = array();
$message = array();
if ($this->_geti($data, 32) == self::SIGNATURE) {
// LegacyKey value - not used.
$this->_geti($data, 16);
while (strlen($data) > 0) {
switch ($this->_geti($data, 8)) {
case self::LVL_MESSAGE:
$this->_decodeMessageProperty($data);
break;
case self::LVL_ATTACHMENT:
$this->_decodeAttachment($data, $out);
break;
}
}
$this->_checkiTip($out);
}
return array_reverse($out);
}
/**
* Pop specified number of bytes from the buffer.
*
* @param string &$data The data string.
* @param integer $bytes How many bytes to retrieve.
*
* @return TODO
*/
protected function _getx(&$data, $bytes)
{
$value = null;
if (strlen($data) >= $bytes) {
$value = substr($data, 0, $bytes);
$data = substr_replace($data, '', 0, $bytes);
}
return $value;
}
/**
* Pop specified number of bits from the buffer
*
* @param string &$data The data string.
* @param integer $bits How many bits to retrieve.
*
* @return TODO
*/
protected function _geti(&$data, $bits)
{
$bytes = $bits / 8;
$value = null;
if (strlen($data) >= $bytes) {
$value = ord($data[0]);
if ($bytes >= 2) {
$value += (ord($data[1]) << 8);
}
if ($bytes >= 4) {
$value += (ord($data[2]) << 16) + (ord($data[3]) << 24);
}
$data = substr_replace($data, '', 0, $bytes);
}
return $value;
}
/**
* TODO
*
* @param string &$data The data string.
*
* @return @todo
*/
protected function _decodeAttribute(&$data)
{
$fetched = $this->_getx($data, $this->_geti($data, 32));
// checksum
$this->_geti($data, 16);
return $fetched;
}
/**
* TODO
*
* @param string $data The data string.
* @param array &$attachment_data TODO
*/
protected function _extractMapiAttributes($data, &$attachment_data)
{
/* Number of attributes. */
$number = $this->_geti($data, 32);
while ((strlen($data) > 0) && $number--) {
$have_mval = false;
$num_mval = 1;
$named_id = $value = null;
$attr_type = $this->_geti($data, 16);
$attr_name = $this->_geti($data, 16);
if (($attr_type & self::MAPI_MV_FLAG) != 0) {
$have_mval = true;
$attr_type = $attr_type & ~self::MAPI_MV_FLAG;
}
if (($attr_name >= 0x8000) && ($attr_name < 0xFFFE)) {
$this->_getx($data, 16);
$named_type = $this->_geti($data, 32);
switch ($named_type) {
case self::MAPI_NAMED_TYPE_ID:
$named_id = $this->_geti($data, 32);
$attr_name = $named_id;
break;
case self::MAPI_NAMED_TYPE_STRING:
$attr_name = 0x9999;
$idlen = $this->_geti($data, 32);
$datalen = $idlen + ((4 - ($idlen % 4)) % 4);
$named_id = substr($this->_getx($data, $datalen), 0, $idlen);
break;
}
}
if ($have_mval) {
$num_mval = $this->_geti($data, 32);
}
switch ($attr_type) {
case self::MAPI_SHORT:
$value = $this->_geti($data, 16);
break;
case self::MAPI_INT:
case self::MAPI_BOOLEAN:
for ($i = 0; $i < $num_mval; $i++) {
$value = $this->_geti($data, 32);
}
break;
case self::MAPI_FLOAT:
case self::MAPI_ERROR:
$value = $this->_getx($data, 4);
break;
case self::MAPI_DOUBLE:
case self::MAPI_APPTIME:
case self::MAPI_CURRENCY:
case self::MAPI_INT8BYTE:
case self::MAPI_SYSTIME:
$value = $this->_getx($data, 8);
break;
case self::MAPI_STRING:
case self::MAPI_UNICODE_STRING:
case self::MAPI_BINARY:
case self::MAPI_OBJECT:
$num_vals = ($have_mval) ? $num_mval : $this->_geti($data, 32);
for ($i = 0; $i < $num_vals; $i++) {
$length = $this->_geti($data, 32);
/* Pad to next 4 byte boundary. */
$datalen = $length + ((4 - ($length % 4)) % 4);
if ($attr_type == self::MAPI_STRING) {
--$length;
}
/* Read and truncate to length. */
$value = substr($this->_getx($data, $datalen), 0, $length);
}
break;
}
/* Store any interesting attributes. */
switch ($attr_name) {
case self::MAPI_ATTACH_LONG_FILENAME:
/* Used in preference to AFILENAME value. */
$attachment_data[0]['name'] = preg_replace('/.*[\/](.*)$/', '\1', $value);
$attachment_data[0]['name'] = str_replace("\0", '', $attachment_data[0]['name']);
break;
case self::MAPI_ATTACH_MIME_TAG:
/* Is this ever set, and what is format? */
$attachment_data[0]['type'] = preg_replace('/^(.*)\/.*/', '\1', $value);
$attachment_data[0]['type'] = str_replace("\0", '', $attachment_data[0]['type']);
$attachment_data[0]['subtype'] = preg_replace('/.*\/(.*)$/', '\1', $value);
$attachment_data[0]['subtype'] = str_replace("\0", '', $attachment_data[0]['subtype']);
break;
// MAPI properties for meeting requests/responses.
case self::MAPI_CONVERSATION_TOPIC:
$this->_conversation_topic = $value;
break;
case self::MAPI_APPOINTMENT_LOCATION:
$attachment_data[0]['location'] = $value;
break;
case self::MAPI_APPOINTMENT_URL:
$attachment_data[0]['url'] = $value;
break;
case self::MAPI_APPOINTMENT_START_WHOLE:
try {
$attachment_data[0]['start_utc'] = new Horde_Date(Horde_Mapi::filetimeToUnixtime($value), 'UTC');
} catch (Horde_Mapi_Exception $e) {
throw new Horde_Compress_Exception($e);
}
break;
case self::MAPI_APPOINTMENT_END_WHOLE:
try {
$attachment_data[0]['end_utc'] = new Horde_Date(Horde_Mapi::filetimeToUnixtime($value), 'UTC');
} catch (Horde_Mapi_Exception $e) {
throw new Horde_Compress_Exception($e);
}
break;
case self::MAPI_APPOINTMENT_DURATION:
$attachment_data[0]['duration'] = $value;
break;
case self::MAPI_APPOINTMENT_SUBTYPE:
$attachment_data[0]['allday'] = $value;
break;
case self::MAPI_ORGANIZER_ALIAS:
$attachment_data[0]['organizer'] = $value;
break;
case self::MAPI_LAST_MODIFIER_NAME:
$this->_lastModifier = $value;
break;
case self::MAPI_ENTRY_UID:
$attachment_data[0]['uid'] = Horde_Mapi::getUidFromGoid(bin2hex($value));
break;
case self::MAPI_APPOINTMENT_RECUR:
if (empty($attachment_data[0]['recurrence'])) {
$attachment_data[0]['recurrence'] = array();
}
$attachment_data[0]['recurrence']['recur'] = $this->_parseRecurrence($value);
break;
case self::MAPI_RECURRING:
if (empty($attachment_data[0]['recurrence'])) {
$attachment_data[0]['recurrence'] = array();
}
break;
case self::MAPI_RECURRENCE_TYPE:
$attachment_data[0]['recurrence']['type'] = $value;
break;
case self::MAPI_MEETING_REQUEST_TYPE:
$attachment_data[0]['type'] = $value;
break;
case self::MAPI_CREATION_TIME:
$attachment_data[0]['created'] = new Horde_Date(Horde_Mapi::filetimeToUnixtime($value), 'UTC');
break;
case self::MAPI_MODIFICATION_TIME:
$attachment_data[0]['modified'] = new Horde_Date(Horde_Mapi::filetimeToUnixtime($value), 'UTC');
break;
}
}
}
/**
* TODO
*
* @param string &$data The data string.
*/
protected function _decodeMessageProperty(&$data)
{
$attribute = $this->_geti($data, 32);
switch ($attribute) {
case self::AMCLASS:
// Start of a message.
$message_class = trim($this->_decodeAttribute($data));
// For now, we only care about the parts that can be represented
// as attachments.
switch ($message_class) {
case self::IPM_MEETING_REQUEST:
$this->_iTip[0]['method'] = 'REQUEST';
break;
case self::IPM_MEETING_REQUEST_CANCELLED:
$this->_iTip[0]['method'] = 'CANCEL';
break;
}
break;
case self::AIDOWNER:
$aid = $this->_decodeAttribute($data);
$this->_iTip[0]['aid'] = $this->_geti($aid, 32);
break;
case self::ID_REQUEST_RESP:
$response = $this->_decodeAttribute($data);
// This is a boolean value in the low-order bits and null byte in
// the high order bits.
$this->_iTip[0]['RequestResponse'] = $this->_geti($response, 16);
break;
case self::AMAPIPROPS:
$properties = $this->_decodeAttribute($data);
$this->_extractMapiAttributes($properties, $this->_iTip);
break;
default:
$this->_decodeAttribute($data);
}
}
/**
* TODO
*
* @param string &$data The data string.
* @param array &$attachment_data TODO
*/
protected function _decodeAttachment(&$data, &$attachment_data)
{
$attribute = $this->_geti($data, 32);
switch ($attribute) {
case self::ARENDDATA:
/* Marks start of new attachment. */
$this->_getx($data, $this->_geti($data, 32));
/* Checksum */
$this->_geti($data, 16);
/* Add a new default data block to hold details of this
attachment. Reverse order is easier to handle later! */
array_unshift($attachment_data, array('type' => 'application',
'subtype' => 'octet-stream',
'name' => 'unknown',
'stream' => ''));
break;
case self::AFILENAME:
/* Strip path. */
$attachment_data[0]['name'] = preg_replace('/.*[\/](.*)$/', '\1', $this->_getx($data, $this->_geti($data, 32)));
$attachment_data[0]['name'] = str_replace("\0", '', $attachment_data[0]['name']);
/* Checksum */
$this->_geti($data, 16);
break;
case self::ATTACHDATA:
/* The attachment itself. */
$length = $this->_geti($data, 32);
$attachment_data[0]['size'] = $length;
$attachment_data[0]['stream'] = $this->_getx($data, $length);
/* Checksum */
$this->_geti($data, 16);
break;
case self::AMAPIATTRS:
$length = $this->_geti($data, 32);
$value = $this->_getx($data, $length);
/* Checksum */
$this->_geti($data, 16);
$this->_extractMapiAttributes($value, $attachment_data);
break;
default:
$this->_decodeAttribute($data);
}
}
/**
* Generate an iTip from embedded TNEF MEETING data.
*
*/
protected function _checkiTip(&$out)
{
// Meeting requests will have 'type' set to a non-empty value.
if (!empty($this->_iTip[0]) && !empty($this->_iTip[0]['method'])) {
$iCal = new Horde_Icalendar();
// METHOD
if (!empty($this->_iTip[0]['type'])) {
switch ($this->_iTip[0]['type']) {
case self::MAPI_MEETING_INITIAL:
case self::MAPI_MEETING_FULL_UPDATE:
$method = 'REQUEST';
break;
case self::MAPI_MEETING_INFO:
$method = 'PUBLISH';
break;
}
} else {
$method = $this->_iTip[0]['method'];
}
$iCal->setAttribute('METHOD', $method);
// VEVENT
$vEvent = Horde_Icalendar::newComponent('vevent', $iCal);
if (empty($this->_iTip[0]['end_utc'])) {
return;
}
$end = clone $this->_iTip[0]['end_utc'];
$end->sec++;
if ($this->_iTip[0]['allday']) {
$vEvent->setAttribute('DTSTART', $this->_iTip[0]['start_utc'], array('VALUE' => 'DATE'));
$vEvent->setAttribute('DTEND', $end, array('VALUE' => 'DATE'));
} else {
$vEvent->setAttribute('DTSTART', $this->_iTip[0]['start_utc']);
$vEvent->setAttribute('DTEND', $end);
}
$vEvent->setAttribute('DTSTAMP', $_SERVER['REQUEST_TIME']);
$vEvent->setAttribute('UID', $this->_iTip[0]['uid']);
if (!empty($this->_iTip[0]['created'])) {
$vEvent->setAttribute('CREATED', $this->_iTip[0]['created']);
}
if (!empty($this->_iTip[0]['modified'])) {
$vEvent->setAttribute('LAST-MODIFIED', $this->_iTip[0]['modified']);
}
$vEvent->setAttribute('SUMMARY', $this->_conversation_topic);
if (empty($this->_iTip[0]['organizer']) && !empty($this->_lastModifier)) {
$email = $this->_lastModifier;
} else if (!empty($this->_iTip[0]['organizer'])) {
$email = $this->_iTip[0]['organizer'];
}
if (!empty($email)) {
$vEvent->setAttribute('ORGANIZER', 'mailto:' . $email);
}
if (!empty($this->_iTip[0]['url'])) {
$vEvent->setAttribute('URL', $this->_iTip[0]['url']);
}
if (!empty($this->_iTip[0]['recurrence']['recur'])) {
$rrule = $this->_iTip[0]['recurrence']['recur']->toRRule20($iCal);
$vEvent->setAttribute('RRULE', $rrule);
}
$iCal->addComponent($vEvent);
array_unshift($out, array(
'type' => 'text',
'subtype' => 'calendar',
'name' => $this->_conversation_topic,
'stream' => $iCal->exportvCalendar()));
}
}
protected function _parseRecurrence($value)
{
// both are 0x3004 (version strings);
$this->_geti($value, 16);
$this->_geti($value, 16);
$freq = $this->_geti($value, 16);
$pattern = $this->_geti($value, 16);
$calendarType = $this->_geti($value, 16);
$firstDt = $this->_geti($value, 32);
$period = $this->_geti($value, 32);
// Only used for tasks, otherwise value must be zero.
$flag = $this->_geti($value, 32);
// TypeSpecific field
switch ($pattern) {
case self::PATTERN_DAY:
// Nothing here to see, move along.
break;
case self::PATTERN_WEEK:
// Bits: 0/unused, 1/Saturday, 2/Friday, 3/Thursday, 4/Wednesday,
// 5/Tuesday, 6/Monday, 7/Sunday.
$day = $this->_geti($value, 8);
$this->_geti($value, 24);
break;
case self::PATTERN_MONTH:
case self::PATTERN_MONTH_END:
// Day of month on which the recurrence falls.
$day = $this->_geti($value, 32);
break;
case self::PATTERN_MONTH_NTH:
// Bits: 0/unused, 1/Saturday, 2/Friday, 3/Thursday, 4/Wednesday,
// 5/Tuesday, 6/Monday, 7/Sunday.
// For Nth Weekday of month
$day = $this->_geti($value, 8);
$this->_geti($value, 24);
$n = $this->_geti($value, 32);
break;
}
$end = $this->_geti($value, 32);
$count = $this->_geti($value, 32);
$fdow = $this->_geti($value, 32);
$deletedCount = $this->_geti($value, 32);
for ($i = 0; $i < $deletedCount; $i++) {
$deleted[] = $this->_geti($value, 32);
}
$modifiedCount = $this->_geti($value, 32);
for ($i = 0; $i < $modifiedCount; $i++) {
$modified[] = $this->_geti($value, 32);
}
// What Timezone are these in?
try {
$startDate = new Horde_Date(Horde_Mapi::filetimeToUnixtime($this->_geti($value, 32)));
$endDate = new Horde_Date(Horde_Mapi::filetimeToUnixtime($this->_geti($value, 32)));
} catch (Horde_Mapi_Exception $e) {
throw new Horde_Compress_Exception($e);
}
$rrule = new Horde_Date_Recurrence($startDate);
switch ($pattern) {
case self::PATTERN_DAY:
$rrule->setRecurType(Horde_Date_Recurrence::RECUR_DAILY);
break;
case self::PATTERN_WEEK:
$rrule->setRecurType(Horde_Date_Recurrence::RECUR_WEEKLY);
break;
case self::PATTERN_MONTH:
case self::PATTERN_MONTH_END:
$rrule->setRecurType(Horde_Date_Recurrence::RECUR_MONTHLY_DATE);
break;
case self::PATTERN_MONTH_NTH:
$rrule->setRecurType(Horde_Date_Recurrence::RECUR_MONTHLY_WEEKDAY);
break;
default:
if ($freq == self::RECUR_YEARLY) {
$rrule->setRecurType(Horde_Date_Recurrence::RECUR_YEARLY);
}
}
switch ($end) {
case self::RECUR_END_N:
$rrule->setRecurCount($count);
break;
case self::RECUR_END_DATE:
$rrule->setRecurEnd($endDate);
break;
}
return $rrule;
}
}
Horde_Compress-2.0.7/lib/Horde/Compress/Translation.php 0000664 0000766 0000024 00000003414 12267642544 020004 0 ustar
* @category Horde
* @package Compress
*/
class Horde_Compress_Translation extends Horde_Translation
{
/**
* Returns the translation of a message.
*
* @var string $message The string to translate.
*
* @return string The string translation, or the original string if no
* translation exists.
*/
static public function t($message)
{
self::$_domain = 'Horde_Compress';
self::$_directory = '@data_dir@' == '@'.'data_dir'.'@' ? __DIR__ . '/../../../locale' : '@data_dir@/Horde_Compress/locale';
return parent::t($message);
}
/**
* Returns the plural translation of a message.
*
* @param string $singular The singular version to translate.
* @param string $plural The plural version to translate.
* @param integer $number The number that determines singular vs. plural.
*
* @return string The string translation, or the original string if no
* translation exists.
*/
static public function ngettext($singular, $plural, $number)
{
self::$_domain = 'Horde_Compress';
self::$_directory = '@data_dir@' == '@'.'data_dir'.'@' ? __DIR__ . '/../../../locale' : '@data_dir@/Horde_Compress/locale';
return parent::ngettext($singular, $plural, $number);
}
}
Horde_Compress-2.0.7/lib/Horde/Compress/Zip.php 0000664 0000766 0000024 00000034545 12267642544 016261 0 ustar
* http://www.zend.com/codex.php?id=535&single=1
*
* Deins125
* http://www.zend.com/codex.php?id=470&single=1
*
* The ZIP compression date code is partially based on code from
* Peter Listiak
*
* Copyright 2000-2013 Horde LLC (http://www.horde.org/)
*
* See the enclosed file COPYING for license information (LGPL). If you
* did not receive this file, see http://www.horde.org/licenses/lgpl21.
*
* @author Chuck Hagenbuch
* @author Michael Cochrane
* @author Michael Slusarz
* @category Horde
* @license http://www.horde.org/licenses/lgpl21 LGPL 2.1
* @package Compress
*/
class Horde_Compress_Zip extends Horde_Compress_Base
{
/* Constants used with decompress(). */
const ZIP_LIST = 1;
const ZIP_DATA = 2;
/* Beginning of central directory record. */
const CTRL_DIR_HEADER = "\x50\x4b\x01\x02";
/* End of central directory record. */
const CTRL_DIR_END = "\x50\x4b\x05\x06\x00\x00\x00\x00";
/* Beginning of file contents. */
const FILE_HEADER = "\x50\x4b\x03\x04";
/**
*/
public $canCompress = true;
/**
*/
public $canDecompress = true;
/**
* ZIP compression methods.
*
* @var array
*/
protected $_methods = array(
0x0 => 'None',
0x1 => 'Shrunk',
0x2 => 'Super Fast',
0x3 => 'Fast',
0x4 => 'Normal',
0x5 => 'Maximum',
0x6 => 'Imploded',
0x8 => 'Deflated'
);
/**
* Temporary data for compressing files.
*
* @var array
*/
protected $_ctrldir;
/**
* Temporary contents for compressing files.
*
* @var resource
*/
protected $_tmp;
/**
* @param array $data The data to compress. Requires an array of
* arrays. Each subarray should contain these
* fields:
* - data: (string/resource) The data to compress.
* - name: (string) The pathname to the file.
* - time: (integer) [optional] The timestamp to use for the file.
* @param array $params The parameter array.
* - stream: (boolean) If set, return a stream instead of a string.
* DEFAULT: Return string
*
* @return mixed The ZIP file as either a string or a stream resource.
*/
public function compress($data, $params = array())
{
if (!Horde_Util::extensionExists('zlib')) {
throw new Horde_Compress_Exception(Horde_Compress_Translation::t("This server can't compress zip files."));
}
$this->_ctrldir = array();
$this->_tmp = fopen('php://temp', 'r+');
reset($data);
while (list(, $val) = each($data)) {
$this->_addToZipFile($val);
}
/* Creates the ZIP file.
* Official ZIP file format: http://www.pkware.com/appnote.txt */
$dir = implode('', $this->_ctrldir);
fseek($this->_tmp, 0, SEEK_END);
$offset = ftell($this->_tmp);
fwrite($this->_tmp,
$dir . self::CTRL_DIR_END .
/* Total # of entries "on this disk". */
pack('v', count($this->_ctrldir)) .
/* Total # of entries overall. */
pack('v', count($this->_ctrldir)) .
/* Size of central directory. */
pack('V', strlen($dir)) .
/* Offset to start of central dir. */
pack('V', $offset) .
/* ZIP file comment length. */
"\x00\x00"
);
rewind($this->_tmp);
if (empty($params['stream'])) {
$out = stream_get_contents($this->_tmp);
fclose($this->_tmp);
return $out;
}
return $this->_tmp;
}
/**
* @param array $params The parameter array.
* - action: (integer) [REQUIRED] The action to take on the data. Either
* self::ZIP_LIST or self::ZIP_DATA.
* - info: (array) [REQUIRED for ZIP_DATA] The zipfile list.
* - key: (integer) [REQUIRED for ZIP_DATA] The position of the file in
* the archive list.
*
* @return mixed If action is self::ZIP_DATA, the uncompressed data. If
* action is self::ZIP_LIST, an array with the KEY as the
* position in the zipfile and these values:
* - attr: File attributes
* - crc: CRC checksum
* - csize: Compressed file size
* - date: File modification time
* - name: Filename
* - method: Compression method
* - size: Original file size
* - type: File type
* @throws Horde_Compress_Exception
*/
public function decompress($data, array $params = array())
{
if (isset($params['action'])) {
switch ($params['action']) {
case self::ZIP_LIST:
return $this->_getZipInfo($data);
case self::ZIP_DATA:
return $this->_getZipData($data, $params['info'], $params['key']);
}
}
}
/**
* Get the list of files/data from the zip archive.
*
* @param string $data The zipfile data.
*
* @return array See decompress() for the format.
*
* @throws Horde_Compress_Exception
*/
protected function _getZipInfo($data)
{
$entries = array();
/* Get details from Central directory structure. */
$fhStart = strpos($data, self::CTRL_DIR_HEADER);
do {
if (strlen($data) < $fhStart + 31) {
throw new Horde_Compress_Exception(Horde_Compress_Translation::t("Invalid ZIP data"));
}
$info = unpack('vMethod/VTime/VCRC32/VCompressed/VUncompressed/vLength', substr($data, $fhStart + 10, 20));
if (!isset($this->_methods[$info['Method']])) {
throw new Horde_Compress_Exception(Horde_Compress_Translation::t("Invalid ZIP data"));
}
$name = substr($data, $fhStart + 46, $info['Length']);
$entries[$name] = array(
'attr' => null,
'crc' => sprintf("%08s", dechex($info['CRC32'])),
'csize' => $info['Compressed'],
'date' => null,
'_dataStart' => null,
'name' => $name,
'method' => $this->_methods[$info['Method']],
'_method' => $info['Method'],
'size' => $info['Uncompressed'],
'type' => null
);
$entries[$name]['date'] =
mktime((($info['Time'] >> 11) & 0x1f),
(($info['Time'] >> 5) & 0x3f),
(($info['Time'] << 1) & 0x3e),
(($info['Time'] >> 21) & 0x07),
(($info['Time'] >> 16) & 0x1f),
((($info['Time'] >> 25) & 0x7f) + 1980));
if (strlen($data) < $fhStart + 43) {
throw new Horde_Compress_Exception(Horde_Compress_Translation::t("Invalid ZIP data"));
}
$info = unpack('vInternal/VExternal', substr($data, $fhStart + 36, 6));
$entries[$name]['type'] = ($info['Internal'] & 0x01) ? 'text' : 'binary';
$entries[$name]['attr'] =
(($info['External'] & 0x10) ? 'D' : '-') .
(($info['External'] & 0x20) ? 'A' : '-') .
(($info['External'] & 0x03) ? 'S' : '-') .
(($info['External'] & 0x02) ? 'H' : '-') .
(($info['External'] & 0x01) ? 'R' : '-');
} while (($fhStart = strpos($data, self::CTRL_DIR_HEADER, $fhStart + 46)) !== false);
/* Get details from local file header. */
$fhStart = strpos($data, self::FILE_HEADER);
$data_len = strlen($data);
do {
if ($data_len < $fhStart + 34) {
throw new Horde_Compress_Exception(Horde_Compress_Translation::t("Invalid ZIP data"));
}
$info = unpack('vMethod/VTime/VCRC32/VCompressed/VUncompressed/vLength/vExtraLength', substr($data, $fhStart + 8, 25));
$name = substr($data, $fhStart + 30, $info['Length']);
if (isset($entries[$name])) {
$entries[$name]['_dataStart'] = $fhStart + 30 + $info['Length'] + $info['ExtraLength'];
}
} while ($data_len > $fhStart + 30 + $info['Length'] &&
($fhStart = strpos($data, self::FILE_HEADER, $fhStart + 30 + $info['Length'])) !== false);
return array_values($entries);
}
/**
* Returns the data for a specific archived file.
*
* @param string $data The zip archive contents.
* @param array $info The information array from _getZipInfo().
* @param integer $key The position of the file in the archive.
*
* @return string The file data.
*/
protected function _getZipData($data, $info, $key)
{
if (($info[$key]['_method'] == 0x8) &&
Horde_Util::extensionExists('zlib')) {
/* If the file has been deflated, and zlib is installed,
then inflate the data again. */
return @gzinflate(substr($data, $info[$key]['_dataStart'], $info[$key]['csize']));
} elseif ($info[$key]['_method'] == 0x0) {
/* Files that aren't compressed. */
return substr($data, $info[$key]['_dataStart'], $info[$key]['csize']);
}
return '';
}
/**
* Checks to see if the data is a valid ZIP file.
*
* @param string $data The ZIP file data.
*
* @return boolean True if valid, false if invalid.
*/
public function checkZipData($data)
{
return (strpos($data, self::FILE_HEADER) !== false);
}
/**
* Converts a UNIX timestamp to a 4-byte DOS date and time format
* (date in high 2-bytes, time in low 2-bytes allowing magnitude
* comparison).
*
* @param integer $unixtime The current UNIX timestamp.
*
* @return integer The current date in a 4-byte DOS format.
*/
protected function _unix2DOSTime($unixtime = null)
{
$timearray = (is_null($unixtime)) ? getdate() : getdate($unixtime);
if ($timearray['year'] < 1980) {
$timearray['year'] = 1980;
$timearray['mon'] = 1;
$timearray['mday'] = 1;
$timearray['hours'] = 0;
$timearray['minutes'] = 0;
$timearray['seconds'] = 0;
}
return (($timearray['year'] - 1980) << 25) |
($timearray['mon'] << 21) |
($timearray['mday'] << 16) |
($timearray['hours'] << 11) |
($timearray['minutes'] << 5) |
($timearray['seconds'] >> 1);
}
/**
* Adds a "file" to the ZIP archive.
*
* @param array $file See self::createZipFile().
*/
protected function _addToZipFile($file)
{
$name = str_replace('\\', '/', $file['name']);
/* See if time/date information has been provided. */
$ftime = (isset($file['time'])) ? $file['time'] : null;
/* Get the hex time. */
$dtime = dechex($this->_unix2DosTime($ftime));
$hexdtime = chr(hexdec($dtime[6] . $dtime[7])) .
chr(hexdec($dtime[4] . $dtime[5])) .
chr(hexdec($dtime[2] . $dtime[3])) .
chr(hexdec($dtime[0] . $dtime[1]));
/* "Local file header" segment. */
if (is_resource($file['data'])) {
$zdata = fopen('php://temp', 'r+');
$params = new stdClass;
stream_filter_register('horde_compress_filter_crc32', 'Horde_Stream_Filter_Crc32');
$filter = stream_filter_prepend($file['data'], 'horde_compress_filter_crc32', STREAM_FILTER_READ, $params);
$filter2 = stream_filter_append($zdata, 'zlib.deflate', STREAM_FILTER_WRITE);
rewind($file['data']);
stream_copy_to_stream($file['data'], $zdata);
$crc = $params->crc32;
$unc_len = ftell($file['data']);
stream_filter_remove($filter2);
stream_filter_remove($filter);
fseek($zdata, 0, SEEK_END);
$c_len = ftell($zdata);
} else {
$unc_len = strlen($file['data']);
$crc = crc32($file['data']);
$zdata = gzdeflate($file['data']);
$c_len = strlen($zdata);
}
/* Common data for the two entries. */
$common =
"\x14\x00" . /* Version needed to extract. */
"\x00\x00" . /* General purpose bit flag. */
"\x08\x00" . /* Compression method. */
$hexdtime . /* Last modification time/date. */
pack('V', $crc) . /* CRC 32 information. */
pack('V', $c_len) . /* Compressed filesize. */
pack('V', $unc_len) . /* Uncompressed filesize. */
pack('v', strlen($name)) . /* Length of filename. */
pack('v', 0); /* Extra field length. */
/* Add this entry to zip data. */
fseek($this->_tmp, 0, SEEK_END);
$old_offset = ftell($this->_tmp);
fwrite($this->_tmp,
self::FILE_HEADER . /* Begin creating the ZIP data. */
$common . /* Common data. */
$name
);
/* "File data" segment. */
if (is_resource($zdata)) {
rewind($zdata);
stream_copy_to_stream($zdata, $this->_tmp);
} else {
fwrite($this->_tmp, $zdata);
}
/* Add to central directory record. */
$this->_ctrldir[] =
self::CTRL_DIR_HEADER .
"\x00\x00" . /* Version made by. */
$common . /* Common data. */
pack('v', 0) . /* File comment length. */
pack('v', 0) . /* Disk number start. */
pack('v', 0) . /* Internal file attributes. */
pack('V', 32) . /* External file attributes -
* 'archive' bit set. */
pack('V', $old_offset) . /* Relative offset of local
* header. */
$name; /* File name. */
}
}
Horde_Compress-2.0.7/lib/Horde/Compress.php 0000664 0000766 0000024 00000002772 12267642544 015514 0 ustar
* @category Horde
* @license http://www.horde.org/licenses/lgpl21 LGPL 2.1
* @package Compress
*/
class Horde_Compress
{
/**
* Attempts to return a concrete Horde_Compress_Base instance based on
* $driver.
*
* @param string $driver Either a driver name, or the full class name to
* use (class must extend Horde_Compress_Base).
* @param array $params Hash containing any additional configuration
* or parameters a subclass needs.
*
* @return Horde_Compress_Base The newly created concrete instance.
* @throws Horde_Compress_Exception
*/
static public function factory($driver, $params = null)
{
/* Base drivers (in Compress/ directory). */
$class = __CLASS__ . '_' . ucfirst($driver);
if (@class_exists($class)) {
return new $class($params);
}
/* Explicit class name. */
if (@class_exists($driver)) {
return new $driver($params);
}
throw new Horde_Compress_Exception(__CLASS__ . ': Class definition of ' . $driver . ' not found.');
}
}
Horde_Compress-2.0.7/locale/ar/LC_MESSAGES/Horde_Compress.mo 0000664 0000766 0000024 00000000577 12267642544 020301 0 ustar Þ• $ , 8 E 9 Project-Id-Version: Horde_Compress
Report-Msgid-Bugs-To: dev@lists.horde.org
POT-Creation-Date: 2010-10-13 01:27+0200
PO-Revision-Date: 2010-10-13 01:27+0200
Last-Translator: Automatically generated
Language-Team: i18n@lists.horde.org
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Horde_Compress-2.0.7/locale/ar/LC_MESSAGES/Horde_Compress.po 0000664 0000766 0000024 00000002337 12267642544 020300 0 ustar # Arabic translations for Horde_Compress module.
# Copyright 2010-2013 Horde LLC
# This file is distributed under the same license as the Horde_Compress module.
# Automatically generated, 2010.
#
msgid ""
msgstr ""
"Project-Id-Version: Horde_Compress\n"
"Report-Msgid-Bugs-To: dev@lists.horde.org\n"
"POT-Creation-Date: 2010-10-13 01:27+0200\n"
"PO-Revision-Date: 2010-10-13 01:27+0200\n"
"Last-Translator: Automatically generated\n"
"Language-Team: i18n@lists.horde.org\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: lib/Horde/Compress/Rar.php:54
msgid "Invalid RAR data."
msgstr ""
#: lib/Horde/Compress/Zip.php:197 lib/Horde/Compress/Zip.php:224
#: lib/Horde/Compress/Zip.php:244
msgid "Invalid ZIP data"
msgstr ""
#: lib/Horde/Compress/Dbx.php:128 lib/Horde/Compress/Dbx.php:157
#: lib/Horde/Compress/Dbx.php:238
msgid "Invalid file format"
msgstr ""
#: lib/Horde/Compress/Zip.php:93
msgid "This server can't compress zip files."
msgstr ""
#: lib/Horde/Compress/Gzip.php:42
msgid "This server can't uncompress gzip files."
msgstr ""
#: lib/Horde/Compress/Gzip.php:49 lib/Horde/Compress/Gzip.php:79
#: lib/Horde/Compress/Tar.php:74
msgid "Unable to decompress data."
msgstr ""
Horde_Compress-2.0.7/locale/bg/LC_MESSAGES/Horde_Compress.mo 0000664 0000766 0000024 00000000577 12267642544 020267 0 ustar Þ• $ , 8 E 9 Project-Id-Version: Horde_Compress
Report-Msgid-Bugs-To: dev@lists.horde.org
POT-Creation-Date: 2010-10-13 01:27+0200
PO-Revision-Date: 2010-10-13 01:27+0200
Last-Translator: Automatically generated
Language-Team: i18n@lists.horde.org
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Horde_Compress-2.0.7/locale/bg/LC_MESSAGES/Horde_Compress.po 0000664 0000766 0000024 00000003215 12267642544 020262 0 ustar # Bulgarian translations for Horde_Compress module.
# Copyright 2010-2013 Horde LLC
# This file is distributed under the same license as the Horde_Compress module.
# Automatically generated, 2010.
#
msgid ""
msgstr ""
"Project-Id-Version: Horde_Compress\n"
"Report-Msgid-Bugs-To: dev@lists.horde.org\n"
"POT-Creation-Date: 2010-10-13 01:27+0200\n"
"PO-Revision-Date: 2010-10-13 01:27+0200\n"
"Last-Translator: Automatically generated\n"
"Language-Team: i18n@lists.horde.org\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: lib/Horde/Compress/Rar.php:54
#, fuzzy
msgid "Invalid RAR data."
msgstr "Изпратените данни Ñа невалидни."
#: lib/Horde/Compress/Zip.php:197 lib/Horde/Compress/Zip.php:224
#: lib/Horde/Compress/Zip.php:244
#, fuzzy
msgid "Invalid ZIP data"
msgstr "Изпратените данни Ñа невалидни."
#: lib/Horde/Compress/Dbx.php:128 lib/Horde/Compress/Dbx.php:157
#: lib/Horde/Compress/Dbx.php:238
msgid "Invalid file format"
msgstr ""
#: lib/Horde/Compress/Zip.php:93
#, fuzzy
msgid "This server can't compress zip files."
msgstr "Този Ñървър не може да декомпреÑира zip и gzip файлове."
#: lib/Horde/Compress/Gzip.php:42
#, fuzzy
msgid "This server can't uncompress gzip files."
msgstr "Този Ñървър не може да декомпреÑира zip и gzip файлове."
#: lib/Horde/Compress/Gzip.php:49 lib/Horde/Compress/Gzip.php:79
#: lib/Horde/Compress/Tar.php:74
#, fuzzy
msgid "Unable to decompress data."
msgstr "Грешка при отварÑнето на компреÑиран архив."
Horde_Compress-2.0.7/locale/bs/LC_MESSAGES/Horde_Compress.mo 0000664 0000766 0000024 00000000577 12267642544 020303 0 ustar Þ• $ , 8 E 9 Project-Id-Version: Horde_Compress
Report-Msgid-Bugs-To: dev@lists.horde.org
POT-Creation-Date: 2010-10-13 01:27+0200
PO-Revision-Date: 2010-10-13 01:27+0200
Last-Translator: Automatically generated
Language-Team: i18n@lists.horde.org
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Horde_Compress-2.0.7/locale/bs/LC_MESSAGES/Horde_Compress.po 0000664 0000766 0000024 00000002367 12267642544 020305 0 ustar # Bosnian translations for Horde_Compress module.
# Copyright 2010-2013 Horde LLC
# This file is distributed under the same license as the Horde_Compress module.
# Automatically generated, 2010.
#
msgid ""
msgstr ""
"Project-Id-Version: Horde_Compress\n"
"Report-Msgid-Bugs-To: dev@lists.horde.org\n"
"POT-Creation-Date: 2010-10-13 01:27+0200\n"
"PO-Revision-Date: 2010-10-13 01:27+0200\n"
"Last-Translator: Automatically generated\n"
"Language-Team: i18n@lists.horde.org\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: lib/Horde/Compress/Rar.php:54
msgid "Invalid RAR data."
msgstr ""
#: lib/Horde/Compress/Zip.php:197 lib/Horde/Compress/Zip.php:224
#: lib/Horde/Compress/Zip.php:244
msgid "Invalid ZIP data"
msgstr ""
#: lib/Horde/Compress/Dbx.php:128 lib/Horde/Compress/Dbx.php:157
#: lib/Horde/Compress/Dbx.php:238
#, fuzzy
msgid "Invalid file format"
msgstr "Vremenska zona"
#: lib/Horde/Compress/Zip.php:93
msgid "This server can't compress zip files."
msgstr ""
#: lib/Horde/Compress/Gzip.php:42
msgid "This server can't uncompress gzip files."
msgstr ""
#: lib/Horde/Compress/Gzip.php:49 lib/Horde/Compress/Gzip.php:79
#: lib/Horde/Compress/Tar.php:74
msgid "Unable to decompress data."
msgstr ""
Horde_Compress-2.0.7/locale/ca/LC_MESSAGES/Horde_Compress.mo 0000664 0000766 0000024 00000001127 12267642544 020252 0 ustar Þ• <