3 * The simulator system class is the super class of all other classes. This
4 * class handles saving of games etc.
6 * @author Roland Haeder <webmaster@ship-simu.org>
8 * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2012 Core Developer Team
9 * @license GNU GPL 3.0 or any newer version
10 * @link http://www.ship-simu.org
12 * This program is free software: you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation, either version 3 of the License, or
15 * (at your option) any later version.
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
22 * You should have received a copy of the GNU General Public License
23 * along with this program. If not, see <http://www.gnu.org/licenses/>.
25 class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
29 private $realClass = 'BaseFrameworkSystem';
32 * Instance of a request class
34 private $requestInstance = NULL;
37 * Instance of a response class
39 private $responseInstance = NULL;
42 * Search criteria instance
44 private $searchInstance = NULL;
47 * Update criteria instance
49 private $updateInstance = NULL;
52 * The file I/O instance for the template loader
54 private $fileIoInstance = NULL;
59 private $resolverInstance = NULL;
62 * Template engine instance
64 private $templateInstance = NULL;
67 * Database result instance
69 private $resultInstance = NULL;
72 * Instance for user class
74 private $userInstance = NULL;
77 * A controller instance
79 private $controllerInstance = NULL;
84 private $rngInstance = NULL;
87 * Instance of a crypto helper
89 private $cryptoInstance = NULL;
92 * Instance of an Iterator class
94 private $iteratorInstance = NULL;
97 * Instance of the list
99 private $listInstance = NULL;
104 private $menuInstance = NULL;
107 * Instance of the image
109 private $imageInstance = NULL;
112 * Instance of the stacker
114 private $stackerInstance = NULL;
117 * A Compressor instance
119 private $compressorInstance = NULL;
122 * A Parseable instance
124 private $parserInstance = NULL;
127 * A ProtocolHandler instance
129 private $protocolInstance = NULL;
132 * A database wrapper instance
134 private $databaseInstance = NULL;
137 * A helper instance for the form
139 private $helperInstance = NULL;
142 * An instance of a Sourceable class
144 private $sourceInstance = NULL;
147 * An instance of a InputStreamable class
149 private $inputStreamInstance = NULL;
152 * An instance of a OutputStreamable class
154 private $outputStreamInstance = NULL;
157 * Networkable handler instance
159 private $handlerInstance = NULL;
162 * Visitor handler instance
164 private $visitorInstance = NULL;
167 * An instance of a database wrapper class
169 private $wrapperInstance = NULL;
172 * Thousands separator
174 private $thousands = '.'; // German
179 private $decimals = ','; // German
184 private $socketResource = false;
189 private $packageData = array();
191 /***********************
192 * Exception codes.... *
193 ***********************/
195 // @todo Try to clean these constants up
196 const EXCEPTION_IS_NULL_POINTER = 0x001;
197 const EXCEPTION_IS_NO_OBJECT = 0x002;
198 const EXCEPTION_IS_NO_ARRAY = 0x003;
199 const EXCEPTION_MISSING_METHOD = 0x004;
200 const EXCEPTION_CLASSES_NOT_MATCHING = 0x005;
201 const EXCEPTION_INDEX_OUT_OF_BOUNDS = 0x006;
202 const EXCEPTION_DIMENSION_ARRAY_INVALID = 0x007;
203 const EXCEPTION_ITEM_NOT_TRADEABLE = 0x008;
204 const EXCEPTION_ITEM_NOT_IN_PRICE_LIST = 0x009;
205 const EXCEPTION_GENDER_IS_WRONG = 0x00a;
206 const EXCEPTION_BIRTH_DATE_IS_INVALID = 0x00b;
207 const EXCEPTION_EMPTY_STRUCTURES_ARRAY = 0x00c;
208 const EXCEPTION_HAS_ALREADY_PERSONELL_LIST = 0x00d;
209 const EXCEPTION_NOT_ENOUGTH_UNEMPLOYEES = 0x00e;
210 const EXCEPTION_TOTAL_PRICE_NOT_CALCULATED = 0x00f;
211 const EXCEPTION_HARBOR_HAS_NO_SHIPYARDS = 0x010;
212 const EXCEPTION_CONTRACT_PARTNER_INVALID = 0x011;
213 const EXCEPTION_CONTRACT_PARTNER_MISMATCH = 0x012;
214 const EXCEPTION_CONTRACT_ALREADY_SIGNED = 0x013;
215 const EXCEPTION_UNEXPECTED_EMPTY_STRING = 0x014;
216 const EXCEPTION_PATH_NOT_FOUND = 0x015;
217 const EXCEPTION_INVALID_PATH_NAME = 0x016;
218 const EXCEPTION_READ_PROTECED_PATH = 0x017;
219 const EXCEPTION_WRITE_PROTECED_PATH = 0x018;
220 const EXCEPTION_DIR_POINTER_INVALID = 0x019;
221 const EXCEPTION_FILE_POINTER_INVALID = 0x01a;
222 const EXCEPTION_INVALID_RESOURCE = 0x01b;
223 const EXCEPTION_UNEXPECTED_OBJECT = 0x01c;
224 const EXCEPTION_LIMIT_ELEMENT_IS_UNSUPPORTED = 0x01d;
225 const EXCEPTION_GETTER_IS_MISSING = 0x01e;
226 const EXCEPTION_ARRAY_EXPECTED = 0x01f;
227 const EXCEPTION_ARRAY_HAS_INVALID_COUNT = 0x020;
228 const EXCEPTION_ID_IS_INVALID_FORMAT = 0x021;
229 const EXCEPTION_MD5_CHECKSUMS_MISMATCH = 0x022;
230 const EXCEPTION_UNEXPECTED_STRING_SIZE = 0x023;
231 const EXCEPTION_SIMULATOR_ID_INVALID = 0x024;
232 const EXCEPTION_MISMATCHING_COMPRESSORS = 0x025;
233 const EXCEPTION_CONTAINER_ITEM_IS_NULL = 0x026;
234 const EXCEPTION_ITEM_IS_NO_ARRAY = 0x027;
235 const EXCEPTION_CONTAINER_MAYBE_DAMAGED = 0x028;
236 const EXCEPTION_INVALID_STRING = 0x029;
237 const EXCEPTION_VARIABLE_NOT_SET = 0x02a;
238 const EXCEPTION_ATTRIBUTES_ARE_MISSING = 0x02b;
239 const EXCEPTION_ARRAY_ELEMENTS_MISSING = 0x02c;
240 const EXCEPTION_TEMPLATE_ENGINE_UNSUPPORTED = 0x02d;
241 const EXCEPTION_UNSPPORTED_OPERATION = 0x02e;
242 const EXCEPTION_MISSING_ELEMENT = 0x030;
243 const EXCEPTION_HEADERS_ALREADY_SENT = 0x031;
244 const EXCEPTION_DEFAULT_CONTROLLER_GONE = 0x032;
245 const EXCEPTION_CLASS_NOT_FOUND = 0x033;
246 const EXCEPTION_REQUIRED_INTERFACE_MISSING = 0x034;
247 const EXCEPTION_FATAL_ERROR = 0x035;
248 const EXCEPTION_FILE_NOT_FOUND = 0x036;
249 const EXCEPTION_ASSERTION_FAILED = 0x037;
250 const EXCEPTION_FILE_CANNOT_BE_READ = 0x038;
251 const EXCEPTION_DATABASE_UPDATED_NOT_ALLOWED = 0x039;
252 const EXCEPTION_FILTER_CHAIN_INTERCEPTED = 0x040;
255 * Hexadecimal->Decimal translation array
257 private static $hexdec = array(
277 * Decimal->hexadecimal translation array
279 private static $dechex = array(
299 * Startup time in miliseconds
301 private static $startupTime = 0;
304 * Protected super constructor
306 * @param $className Name of the class
309 protected function __construct ($className) {
311 $this->setRealClass($className);
313 // Set configuration instance if no registry ...
314 if (!$this instanceof Register) {
315 // ... because registries doesn't need to be configured
316 $this->setConfigInstance(FrameworkConfiguration::getSelfInstance());
319 // Is the startup time set? (0 cannot be true anymore)
320 if (self::$startupTime == 0) {
322 self::$startupTime = microtime(true);
327 * Destructor for all classes
331 public function __destruct () {
332 // Flush any updated entries to the database
333 $this->flushPendingUpdates();
335 // Is this object already destroyed?
336 if ($this->__toString() != 'DestructedObject') {
337 // Destroy all informations about this class but keep some text about it alive
338 $this->setRealClass('DestructedObject');
339 } elseif ((defined('DEBUG_DESTRUCTOR')) && (is_object($this->getDebugInstance()))) {
340 // Already destructed object
341 self::createDebugInstance(__CLASS__)->debugOutput(sprintf("[%s:] The object <span class=\"object_name\">%s</span> is already destroyed.",
349 * The __call() method where all non-implemented methods end up
351 * @param $methodName Name of the missing method
352 * @args $args Arguments passed to the method
355 public final function __call ($methodName, $args) {
356 return self::__callStatic($methodName, $args);
360 * The __callStatic() method where all non-implemented static methods end up
362 * @param $methodName Name of the missing method
363 * @args $args Arguments passed to the method
366 public static final function __callStatic ($methodName, $args) {
367 // Init argument string
370 // Is it empty or an array?
373 $argsString = 'NULL';
374 } elseif (is_array($args)) {
375 // Some arguments are there
376 foreach ($args as $arg) {
377 // Add the value itself if not array. This prevents 'array to string conversion' message
378 if (is_array($arg)) {
379 $argsString .= 'Array';
384 // Add data about the argument
385 $argsString .= ' (' . gettype($arg);
387 if (is_string($arg)) {
388 // Add length for strings
389 $argsString .= ', ' . strlen($arg);
390 } elseif (is_array($arg)) {
391 // .. or size if array
392 $argsString .= ', ' . count($arg);
393 } elseif ($arg === true) {
394 // ... is boolean 'true'
395 $argsString .= ', true';
396 } elseif ($arg === false) {
397 // ... is boolean 'true'
398 $argsString .= ', false';
402 $argsString .= '), ';
406 if (substr($argsString, -2, 1) == ',') {
407 $argsString = substr($argsString, 0, -2);
410 // Invalid arguments!
411 $argsString = '!INVALID:' . gettype($args) . '!';
414 // Output stub message
415 // @TODO __CLASS__ does always return BaseFrameworkSystem but not the extending (=child) class
416 self::createDebugInstance(__CLASS__)->debugOutput(sprintf("[unknown::%s:] Stub! Args: %s",
426 * Getter for $realClass
428 * @return $realClass The name of the real class (not BaseFrameworkSystem)
430 public function __toString () {
431 return $this->realClass;
435 * Magic function to catch setting of missing but set class fields/attributes
437 * @param $name Name of the field/attribute
438 * @param $value Value to store
441 public final function __set ($name, $value) {
442 $this->debugBackTrace(sprintf("Tried to set a missing field. name=%s, value[%s]=%s",
450 * Magic function to catch getting of missing fields/attributes
452 * @param $name Name of the field/attribute
455 public final function __get ($name) {
456 $this->debugBackTrace(sprintf("Tried to get a missing field. name=%s",
462 * Magic function to catch unsetting of missing fields/attributes
464 * @param $name Name of the field/attribute
467 public final function __unset ($name) {
468 $this->debugBackTrace(sprintf("Tried to unset a missing field. name=%s",
474 * Setter for the real class name
476 * @param $realClass Class name (string)
479 public final function setRealClass ($realClass) {
481 $this->realClass = (string) $realClass;
485 * Setter for database result instance
487 * @param $resultInstance An instance of a database result class
489 * @todo SearchableResult and UpdateableResult shall have a super interface to use here
491 protected final function setResultInstance (SearchableResult $resultInstance) {
492 $this->resultInstance = $resultInstance;
496 * Getter for database result instance
498 * @return $resultInstance An instance of a database result class
500 public final function getResultInstance () {
501 return $this->resultInstance;
505 * Setter for template engine instances
507 * @param $templateInstance An instance of a template engine class
510 protected final function setTemplateInstance (CompileableTemplate $templateInstance) {
511 $this->templateInstance = $templateInstance;
515 * Getter for template engine instances
517 * @return $templateInstance An instance of a template engine class
519 protected final function getTemplateInstance () {
520 return $this->templateInstance;
524 * Setter for search instance
526 * @param $searchInstance Searchable criteria instance
529 public final function setSearchInstance (LocalSearchCriteria $searchInstance) {
530 $this->searchInstance = $searchInstance;
534 * Getter for search instance
536 * @return $searchInstance Searchable criteria instance
538 public final function getSearchInstance () {
539 return $this->searchInstance;
543 * Setter for update instance
545 * @param $updateInstance Searchable criteria instance
548 public final function setUpdateInstance (LocalUpdateCriteria $updateInstance) {
549 $this->updateInstance = $updateInstance;
553 * Getter for update instance
555 * @return $updateInstance Updateable criteria instance
557 public final function getUpdateInstance () {
558 return $this->updateInstance;
562 * Setter for resolver instance
564 * @param $resolverInstance Instance of a command resolver class
567 public final function setResolverInstance (Resolver $resolverInstance) {
568 $this->resolverInstance = $resolverInstance;
572 * Getter for resolver instance
574 * @return $resolverInstance Instance of a command resolver class
576 public final function getResolverInstance () {
577 return $this->resolverInstance;
581 * Setter for language instance
583 * @param $configInstance The configuration instance which shall
584 * be FrameworkConfiguration
587 public final function setConfigInstance (FrameworkConfiguration $configInstance) {
588 Registry::getRegistry()->addInstance('config', $configInstance);
592 * Getter for configuration instance
594 * @return $configInstance Configuration instance
596 public final function getConfigInstance () {
597 $configInstance = Registry::getRegistry()->getInstance('config');
598 return $configInstance;
602 * Setter for debug instance
604 * @param $debugInstance The instance for debug output class
607 public final function setDebugInstance (DebugMiddleware $debugInstance) {
608 Registry::getRegistry()->addInstance('debug', $debugInstance);
612 * Getter for debug instance
614 * @return $debugInstance Instance to class DebugConsoleOutput or DebugWebOutput
616 public final function getDebugInstance () {
617 // Get debug instance
618 $debugInstance = Registry::getRegistry()->getInstance('debug');
621 return $debugInstance;
625 * Setter for web output instance
627 * @param $webInstance The instance for web output class
630 public final function setWebOutputInstance (OutputStreamer $webInstance) {
631 Registry::getRegistry()->addInstance('web_output', $webInstance);
635 * Getter for web output instance
637 * @return $webOutputInstance - Instance to class WebOutput
639 public final function getWebOutputInstance () {
640 $webOutputInstance = Registry::getRegistry()->getInstance('web_output');
641 return $webOutputInstance;
645 * Setter for database instance
647 * @param $databaseInstance The instance for the database connection (forced DatabaseConnection)
650 public final function setDatabaseInstance (DatabaseConnection $databaseInstance) {
651 Registry::getRegistry()->addInstance('db_instance', $databaseInstance);
655 * Getter for database layer
657 * @return $databaseInstance The database layer instance
659 public final function getDatabaseInstance () {
661 $databaseInstance = Registry::getRegistry()->getInstance('db_instance');
664 return $databaseInstance;
668 * Setter for compressor channel
670 * @param $compressorInstance An instance of CompressorChannel
673 public final function setCompressorChannel (CompressorChannel $compressorInstance) {
674 Registry::getRegistry()->addInstance('compressor', $compressorInstance);
678 * Getter for compressor channel
680 * @return $compressorInstance The compressor channel
682 public final function getCompressorChannel () {
683 $compressorInstance = Registry::getRegistry()->getInstance('compressor');
684 return $compressorInstance;
688 * Protected getter for a manageable application helper class
690 * @return $applicationInstance An instance of a manageable application helper class
692 protected final function getApplicationInstance () {
693 $applicationInstance = Registry::getRegistry()->getInstance('application');
694 return $applicationInstance;
698 * Setter for a manageable application helper class
700 * @param $applicationInstance An instance of a manageable application helper class
703 public final function setApplicationInstance (ManageableApplication $applicationInstance) {
704 Registry::getRegistry()->addInstance('application', $applicationInstance);
708 * Setter for request instance
710 * @param $requestInstance An instance of a Requestable class
713 public final function setRequestInstance (Requestable $requestInstance) {
714 $this->requestInstance = $requestInstance;
718 * Getter for request instance
720 * @return $requestInstance An instance of a Requestable class
722 public final function getRequestInstance () {
723 return $this->requestInstance;
727 * Setter for response instance
729 * @param $responseInstance An instance of a Responseable class
732 public final function setResponseInstance (Responseable $responseInstance) {
733 $this->responseInstance = $responseInstance;
737 * Getter for response instance
739 * @return $responseInstance An instance of a Responseable class
741 public final function getResponseInstance () {
742 return $this->responseInstance;
746 * Private getter for language instance
748 * @return $langInstance An instance to the language sub-system
750 protected final function getLanguageInstance () {
751 $langInstance = Registry::getRegistry()->getInstance('language');
752 return $langInstance;
756 * Setter for language instance
758 * @param $langInstance An instance to the language sub-system
760 * @see LanguageSystem
762 public final function setLanguageInstance (ManageableLanguage $langInstance) {
763 Registry::getRegistry()->addInstance('language', $langInstance);
767 * Private getter for file IO instance
769 * @return $fileIoInstance An instance to the file I/O sub-system
771 protected final function getFileIoInstance () {
772 return $this->fileIoInstance;
776 * Setter for file I/O instance
778 * @param $fileIoInstance An instance to the file I/O sub-system
781 public final function setFileIoInstance (FileIoHandler $fileIoInstance) {
782 $this->fileIoInstance = $fileIoInstance;
786 * Protected setter for user instance
788 * @param $userInstance An instance of a user class
791 protected final function setUserInstance (ManageableAccount $userInstance) {
792 $this->userInstance = $userInstance;
796 * Getter for user instance
798 * @return $userInstance An instance of a user class
800 public final function getUserInstance () {
801 return $this->userInstance;
805 * Setter for controller instance (this surely breaks a bit the MVC patterm)
807 * @param $controllerInstance An instance of the controller
810 public final function setControllerInstance (Controller $controllerInstance) {
811 $this->controllerInstance = $controllerInstance;
815 * Getter for controller instance (this surely breaks a bit the MVC patterm)
817 * @return $controllerInstance An instance of the controller
819 public final function getControllerInstance () {
820 return $this->controllerInstance;
824 * Setter for RNG instance
826 * @param $rngInstance An instance of a random number generator (RNG)
829 protected final function setRngInstance (RandomNumberGenerator $rngInstance) {
830 $this->rngInstance = $rngInstance;
834 * Getter for RNG instance
836 * @return $rngInstance An instance of a random number generator (RNG)
838 public final function getRngInstance () {
839 return $this->rngInstance;
843 * Setter for Cryptable instance
845 * @param $cryptoInstance An instance of a Cryptable class
848 protected final function setCryptoInstance (Cryptable $cryptoInstance) {
849 $this->cryptoInstance = $cryptoInstance;
853 * Getter for Cryptable instance
855 * @return $cryptoInstance An instance of a Cryptable class
857 public final function getCryptoInstance () {
858 return $this->cryptoInstance;
862 * Setter for the list instance
864 * @param $listInstance A list of Listable
867 protected final function setListInstance (Listable $listInstance) {
868 $this->listInstance = $listInstance;
872 * Getter for the list instance
874 * @return $listInstance A list of Listable
876 protected final function getListInstance () {
877 return $this->listInstance;
881 * Setter for the menu instance
883 * @param $menuInstance A RenderableMenu instance
886 protected final function setMenuInstance (RenderableMenu $menuInstance) {
887 $this->menuInstance = $menuInstance;
891 * Getter for the menu instance
893 * @return $menuInstance A RenderableMenu instance
895 protected final function getMenuInstance () {
896 return $this->menuInstance;
900 * Setter for image instance
902 * @param $imageInstance An instance of an image
905 public final function setImageInstance (BaseImage $imageInstance) {
906 $this->imageInstance = $imageInstance;
910 * Getter for image instance
912 * @return $imageInstance An instance of an image
914 public final function getImageInstance () {
915 return $this->imageInstance;
919 * Setter for stacker instance
921 * @param $stackerInstance An instance of an stacker
924 public final function setStackerInstance (Stackable $stackerInstance) {
925 $this->stackerInstance = $stackerInstance;
929 * Getter for stacker instance
931 * @return $stackerInstance An instance of an stacker
933 public final function getStackerInstance () {
934 return $this->stackerInstance;
938 * Setter for compressor instance
940 * @param $compressorInstance An instance of an compressor
943 public final function setCompressorInstance (Compressor $compressorInstance) {
944 $this->compressorInstance = $compressorInstance;
948 * Getter for compressor instance
950 * @return $compressorInstance An instance of an compressor
952 public final function getCompressorInstance () {
953 return $this->compressorInstance;
957 * Setter for Parseable instance
959 * @param $parserInstance An instance of an Parseable
962 public final function setParserInstance (Parseable $parserInstance) {
963 $this->parserInstance = $parserInstance;
967 * Getter for Parseable instance
969 * @return $parserInstance An instance of an Parseable
971 public final function getParserInstance () {
972 return $this->parserInstance;
976 * Setter for ProtocolHandler instance
978 * @param $protocolInstance An instance of an ProtocolHandler
981 public final function setProtocolInstance (ProtocolHandler $protocolInstance = NULL) {
982 $this->protocolInstance = $protocolInstance;
986 * Getter for ProtocolHandler instance
988 * @return $protocolInstance An instance of an ProtocolHandler
990 public final function getProtocolInstance () {
991 return $this->protocolInstance;
995 * Setter for BaseDatabaseWrapper instance
997 * @param $wrapperInstance An instance of an BaseDatabaseWrapper
1000 public final function setWrapperInstance (BaseDatabaseWrapper $wrapperInstance) {
1001 $this->wrapperInstance = $wrapperInstance;
1005 * Getter for BaseDatabaseWrapper instance
1007 * @return $wrapperInstance An instance of an BaseDatabaseWrapper
1009 public final function getWrapperInstance () {
1010 return $this->wrapperInstance;
1014 * Setter for socket resource
1016 * @param $socketResource A valid socket resource
1019 public final function setSocketResource ($socketResource) {
1020 //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput($this->__toString() . '::' . __FUNCTION__ . ': socketResource=' . $socketResource . ',previous[' . gettype($this->socketResource) . ']=' . $this->socketResource);
1021 $this->socketResource = $socketResource;
1025 * Getter for socket resource
1027 * @return $socketResource A valid socket resource
1029 public final function getSocketResource () {
1030 //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput($this->__toString() . '::' . __FUNCTION__ . ': socketResource[' . gettype($this->socketResource) . ']=' . $this->socketResource);
1031 return $this->socketResource;
1035 * Setter for helper instance
1037 * @param $helperInstance An instance of a helper class
1040 protected final function setHelperInstance (Helper $helperInstance) {
1041 $this->helperInstance = $helperInstance;
1045 * Getter for helper instance
1047 * @return $helperInstance An instance of a helper class
1049 public final function getHelperInstance () {
1050 return $this->helperInstance;
1054 * Setter for a Sourceable instance
1056 * @param $sourceInstance The Sourceable instance
1059 protected final function setSourceInstance (Sourceable $sourceInstance) {
1060 $this->sourceInstance = $sourceInstance;
1064 * Getter for a Sourceable instance
1066 * @return $sourceInstance The Sourceable instance
1068 protected final function getSourceInstance () {
1069 return $this->sourceInstance;
1073 * Getter for a InputStreamable instance
1075 * @param $inputStreamInstance The InputStreamable instance
1077 protected final function getInputStreamInstance () {
1078 return $this->inputStreamInstance;
1082 * Setter for a InputStreamable instance
1084 * @param $inputStreamInstance The InputStreamable instance
1087 protected final function setInputStreamInstance (InputStreamable $inputStreamInstance) {
1088 $this->inputStreamInstance = $inputStreamInstance;
1092 * Getter for a OutputStreamable instance
1094 * @param $outputStreamInstance The OutputStreamable instance
1096 protected final function getOutputStreamInstance () {
1097 return $this->outputStreamInstance;
1101 * Setter for a OutputStreamable instance
1103 * @param $outputStreamInstance The OutputStreamable instance
1106 protected final function setOutputStreamInstance (OutputStreamable $outputStreamInstance) {
1107 $this->outputStreamInstance = $outputStreamInstance;
1111 * Setter for handler instance
1113 * @param $handlerInstance An instance of a Handleable class
1116 protected final function setHandlerInstance (Handleable $handlerInstance) {
1117 $this->handlerInstance = $handlerInstance;
1121 * Getter for handler instance
1123 * @return $handlerInstance A Networkable instance
1125 protected final function getHandlerInstance () {
1126 return $this->handlerInstance;
1130 * Setter for visitor instance
1132 * @param $visitorInstance A Visitor instance
1135 protected final function setVisitorInstance (Visitor $visitorInstance) {
1136 $this->visitorInstance = $visitorInstance;
1140 * Getter for visitor instance
1142 * @return $visitorInstance A Visitor instance
1144 protected final function getVisitorInstance () {
1145 return $this->visitorInstance;
1149 * Setter for raw package Data
1151 * @param $packageData Raw package Data
1154 public final function setPackageData (array $packageData) {
1155 $this->packageData = $packageData;
1159 * Getter for raw package Data
1161 * @return $packageData Raw package Data
1163 public function getPackageData () {
1164 return $this->packageData;
1169 * Setter for Iterator instance
1171 * @param $iteratorInstance An instance of an Iterator
1174 protected final function setIteratorInstance (Iterator $iteratorInstance) {
1175 $this->iteratorInstance = $iteratorInstance;
1179 * Getter for Iterator instance
1181 * @return $iteratorInstance An instance of an Iterator
1183 public final function getIteratorInstance () {
1184 return $this->iteratorInstance;
1188 * Checks whether an object equals this object. You should overwrite this
1189 * method to implement own equality checks
1191 * @param $objectInstance An instance of a FrameworkInterface object
1192 * @return $equals Whether both objects equals
1194 public function equals (FrameworkInterface $objectInstance) {
1197 $this->__toString() == $objectInstance->__toString()
1199 $this->hashCode() == $objectInstance->hashCode()
1202 // Return the result
1207 * Generates a generic hash code of this class. You should really overwrite
1208 * this method with your own hash code generator code. But keep KISS in mind.
1210 * @return $hashCode A generic hash code respresenting this whole class
1212 public function hashCode () {
1214 return crc32($this->__toString());
1218 * Formats computer generated price values into human-understandable formats
1219 * with thousand and decimal separators.
1221 * @param $value The in computer format value for a price
1222 * @param $currency The currency symbol (use HTML-valid characters!)
1223 * @param $decNum Number of decimals after commata
1224 * @return $price The for the current language formated price string
1225 * @throws MissingDecimalsThousandsSeparatorException If decimals or
1226 * thousands separator
1229 public function formatCurrency ($value, $currency = '€', $decNum = 2) {
1230 // Are all required attriutes set?
1231 if ((!isset($this->decimals)) || (!isset($this->thousands))) {
1232 // Throw an exception
1233 throw new MissingDecimalsThousandsSeparatorException($this, self::EXCEPTION_ATTRIBUTES_ARE_MISSING);
1237 $value = (float) $value;
1239 // Reformat the US number
1240 $price = number_format($value, $decNum, $this->decimals, $this->thousands) . $currency;
1242 // Return as string...
1247 * Appends a trailing slash to a string
1249 * @param $str A string (maybe) without trailing slash
1250 * @return $str A string with an auto-appended trailing slash
1252 public final function addMissingTrailingSlash ($str) {
1253 // Is there a trailing slash?
1254 if (substr($str, -1, 1) != '/') {
1258 // Return string with trailing slash
1263 * Prepare the template engine (WebTemplateEngine by default) for a given
1264 * application helper instance (ApplicationHelper by default).
1266 * @param $applicationInstance An application helper instance or
1267 * null if we shall use the default
1268 * @return $templateInstance The template engine instance
1269 * @throws NullPointerException If the discovered application
1270 * instance is still null
1272 protected function prepareTemplateInstance (ManageableApplication $applicationInstance = NULL) {
1273 // Is the application instance set?
1274 if (is_null($applicationInstance)) {
1275 // Get the current instance
1276 $applicationInstance = $this->getApplicationInstance();
1279 if (is_null($applicationInstance)) {
1280 // Thrown an exception
1281 throw new NullPointerException($this, self::EXCEPTION_IS_NULL_POINTER);
1285 // Initialize the template engine
1286 $templateInstance = ObjectFactory::createObjectByConfiguredName('web_template_class');
1288 // Return the prepared instance
1289 return $templateInstance;
1293 * Debugs this instance by putting out it's full content
1295 * @param $message Optional message to show in debug output
1298 public final function debugInstance ($message = '') {
1299 // Restore the error handler to avoid trouble with missing array elements or undeclared variables
1300 restore_error_handler();
1305 // Is a message set?
1306 if (!empty($message)) {
1307 // Construct message
1308 $content = sprintf("<div class=\"debug_message\">Message: %s</div>\n", $message);
1311 // Generate the output
1312 $content .= sprintf("<pre>%s</pre>",
1315 print_r($this, true)
1321 ApplicationEntryPoint::app_exit(sprintf("<div class=\"debug_header\">%s debug output:</div><div class=\"debug_content\">%s</div>\nLoaded includes: <div class=\"debug_include_list\">%s</div>",
1322 $this->__toString(),
1324 ClassLoader::getSelfInstance()->getPrintableIncludeList()
1329 * Replaces control characters with printable output
1331 * @param $str String with control characters
1332 * @return $str Replaced string
1334 protected function replaceControlCharacters ($str) {
1337 chr(13), '[r]', str_replace(
1338 chr(10), '[n]', str_replace(
1348 * Output a partial stub message for the caller method
1350 * @param $message An optional message to display
1353 protected function partialStub ($message = '') {
1354 // Get the backtrace
1355 $backtrace = debug_backtrace();
1357 // Generate the class::method string
1358 $methodName = 'UnknownClass->unknownMethod';
1359 if ((isset($backtrace[1]['class'])) && (isset($backtrace[1]['function']))) {
1360 $methodName = $backtrace[1]['class'] . '->' . $backtrace[1]['function'];
1363 // Construct the full message
1364 $stubMessage = sprintf('[%s:] Partial stub!',
1368 // Is the extra message given?
1369 if (!empty($message)) {
1370 // Then add it as well
1371 $stubMessage .= ' Message: ' . $message;
1374 // Debug instance is there?
1375 if (!is_null($this->getDebugInstance())) {
1376 // Output stub message
1377 self::createDebugInstance(__CLASS__)->debugOutput($stubMessage);
1380 trigger_error($stubMessage);
1385 * Outputs a debug backtrace and stops further script execution
1387 * @param $message An optional message to output
1388 * @param $doExit Whether exit the program (true is default)
1391 public function debugBackTrace ($message = '', $doExit = true) {
1392 // Sorry, there is no other way getting this nice backtrace
1393 if (!empty($message)) {
1395 printf('Message: %s<br />' . chr(10), $message);
1399 debug_print_backtrace();
1403 if ($doExit === true) {
1409 * Creates an instance of a debugger instance
1411 * @param $className Name of the class (currently unsupported)
1412 * @return $debugInstance An instance of a debugger class
1414 public final static function createDebugInstance ($className) {
1415 // Init debug instance
1416 $debugInstance = NULL;
1420 // Get a debugger instance
1421 $debugInstance = DebugMiddleware::createDebugMiddleware(FrameworkConfiguration::getSelfInstance()->getConfigEntry('debug_class'));
1422 } catch (NullPointerException $e) {
1423 // Didn't work, no instance there
1424 exit('Cannot create debugInstance! Exception=' . $e->__toString() . ', message=' . $e->getMessage());
1427 // Empty string should be ignored and used for testing the middleware
1428 DebugMiddleware::getSelfInstance()->output('');
1431 return $debugInstance;
1435 * Outputs a debug message whether to debug instance (should be set!) or
1436 * dies with or ptints the message. Do NEVER EVER rewrite the exit() call to
1437 * ApplicationEntryPoint::app_exit(), this would cause an endless loop.
1439 * @param $message Message we shall send out...
1440 * @param $doPrint Whether print or die here (default: print)
1441 * @paran $stripTags Whether to strip tags (default: false)
1444 public function debugOutput ($message, $doPrint = true, $stripTags = false) {
1445 // Set debug instance to NULL
1446 $debugInstance = NULL;
1450 // Get debug instance
1451 $debugInstance = $this->getDebugInstance();
1452 } catch (NullPointerException $e) {
1453 // The debug instance is not set (yet)
1456 // Is the debug instance there?
1457 if (is_object($debugInstance)) {
1458 // Use debug output handler
1459 $debugInstance->output($message, $stripTags);
1461 if ($doPrint === false) {
1462 // Die here if not printed
1466 // Are debug times enabled?
1467 if ($this->getConfigInstance()->getConfigEntry('debug_output_timings') == 'Y') {
1469 $message = $this->getPrintableExecutionTime() . $message;
1473 if ($doPrint === true) {
1475 print($message . chr(10));
1484 * Converts e.g. a command from URL to a valid class by keeping out bad characters
1486 * @param $str The string, what ever it is needs to be converted
1487 * @return $className Generated class name
1489 public function convertToClassName ($str) {
1493 // Convert all dashes in underscores
1494 $str = $this->convertDashesToUnderscores($str);
1496 // Now use that underscores to get classname parts for hungarian style
1497 foreach (explode('_', $str) as $strPart) {
1498 // Make the class name part lower case and first upper case
1499 $className .= ucfirst(strtolower($strPart));
1502 // Return class name
1507 * Converts dashes to underscores, e.g. useable for configuration entries
1509 * @param $str The string with maybe dashes inside
1510 * @return $str The converted string with no dashed, but underscores
1512 public final function convertDashesToUnderscores ($str) {
1514 $str = str_replace('-', '_', $str);
1516 // Return converted string
1521 * Marks up the code by adding e.g. line numbers
1523 * @param $phpCode Unmarked PHP code
1524 * @return $markedCode Marked PHP code
1526 public function markupCode ($phpCode) {
1531 $errorArray = error_get_last();
1533 // Init the code with error message
1534 if (is_array($errorArray)) {
1536 $markedCode = sprintf('<div id="error_header">File: <span id="error_data">%s</span>, Line: <span id="error_data">%s</span>, Message: <span id="error_data">%s</span>, Type: <span id="error_data">%s</span></div>',
1537 basename($errorArray['file']),
1538 $errorArray['line'],
1539 $errorArray['message'],
1544 // Add line number to the code
1545 foreach (explode(chr(10), $phpCode) as $lineNo => $code) {
1547 $markedCode .= sprintf('<span id="code_line">%s</span>: %s' . chr(10),
1549 htmlentities($code, ENT_QUOTES)
1558 * Filter a given GMT timestamp (non Uni* stamp!) to make it look more
1559 * beatiful for web-based front-ends. If null is given a message id
1560 * null_timestamp will be resolved and returned.
1562 * @param $timestamp Timestamp to prepare (filter) for display
1563 * @return $readable A readable timestamp
1565 public function doFilterFormatTimestamp ($timestamp) {
1566 // Default value to return
1569 // Is the timestamp null?
1570 if (is_null($timestamp)) {
1571 // Get a message string
1572 $readable = $this->getLanguageInstance()->getMessage('null_timestamp');
1574 switch ($this->getLanguageInstance()->getLanguageCode()) {
1575 case 'de': // German format is a bit different to default
1576 // Split the GMT stamp up
1577 $dateTime = explode(' ', $timestamp );
1578 $dateArray = explode('-', $dateTime[0]);
1579 $timeArray = explode(':', $dateTime[1]);
1581 // Construct the timestamp
1582 $readable = sprintf($this->getConfigInstance()->getConfigEntry('german_date_time'),
1592 default: // Default is pass-through
1593 $readable = $timestamp;
1603 * Filter a given number into a localized number
1605 * @param $value The raw value from e.g. database
1606 * @return $localized Localized value
1608 public function doFilterFormatNumber ($value) {
1609 // Generate it from config and localize dependencies
1610 switch ($this->getLanguageInstance()->getLanguageCode()) {
1611 case 'de': // German format is a bit different to default
1612 $localized = number_format($value, $this->getConfigInstance()->getConfigEntry('decimals'), ',', '.');
1615 default: // US, etc.
1616 $localized = number_format($value, $this->getConfigInstance()->getConfigEntry('decimals'), '.', ',');
1625 * "Getter" for databse entry
1627 * @return $entry An array with database entries
1628 * @throws NullPointerException If the database result is not found
1629 * @throws InvalidDatabaseResultException If the database result is invalid
1631 protected final function getDatabaseEntry () {
1632 // Is there an instance?
1633 if (is_null($this->getResultInstance())) {
1634 // Throw an exception here
1635 throw new NullPointerException($this, self::EXCEPTION_IS_NULL_POINTER);
1639 $this->getResultInstance()->rewind();
1641 // Do we have an entry?
1642 if ($this->getResultInstance()->valid() === false) {
1643 throw new InvalidDatabaseResultException(array($this, $this->getResultInstance()), DatabaseResult::EXCEPTION_INVALID_DATABASE_RESULT);
1647 $this->getResultInstance()->next();
1650 $entry = $this->getResultInstance()->current();
1657 * Getter for field name
1659 * @param $fieldName Field name which we shall get
1660 * @return $fieldValue Field value from the user
1661 * @throws NullPointerException If the result instance is null
1663 public final function getField ($fieldName) {
1664 // Default field value
1667 // Get result instance
1668 $resultInstance = $this->getResultInstance();
1670 // Is this instance null?
1671 if (is_null($resultInstance)) {
1672 // Then the user instance is no longer valid (expired cookies?)
1673 throw new NullPointerException($this, self::EXCEPTION_IS_NULL_POINTER);
1676 // Get current array
1677 $fieldArray = $resultInstance->current();
1678 //* DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput($fieldName.':<pre>'.print_r($fieldArray, true).'</pre>');
1680 // Convert dashes to underscore
1681 $fieldName = $this->convertDashesToUnderscores($fieldName);
1683 // Does the field exist?
1684 if (isset($fieldArray[$fieldName])) {
1686 $fieldValue = $fieldArray[$fieldName];
1688 // Missing field entry, may require debugging
1689 self::createDebugInstance(__CLASS__)->debugOutput($this->__toString() . ':fieldname=' . $fieldName . ' not found!');
1697 * Flushs all pending updates to the database layer
1701 public function flushPendingUpdates () {
1702 // Get result instance
1703 $resultInstance = $this->getResultInstance();
1705 // Do we have data to update?
1706 if ((is_object($resultInstance)) && ($resultInstance->ifDataNeedsFlush())) {
1707 // Get wrapper class name config entry
1708 $configEntry = $resultInstance->getUpdateInstance()->getWrapperConfigEntry();
1710 // Create object instance
1711 $wrapperInstance = ObjectFactory::createObjectByConfiguredName($configEntry);
1713 // Yes, then send the whole result to the database layer
1714 $wrapperInstance->doUpdateByResult($this->getResultInstance());
1719 * Outputs a deprecation warning to the developer.
1721 * @param $message The message we shall output to the developer
1723 * @todo Write a logging mechanism for productive mode
1725 public function deprecationWarning ($message) {
1726 // Is developer mode active?
1727 if (defined('DEVELOPER')) {
1728 // Debug instance is there?
1729 if (!is_null($this->getDebugInstance())) {
1730 // Output stub message
1731 self::createDebugInstance(__CLASS__)->debugOutput($message);
1734 trigger_error($message . "<br />\n");
1737 // @TODO Finish this part!
1738 $this->partialStub('Developer mode inactive. Message:' . $message);
1743 * Checks whether the given PHP extension is loaded
1745 * @param $phpExtension The PHP extension we shall check
1746 * @return $isLoaded Whether the PHP extension is loaded
1748 public final function isPhpExtensionLoaded ($phpExtension) {
1750 $isLoaded = in_array($phpExtension, get_loaded_extensions());
1757 * "Getter" as a time() replacement but with milliseconds. You should use this
1758 * method instead of the encapsulated getimeofday() function.
1760 * @return $milliTime Timestamp with milliseconds
1762 public function getMilliTime () {
1763 // Get the time of day as float
1764 $milliTime = gettimeofday(true);
1771 * Idles (sleeps) for given milliseconds
1773 * @return $hasSlept Whether it goes fine
1775 public function idle ($milliSeconds) {
1776 // Sleep is fine by default
1779 // Idle so long with found function
1780 if (function_exists('time_sleep_until')) {
1781 // Get current time and add idle time
1782 $sleepUntil = $this->getMilliTime() + abs($milliSeconds) / 1000;
1784 // New PHP 5.1.0 function found, ignore errors
1785 $hasSlept = @time_sleep_until($sleepUntil);
1788 * My Sun station doesn't have that function even with latest PHP
1791 usleep($milliSeconds * 1000);
1798 * Converts a hexadecimal string, even with negative sign as first string to
1799 * a decimal number using BC functions.
1801 * This work is based on comment #86673 on php.net documentation page at:
1802 * <http://de.php.net/manual/en/function.dechex.php#86673>
1804 * @param $hex Hexadecimal string
1805 * @return $dec Decimal number
1807 protected function hex2dec ($hex) {
1808 // Convert to all lower-case
1809 $hex = strtolower($hex);
1811 // Detect sign (negative/positive numbers)
1813 if (substr($hex, 0, 1) == '-') {
1815 $hex = substr($hex, 1);
1818 // Decode the hexadecimal string into a decimal number
1820 for ($i = strlen($hex) - 1, $e = 1; $i >= 0; $i--, $e = bcmul($e, 16)) {
1821 $factor = self::$hexdec[substr($hex, $i, 1)];
1822 $dec = bcadd($dec, bcmul($factor, $e));
1825 // Return the decimal number
1826 return $sign . $dec;
1830 * Converts even very large decimal numbers, also with negative sign, to a
1831 * hexadecimal string.
1833 * This work is based on comment #97756 on php.net documentation page at:
1834 * <http://de.php.net/manual/en/function.hexdec.php#97756>
1836 * @param $dec Decimal number, even with negative sign
1837 * @param $maxLength Optional maximum length of the string
1838 * @return $hex Hexadecimal string
1840 protected function dec2hex ($dec, $maxLength = 0) {
1841 // maxLength can be zero or devideable by 2
1842 assert(($maxLength == 0) || (($maxLength % 2) == 0));
1844 // Detect sign (negative/positive numbers)
1851 // Encode the decimal number into a hexadecimal string
1854 $hex = self::$dechex[($dec % 16)] . $hex;
1856 } while ($dec >= 1);
1859 * We need hexadecimal strings with leading zeros if the length cannot
1862 if ($maxLength > 0) {
1863 // Prepend more zeros
1864 $hex = $this->prependStringToString($hex, '0', $maxLength);
1865 } elseif ((strlen($hex) % 2) != 0) {
1869 // Return the hexadecimal string
1870 return $sign . $hex;
1874 * Converts a ASCII string (0 to 255) into a decimal number.
1876 * @param $asc The ASCII string to be converted
1877 * @return $dec Decimal number
1879 protected function asc2dec ($asc) {
1880 // Convert it into a hexadecimal number
1881 $hex = bin2hex($asc);
1883 // And back into a decimal number
1884 $dec = $this->hex2dec($hex);
1891 * Converts a decimal number into an ASCII string.
1893 * @param $dec Decimal number
1894 * @return $asc An ASCII string
1896 protected function dec2asc ($dec) {
1897 // First convert the number into a hexadecimal string
1898 $hex = $this->dec2hex($dec);
1900 // Then convert it into the ASCII string
1901 $asc = $this->hex2asc($hex);
1908 * Converts a hexadecimal number into an ASCII string. Negative numbers
1911 * @param $hex Hexadecimal string
1912 * @return $asc An ASCII string
1914 protected function hex2asc ($hex) {
1915 // Check for length, it must be devideable by 2
1916 //* DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('hex='.$hex);
1917 assert((strlen($hex) % 2) == 0);
1921 for ($idx = 0; $idx < strlen($hex); $idx+=2) {
1922 // Get the decimal number of the chunk
1923 $part = hexdec(substr($hex, $idx, 2));
1925 // Add it to the final string
1929 // Return the final string
1934 * Prepends a given string $prepend to $str with a given total length
1936 * @param $str Given original string which should be prepended
1937 * @param $prepend The string to prepend
1938 * @param $length Total length of the final string
1939 * @return $strFinal Final prepended string
1941 protected function prependStringToString ($str, $prepend, $length) {
1942 // Set final string to original string by default
1946 if (strlen($str) < $length) {
1947 // Difference between total length and length of original string
1948 $diff = $length - strlen($str);
1950 // Prepend the string
1951 $prepend = str_repeat($prepend, ($diff / strlen($prepend) + 1));
1953 // Make sure it will definedly fit
1954 assert(strlen($prepend) >= $diff);
1956 // Cut it a little down
1957 $prepend = substr($prepend, 0, $diff);
1958 //* DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('prepend('.strlen($prepend).')='.$prepend.',diff='.$diff.',length='.$length);
1960 // Construct the final prepended string
1961 $strFinal = $prepend . $str;
1969 * Checks whether the given encoded data was encoded with Base64
1971 * @param $encodedData Encoded data we shall check
1972 * @return $isBase64 Whether the encoded data is Base64
1974 protected function isBase64Encoded ($encodedData) {
1976 $isBase64 = (@base64_decode($encodedData, true) !== false);
1983 * "Getter" to get response/request type from analysis of the system.
1985 * @return $responseType Analyzed response type
1987 protected function getResponseTypeFromSystem () {
1988 // Default is console
1989 $responseType = 'console';
1991 // Is 'HTTP_HOST' set?
1992 if (isset($_SERVER['HTTP_HOST'])) {
1993 // Then it is a HTTP response/request
1994 $responseType = 'http';
1998 return $responseType;
2002 * Gets a cache key from Criteria instance
2004 * @param $criteriaInstance An instance of a Criteria class
2005 * @param $onlyKeys Only use these keys for a cache key
2006 * @return $cacheKey A cache key suitable for lookup/storage purposes
2008 protected function getCacheKeyByCriteria (Criteria $criteriaInstance, array $onlyKeys = array()) {
2010 $cacheKey = sprintf("%s@%s",
2011 $this->__toString(),
2012 $criteriaInstance->getCacheKey($onlyKeys)
2016 //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput($this->__toString() . ': cacheKey=' . $cacheKey);
2021 * Getter for startup time in miliseconds
2023 * @return $startupTime Startup time in miliseconds
2025 protected function getStartupTime () {
2026 return self::$startupTime;
2030 * "Getter" for a printable currently execution time in nice braces
2032 * @return $executionTime Current execution time in nice braces
2034 protected function getPrintableExecutionTime () {
2035 // Caculate the execution time
2036 $executionTime = microtime(true) - $this->getStartupTime();
2038 // Pack it in nice braces
2039 $executionTime = sprintf('[ %01.5f ] ', $executionTime);
2042 return $executionTime;
2046 * Hashes a given string with a simple but stronger hash function (no salts)
2048 * @param $str The string to be hashed
2049 * @return $hash The hash from string $str
2051 public function hashString ($str) {
2052 // Hash given string with (better secure) hasher
2053 $hash = mhash(MHASH_SHA256, $str);
2060 * Checks whether the given number is really a number (only chars 0-9).
2062 * @param $num A string consisting only chars between 0 and 9
2063 * @param $castValue Whether to cast the value to double. Do only use this to secure numbers from Requestable classes.
2064 * @param $assertMismatch Whether to assert mismatches
2065 * @return $ret The (hopefully) secured numbered value
2067 public function bigintval ($num, $castValue = true, $assertMismatch = false) {
2068 // Filter all numbers out
2069 $ret = preg_replace('/[^0123456789]/', '', $num);
2072 if ($castValue === true) {
2073 // Cast to biggest numeric type
2074 $ret = (double) $ret;
2077 // Assert only if requested
2078 if ($assertMismatch === true) {
2079 // Has the whole value changed?
2080 assert(('' . $ret . '' != '' . $num . '') && (!is_null($num)));
2088 * Checks whether the given hexadecimal number is really a hex-number (only chars 0-9,a-f).
2090 * @param $num A string consisting only chars between 0 and 9
2091 * @param $assertMismatch Whether to assert mismatches
2092 * @return $ret The (hopefully) secured hext-numbered value
2094 public function hexval ($num, $assertMismatch = false) {
2095 // Filter all numbers out
2096 $ret = preg_replace('/[^0123456789abcdefABCDEF]/', '', $num);
2098 // Assert only if requested
2099 if ($assertMismatch === true) {
2100 // Has the whole value changed?
2101 assert(('' . $ret . '' != '' . $num . '') && (!is_null($num)));
2109 * Checks whether start/end marker are set
2111 * @param $data Data to be checked
2112 * @return $isset Whether start/end marker are set
2114 public final function ifStartEndMarkersSet ($data) {
2116 $isset = ((substr($data, 0, strlen(BaseRawDataHandler::STREAM_START_MARKER)) == BaseRawDataHandler::STREAM_START_MARKER) && (substr($data, -1 * strlen(BaseRawDataHandler::STREAM_END_MARKER), strlen(BaseRawDataHandler::STREAM_END_MARKER)) == BaseRawDataHandler::STREAM_END_MARKER));
2118 // ... and return it