phpgroupware-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Phpgroupware-cvs] phpgwapi/inc/class.wsdl.inc.php, 1.5


From: nomail
Subject: [Phpgroupware-cvs] phpgwapi/inc/class.wsdl.inc.php, 1.5
Date: Thu, 30 Dec 2004 07:47:31 +0100

Update of /phpgwapi/inc
Added Files:
        Branch: 
          class.wsdl.inc.php

date: 2004/12/30 06:47:31;  author: skwashd;  state: Exp;  lines: +297 -293

Log Message:
new HEAD
=====================================================================
<?php
        /**
        * SOAPx4 ("XML-RPC for PHP" and "SOAP for PHP")
        * @author Dietrich Ayala <address@hidden>
        * @author Edd Dumbill
        * @author Victor Zou <address@hidden>
        * @copyright Copyright (C) 1999-2000 Edd Dumbill
        * @copyright Copyright (C) 2000-2001 Victor Zou
        * @copyright Copyright (C) 2001 Dietrich Ayala
        * @copyright Portions Copyright (C) 2004 Free Software Foundation, Inc. 
http://www.fsf.org/
        * @package phpgwapi
        * @subpackage communication
        * @version $Id: class.wsdl.inc.php,v 1.5 2004/12/30 06:47:31 skwashd 
Exp $
        * @internal This project began based on code from the 2 projects below,
        * @internal and still contains some original code. The licenses of both 
must be respected.
        */

        /**
        * SOAPx4 ("XML-RPC for PHP" and "SOAP for PHP")
        * 
        * @package phpgwapi
        * @subpackage communication
        * This is a class that loads a wsdl file and makes it's data available 
to an application
        * it should provide methods that allow both client and server usage of 
it
        * Also should have methods for creating a wsdl file from scratch and
        * serializing wsdl into valid markup
        */
        class wsdl
        {
                // constructor
                function wsdl($wsdl=False)
                {       
                        // define internal arrays of bindings, ports, 
operations, messages, etc.
                        $this->complexTypes = array();
                        $this->messages = array();
                        $this->currentMessage;
                        $this->portOperations = array();
                        $this->currentOperation;
                        $this->portTypes = array();
                        $this->currentPortType;
                        $this->bindings = array();
                        $this->currentBinding;
                        // debug switch
                        $this->debug_flag = False;
                        // parser vars
                        $this->parser;
                        $this->position;
                        $this->depth;
                        $this->depth_array = array();

                        if($wsdl == "-1")
                        {
                                $wsdl=False;
                        }
                        // Check whether content has been read.
                        if($wsdl)
                        {
                                $wsdl_string = join("",file($wsdl));
                                // Create an XML parser.
                                $this->parser = xml_parser_create();
                                // Set the options for parsing the XML data.
                                //xml_parser_set_option($parser, 
XML_OPTION_SKIP_WHITE, 1); 
                                xml_parser_set_option($this->parser, 
XML_OPTION_CASE_FOLDING, 0);
                                // Set the object for the parser.
                                xml_set_object($this->parser, &$this);
                                // Set the element handlers for the parser.
                                xml_set_element_handler($this->parser, 
'start_element','end_element');
                                
xml_set_character_data_handler($this->parser,'character_data');
                                //xml_set_default_handler($this->parser, 
'default_handler');

                                // Parse the XML file.
                                if(!xml_parse($this->parser,$wsdl_string,True))
                                {
                                        // Display an error message.
                                        $this->debug(sprintf('XML error on line 
%d: %s',
                                                
xml_get_current_line_number($this->parser),
                                                
xml_error_string(xml_get_error_code($this->parser))));
                                        $this->fault = True;
                                }
                                xml_parser_free($this->parser);
                        }
                }

                // start-element handler
                function start_element($parser, $name, $attrs)
                {
                        // position in the total number of elements, starting 
from 0
                        $pos = $this->position++;
                        $depth = $this->depth++;
                        // set self as current value for this depth
                        $this->depth_array[$depth] = $pos;

                        // find status, register data
                        switch($this->status)
                        {
                                case 'types':
                                switch($name)
                                {
                                        case 'schema':
                                                $this->schema = True;
                                                break;
                                        case 'complexType':
                                                $this->currentElement = 
$attrs['name'];
                                                $this->schemaStatus = 
'complexType';
                                                break;
                                        case 'element':
                                                
$this->complexTypes[$this->currentElement]['elements'][$attrs['name']] = $attrs;
                                                break;
                                        case 'complexContent':
                                                break;
                                        case 'restriction':
                                                
$this->complexTypes[$this->currentElement]['restrictionBase'] = $attrs['base'];
                                                break;
                                        case 'sequence':
                                                
$this->complexTypes[$this->currentElement]['order'] = 'sequence';
                                                break;
                                        case "all":
                                                
$this->complexTypes[$this->currentElement]['order'] = 'all';
                                                break;
                                        case 'attribute':
                                                if($attrs['ref'])
                                                {
                                                        
$this->complexTypes[$this->currentElement]['attrs'][$attrs['ref']] = $attrs;
                                                }
                                                elseif($attrs['name'])
                                                {
                                                        
$this->complexTypes[$this->currentElement]['attrs'][$attrs['name']] = $attrs;
                                                }
                                                break;
                                        }
                                        break;
                                case 'message':
                                        if($name == 'part')
                                        {
                                                
$this->messages[$this->currentMessage][$attrs['name']] = $attrs['type'];
                                        }
                                        break;
                                case 'portType':
                                        switch($name)
                                        {
                                                case 'operation':
                                                        $this->currentOperation 
= $attrs['name'];
                                                        
$this->portTypes[$this->currentPortType][$attrs['name']] = 
$attrs['parameterOrder'];
                                                break;
                                                default:
                                                        
$this->portOperations[$this->currentOperation][$name]= $attrs;
                                                        break;
                                        }
                                        break;
                                case 'binding':
                                        switch($name)
                                        {
                                                case 'soap:binding':
                                                        
$this->bindings[$this->currentBinding] = 
array_merge($this->bindings[$this->currentBinding],$attrs);
                                                        break;
                                                case 'operation':
                                                        $this->currentOperation 
= $attrs['name'];
                                                        
$this->bindings[$this->currentBinding]['operations'][$attrs['name']] = array();
                                                        break;
                                                case 'soap:operation':
                                                        
$this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['soapAction']
 = $attrs['soapAction'];
                                                        break;
                                                case 'input':
                                                        $this->opStatus = 
'input';
                                                case 'soap:body':
                                                        
$this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus]
 = $attrs;
                                                        break;
                                                case 'output':
                                                        $this->opStatus = 
'output';
                                                        break;
                                        }
                                        break;
                                case 'service':
                                        switch($name)
                                        {
                                                case 'port':
                                                        $this->currentPort = 
$attrs['name'];
                                                        
$this->ports[$attrs['name']] = $attrs;
                                                        break;
                                                case 'soap:address':
                                                        
$this->ports[$this->currentPort]['location'] = $attrs['location'];
                                                        break;
                                        }
                                        break;
                        }
                        // set status
                        switch($name)
                        {
                                case 'types':
                                        $this->status = 'types';
                                        break;
                                case 'message':
                                        $this->status = 'message';
                                        $this->messages[$attrs['name']] = 
array();
                                        $this->currentMessage = $attrs['name'];
                                        break;
                                case 'portType':
                                        $this->status = 'portType';
                                        $this->portTypes[$attrs['name']] = 
array();
                                        $this->currentPortType = $attrs['name'];
                                        break;
                                case 'binding':
                                        $this->status = 'binding';
                                        $this->currentBinding = $attrs['name'];
                                        $this->bindings[$attrs['name']]['type'] 
= $attrs['type'];
                                        break;
                                case 'service':
                                        $this->status = 'service';
                                        break;
                        }
                        // get element prefix
                        if(ereg(":",$name))
                        {
                                $prefix = substr($name,0,strpos($name,':'));
                        }
                }

                function getEndpoint($portName)
                {
                        if($endpoint = $this->ports[$portName]['location'])
                        {
                                return $endpoint;
                        }
                        return False;
                }

                function getPortName($operation)
                {
                        @reset($this->ports);
                        while(list($port,$portAttrs) = @each($this->ports));
                        /* foreach($this->ports as $port => $portAttrs) */
                        {
                                $binding = substr($portAttrs['binding'],4);
                                @reset($this->bindings[$binding]['operations']);
                                while(list($op,$opAttrs) = 
@each($this->bindings[$binding]['operations']))
                                /* 
foreach($this->bindings[$binding]["operations"] as $op => $opAttrs) */
                                {
                                        if($op == $operation)
                                        {
                                                return $port;
                                        }
                                }
                        }
                }

                function getSoapAction($portName,$operation)
                {
                        if($binding = 
substr($this->ports[$portName]['binding'],4))
                        {
                                if($soapAction = 
$this->bindings[$binding]['operations'][$operation]['soapAction'])
                                {
                                        return $soapAction;
                                }
                                return False;
                        }
                        return False;
                }

                function getNamespace($portName,$operation)
                {
                        if($binding = 
substr($this->ports[$portName]['binding'],4))
                        {
                                //$this->debug("looking for namespace using 
binding '$binding', port '$portName', operation '$operation'");
                                if($namespace = 
$this->bindings[$binding]['operations'][$operation]['input']['namespace'])
                                {
                                        return $namespace;
                                }
                                return False;
                        }
                        return False;
                }

                // end-element handler
                function end_element($parser, $name)
                {
                        // position of current element is equal to the last 
value left in depth_array for my depth
                        $pos = $this->depth_array[$this->depth];
                        // bring depth down a notch
                        $this->depth--; 
                }

                // element content handler
                function character_data($parser, $data)
                {
                        $pos = $this->depth_array[$this->depth];
                        $this->message[$pos]['cdata'] .= $data;
                }

                function debug($string)
                {
                        if($this->debug_flag)
                        {
                                $this->debug_str .= "$string\n";
                        }
                }
        }
?>




reply via email to

[Prev in Thread] Current Thread [Next in Thread]