3 * A NetworkPackage class. This class implements the Deliverable class because
4 * all network packages should be deliverable to other nodes. It further
5 * provides methods for reading raw content from template engines and feeding it
6 * to the stacker for undeclared packages.
8 * The factory method requires you to provide a compressor class (which must
9 * implement the Compressor interface). If you don't want any compression (not
10 * adviceable due to increased network load), please use the NullCompressor
11 * class and encode it with BASE64 for a more error-free transfer over the
14 * For performance reasons, this class should only be instantiated once and then
15 * used as a "pipe-through" class.
17 * @author Roland Haeder <webmaster@ship-simu.org>
19 * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009, 2010 Hub Developer Team
20 * @license GNU GPL 3.0 or any newer version
21 * @link http://www.ship-simu.org
22 * @todo Needs to add functionality for handling the object's type
24 * This program is free software: you can redistribute it and/or modify
25 * it under the terms of the GNU General Public License as published by
26 * the Free Software Foundation, either version 3 of the License, or
27 * (at your option) any later version.
29 * This program is distributed in the hope that it will be useful,
30 * but WITHOUT ANY WARRANTY; without even the implied warranty of
31 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
32 * GNU General Public License for more details.
34 * You should have received a copy of the GNU General Public License
35 * along with this program. If not, see <http://www.gnu.org/licenses/>.
37 class NetworkPackage extends BaseFrameworkSystem implements Deliverable {
39 * Package mask for compressing package data
41 const PACKAGE_MASK = '%s:%s:%s';
44 * Protected constructor
48 protected function __construct () {
49 // Call parent constructor
50 parent::__construct(__CLASS__);
52 // We need to initialize a stack here for our packages even those
53 // which have no recipient address and stamp... ;-)
54 $stackerInstance = ObjectFactory::createObjectByConfiguredName('package_stacker_class');
56 // At last, set it in this class
57 $this->setStackerInstance($stackerInstance);
61 * Creates an instance of this class
63 * @param $compressorInstance A Compressor instance for compressing the content
64 * @return $packageInstance An instance of a Deliverable class
66 public final static function createNetworkPackage (Compressor $compressorInstance) {
68 $packageInstance = new NetworkPackage();
70 // Now set the compressor instance if set
71 if ($compressorInstance instanceof Compressor) {
73 $packageInstance->setCompressorInstance($compressorInstance);
76 // Return the prepared instance
77 return $packageInstance;
81 * "Queues" raw content into this delivery class by reading the raw content
82 * from given template instance and pushing it on the 'undeclared' stack.
84 * @param $templateInstance A CompileableTemplate instance
87 public function queueRawDataFromTemplate (CompileableTemplate $templateInstance) {
88 // Get the raw content and compress it
89 $content = $this->getCompressorInstance()->compressStream($templateInstance->getRawTemplateData());
91 // Add magic in front of it and hash behind it, including BASE64 encoding
92 $content = sprintf(self::PACKAGE_MASK,
93 $this->getCompressorInstance()->getCompressorExtension(),
94 base64_encode($content),
95 crc32($content) // Not so good, but needs to be fast!
98 // Now prepare the temporary array and push it on the 'undeclared' stack
99 $this->getStackerInstance()->pushNamed('undeclared', array(
102 'content' => $content