Continued:
[core.git] / inc / classes / main / class_BaseFrameworkSystem.php
index 7087af8d28124c6451e032f1288198a63f4a73f9..2b2d2683109df9c224f0d4d788370e09248010f1 100644 (file)
@@ -253,6 +253,34 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
         */
        private $controllerName = '';
 
+       /**
+        * Array with bitmasks and such for pack/unpack methods to support both
+        * 32-bit and 64-bit systems
+        */
+       private $packingData = array(
+               32 => array(
+                       'step'   => 3,
+                       'left'   => 0xffff0000,
+                       'right'  => 0x0000ffff,
+                       'factor' => 16,
+                       'format' => 'II',
+               ),
+               64 => array(
+                       'step'   => 7,
+                       'left'   => 0xffffffff00000000,
+                       'right'  => 0x00000000ffffffff,
+                       'factor' => 32,
+                       'format' => 'NN'
+               )
+       );
+
+       /**
+        * Simple 64-bit check, thanks to "Salman A" from stackoverflow.com:
+        *
+        * The integer size is 4 bytes on 32-bit and 8 bytes on a 64-bit system.
+        */
+       private $archArrayElement = (PHP_INT_SIZE === 8 ? 64 : 32);
+
        /***********************
         * Exception codes.... *
         ***********************/
@@ -502,7 +530,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        }
 
        /**
-        * Magic function to catch setting of missing but set class fields/attributes
+        * Magic method to catch setting of missing but set class fields/attributes
         *
         * @param       $name   Name of the field/attribute
         * @param       $value  Value to store
@@ -517,7 +545,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        }
 
        /**
-        * Magic function to catch getting of missing fields/attributes
+        * Magic method to catch getting of missing fields/attributes
         *
         * @param       $name   Name of the field/attribute
         * @return      void
@@ -529,7 +557,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
        }
 
        /**
-        * Magic function to catch unsetting of missing fields/attributes
+        * Magic method to catch unsetting of missing fields/attributes
         *
         * @param       $name   Name of the field/attribute
         * @return      void
@@ -540,6 +568,36 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                ));
        }
 
+       /**
+        * Magic method to catch object serialization
+        *
+        * @return      $unsupported    Unsupported method
+        * @throws      UnsupportedOperationException   Objects of this framework cannot be serialized
+        */
+       public final function __sleep () {
+               throw new UnsupportedOperationException(array($this, __FUNCTION__), self::EXCEPTION_UNSPPORTED_OPERATION);
+       }
+
+       /**
+        * Magic method to catch object deserialization
+        *
+        * @return      $unsupported    Unsupported method
+        * @throws      UnsupportedOperationException   Objects of this framework cannot be serialized
+        */
+       public final function __wakeup () {
+               throw new UnsupportedOperationException(array($this, __FUNCTION__), self::EXCEPTION_UNSPPORTED_OPERATION);
+       }
+
+       /**
+        * Magic method to catch calls when an object instance is called
+        *
+        * @return      $unsupported    Unsupported method
+        * @throws      UnsupportedOperationException   Objects of this framework cannot be serialized
+        */
+       public final function __invoke () {
+               throw new UnsupportedOperationException(array($this, __FUNCTION__), self::EXCEPTION_UNSPPORTED_OPERATION);
+       }
+
        /**
         * Setter for the real class name
         *
@@ -3072,6 +3130,74 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface {
                // ... and return it
                return $translated;
        }
+
+       /**
+        * Encodes raw data (almost any type) by "serializing" it and then pack it
+        * into a "binary format".
+        *
+        * @param       $rawData        Raw data (almost any type)
+        * @return      $encoded        Encoded data
+        */
+       protected function encodeData ($rawData) {
+               // Make sure no objects or resources pass through
+               assert(!is_object($rawData));
+               assert(!is_resource($rawData));
+
+               // First "serialize" it (json_encode() is faster than serialize())
+               $encoded = $this->packString(json_encode($rawData));
+
+               // And return it
+               return $encoded;
+       }
+
+       /**
+        * Pack a string into a "binary format". Please execuse me that this is
+        * widely undocumented. :-(
+        *
+        * @param       $str            Unpacked string
+        * @return      $packed         Packed string
+        * @todo        Improve documentation
+        */
+       protected function packString ($str) {
+               // Debug message
+               //* NOISY-DEBUG */ self::createDebugInstance(__CLASS__)->debugOutput('str=' . $str . ' - CALLED!');
+
+               // First compress the string (gzcompress is okay)
+               $str = gzcompress($str);
+
+               // Init variable
+               $packed = '';
+
+               // And start the "encoding" loop
+               for ($idx = 0; $idx < strlen($str); $idx += $this->packingData[$this->archArrayElement]['step']) {
+                       $big = 0;
+                       for ($i = 0; $i < $this->packingData[$this->archArrayElement]['step']; $i++) {
+                               $factor = ($this->packingData[$this->archArrayElement]['step'] - 1 - $i);
+
+                               if (($idx + $i) <= strlen($str)) {
+                                       $ord = ord(substr($str, ($idx + $i), 1));
+
+                                       $add = $ord * pow(256, $factor);
+
+                                       $big += $add;
+
+                                       //print 'idx=' . $idx . ',i=' . $i . ',ord=' . $ord . ',factor=' . $factor . ',add=' . $add . ',big=' . $big . PHP_EOL;
+                               } // END - if
+                       } // END - for
+
+                       $l = ($big & $this->packingData[$this->archArrayElement]['left']) >>$this->packingData[$this->archArrayElement]['factor'];
+                       $r = $big & $this->packingData[$this->archArrayElement]['right'];
+
+                       $chunk = str_pad(pack($this->packingData[$this->archArrayElement]['format'], $l, $r), 8, '0', STR_PAD_LEFT);
+                       //* NOISY-DEBUG */ print 'big=' . $big . ',chunk('.strlen($chunk) . ')='.md5($chunk).PHP_EOL;
+
+                       $packed .= $chunk;
+               } // END - for
+
+               // Return it
+               //* NOISY-DEBUG */ self::createDebugInstance(__CLASS__)->debugOutput('packed=' . $packed . ' - EXIT!');
+               return $packed;
+       }
 }
 
 // [EOF]