Changeset View
Changeset View
Standalone View
Standalone View
src/applications/phortune/pdf/PhabricatorPDFIterator.php
- This file was added.
<?php | |||||
final class PhabricatorPDFIterator | |||||
extends Phobject | |||||
implements Iterator { | |||||
private $generator; | |||||
private $hasRewound; | |||||
private $fragments; | |||||
private $fragmentKey; | |||||
private $fragmentBytes; | |||||
private $fragmentOffsets = array(); | |||||
private $byteLength; | |||||
public function setGenerator(PhabricatorPDFGenerator $generator) { | |||||
if ($this->generator) { | |||||
throw new Exception( | |||||
pht( | |||||
'This iterator already has a generator. You can not modify the '. | |||||
'generator for a given iterator.')); | |||||
} | |||||
$this->generator = $generator; | |||||
return $this; | |||||
} | |||||
public function getGenerator() { | |||||
if (!$this->generator) { | |||||
throw new Exception( | |||||
pht( | |||||
'This PDF iterator has no associated PDF generator.')); | |||||
} | |||||
return $this->generator; | |||||
} | |||||
public function getFragmentOffsets() { | |||||
return $this->fragmentOffsets; | |||||
} | |||||
public function current() { | |||||
return $this->fragmentBytes; | |||||
} | |||||
public function key() { | |||||
return $this->framgentKey; | |||||
} | |||||
public function next() { | |||||
$this->fragmentKey++; | |||||
if (!$this->valid()) { | |||||
return; | |||||
} | |||||
$fragment = $this->fragments[$this->fragmentKey]; | |||||
$this->fragmentOffsets[] = id(new PhabricatorPDFFragmentOffset()) | |||||
->setFragment($fragment) | |||||
->setOffset($this->byteLength); | |||||
$bytes = $fragment->getAsBytes(); | |||||
$this->fragmentBytes = $bytes; | |||||
$this->byteLength += strlen($bytes); | |||||
} | |||||
public function rewind() { | |||||
if ($this->hasRewound) { | |||||
throw new Exception( | |||||
pht( | |||||
'PDF iterators may not be rewound. Create a new iterator to emit '. | |||||
'another PDF.')); | |||||
} | |||||
$generator = $this->getGenerator(); | |||||
$objects = $generator->getObjects(); | |||||
$this->fragments = array(); | |||||
$this->fragments[] = new PhabricatorPDFHeadFragment(); | |||||
foreach ($objects as $object) { | |||||
$this->fragments[] = $object; | |||||
} | |||||
$this->fragments[] = id(new PhabricatorPDFTailFragment()) | |||||
->setIterator($this); | |||||
$this->hasRewound = true; | |||||
$this->fragmentKey = -1; | |||||
$this->byteLength = 0; | |||||
$this->next(); | |||||
} | |||||
public function valid() { | |||||
return isset($this->fragments[$this->fragmentKey]); | |||||
} | |||||
} |