]> git.mxchange.org Git - hub.git/commitdiff
Added support for visiting package assembler which will e.g. clear pending data on...
authorRoland Haeder <roland@mxchange.org>
Fri, 14 Mar 2014 21:35:29 +0000 (22:35 +0100)
committerRoland Haeder <roland@mxchange.org>
Fri, 14 Mar 2014 21:35:29 +0000 (22:35 +0100)
Signed-off-by: Roland Haeder <roland@mxchange.org>
application/hub/exceptions/stream/class_MultipleMessageSentException.php
application/hub/main/package/assembler/class_PackageAssembler.php
application/hub/main/package/class_NetworkPackage.php
application/hub/main/visitor/socket/class_ShutdownSocketVisitor.php

index e0b9d6f303af67843a317bbed9a91d959e2f840e..bebe02b07393de78ea557ae27347164f85a4c509 100644 (file)
@@ -25,14 +25,14 @@ class MultipleMessageSentException extends FrameworkException {
        /**
         * The super constructor for all exceptions
         *
-        * @param       $streamInstance         An instance of a InputStreamable class
-        * @param       $data                           The actual data
+        * @param       $messageArray   Error message array
+        * @param       $code                   Error code
         * @return      void
         */
-       public function __construct (InputStreamable $streamInstance, $data) {
+       public function __construct (array $messageArray, $code) {
                // Construct the message
                $message = sprintf('[%s:%d] Cannot handle multiple messages. Please split them before calling this method.',
-                       $streamInstance->__toString(),
+                       $messageArray[0]->__toString(),
                        $this->getLine()
                );
 
index 99e1a0c29c1e7804f71995f9a2a54f86771e8c50..2325b9f99d06e0cbf5c1261d44eeb072585764ce 100644 (file)
  * You should have received a copy of the GNU General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
-class PackageAssembler extends BaseHubSystem implements Assembler, Registerable {
+class PackageAssembler extends BaseHubSystem implements Assembler, Registerable, Visitable {
+       /**
+        * Name for stacker holding raw data of multiple messages
+        */
+       const STACKER_NAME_MULTIPLE_MESSAGE = 'multiple_message';
+
        /**
         * Pending data
         */
@@ -71,6 +76,9 @@ class PackageAssembler extends BaseHubSystem implements Assembler, Registerable
                // Get stacker instance
                $stackerInstance = ObjectFactory::createObjectByConfiguredName('multiple_message_stacker_class');
 
+               // Initialize the only one stack
+               $stackerInstance->initStack(self::STACKER_NAME_MULTIPLE_MESSAGE);
+
                // And add it
                $assemblerInstance->setStackerInstance($stackerInstance);
 
@@ -208,6 +216,19 @@ class PackageAssembler extends BaseHubSystem implements Assembler, Registerable
                         * Multiple messages found, so split off first message as the input
                         * stream can only handle one message per time.
                         */
+                       foreach (explode(BaseRawDataHandler::STREAM_START_MARKER, $this->pendingData) as $message) {
+                               // Prepend start marker again as it is needed to decode the message.
+                               $message = BaseRawDataHandler::STREAM_START_MARKER . $message;
+
+                               // Push it on stack
+                               $this->getStackerInstance()->pushNamed(self::STACKER_NAME_MULTIPLE_MESSAGE, $message);
+                       } // END - foreach
+
+                       // Clear pending data
+                       $this->clearPendingData();
+
+                       // ... and exit here
+                       return;
                }
 
                // Init fake array
@@ -217,7 +238,7 @@ class PackageAssembler extends BaseHubSystem implements Assembler, Registerable
                );
 
                // Clear pending data
-               $this->pendingData = '';
+               $this->clearPendingData();
 
                // Debug message
                //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('PACKAGE-ASSEMBLER[' . __METHOD__ . ':' . __LINE__ . ': Last block of partial data received. A total of ' . strlen($packageContent[BaseRawDataHandler::PACKAGE_RAW_DATA]) . ' bytes has been received.');
@@ -239,6 +260,27 @@ class PackageAssembler extends BaseHubSystem implements Assembler, Registerable
                //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('PACKAGE-ASSEMBLER[' . __METHOD__ . ':' . __LINE__ . ': Going to add ' . count($chunks) . ' to chunk handler ...');
                $this->getHandlerInstance()->addAllChunksWithFinal($chunks);
        }
+
+       /**
+        * Accepts the visitor to process the visit "request"
+        *
+        * @param       $visitorInstance        An instance of a Visitor class
+        * @return      void
+        */
+       public function accept (Visitor $visitorInstance) {
+               // Visit the assembler
+               $visitorInstance->visitAssembler($this);
+       }
+
+       /**
+        * Clears pending data
+        *
+        * @return      void
+        */
+       public function clearPendingData () {
+               // Clear it
+               $this->pendingData = '';
+       }
 }
 
 // [EOF]
index b1b345928e33d61153e6f161d56e86fc4d4d5213..faf9f17035151bfb904e3fd708d52d655e393e06 100644 (file)
@@ -1060,13 +1060,16 @@ class NetworkPackage extends BaseHubSystem implements Deliverable, Receivable, R
         */
        public function accept (Visitor $visitorInstance) {
                // Debug message
-               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('NETWORK-PACKAGE[' . __METHOD__ . ':' . __LINE__ . ']: ' . $visitorInstance->__toString() . ' has visited - START');
+               /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('NETWORK-PACKAGE[' . __METHOD__ . ':' . __LINE__ . ']: ' . $visitorInstance->__toString() . ' has visited - START');
 
                // Visit the package
                $visitorInstance->visitNetworkPackage($this);
 
+               // Then visit the assembler to handle multiple packages
+               $this->getAssemblerInstance()->accept($visitorInstance);
+
                // Debug message
-               //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('NETWORK-PACKAGE[' . __METHOD__ . ':' . __LINE__ . ']: ' . $visitorInstance->__toString() . ' has visited - FINISHED');
+               /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('NETWORK-PACKAGE[' . __METHOD__ . ':' . __LINE__ . ']: ' . $visitorInstance->__toString() . ' has visited - FINISHED');
        }
 
        /**
index 9882d6899646491181b7cfefc4f4f6e1b0f87b49..fbcd19c49bc9c955ba31323a8e17239d3e4bccfc 100644 (file)
@@ -80,6 +80,17 @@ class ShutdownSocketVisitor extends BaseVisitor implements Visitor {
                // Just call it back
                $packageInstance->clearAllStacks();
        }
+
+       /**
+        * "Visit" the assembler instance. This shall clear any pending data
+        *
+        * @param       $assemblerInstance      An instance of a Assembler class
+        * @return      void
+        */
+       public function visitAssembler (Assembler $assemblerInstance) {
+               // Clear pending data
+               $assemblerInstance->clearPendingData();
+       }
 }
 
 // [EOF]