Author: chirino
Date: Sun Mar 19 01:22:40 2006
New Revision: 386940

URL: http://svn.apache.org/viewcvs?rev=386940&view=rev
Log:
Created a STOMP PHP client.

Added:
    incubator/activemq/trunk/stomp/
    incubator/activemq/trunk/stomp/php/
    incubator/activemq/trunk/stomp/php/Stomp.php
    incubator/activemq/trunk/stomp/php/Test.php

Added: incubator/activemq/trunk/stomp/php/Stomp.php
URL: 
http://svn.apache.org/viewcvs/incubator/activemq/trunk/stomp/php/Stomp.php?rev=386940&view=auto
==============================================================================
--- incubator/activemq/trunk/stomp/php/Stomp.php (added)
+++ incubator/activemq/trunk/stomp/php/Stomp.php Sun Mar 19 01:22:40 2006
@@ -0,0 +1,201 @@
+<?php
+/**
+ *
+ * Copyright 2005-2006 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* vim: set expandtab tabstop=3 shiftwidth=3: */
+
+/**
+ * A StompFrame are the messages that are sent and received on a 
StompConnection.
+ *
+ * @package Stomp
+ * @author Hiram Chirino <[EMAIL PROTECTED]>
+ * @version $Revision$
+ */
+class StompFrame {
+       var $command;
+       var $headers;
+       var $body;
+       
+       function StompFrame($command = null, $headers=null, $body=null) {
+               $this->command = $command;
+               $this->headers = $headers;
+               $this->body = $body;
+       }
+}
+
+/**
+ * A Stomp Connection
+ *
+ * The class wraps around HTTP_Request providing a higher-level
+ * API for performing multiple HTTP requests
+ *
+ * @package Stomp
+ * @author Hiram Chirino <[EMAIL PROTECTED]>
+ * @version $Revision$
+ */
+class StompConnection {
+
+       var $socket;
+
+       function StompConnection($host, $port = 61613) {
+               $this->socket = socket_create(AF_INET, SOCK_STREAM, 0) or 
die("Could not create socket\n");
+               $result = socket_connect($this->socket, $host, $port) or 
die("Could not connect to server\n");
+       }
+
+
+       function connect($userName="", $password="") {
+               $this->writeFrame( new StompFrame("CONNECT", 
array("login"=>$userName, "passcode"=> $password ) ) );
+               return $this->readFrame();
+       }
+
+       function send($destination, $body, $properties=null) {
+               $headers = array();
+               if( isset($properties) ) {
+                       foreach ($properties as $name => $value) {
+                   $headers[$name] = $value;
+                       }
+               }
+               $headers["destination"] = $destination ;
+               $this->writeFrame( new StompFrame("SEND", $headers, $body) );
+       }
+       
+       function subscribe($destination, $properties=null) {
+               $headers = array("ack"=>"client");
+               if( isset($properties) ) {
+                       foreach ($properties as $name => $value) {
+                   $headers[$name] = $value;
+                       }
+               }
+               $headers["destination"] = $destination ;
+               $this->writeFrame( new StompFrame("SUBSCRIBE", $headers) );
+       }
+       
+       function unsubscribe($destination, $properties=null) {
+               $headers = array();
+               if( isset($properties) ) {
+                       foreach ($properties as $name => $value) {
+                   $headers[$name] = $value;
+                       }
+               }
+               $headers["destination"] = $destination ;
+               $this->writeFrame( new StompFrame("UNSUBSCRIBE", $headers) );
+       }
+
+       function begin($transactionId=null) {
+               $headers = array();
+               if( isset($transactionId) ) {
+            $headers["transaction"] = $transactionId;
+               }
+               $this->writeFrame( new StompFrame("BEGIN", $headers) );
+       }
+       
+       function commit($transactionId=null) {
+               $headers = array();
+               if( isset($transactionId) ) {
+            $headers["transaction"] = $transactionId;
+               }
+               $this->writeFrame( new StompFrame("COMMIT", $headers) );
+       }
+
+       function abort($transactionId=null) {
+               $headers = array();
+               if( isset($transactionId) ) {
+            $headers["transaction"] = $transactionId;
+               }
+               $this->writeFrame( new StompFrame("ABORT", $headers) );
+       }
+       
+       function acknowledge($messageId, $transactionId=null) {
+               $headers = array();
+               if( isset($transactionId) ) {
+            $headers["transaction"] = $transactionId;
+               }
+               $headers["message-id"] = $messageId ;
+               $this->writeFrame( new StompFrame("ABORT", $headers) );
+       }
+       
+       function disconnect() {
+               $this->writeFrame( new StompFrame("DISCONNECT") );
+               socket_close($this->socket);
+       }
+       
+       function writeFrame($stompFrame) {
+               $data = $stompFrame->command . "\n";            
+               if( isset($stompFrame->headers) ) {
+                       foreach ($stompFrame->headers as $name => $value) {
+                   $data .= $name . ": " . $value . "\n";
+                       }
+               }
+               $data .= "\n";
+               if( isset($stompFrame->body) ) {
+                       $data .= $stompFrame->body;
+               }
+               $l1 = strlen($data);
+               $data .= "\x00";
+               $l2 = strlen($data);
+               
+               socket_write($this->socket, $data, strlen($data)) or die("Could 
not send stomp frame to server\n");
+       }
+       
+       function readFrame() {
+
+               $rc = socket_recv($this->socket, &$b, 1, 0);
+               
+               // I think this EOF
+               if( $rc == 0 ) {
+                       return null;
+               }
+               // I think this is no data.
+               if( $rc == false ) {
+                       return null;
+               }               
+               
+               // Read until end of frame.
+               while( ord($b) != 0  ) {
+
+                       $data .= $b;
+                       $t = ord($b);
+                                                               
+                       $rc = socket_recv($this->socket,&$b,1,0);
+                       
+                       // I think this EOF
+                       if( $rc == 0 ) {
+                               return null;
+                       }
+                       
+               }
+
+               list($header, $body) = explode("\n\n", $data, 2);
+               $header = explode("\n", $header);
+               $headers = array();
+               
+               $command = null;
+               foreach ($header as $v) {
+                  if( isset($command) ) {
+                               list($name, $value) = explode(':', $v, 2);
+                               $headers[$name]=$value;
+                  } else {
+                               $command = $v;
+                  }
+               }
+               
+               return new StompFrame($command, $headers, $body);               
+       }
+}
+
+?>
+

Added: incubator/activemq/trunk/stomp/php/Test.php
URL: 
http://svn.apache.org/viewcvs/incubator/activemq/trunk/stomp/php/Test.php?rev=386940&view=auto
==============================================================================
--- incubator/activemq/trunk/stomp/php/Test.php (added)
+++ incubator/activemq/trunk/stomp/php/Test.php Sun Mar 19 01:22:40 2006
@@ -0,0 +1,34 @@
+<?php
+/**
+ *
+ * Copyright 2005-2006 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+require_once 'Stomp.php';
+
+$c = new StompConnection("localhost");
+$result = $c->connect("hiram", "test");
+print_r($result);
+
+$c->subscribe("/queue/FOO");
+$c->send("/queue/FOO", "Hello World!");
+
+// Wait for the message to come in..
+$result = $c->readFrame();
+print_r($result);
+
+$c->disconnect();
+
+?>


Reply via email to