--1731:ChangeLog:-- Release r0 @ 2008-06-07 22:18:46+0200> { Heads up! ~~~~~~~~~ - Deprecated xml.XML class (friebe) RFCs ~~~~ - Implemented RFC #0166: XP Runners (friebe) - Implemented RFC #0165: New text.regex package (friebe) - Implemented RFC #0163: Respect ANSI SQL in rdbms package (kiesel) - Implemented RFC #0157: Make product, language and session optional URL parts (kiesel) Bugfixes ~~~~~~~~ - Made HttpScriptlet::process() rethrow HttpScriptletExceptions as-is, while any other exception is wrapped into a HttpScriptletException. (friebe). - Fixed bug when scriptlet.xml.workflow.casters.ToDate accepted an abbreviated date, interpreted it as a time and used the current date with given time instead the given date (kiesel) - Fixed session id initialization in XMLScriptletRequest::initialize() (hinckel) - Fixed rdbms.Record::set() method (Michael Bayer, kiesel) Features ~~~~~~~~ - Added lang.Process::newInstance() method http://news.xp-framework.net/article/258/2008/05/28/New_Process (friebe) - Added " @ {host}" to rdbms.SQLConnectionClosedException's message (friebe) - Changed XAR file format (BC-break-free) to be less memory-consuming, platform-independent and get rid of original filename junk (friebe) - Added a parameter "bool append" (defaulting to FALSE) to io.streams.FileOutputStream's constructor (friebe) - Made io.streams.FileInputStream and io.streams.FileOutputStream's constructors accept either an io.File or a string with the filename (friebe) - Added syntactical support in text.doclet.markup API for ordered and unordered lists. (friebe) } --17433:lang.base.php:-- array(), 'sapi' => array(), 'class.xp' => '', 'class.null' => '', ); // {{{ public string loadClass0(string name) // Loads a class by its fully qualified name function loadClass0($class) { if (isset(xp::$registry['classloader.'.$class])) { return substr(array_search($class, xp::$registry), 6); } $package= NULL; foreach (xp::$registry['classpath'] as $path) { // If path is a directory and the included file exists, load it if (is_dir($path) && file_exists($f= $path.DIRECTORY_SEPARATOR.strtr($class, '.', DIRECTORY_SEPARATOR).xp::CLASS_FILE_EXT)) { if (FALSE === ($r= include($f))) { xp::error('Cannot bootstrap class '.$class.' (from file "'.$f.'")'); } xp::$registry['classloader.'.$class]= 'FileSystemClassLoader://'.$path; break; } else if (is_file($path) && file_exists($f= 'xar://'.$path.'?'.strtr($class, '.', '/').xp::CLASS_FILE_EXT)) { // To to load via bootstrap class loader, if the file cannot provide the class-to-load // skip to the next include_path part if (FALSE === ($r= include($f))) { continue; } xp::$registry['classloader.'.$class]= 'ArchiveClassLoader://'.$path; break; } } // Verify the requested class could be loaded if (!isset(xp::$registry['classloader.'.$class])) { xp::error('Cannot bootstrap class '.$class.' (include_path= '.get_include_path().')'); } // Register class name and call static initializer if available $name= ($package ? strtr($package, '.', '').'' : '').xp::reflect($class); xp::$registry['class.'.$name]= $class; is_callable(array($name, '__static')) && call_user_func(array($name, '__static')); return $name; } // }}} // {{{ public string nameOf(string name) // Returns the fully qualified name static function nameOf($name) { if (!($n= xp::registry('class.'.$name))) { return $name ? 'php.'.$name : NULL; } return $n; } // }}} // {{{ public string typeOf(mixed arg) // Returns the fully qualified type name static function typeOf($arg) { return is_object($arg) ? xp::nameOf(get_class($arg)) : gettype($arg); } // }}} // {{{ public string stringOf(mixed arg [, string indent default '']) // Returns a string representation of the given argument static function stringOf($arg, $indent= '') { static $protect= array(); if (is_string($arg)) { return '"'.$arg.'"'; } else if (is_bool($arg)) { return $arg ? 'true' : 'false'; } else if (is_null($arg)) { return 'null'; } else if ($arg instanceof null) { return ''; } else if (is_int($arg) || is_float($arg)) { return (string)$arg; } else if ($arg instanceof Generic && !isset($protect[$arg->hashCode()])) { $protect[$arg->hashCode()]= TRUE; $s= $arg->toString(); unset($protect[$arg->hashCode()]); return $s; } else if (is_array($arg)) { $ser= serialize($arg); if (isset($protect[$ser])) return '->{:recursion:}'; $protect[$ser]= TRUE; $r= "[\n"; foreach (array_keys($arg) as $key) { $r.= $indent.' '.$key.' => '.xp::stringOf($arg[$key], $indent.' ')."\n"; } unset($protect[$ser]); return $r.$indent.']'; } else if (is_object($arg)) { $ser= serialize($arg); if (isset($protect[$ser])) return '->{:recursion:}'; $protect[$ser]= TRUE; $r= xp::nameOf(get_class($arg))." {\n"; $vars= (array)$arg; foreach (array_keys($vars) as $key) { $r.= $indent.' '.$key.' => '.xp::stringOf($vars[$key], $indent.' ')."\n"; } unset($protect[$ser]); return $r.$indent.'}'; } else if (is_resource($arg)) { return 'resource(type= '.get_resource_type($arg).', id= '.(int)$arg.')'; } } // }}} // {{{ public void gc() // Runs the garbage collector static function gc() { xp::$registry['errors']= array(); } // }}} // {{{ public null() // Runs a fatal-error safe version of NULL static function null() { return xp::$registry['null']; } // }}} // {{{ public bool errorAt(string file [, int line) // Returns whether an error occured at the specified position static function errorAt($file, $line= -1) { $errors= xp::$registry['errors']; // If no line is given, check for an error in the file if ($line < 0) return !empty($errors[$file]); // Otherwise, check for an error in the file on a certain line return !empty($errors[$file][$line]); } // }}} // {{{ public mixed sapi(string* sapis) // Sets an SAPI static function sapi() { foreach ($a= func_get_args() as $name) { foreach (xp::$registry['classpath'] as $path) { $filename= 'sapi'.DIRECTORY_SEPARATOR.strtr($name, '.', DIRECTORY_SEPARATOR).'.sapi.php'; if (is_dir($path) && file_exists($f= $path.DIRECTORY_SEPARATOR.$filename)) { require_once($f); continue 2; } else if (is_file($path) && file_exists($f= 'xar://'.$path.'?'.strtr($filename, DIRECTORY_SEPARATOR, '/'))) { require_once($f); continue 2; } } xp::error('Cannot open SAPI '.$name.' (include_path='.get_include_path().')'); } xp::$registry['sapi']= $a; } // }}} // {{{ internal mixed registry(mixed args*) // Stores static data static function registry() { switch (func_num_args()) { case 0: return xp::$registry; case 1: return @xp::$registry[func_get_arg(0)]; case 2: xp::$registry[func_get_arg(0)]= func_get_arg(1); break; } return NULL; } // }}} // {{{ internal string reflect(string str) // Retrieve PHP conformant name for fqcn static function reflect($str) { $l= array_search($str, xp::$registry); return $l ? substr($l, 6) : substr($str, (FALSE === $p= strrpos($str, '.')) ? 0 : $p+ 1); } // }}} // {{{ internal void error(string message) // Throws a fatal error and exits with exitcode 61 static function error($message) { restore_error_handler(); trigger_error($message, E_USER_ERROR); exit(0x3d); } } // }}} // {{{ final class null class null { // {{{ public object __construct(void) // Constructor to avoid magic __call invokation public function __construct() { if (isset(xp::$registry['null'])) { throw new IllegalAccessException('Cannot create new instances of xp::null()'); } } // {{{ public void __clone(void) // Clone interceptor public function __clone() { throw new NullPointerException('Object cloning intercepted.'); } // }}} // {{{ magic mixed __call(string name, mixed[] args) // Call proxy function __call($name, $args) { throw new NullPointerException('Method.invokation('.$name.')'); } // }}} // {{{ magic void __set(string name, mixed value) // Set proxy function __set($name, $value) { throw new NullPointerException('Property.write('.$name.')'); } // }}} // {{{ magic mixed __get(string name) // Set proxy function __get($name) { throw new NullPointerException('Property.read('.$name.')'); } // }}} } // }}} // {{{ final class xploader class xarloader { public $position = 0, $archive = '', $filename = ''; // {{{ static mixed[] acquire(string archive) // Archive instance handling pool function, opens an archive and reads header only once static function acquire($archive) { static $archives= array(); static $unpack= array( 1 => 'a80id/a80*filename/a80*path/V1size/V1offset/a*reserved', 2 => 'a240id/V1size/V1offset/a*reserved' ); if (!isset($archives[$archive])) { $archives[$archive]= array(); $current= &$archives[$archive]; $current['handle']= fopen($archive, 'rb'); $header= unpack('a3id/c1version/V1indexsize/a*reserved', fread($current['handle'], 0x0100)); if ('CCA' != $header['id']) raise('lang.FormatException', 'Malformed archive '.$archive); for ($current['index']= array(), $i= 0; $i < $header['indexsize']; $i++) { $entry= unpack( $unpack[$header['version']], fread($current['handle'], 0x0100) ); $current['index'][$entry['id']]= array($entry['size'], $entry['offset']); } } return $archives[$archive]; } // }}} // {{{ function bool stream_open(string path, string mode, int options, string opened_path) // Open the given stream and check if file exists function stream_open($path, $mode, $options, $opened_path) { sscanf($path, 'xar://%[^?]?%[^$]', $archive, $file); $this->archive= urldecode($archive); $this->filename= $file; $current= self::acquire($this->archive); return isset($current['index'][$this->filename]); } // }}} // {{{ string stream_read(int count) // Read $count bytes up-to-length of file function stream_read($count) { $current= self::acquire($this->archive); if (!isset($current['index'][$this->filename])) return FALSE; if ($current['index'][$this->filename][0] == $this->position || 0 == $count) return FALSE; fseek($current['handle'], 0x0100 + sizeof($current['index']) * 0x0100 + $current['index'][$this->filename][1] + $this->position, SEEK_SET); $bytes= fread($current['handle'], min($current['index'][$this->filename][0]- $this->position, $count)); $this->position+= strlen($bytes); return $bytes; } // }}} // {{{ bool stream_eof() // Returns whether stream is at end of file function stream_eof() { $current= self::acquire($this->archive); return $this->position >= $current['index'][$this->filename][0]; } // }}} // {{{ stream_stat() // Retrieve status of stream function stream_stat() { $current= self::acquire($this->archive); return array( 'size' => $current['index'][$this->filename][0] ); } // }}} // {{{ bool stream_seek(int offset, int whence) // Callback for fseek function stream_seek($offset, $whence) { switch ($whence) { case SEEK_SET: $this->position= $offset; break; case SEEK_CUR: $this->position+= $offset; break; case SEEK_END: $current= self::acquire($this->archive); $this->position= $current['index'][$this->filename][0] + $offset; break; } return TRUE; } // }}} // {{{ int stream_tell // Callback for ftell function stream_tell() { return $this->position; } // }}} // {{{ url_stat(string path) // Retrieve status of url function url_stat($path) { sscanf($path, 'xar://%[^?]?%[^$]', $archive, $file); $current= self::acquire(urldecode($archive)); return isset($current['index'][$file]) ? array('size' => $current['index'][$file][0]) : FALSE ; } // }}} } // }}} // {{{ internal void __error(int code, string msg, string file, int line) // Error callback function __error($code, $msg, $file, $line) { if (0 == error_reporting() || is_null($file)) return; if (E_RECOVERABLE_ERROR == $code) { throw new IllegalArgumentException($msg.' @ '.$file.':'.$line); } else { @xp::$registry['errors'][$file][$line][$msg]++; } } // }}} // {{{ void uses (string* args) // Uses one or more classes function uses() { foreach (func_get_args() as $str) xp::$registry['loader']->loadClass0($str); } // }}} // {{{ void raise (string classname, mixed* args) // throws an exception by a given class name function raise($classname) { try { $class= XPClass::forName($classname); } catch (ClassNotFoundException $e) { xp::error($e->getMessage()); } $a= func_get_args(); throw call_user_func_array(array($class, 'newInstance'), array_slice($a, 1)); } // }}} // {{{ void finally (void) // Syntactic sugar. Intentionally empty function finally() { } // }}} // {{{ Generic cast (Generic expression, string type) // Casts an expression. function cast(Generic $expression= NULL, $type) { if (NULL === $expression) { return xp::null(); } else if (XPClass::forName($type)->isInstance($expression)) { return $expression; } raise('lang.ClassCastException', 'Cannot cast '.xp::typeOf($expression).' to '.$type); } // {{{ proto bool is(string class, lang.Object object) // Checks whether a given object is of the class, a subclass or implements an interface function is($class, $object) { if (NULL === $class) return $object instanceof null; $class= xp::reflect($class); return $object instanceof $class; } // }}} // {{{ proto void delete(&lang.Object object) // Destroys an object function delete(&$object) { $object= NULL; } // }}} // {{{ proto void with(expr) // Syntactic sugar. Intentionally empty function with() { } // }}} // {{{ proto mixed ref(mixed object) // Creates a "reference" to an object function ref(&$object) { return array(&$object); } // }}} // {{{ proto &mixed deref(&mixed expr) // Dereferences an expression function &deref(&$expr) { if (is_array($expr)) return $expr[0]; else return $expr; } // }}} // {{{ proto lang.Object newinstance(string classname, mixed[] args, string bytes) // Anonymous instance creation function newinstance($classname, $args, $bytes) { static $u= 0; $class= xp::reflect($classname); if (!class_exists($class) && !interface_exists($class)) { xp::error(xp::stringOf(new Error('Class "'.$classname.'" does not exist'))); // Bails } $name= $class.''.(++$u); // Checks whether an interface or a class was given $cl= DynamicClassLoader::instanceFor(__FUNCTION__); if (interface_exists($class)) { $cl->setClassBytes($name, 'class '.$name.' extends Object implements '.$class.' '.$bytes); } else { $cl->setClassBytes($name, 'class '.$name.' extends '.$class.' '.$bytes); } $cl->loadClass0($name); // Build paramstr for evaluation for ($paramstr= '', $i= 0, $m= sizeof($args); $i < $m; $i++) { $paramstr.= ', $args['.$i.']'; } return eval('return new '.$name.'('.substr($paramstr, 2).');'); } // }}} // {{{ lang.Generic create(mixed spec) // Creates a generic object function create($spec) { if ($spec instanceof Generic) return $spec; sscanf($spec, 'new %[^<]<%[^>]>', $classname, $types); $class= xp::reflect($classname); // Check whether class is generic if (!property_exists($class, '__generic')) { throw new IllegalArgumentException('Class '.$classname.' is not generic'); } // Instanciate without invoking the constructor and pass type information. // This is done so that the constructur can already use generic types. $__id= microtime(); $instance= unserialize('O:'.strlen($class).':"'.$class.'":1:{s:4:"__id";s:'.strlen($__id).':"'.$__id.'";}'); foreach (explode(',', $types) as $type) { $instance->__generic[]= xp::reflect(trim($type)); } // Call constructor if available if (is_callable(array($instance, '__construct'))) { $a= func_get_args(); call_user_func_array(array($instance, '__construct'), array_slice($a, 1)); } return $instance; } // }}} // {{{ initialization error_reporting(E_ALL); // Get rid of magic quotes get_magic_quotes_gpc() && xp::error('[xp::core] magic_quotes_gpc enabled'); ini_set('magic_quotes_runtime', FALSE); // Constants define('LONG_MAX', PHP_INT_MAX); define('LONG_MIN', -PHP_INT_MAX - 1); // Hooks set_error_handler('__error'); // Registry initialization xp::$registry['null']= new null(); xp::$registry['loader']= new xp(); xp::$registry['classpath']= array_filter(array_map('realpath', explode(PATH_SEPARATOR, get_include_path()))); // Register stream wrapper for .xar class loading stream_wrapper_register('xar', 'xarloader'); // Omnipresent classes uses( 'lang.Object', 'lang.Error', 'lang.XPException', 'lang.XPClass', 'lang.NullPointerException', 'lang.IllegalAccessException', 'lang.IllegalArgumentException', 'lang.IllegalStateException', 'lang.FormatException', 'lang.ClassLoader' ); // }}} ?> --69:bin/boot.pth:-- .. ../lib/xp-rt-5.6.7RC3.xar ../lib/xp-net.xp_framework-5.6.7RC3.xar --2606189:lib/xp-rt-5.6.7RC3.xar:-- CCAAlang/archive/Archive.class.php#"lang/archive/ArchiveClassLoader.class.php#"lang/archive/ArchiveReader.class.php3=lang/archive/package-info.xp Qlang/ChainedException.class.php- Tlang/ClassCastException.class.php 6\lang/ClassLoader.class.php/B]lang/ClassNotFoundException.class.phplang/CloneNotSupportedException.class.php@lang/Collection.class.php7 lang/DynamicClassLoader.class.phpl"lang/ElementNotFoundException.class.phplang/Enum.class.php lang/Error.class.phplang/FileSystemClassLoader.class.phpYlang/FormatException.class.php lang/Generic.class.php"lang/IClassLoader.class.php-lang/IllegalAccessException.class.php lang/IllegalArgumentException.class.phpvlang/IllegalStateException.class.phplang/IllegalThreadStateException.class.php"lang/IndexOutOfBoundsException.class.phpq7lang/MethodNotImplementedException.class.phplang/NullPointerException.class.phpWd lang/Object.class.php- lang/package-info.xplang/Primitive.class.php, %lang/Process.class.php2lang/reflect/Constructor.class.php Nlang/reflect/Field.class.php| Xlang/reflect/InvocationHandler.class.phpdlang/reflect/Method.class.phpg hlang/reflect/Modifiers.class.phpz qrlang/reflect/package-info.xplang/reflect/Package.class.phplang/reflect/Parameter.class.phpZ lang/reflect/Proxy.class.phplang/reflect/Routine.class.php!lang/reflect/TargetInvocationException.class.php5lang/Runnable.class.phpo lang/Runtime.class.php xlang/RuntimeError.class.php=lang/StackTraceElement.class.phpU :lang/System.class.phplang/SystemException.class.phpV lang/Thread.class.php"lang/Throwable.class.php>x8lang/Type.class.phpQ Mlang/types/ArrayList.class.phpZlang/types/Boolean.class.php0llang/types/Byte.class.php4qlang/types/Bytes.class.phprlang/types/Character.class.php qlang/types/Double.class.phplang/types/Float.class.phplang/types/Integer.class.php=.lang/types/Long.class.php6klang/types/Number.class.phplang/types/package-info.xplang/types/Short.class.php:lang/types/String.class.php"lang/XPClass.class.phpJlang/XPException.class.php1util/AbstractDeferredInvokationHandler.class.php@util/Binford.class.phphCutil/Calendar.class.php!util/ChainedException.class.php^ >util/cmd/Command.class.phplGutil/cmd/Console.class.php QIutil/cmd/package-info.xplAUutil/cmd/ParamString.class.phpYutil/cmd/Runner.class.php+dlutil/cmd/SingleProcess.class.phpN_util/collections/DJBX33AHashImplementation.class.php util/collections/HashImplementation.class.phputil/collections/HashProvider.class.php^util/collections/HashSet.class.php =util/collections/HashTable.class.phpIutil/collections/IList.class.phpJutil/collections/LRUBuffer.class.php util/collections/Map.class.php6 util/collections/MD5HashImplementation.class.phpHutil/collections/package-info.xpQ, util/collections/Queue.class.php}util/collections/Set.class.phpD4$util/collections/Stack.class.phpx+util/collections/Vector.class.php7%;util/Comparator.class.phpo`util/Component.class.php9cutil/Configurable.class.phpfutil/Date.class.phpd*hutil/DateInterval.class.phps-util/DateMath.class.phputil/DateUtil.class.phpKutil/DeferredInitializationException.class.phpSutil/Hashmap.class.phpJ"jutil/HashmapIterator.class.phpCutil/io/VirtualFileManager.class.phpButil/Locale.class.php 9util/log/BufferedAppender.class.phputil/log/ColoredConsoleAppender.class.phputil/log/ConsoleAppender.class.php:util/log/FileAppender.class.phpxutil/log/LogAppender.class.phpXVutil/log/LogCategory.class.php! util/log/Logger.class.phpi+util/log/LogObserver.class.phpFutil/log/package-info.xpVJutil/log/SmtpAppender.class.php0-Outil/log/SyslogAppender.class.phpu]Vutil/log/Traceable.class.php[util/MimeType.class.php*]util/NoSuchElementException.class.phpn=util/Observable.class.php util/Observer.class.php˔util/package-info.xpk qutil/profiling/ClassProfiler.class.phpܠutil/profiling/Timer.class.phputil/Properties.class.php2Xutil/PropertyManager.class.phputil/semaphore/Semaphore.class.phputil/semaphore/SessionSemaphore.class.php tutil/ServiceException.class.phputil/telephony/TelephonyAddress.class.phputil/telephony/TelephonyAddressParser.class.php@=util/telephony/TelephonyCall.class.phpButil/telephony/TelephonyException.class.phpFutil/telephony/TelephonyProvider.class.phpRGutil/telephony/TelephonyTerminal.class.phpUutil/TimeSpan.class.php2Yutil/TimeZone.class.phpwutil/TimeZoneTransition.class.php#util/Visitor.class.phputil/XPIterator.class.php|io/ByteOrder.class.phpYio/collections/CollectionComposite.class.phpO ^io/collections/FileCollection.class.php io/collections/FileElement.class.phpIBio/collections/IOCollection.class.phpio/collections/IOElement.class.phpio/collections/iterate/AbstractCombinedFilter.class.phpv io/collections/iterate/AbstractDateComparisonFilter.class.phpio/collections/iterate/AbstractSizeComparisonFilter.class.phpio/collections/iterate/AccessedAfterFilter.class.phpLio/collections/iterate/AccessedBeforeFilter.class.phpO io/collections/iterate/AllOfFilter.class.php~Xio/collections/iterate/AnyOfFilter.class.phpaio/collections/iterate/CollectionFilter.class.php 7io/collections/iterate/CreatedAfterFilter.class.phpG@io/collections/iterate/CreatedBeforeFilter.class.phpJio/collections/iterate/ExtensionEqualsFilter.class.phpio/collections/iterate/FilteredIOCollectionIterator.class.phpio/collections/iterate/IOCollectionIterator.class.phpio/collections/iterate/IterationFilter.class.phpwio/collections/iterate/ModifiedAfterFilter.class.phpLFio/collections/iterate/ModifiedBeforeFilter.class.phpO io/collections/iterate/NameEqualsFilter.class.php io/collections/iterate/NameMatchesFilter.class.php io/collections/iterate/NegationOfFilter.class.phpio/collections/iterate/RegexFilter.class.phpsio/collections/iterate/SizeBiggerThanFilter.class.php0io/collections/iterate/SizeEqualsFilter.class.php),io/collections/iterate/SizeSmallerThanFilter.class.php2Uio/collections/package-info.xp!io/dba/DBAFile.class.phpI&io/dba/DBAIterator.class.phpAio/EmbeddedFile.class.phpTGio/EncapsedStream.class.phpMio/File.class.phpDeio/FileNotFoundException.class.phpUio/FilePermission.class.phpio/FileUtil.class.phpio/Folder.class.php2رio/IOException.class.php io/OperationTimedOutException.class.phpYio/package-info.xpU io/SearchableStream.class.phpaio/SpoolDirectory.class.phpKio/Stream.class.phpio/streams/BufferedInputStream.class.php- io/streams/BufferedOutputStream.class.php,io/streams/ConsoleOutputStream.class.php0#io/streams/FileInputStream.class.phpSio/streams/FileOutputStream.class.php8%io/streams/InputStream.class.phpo+io/streams/MemoryInputStream.class.php-io/streams/MemoryOutputStream.class.php4io/streams/OutputStream.class.php8io/streams/OutputStreamWriter.class.php:io/streams/package-info.xp>io/streams/Seekable.class.phpsAio/streams/Streams.class.php=Dio/streams/StringWriter.class.phpO &Wio/sys/Ftok.class.phpu`io/sys/IPCMessage.class.phpjfio/sys/IPCQueue.class.php^jio/sys/Semaphore.class.phpk Iio/sys/ShmSegment.class.php io/sys/StdStream.class.php(_io/TempFile.class.phpUio/ZipFile.class.phpOܦsapi/cgi.sapi.php+sapi/class.sapi.phpsapi/cli.sapi.phpZNsapi/gui/gtk.sapi.phpsapi/scriptlet/development.sapi.phpB_sapi/scriptlet/error400.htmlsapi/scriptlet/error403.htmlsapi/scriptlet/error404.htmlsapi/scriptlet/error405.htmlssapi/scriptlet/error406.htmlsapi/scriptlet/error500.htmlsapi/scriptlet/production.sapi.phpsapi/scriptlet/ScriptletRunner.class.phpsapi/soap/client.sapi.phpTsapi/soap/service.sapi.php sapi/strict.sapi.php sapi/synchronized.sapi.php1 sapi/xmlrpc/client.sapi.php sapi/xmlrpc/service.sapi.php peer/AuthenticationException.class.php peer/BSDSocket.class.phph [ peer/ConnectException.class.phpV9 peer/ftp/DefaultFtpListParser.class.php; peer/ftp/FtpConnection.class.php$A peer/ftp/FtpDir.class.phpI%f peer/ftp/FtpDownload.class.phpC peer/ftp/FtpEntry.class.php9 peer/ftp/FtpEntryList.class.phpը peer/ftp/FtpFile.class.php  peer/ftp/FtpListIterator.class.php peer/ftp/FtpListParser.class.php9 peer/ftp/FtpTransfer.class.php! peer/ftp/FtpTransferListener.class.php peer/ftp/FtpUpload.class.php peer/ftp/package-info.xpr peer/ftp/server/FtpConnectionListener.class.php# peer/ftp/server/FtpSession.class.phpA k peer/ftp/server/FtpThread.class.phpw peer/ftp/server/interceptor/DefaultInterceptor.class.php peer/ftp/server/interceptor/EntrynameInterceptor.class.phpȕ peer/ftp/server/interceptor/InterceptorCondition.class.php| peer/ftp/server/interceptor/PathCondition.class.phpi peer/ftp/server/interceptor/StorageActionInterceptor.class.php peer/ftp/server/storage/FilesystemStorage.class.php peer/ftp/server/storage/FilesystemStorageCollection.class.phpcR peer/ftp/server/storage/FilesystemStorageElement.class.php peer/ftp/server/storage/Storage.class.php peer/ftp/server/storage/StorageCollection.class.phpJ peer/ftp/server/storage/StorageElement.class.php peer/ftp/server/storage/StorageEntry.class.php peer/ftp/WindowsFtpListParser.class.php peer/Header.class.phpT peer/http/BasicAuthorization.class.php peer/http/HttpConnection.class.phpt peer/http/HttpConstants.class.php m peer/http/HttpInputStream.class.php{f$ peer/http/HttpRequest.class.phps+ peer/http/HttpRequestFactory.class.phpT= peer/http/HttpResponse.class.php