public static function decodeBase64($uri)
{
$commandMap = array(0 => 'Sync', 1 => 'SendMail', 2 => 'SmartForward', 3 => 'SmartReply', 4 => 'GetAttachment', 9 => 'FolderSync', 10 => 'FolderCreate', 11 => 'FolderDelete', 12 => 'FolderUpdate', 13 => 'MoveItems', 14 => 'GetItemEstimate', 15 => 'MeetingResponse', 16 => 'Search', 17 => 'Settings', 18 => 'Ping', 19 => 'ItemOperations', 20 => 'Provision', 21 => 'ResolveRecipients', 22 => 'ValidateCert');
$stream = fopen('php://temp', 'r+');
fwrite($stream, base64_decode($uri));
rewind($stream);
$results = array();
// Version, command, locale
$data = unpack('CprotocolVersion/Ccommand/vlocale', fread($stream, 4));
$results['ProtVer'] = substr($data['protocolVersion'], 0, -1) . '.' . substr($data['protocolVersion'], -1);
$results['Cmd'] = $commandMap[$data['command']];
$results['Locale'] = $data['locale'];
// deviceId
$length = ord(fread($stream, 1));
if ($length > 0) {
$data = fread($stream, $length);
$data = unpack('H' . $length * 2 . 'DevID', $data);
$results['DeviceId'] = $data['DevID'];
}
// policyKey
$length = ord(fread($stream, 1));
if ($length > 0) {
$data = unpack('VpolicyKey', fread($stream, $length));
$results['PolicyKey'] = $data['policyKey'];
}
// deviceType
$length = ord(fread($stream, 1));
if ($length > 0) {
$data = unpack('A' . $length . 'devType', fread($stream, $length));
$results['DeviceType'] = $data['devType'];
}
// Remaining properties
while (!feof($stream)) {
$tag = ord(fread($stream, 1));
$length = ord(fread($stream, 1));
if ($length > 0 || $tag == 7) {
switch ($tag) {
case 0:
$data = unpack('A' . $length . 'AttName', fread($stream, $length));
$results['AttachmentName'] = $data['AttName'];
break;
case 1:
$data = unpack('A' . $length . 'CollId', fread($stream, $length));
$results['CollectionId'] = $data['CollId'];
break;
case 3:
$data = unpack('A' . $length . 'ItemId', fread($stream, $length));
$results['ItemId'] = $data['ItemId'];
break;
case 4:
$data = unpack('A' . $length . 'Lid', fread($stream, $length));
$results['LongId'] = $data['Lid'];
break;
case 5:
$data = unpack('A' . $length . 'Pid', fread($stream, $length));
$results['ParentId'] = $data['Pid'];
break;
case 6:
$data = unpack('A' . $length . 'Oc', fread($stream, $length));
$results['Occurrence'] = $data['Oc'];
break;
case 7:
$options = ord(fread($stream, 1));
$results['SaveInSent'] = !!($options & 0x1);
$results['AcceptMultiPart'] = !!($options & 0x2);
break;
case 8:
$data = unpack('A' . $length . 'User', fread($stream, $length));
$results['User'] = $data['User'];
break;
}
}
}
return $results;
}