private function getMultipartPid(string $pid, string $mimeType, string $lookFor) : string
{
$partLevel = count(explode('.', $pid));
$pidLength = strlen($pid);
$pidAdd = 1;
foreach ($this->structure['pid'] as $partNo => $id) {
$level = count(explode('.', $this->structure['pid'][$partNo]));
switch ($lookFor) {
case 'subparts':
$condition = $level == $partLevel + 1 && $pid == substr($this->structure['pid'][$partNo], 0, $pidLength);
break;
case 'multipart':
$condition = $level == $partLevel + 1 && $pid == $this->structure['pid'][$partNo];
break;
default:
$condition = false;
break;
}
if ($condition) {
if ($this->isPartMultipart($partNo, 'alternative') || $this->isPartMultipart($partNo, 'report') || $this->isPartMultipart($partNo, 'mixed')) {
foreach ($this->structure['pid'] as $multipartNo => $multipartPid) {
// Part has to begin with the last tested Id and has to be in the next level
$subLevel = count(explode('.', $this->structure['pid'][$partNo]));
if ($this->structure['ftype'][$multipartNo] == $mimeType && $subLevel == $partLevel + $pidAdd && $pid == substr($multipartPid, 0, strlen($this->structure['pid'][$partNo]))) {
if (empty($this->structure['fname'][$multipartNo])) {
return $this->structure['pid'][$multipartNo];
}
} elseif ($this->isPartMultipart($multipartNo, 'alternative') || $this->isPartMultipart($multipartNo, 'report')) {
// Need to match this PID to next level in
$pid = $this->structure['pid'][$multipartNo];
$pidLength = strlen($pid);
$partLevel = count(explode('.', $pid));
$pidAdd = 2;
continue;
}
}
} elseif ('inline' == $this->structure['disposition'][$partNo] && !$this->isPartMultipart($partNo, 'related') && !$this->isPartMultipart($partNo, 'mixed')) {
// It is inline, but not related or mixed type
if ($this->structure['ftype'][$partNo] == $mimeType && !isset($this->structure['fname'][$partNo])) {
return $this->structure['pid'][$partNo];
}
}
}
}
}