[PD-cvs] SF.net SVN: pure-data: [9619] vendor

eighthave at users.sourceforge.net eighthave at users.sourceforge.net
Sat Mar 22 03:13:12 CET 2008


Revision: 9619
          http://pure-data.svn.sourceforge.net/pure-data/?rev=9619&view=rev
Author:   eighthave
Date:     2008-03-21 19:13:11 -0700 (Fri, 21 Mar 2008)

Log Message:
-----------
importing pdj-0.8.3.tar.gz from http://www.le-son666.com/software/pdj/

Added Paths:
-----------
    vendor/pdj/
    vendor/pdj/current/
    vendor/pdj/current/.cdtproject
    vendor/pdj/current/.project
    vendor/pdj/current/.settings/
    vendor/pdj/current/.settings/org.eclipse.cdt.core.prefs
    vendor/pdj/current/LICENSE
    vendor/pdj/current/Linux-build.properties
    vendor/pdj/current/Mac OS X-build.properties
    vendor/pdj/current/Makefile
    vendor/pdj/current/README
    vendor/pdj/current/Windows XP-build.properties
    vendor/pdj/current/build.properties
    vendor/pdj/current/build.xml
    vendor/pdj/current/lib/
    vendor/pdj/current/lib/ant/
    vendor/pdj/current/lib/ant/cpptasks.jar
    vendor/pdj/current/res/
    vendor/pdj/current/res/help-pdj.pd
    vendor/pdj/current/res/pdj-test.pd
    vendor/pdj/current/res/pdj.properties
    vendor/pdj/current/res/pdj~-panner.pd
    vendor/pdj/current/res/pdj~-test.pd
    vendor/pdj/current/src/
    vendor/pdj/current/src/MSPBuffer.c
    vendor/pdj/current/src/MaxClock.c
    vendor/pdj/current/src/MaxObject.c
    vendor/pdj/current/src/MaxSystem.c
    vendor/pdj/current/src/init.c
    vendor/pdj/current/src/java/
    vendor/pdj/current/src/java/com/
    vendor/pdj/current/src/java/com/cycling74/
    vendor/pdj/current/src/java/com/cycling74/io/
    vendor/pdj/current/src/java/com/cycling74/io/ErrorStream.java
    vendor/pdj/current/src/java/com/cycling74/io/PostStream.java
    vendor/pdj/current/src/java/com/cycling74/max/
    vendor/pdj/current/src/java/com/cycling74/max/Atom.java
    vendor/pdj/current/src/java/com/cycling74/max/AtomFloat.java
    vendor/pdj/current/src/java/com/cycling74/max/AtomString.java
    vendor/pdj/current/src/java/com/cycling74/max/Attribute.java
    vendor/pdj/current/src/java/com/cycling74/max/Callback.java
    vendor/pdj/current/src/java/com/cycling74/max/DataTypes.java
    vendor/pdj/current/src/java/com/cycling74/max/Executable.java
    vendor/pdj/current/src/java/com/cycling74/max/MaxClock.java
    vendor/pdj/current/src/java/com/cycling74/max/MaxContext.java
    vendor/pdj/current/src/java/com/cycling74/max/MaxObject.java
    vendor/pdj/current/src/java/com/cycling74/max/MaxPatcher.java
    vendor/pdj/current/src/java/com/cycling74/max/MaxQelem.java
    vendor/pdj/current/src/java/com/cycling74/max/MaxRuntimeException.java
    vendor/pdj/current/src/java/com/cycling74/max/MaxSystem.java
    vendor/pdj/current/src/java/com/cycling74/max/MessageReceiver.java
    vendor/pdj/current/src/java/com/cycling74/max/package.html
    vendor/pdj/current/src/java/com/cycling74/msp/
    vendor/pdj/current/src/java/com/cycling74/msp/AudioFileBuffer.java
    vendor/pdj/current/src/java/com/cycling74/msp/MSPBuffer.java
    vendor/pdj/current/src/java/com/cycling74/msp/MSPObject.java
    vendor/pdj/current/src/java/com/cycling74/msp/MSPPerformable.java
    vendor/pdj/current/src/java/com/cycling74/msp/MSPPerformer.java
    vendor/pdj/current/src/java/com/cycling74/msp/MSPSignal.java
    vendor/pdj/current/src/java/com/cycling74/msp/package.html
    vendor/pdj/current/src/java/com/e1/
    vendor/pdj/current/src/java/com/e1/pdj/
    vendor/pdj/current/src/java/com/e1/pdj/ConsoleStream.java
    vendor/pdj/current/src/java/com/e1/pdj/ConsoleStreamWin32.java
    vendor/pdj/current/src/java/com/e1/pdj/GenericCompiler.java
    vendor/pdj/current/src/java/com/e1/pdj/JavacCompiler.java
    vendor/pdj/current/src/java/com/e1/pdj/JikesCompiler.java
    vendor/pdj/current/src/java/com/e1/pdj/PDJClassLoader.java
    vendor/pdj/current/src/java/com/e1/pdj/PDJClassLoaderException.java
    vendor/pdj/current/src/java/com/e1/pdj/PDJError.java
    vendor/pdj/current/src/java/com/e1/pdj/PDJSystem.java
    vendor/pdj/current/src/java/com/e1/pdj/PriorityQueue.java
    vendor/pdj/current/src/java/com/e1/pdj/test/
    vendor/pdj/current/src/java/com/e1/pdj/test/AtomTest.java
    vendor/pdj/current/src/java/com/e1/pdj/test/CallbackTest.java
    vendor/pdj/current/src/java/com/e1/pdj/test/MaxQelemTest.java
    vendor/pdj/current/src/java/help_class.java
    vendor/pdj/current/src/java/panner.java
    vendor/pdj/current/src/java/pdj_test_class.java
    vendor/pdj/current/src/java/pdj_test_tilde.java
    vendor/pdj/current/src/java/pdj_tilde.java
    vendor/pdj/current/src/pdj-linux.c
    vendor/pdj/current/src/pdj-osx.c
    vendor/pdj/current/src/pdj-win32.c
    vendor/pdj/current/src/pdj.c
    vendor/pdj/current/src/pdj.h
    vendor/pdj/current/src/pdj~.c
    vendor/pdj/current/src/type_handler.c
    vendor/pdj/current/src/type_handler.h
    vendor/pdj/current/www/
    vendor/pdj/current/www/index.html
    vendor/pdj/current/www/pdj-help.png
    vendor/pdj/current/www/pdj-logo.png
    vendor/pdj/current/www/stylesheet.css

Added: vendor/pdj/current/.cdtproject
===================================================================
--- vendor/pdj/current/.cdtproject	                        (rev 0)
+++ vendor/pdj/current/.cdtproject	2008-03-22 02:13:11 UTC (rev 9619)
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.MachO" point="org.eclipse.cdt.core.BinaryParser">
+<attribute key="c++filt" value="c++filt"/>
+</extension>
+<extension id="org.eclipse.cdt.core.domsourceindexer" point="org.eclipse.cdt.core.CIndexer"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="true"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+<item id="org.eclipse.cdt.make.core.buildtargets">
+<buildTargets>
+<target name="all" path="java" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
+<buildCommand>make</buildCommand>
+<buildTarget>all</buildTarget>
+<stopOnError>false</stopOnError>
+<useDefaultCommand>true</useDefaultCommand>
+</target>
+<target name="all" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
+<buildCommand>make</buildCommand>
+<buildTarget>all</buildTarget>
+<stopOnError>false</stopOnError>
+<useDefaultCommand>true</useDefaultCommand>
+</target>
+<target name="test" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
+<buildCommand>make</buildCommand>
+<buildTarget>test</buildTarget>
+<stopOnError>false</stopOnError>
+<useDefaultCommand>true</useDefaultCommand>
+</target>
+<target name="clean" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
+<buildCommand>make</buildCommand>
+<buildTarget>clean</buildTarget>
+<stopOnError>false</stopOnError>
+<useDefaultCommand>true</useDefaultCommand>
+</target>
+</buildTargets>
+</item>
+<item id="cdt_resolver">
+<custom value="false"/>
+</item>
+<item id="scannerConfiguration">
+<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"/>
+<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+<buildOutputProvider>
+<openAction enabled="true" filePath=""/>
+<parser enabled="true"/>
+</buildOutputProvider>
+<scannerInfoProvider id="specsFile">
+<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+<parser enabled="true"/>
+</scannerInfoProvider>
+</profile>
+<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+<buildOutputProvider>
+<openAction enabled="false" filePath=""/>
+<parser enabled="true"/>
+</buildOutputProvider>
+<scannerInfoProvider id="makefileGenerator">
+<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
+<parser enabled="false"/>
+</scannerInfoProvider>
+</profile>
+<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+<buildOutputProvider>
+<openAction enabled="false" filePath=""/>
+<parser enabled="true"/>
+</buildOutputProvider>
+<scannerInfoProvider id="specsFile">
+<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+<parser enabled="false"/>
+</scannerInfoProvider>
+</profile>
+<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+<buildOutputProvider>
+<openAction enabled="false" filePath=""/>
+<parser enabled="true"/>
+</buildOutputProvider>
+<scannerInfoProvider id="specsFile">
+<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+<parser enabled="false"/>
+</scannerInfoProvider>
+</profile>
+</item>
+</data>
+</cdtproject>

Added: vendor/pdj/current/.project
===================================================================
--- vendor/pdj/current/.project	                        (rev 0)
+++ vendor/pdj/current/.project	2008-03-22 02:13:11 UTC (rev 9619)
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>pdj</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.makeBuilder</name>
+			<triggers>clean,full,incremental,</triggers>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.core.errorOutputParser</key>
+					<value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+					<value>clean all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+					<value>false</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildLocation</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.environment</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.build.target.inc</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.build.target.clean</key>
+					<value>clean</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+					<value>clean</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.append_environment</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildCommand</key>
+					<value>make</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.stopOnError</key>
+					<value>false</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.build.target.auto</key>
+					<value>all</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.make.core.makeNature</nature>
+		<nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>

Added: vendor/pdj/current/.settings/org.eclipse.cdt.core.prefs
===================================================================
--- vendor/pdj/current/.settings/org.eclipse.cdt.core.prefs	                        (rev 0)
+++ vendor/pdj/current/.settings/org.eclipse.cdt.core.prefs	2008-03-22 02:13:11 UTC (rev 9619)
@@ -0,0 +1,3 @@
+#Mon Jul 03 15:02:11 EDT 2006
+eclipse.preferences.version=1
+indexerId=org.eclipse.cdt.core.fastIndexer

Added: vendor/pdj/current/LICENSE
===================================================================
--- vendor/pdj/current/LICENSE	                        (rev 0)
+++ vendor/pdj/current/LICENSE	2008-03-22 02:13:11 UTC (rev 9619)
@@ -0,0 +1,22 @@
+Copyright (c) 2004-2007, Pascal Gauthier
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+   * Redistributions of source code must retain the above copyright notice,
+     this list of conditions and the following disclaimer.
+   * Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+     
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.

Added: vendor/pdj/current/Linux-build.properties
===================================================================
--- vendor/pdj/current/Linux-build.properties	                        (rev 0)
+++ vendor/pdj/current/Linux-build.properties	2008-03-22 02:13:11 UTC (rev 9619)
@@ -0,0 +1,15 @@
+# property file for Linux
+
+# put the path of where the jdk (java sdk) is installed
+jdk.home=/usr/local/java
+
+# put the path of where pd is installed
+pd.home=/home/asb2m10/pd-0.39-0
+
+# common linux properties
+isLinux=true
+compiler=gcc
+linker.type=shared
+platform=linux
+jdk.libs=${jdk.home}/jre/lib/i386
+pdj.outfile=${dist.dir}/pdj
\ No newline at end of file

Added: vendor/pdj/current/Mac OS X-build.properties
===================================================================
--- vendor/pdj/current/Mac OS X-build.properties	                        (rev 0)
+++ vendor/pdj/current/Mac OS X-build.properties	2008-03-22 02:13:11 UTC (rev 9619)
@@ -0,0 +1,16 @@
+# properties file for OSX.
+
+# put the root of your pd path installation
+pd.home=/Applications/pd.app/Contents/Resources
+
+# set this to 'pd_darwin' if you are building for PowerPC
+pdj.archBuild=d_fat
+
+# common OS X properties
+isOSX=true
+compiler=gcc
+linker.type=plugin
+platform=osx
+jdk.libs=/System/Library/Frameworks/JavaVM.framework/Libraries
+jdk.home=/Library/Java/Home
+pdj.outfile=${dist.dir}/pdj.${pdj.archBuild}

Added: vendor/pdj/current/Makefile
===================================================================
--- vendor/pdj/current/Makefile	                        (rev 0)
+++ vendor/pdj/current/Makefile	2008-03-22 02:13:11 UTC (rev 9619)
@@ -0,0 +1,11 @@
+# check out the build.properties / {your platform}.properties / build.xml
+# for path settings
+
+all: 
+	ant package
+
+clean:
+	ant clean
+	
+test:
+	ant test

Added: vendor/pdj/current/README
===================================================================
--- vendor/pdj/current/README	                        (rev 0)
+++ vendor/pdj/current/README	2008-03-22 02:13:11 UTC (rev 9619)
@@ -0,0 +1,174 @@
+###########################################################################
+pdj - java plugin interface to pure-data
+###########################################################################
+
+RELEASE 0.8.3 / September 2007
+
+
+PDJ enables you to write java code to interact with pure-data objects. The
+API is totally based on Cycling74 Max/MSP 'mxj' object implementation. This 
+will enable java mxj objects to run on pure-data with pdj. You can also 
+create signal/tilde (~) objects.
+
+This is a work in progress and some of features are missing and some might 
+not even be ported.		
+	    
+IMPLEMENTED:
+
+	* MaxClock 100%
+	* MSPBuffer 100%
+	* Callback 100%
+	* MaxObject 100%
+	* Atom 98%
+	* MaxSystem 90%
+	* MaxQelem 90%
+	* MSPObject 85% (missing signal in/outlet detection)
+	* MSPPerformable 100%
+	* MaxPatcher 5%
+
+TODO:
+
+	* MSPObject connection status
+	* MaxBox/MaxPatcher object; inspiration from dyn~ (kudo Mr. Grill!)
+
+LIMITATION:
+
+	* Signal inlets cannot be hot inlets for receiving atom message.
+	  This means that if you create a signal inlet and send an atom
+	  to this inlet, pdj won't be able to process it; float or symbol.
+	  This looks like a work as designed in pd.
+
+BUGS:
+
+	* OS X: cannot use AWT classes with OS X because of a weird bug
+	  that locks the thread when the GUI libraries are loaded. 
+	  -> http://lists.apple.com/archives/java-dev/2004/Mar/msg00910.html
+	  this solution has been tested but the loadLibrary still hang.
+
+WORKAROUNDS: 
+
+	* on most cases you don't have to put the JVM libs dir to the 
+	  LD_LIBRARY_PATH. If you have a UnsatisfiedLinkError, add it 
+	  before you start PD. 
+	* on some machines, the System.out redirection can crash PD. If
+	  it is the case, you can disable it in the pdj.properties file;
+	  check the property: pdj.redirect-pdio.
+
+REQUIEREMENTS:
+	
+	* pure-data 0.38.x or better
+	* java JDK version 1.4.x or better; use 1.5 if you can !
+	* works on linux, windows
+	
+REQUIEREMENTS FOR BUILDING:
+
+	* apache ant 1.6.x or better
+	* c compiler
+
+INSTALLATION:
+
+	* if you are using the source distribution, build it before
+	  -> download java sdk from java.sun.com (unless you are using OS X)
+	  -> download apache ant for ant.apache.org
+	  -> edit file <your platform>-build.properties
+	  -> in the root directory of pdj, run 'ant package'
+	* add the pdj external (pdj.pd_linux/pd.dll/pd.pd_dawrin) directory
+	  to your pd path (very important on OS X)
+	* the other files of the original binary directory must be in 
+	  the same directory
+	* double check dist/pdj.properties to be sure that the JAVA 
+	  environment parameters are right
+	* === OS X WARNING ====
+	  I am working on a universal binary of pdj. This is planned on version
+	  0.8.4. If you really need a OS X build, email me.
+
+USAGE:
+
+	* put your .java file in the /classes directory
+	* create a pdj object with the name of the java class; if
+	  you have not compiled it before, pdj will do it for you
+
+CHANGELOG:
+	--- VERSION 0.8.3 ---
+	* Atom.getInt() on a float now works.
+	* corrected some classpath definition issues with windows
+	* bypass the java compilation with pdj.compiler=null
+	* remove dependencies task for cpptasks.jar (now part of distribution)
+	* FIXED: comment on property pdj.vm_args failed to initialize VM
+	* BUG: cannot link with OS X and cpptasks. Planned on 0.8.4
+
+	--- VERSION 0.8.2 ---
+	* if javac is set, using the javac compiler from the JAVA_HOME first
+	* optimizations (main thread JVM and symbol method resolution)
+	* FIXED: using pdj.classpath with directories
+	* FIXED: search path on file in the current directory
+	* FIXED: leak with open_path and casting warnings
+	* build for Intel Mac
+	* getting better at attribute support
+	
+	--- VERSION 0.8.1 ---
+	* added MaxPatcher object to get patch path
+	* FIXED: to match mxj: method with args[] will always be called first
+
+	--- VERSION 0.8 ---
+	* pdj~ object support (MSPSignal/MSPObject/MSPPerformable)
+	* The JVM can now be server or in client mode (windows/linux only)
+	* JVM selection for OS X
+	* FIXED: working jikes compiler on OS X
+	* FIXED: declareIO inlets count
+	* FIXED: windows: System.out CR/LF errors on the PD console
+    
+	--- VERSION 0.7.1 ---
+	* OS X support with distribution
+	* FIXED: MaxSystem.locateFile now works
+
+	--- VERSION 0.7 ---
+	* Better JVM resolution on win32 (eg: with the registry)
+	* Full implementation of MSPBuffer
+	* Added Atom methods with unit tests
+	* Windows binaries distribution
+	* FIXED: now filtering { and } with post() not to lock PD
+	* FIXED: anything gets called on a undefined bang/float/list method
+	* FIXED: defined inlet(int) without inlet(float) now works... :-\
+	
+	--- VERSION 0.6.1 ---
+	* FIXED: outlet(Atom) and outlet(Atom[]) resolution error
+
+	--- VERSION 0.6 ---
+	* MaxObject constructor with arguments
+	* partial attribute support; automatic field setter/getter
+	* added method bail on MaxObject
+	* strict declaration of inlets/outlets (with info outlet)
+	* System.out and System.err linked to the pd console
+	* outlet(atom[]) checks type before calling the right func.
+
+	--- VERSION 0.5 ---
+	* method inlet resolution (bang->float->list->anything) now works
+	* windows support (premilinary support)
+	* auto-compiling class of every .java in /class (max -1; pdj +1)
+
+	--- VERSION 0.4 ---
+	* more javadoc and documentation... but could be better
+	* multiple inlet operations
+	* loadbang now works
+	
+	--- VERSION 0.3 ---
+	* added a small and cheap javadoc. the original MXJ should be the
+	  reference.
+	* partial MSPBuffer support
+	* Atom and MaxObject now supports Atom arrays
+	
+	--- VERSION 0.2 ---
+	* added classpath of $PDJ_HOME/classes and $PDJ_HOME/lib/* by default
+	* 95 % Dynamic JVM resolution with the JAVA_HOME; via dlsym (see BUGS)
+	* MaxSystem.deferLow(...) works ! :-\
+	* added an help patch
+
+THANKS:
+
+	* Thomas Grill
+	* patrick a 11h11
+	* pd-mtl crew !
+
+(c) Pascal Gauthier 2004-2007, under BSD like license
+asb2m10 at users.sourceforge.net

Added: vendor/pdj/current/Windows XP-build.properties
===================================================================
--- vendor/pdj/current/Windows XP-build.properties	                        (rev 0)
+++ vendor/pdj/current/Windows XP-build.properties	2008-03-22 02:13:11 UTC (rev 9619)
@@ -0,0 +1,14 @@
+# properties file for windows
+
+# put the path of where the jdk (java sdk) is installed
+jdk.home=C:/Java/jdk1.6.0_02
+
+# put the path of where pd is installed
+pd.home=C:/Projets/pd
+# common windows properties
+isWin32=true
+compiler=msvc
+linker.type=shared
+platform=win32
+jdk.libs=${jdk.home}/jre/lib/i386
+pdj.outfile=${dist.dir}/pdj
\ No newline at end of file

Added: vendor/pdj/current/build.properties
===================================================================
--- vendor/pdj/current/build.properties	                        (rev 0)
+++ vendor/pdj/current/build.properties	2008-03-22 02:13:11 UTC (rev 9619)
@@ -0,0 +1,21 @@
+#
+
+# PDJ packaging version
+# =========================================================================
+pdj.version=0.8.3
+
+# Various path definition
+# =========================================================================
+src.dir=src
+java.src.dir=src/java
+work.dir=work
+www.dir=www
+javadoc.dir=${www.dir}/api
+classes.dir=${work.dir}/classes
+dist.dir=dist
+javah.file=${work.dir}/native_classes.h
+pdj.jar=${dist.dir}/pdj.jar
+pdj.test-patch=pdj-test.pd
+pdj-tilde.test-patch="pdj~-test.pd"
+	
+	

Added: vendor/pdj/current/build.xml
===================================================================
--- vendor/pdj/current/build.xml	                        (rev 0)
+++ vendor/pdj/current/build.xml	2008-03-22 02:13:11 UTC (rev 9619)
@@ -0,0 +1,250 @@
+<project name="pdj" default="package" basedir=".">
+
+	<property file="build.properties"/>
+	<property file="${os.name}-build.properties"/>
+	
+	<!-- ============================================================== -->
+
+	<property name="jdk.include" value="${jdk.home}/include"/>
+	<property name="pd.include" value="${pd.home}/src"/>
+
+	<!-- java classes that uses a native interface -->
+	<property name="native.classes" value="
+		com.cycling74.max.MaxObject,
+		com.cycling74.max.MaxClock,
+	 	com.cycling74.max.MaxSystem,
+		com.cycling74.msp.MSPBuffer,
+		com.cycling74.msp.MSPObject"/>
+
+	<target name="clean" depends="-init">
+		<delete dir="${dist.dir}"/>
+		<delete dir="${work.dir}"/>
+		<delete dir="${javadoc.dir}"/>
+		<delete>
+			<fileset dir="." 
+				includes="**/history.xml,**/dependencies.xml,index.html"/>
+		</delete>
+	</target>
+	
+	<target name="-init">
+		<mkdir dir="${classes.dir}"/>
+		<mkdir dir="${dist.dir}"/>
+		<taskdef resource="cpptasks.tasks" classpath="lib/ant/cpptasks.jar"/>
+		<typedef resource="cpptasks.types" classpath="lib/ant/cpptasks.jar"/>
+		<available classname="junit.framework.Test" property="isJunitFound"/>
+	</target>
+	
+	<target name="cl-java" depends="-init">
+		<javac destdir="${classes.dir}" srcdir="${java.src.dir}" debug="true"
+			target="1.4" source="1.4">
+			<exclude name="**/test/**" unless="isJunitFound"/>
+			<exclude name="**/*Test.java" unless="isJunitFound"/>
+		</javac>		
+		<jar jarfile="${pdj.jar}" basedir="${classes.dir}">
+			<exclude name="*.class"/>
+			<exclude name="**/test/**" unless="isJunitFound"/>
+			<exclude name="**/*Test.class" unless="isJunitFound"/>
+		</jar>
+
+		<uptodate property="javah.up2date"
+			srcfile="${pdj.jar}" targetfile="${javah.file}"/>
+	</target>
+	
+	<target name="javah" depends="cl-java" unless="javah.up2date">
+		<javah class="${native.classes}" classpath="${pdj.jar}"
+			outputFile="${javah.file}" force="true"/>
+	</target>
+	
+	<target name="-linux-rename" if="isLinux">
+		<move file="${dist.dir}/libpdj.so" tofile="${dist.dir}/pdj.pd_linux"/>
+	</target>
+	
+    <target name="-osx-rename" if="isOSX">
+		<move file="${dist.dir}/libpdj.${pdj.archBuild}.bundle" tofile="${pdj.outfile}"/>
+    </target>
+    
+	<target name="cl" depends="javah">
+		<cc debug="true" objdir="${work.dir}" outtype="${linker.type}" 
+            outfile="${pdj.outfile}" name="${compiler}">
+			
+			<fileset dir="${src.dir}" includes="*.c">
+				<exclude name="pdj-linux.c" unless="isLinux"/>
+				<exclude name="pdj-win32.c" unless="isWin32"/>
+				<exclude name="pdj-osx.c"   unless="isOSX"/>
+			</fileset>
+		  
+			<!-- compiler args -->
+			<defineset define="DEBUG"/>
+			<defineset define="PROFILER"/>
+			<defineset define="PD"/>
+			<defineset define="NT" if="isWin32"/>
+			
+			<compilerarg value="-Wall" if="isLinux"/>
+            <compilerarg value="-fno-common" if="isOSX"/>
+            <compilerarg value="-fPIC" if="isOSX"/>
+	    	<compilerarg value="-arch" if="isOSX"/>
+	   		<compilerarg value="i386" if="isOSX"/>
+            <compilerarg value="-arch" if="isOSX"/>
+	   		<compilerarg value="ppc" if="isOSX"/>
+            
+			<!-- includes files -->
+			<includepath location="${jdk.include}"/>
+			<includepath location="${jdk.include}/linux" if="isLinux"/>
+			<includepath location="${jdk.include}/win32" if="isWin32"/>
+			<includepath location="${pd.include}"/>
+			<includepath location="${work.dir}"/>
+            
+            <!-- linker specific -->
+            <libset dir="${pd.home}/bin" libs="pd" if="isWin32"/>
+            <libset if="isWin32" libs="Advapi32"/>
+            <linkerarg value="/export:pdj_setup" if="isWin32"/>
+
+			<linkerarg value="-export-dynamic" if="isLinux"/>
+			<linkerarg value="-Xlinker" if="isLinux"/>
+			
+			<!-- OS X :-\ -->
+			<linkerarg value="-arch" if="isOSX"/>
+			<linkerarg value="-arch" if="isOSX"/>
+	        <linkerarg value="i386" if="isOSX"/>
+			<linkerarg value="-arch" if="isOSX"/>
+	        <linkerarg value="ppc" if="isOSX"/>
+
+            <linkerarg value="-framework" if="isOSX"/>
+            <linkerarg value="JavaVM" if="isOSX"/>
+            <linkerarg value="-framework" if="isOSX"/>
+            <linkerarg value="CoreFoundation" if="isOSX"/>
+            <linkerarg value="-flat_namespace" if="isOSX"/>
+            <linkerarg value="-framework" if="isOSX"/>
+            <linkerarg value="AppKit" if="isOSX"/>
+            <linkerarg value="-undefined" if="isOSX"/>
+            <linkerarg value="suppress" if="isOSX"/>
+
+            <linkerarg value="-bundle" if="isOSX"/>
+            <linkerarg value="-Xlinker" if="isOSX"/>
+           
+        </cc>
+       
+		<antcall target="-linux-rename"/>
+        <antcall target="-osx-rename"/>
+	</target>
+	
+	<target name="package" depends="cl">
+		<copy todir="${dist.dir}">
+			<fileset dir="res"/>
+		</copy>
+			
+		<copy todir="${dist.dir}/classes">
+			<!-- include the default package (examples) source -->
+			<fileset dir="src/java" includes="*.java"/>
+			<fileset dir="${classes.dir}" includes="*.class"/>
+		</copy>
+
+	</target>
+	
+	<target name="test" depends="package">
+		<exec dir="${dist.dir}" executable="${pd.home}/bin/pd">
+			<arg line="-lib pdj ${pdj.test-patch}"/>
+		</exec>
+	</target>
+
+	<target name="test-dsp" depends="package">
+		<exec dir="${dist.dir}" executable="${pd.home}/bin/pd">
+			<arg line="-lib pdj ${pdj-tilde.test-patch}"/>
+		</exec>
+	</target>
+	
+	<target name="test-mxdublin" depends="package">
+		<ant antfile="../mxdublin/build.xml" target="package" dir="../mxdublin"/>
+			
+		<exec dir="${dist.dir}" executable="${pd.home}/bin/pd">
+			<env key="AWT_TOOLKIT" value="MToolkit"/>
+			<arg line="-lib pdj ../../mxdublin/res/test/test-mxdublin.pd"/>
+		</exec>
+	</target>
+
+	<target name="test-mxdublin-help" depends="package">
+		<ant antfile="../mxdublin/build.xml" target="package" 
+			dir="../mxdublin"/>
+		<exec dir="${dist.dir}" executable="${pd.home}/bin/pd">
+			<arg line="-lib pdj ../../mxdublin/res/examples/help-mxdublin.pd"/>
+		</exec>
+	</target>
+	
+	<target name="test-helpatch" depends="package">
+		<exec dir="${dist.dir}" executable="${pd.home}/bin/pd" >
+			<arg line="-lib pdj ../res/help-pdj.pd"/>
+		</exec>
+	</target>
+
+	<target name="dist" depends="clean">
+		<tar destfile="../pdj-${pdj.version}.tar.gz" compression="gzip">
+			<tarfileset dir="." prefix="pdj-${pdj.version}">
+				<exclude name="CVS"/>
+			</tarfileset>
+		</tar>
+	</target>
+		
+	<target name="javadoc" depends="cl-java">
+		<mkdir dir="${javadoc.dir}"/>
+		<javadoc source="src" destdir="${javadoc.dir}" 
+			     windowtitle="pdj-MXJ API">
+			<fileset dir="src/java">
+				<include name="com/cycling74/max/*.java"/>
+				<include name="com/cycling74/msp/*.java"/>
+				<exclude name="*.java"/>
+				<exclude name="**/test/**"/>
+				<exclude name="**/*Test.java"/>
+			</fileset>
+			<link href="http://java.sun.com/j2se/1.4.2/docs/api/"/>
+		    <doctitle><![CDATA[<h1>The MXJ Java API for pure-data</h1>
+		    <p>This API is based on MXJ for Max/MSP.</p>]]></doctitle>
+		    <bottom><![CDATA[This API is based on mxj for <a  
+		    	href="http://www.cycling74.com/products/maxmsp.html">
+		    	Max/MSP</a> by Cycling74. Please see original MXJ
+			    implementation.]]></bottom>
+		</javadoc>
+	</target>
+	
+	<target name="dist-www" depends="javadoc">
+		<tar destfile="../pdj-web.tar.gz" compression="gzip">
+			<tarfileset dir="www">
+				<exclude name="CVS"/>
+				<exclude name=".*"/>
+			</tarfileset>
+		</tar>
+	</target>
+	
+	<target name="dist-win32" depends="package,javadoc">
+		<zip destfile="${dist.dir}/pdj-${pdj.version}-win32.zip">
+			<zipfileset dir="www/api" includes="**" prefix="javadoc"/>
+			<fileset dir="${dist.dir}">
+				<include name="classes/**"/>
+				<include name="*.jar"/>
+				<include name="*.pd"/>
+				<include name="*.properties"/>
+				<include name="*.dll"/>
+			</fileset>
+			<fileset dir=".">
+				<include name="README"/>
+				<include name="LICENSE"/>
+			</fileset>
+		</zip>
+	</target>
+    
+	<target name="dist-osx" depends="package,javadoc">
+		<zip destfile="../pdj-${pdj.version}-${pdj.archBuild}.zip">
+			<zipfileset dir="www/api" includes="**" prefix="javadoc"/>
+			<fileset dir="${dist.dir}">
+				<include name="classes/**"/>
+				<include name="*.jar"/>
+				<include name="*.pd"/>
+				<include name="*.properties"/>
+				<include name="*.${pdj.archBuild}"/>
+			</fileset>
+			<fileset dir=".">
+				<include name="README"/>
+				<include name="LICENSE"/>
+			</fileset>
+		</zip>
+	</target>
+</project>

Added: vendor/pdj/current/lib/ant/cpptasks.jar
===================================================================
(Binary files differ)


Property changes on: vendor/pdj/current/lib/ant/cpptasks.jar
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/pdj/current/res/help-pdj.pd
===================================================================
--- vendor/pdj/current/res/help-pdj.pd	                        (rev 0)
+++ vendor/pdj/current/res/help-pdj.pd	2008-03-22 02:13:11 UTC (rev 9619)
@@ -0,0 +1,63 @@
+#N canvas 338 130 812 533 12;
+#X text 17 7 pdj - JAVA PLUGIN EXTERNAL;
+#X obj 18 327 pdj help_class;
+#X text 16 49 The pdj object enables you to write Java external with
+Max/MSP API mxj.;
+#X obj 18 410 nbx 5 14 -1e+37 1e+37 0 0 empty empty empty 0 -6 0 10
+-262144 -1 -1 0 256;
+#X floatatom 18 97 5 0 0 0 - - -;
+#X text 81 95 <-- the method inlet(float) will be called;
+#X text 230 204 <-- the method callme(Atom []) will be called;
+#X msg 50 241 dynamic_method;
+#X text 203 238 <-- the method dynamic_method() will be called;
+#X msg 61 276 idontexists 10;
+#X text 222 275 <-- since idontexists is not in help_class \, an error
+will be thrown;
+#X msg 37 204 callme hola ouain;
+#X text 73 162 symbols sended to the java class will be resolved by
+the method name defined in the user class.;
+#X obj 32 126 bng 30 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X text 80 132 <-- the method bang() will be called;
+#X text 16 25 ======================================================
+;
+#X obj 139 373 print help_class outlet1;
+#N canvas 297 319 715 331 attributes 0;
+#X obj 19 229 pdj help_class @attr1 10;
+#X msg 39 127 get attr1;
+#X msg 19 92 attr1 \$1;
+#X floatatom 19 66 5 0 0 0 - - -;
+#X obj 254 260 print info-outlet;
+#X text 144 126 <-- using get with attribute name will output the value
+using the info outlet (the last outlet);
+#X text 18 8 Attributes are used to access fields in a class. To do
+this \, you can use the method declareAttribute in the constructor.
+;
+#X text 109 69 <-- calling the attribute with his name will set the
+attribute(field) value;
+#X text 48 172 you can also declare a attribute within a class by using
+@ in the constructor arguments. You must also provide a initial value
+to this field.;
+#X text 17 288 attribute value will always be sended to the last outlet
+of the object that is called the info-outlet.;
+#X connect 0 2 4 0;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 3 0 2 0;
+#X restore 656 40 pd attributes;
+#X text 652 7 *** see also :;
+#X text 169 321 first argument is the classname to find in classpath.
+additionnal arguments are given to the class constructor.;
+#X text 682 504 VERSION 0.8;
+#X text 99 406 see help_class.java in classes folder to see how this
+example is handled.;
+#X text 13 454 CLASSPATH INFORMATION : by default \, (whereis pdj)/lib/*.jar
+and /classes is added to the classpath. edit pdj.properties to add
+more .jar or directories to the pdj or system classpath;
+#X connect 1 0 3 0;
+#X connect 1 1 16 0;
+#X connect 4 0 1 0;
+#X connect 7 0 1 0;
+#X connect 9 0 1 0;
+#X connect 11 0 1 0;
+#X connect 13 0 1 0;

Added: vendor/pdj/current/res/pdj-test.pd
===================================================================
--- vendor/pdj/current/res/pdj-test.pd	                        (rev 0)
+++ vendor/pdj/current/res/pdj-test.pd	2008-03-22 02:13:11 UTC (rev 9619)
@@ -0,0 +1,42 @@
+#N canvas 765 257 450 295 10;
+#X obj 23 187 pdj pdj_test_class;
+#X obj 39 157 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 254 47 r allo;
+#X floatatom 263 98 5 0 0 0 - - -;
+#X obj 326 93 print xc;
+#X msg 82 160 wer wer 1;
+#X obj 135 34 metro 300;
+#X obj 170 3;
+#X obj 127 9 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X floatatom 218 11 5 0 0 0 - - -;
+#X obj 30 246 print outlet_1;
+#N canvas 0 0 450 300 graph1 0;
+#X array array_tester 100 float 1;
+#A 0 0 0.585717 0.528574 0.471431 0.442859 0.485716 0.585717 0.528574
+0.257144 0.385716 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;
+#X coords 0 1 99 -1 200 140 1;
+#X restore 220 143 graph;
+#X msg 25 117 testle;
+#X msg 21 11 sizeArray 10;
+#X msg 29 50 sizeArray 100;
+#X msg 169 68 get patate;
+#X msg 161 116 set patate 1;
+#X obj 105 222 print setter;
+#X connect 0 0 10 0;
+#X connect 0 1 17 0;
+#X connect 1 0 0 0;
+#X connect 2 0 3 0;
+#X connect 2 0 4 0;
+#X connect 5 0 0 0;
+#X connect 6 0 5 0;
+#X connect 8 0 6 0;
+#X connect 9 0 6 1;
+#X connect 12 0 0 0;
+#X connect 13 0 0 0;
+#X connect 14 0 0 0;
+#X connect 15 0 0 0;
+#X connect 16 0 0 0;

Added: vendor/pdj/current/res/pdj.properties
===================================================================
--- vendor/pdj/current/res/pdj.properties	                        (rev 0)
+++ vendor/pdj/current/res/pdj.properties	2008-03-22 02:13:11 UTC (rev 9619)
@@ -0,0 +1,81 @@
+# pdj.properties
+#
+# this property file is not 100% java properties aware (like: \\) so
+# pay special attention
+#
+# all parameters from this properties file will be copied to the java
+# system properties
+# =========================================================================
+
+# by default the pdj.jar (where the pdj.pd_linux is located) will be added 
+# to the system classpath
+#
+# add your jars or directories of jars seperated with a ':' for unix and
+# ';' for windows
+#
+pdj.system-classpath=/home/asb2m10/workspace/mxdublin/work/mxdublin.jar
+
+# by default from where the pdj.pd_linux is located, every .jar in 
+# ${pdj.home}/lib will be added to the pdj classpath
+#
+# add you jars or directories of jars seperated with a ':' for unix and
+# ';' for windows
+#
+# this is the pdj classpath (dynamic) to set :
+pdj.classpath=
+
+# this will print all .jars that are loaded before compiling/loading the 
+# user class
+pdj.verbose-classloader=true
+
+# the type of compiler to use with the pdj classloader. use only 'javac' 
+# or 'jikes'. do not put full path to your compiler
+#
+# to disable the automatic compilation simply use 
+# pdj.compiler=null
+#
+pdj.compiler=javac
+
+# pdj compiler/classloader directory. by default, ${pdj.home}/classes 
+# directory is used if this property is not defined. Before compiling, pdj
+# will check if your .java needs to be compiled.
+#
+# pdj.classes-dir=[your working directory]
+
+# this will redirect the java out/err streams to the pd console. If you need
+# to log pdj errors and exceptions to stderr and stdout, set this to false.
+#
+pdj.redirect-pdio=true
+
+# the jvm to use. If it is not found and the system is on Windows, 
+# the jvm installed with the registry will be used. Not used on OS X
+#
+pdj.JAVA_HOME=/usr/local/java
+
+# the JVM version to use with OS X; linked to the Java Framework on OS X
+#
+pdj.osx.JVM_JAVA_VERSION=1.5.0
+
+# NOTE: pdj.home is set automagicly from where the pdj.pd_linux or pdj.dll 
+# is installed (you need to put it in your pd path in OS X)
+
+# =========================================================================
+# VM ARGUMENTS
+#
+# to monitor memory and thread usage with 1.5 (jconsole) use 
+#   -Dcom.sun.management.jmxremote
+# to do remote debugging at port 3999
+#   -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=3999
+# to check jni calls
+#   -Xcheck:jni -verbose:jni
+#
+# All arguments on the same line just like $ java -X... -X... myclass
+#
+pdj.vm_args=-Xincgc -Xms32m -Xmx256m
+
+# tells pdj what type of jvm it must use: client or server. Not used on 
+# OS X. client has lower starting time and can take less memory. server
+# starts slower and takes more memory, but once the code is executed, 
+# it will be faster than in client mode.
+#
+pdj.vm_type=server

Added: vendor/pdj/current/res/pdj~-panner.pd
===================================================================
--- vendor/pdj/current/res/pdj~-panner.pd	                        (rev 0)
+++ vendor/pdj/current/res/pdj~-panner.pd	2008-03-22 02:13:11 UTC (rev 9619)
@@ -0,0 +1,10 @@
+#N canvas 0 0 450 300 10;
+#X obj 54 90 pdj~ panner;
+#X obj 126 48 nbx 5 14 0 127 0 0 empty empty empty 0 -6 0 10 -262144
+-1 -1 0 256;
+#X obj 54 48 osc~ 440;
+#X obj 55 136 dac~;
+#X connect 0 0 3 0;
+#X connect 0 1 3 1;
+#X connect 1 0 0 1;
+#X connect 2 0 0 0;

Added: vendor/pdj/current/res/pdj~-test.pd
===================================================================
--- vendor/pdj/current/res/pdj~-test.pd	                        (rev 0)
+++ vendor/pdj/current/res/pdj~-test.pd	2008-03-22 02:13:11 UTC (rev 9619)
@@ -0,0 +1,42 @@
+#N canvas 699 369 461 376 10;
+#N canvas 0 0 450 300 graph1 0;
+#X array signal-debug 441 float 0;
+#X coords 0 1.02 440 -1.02 400 150 1;
+#X restore 17 -91 graph;
+#X obj 18 -264 osc~ 440;
+#X obj 17 -183 *~;
+#X obj 49 -182 *~;
+#X obj 33 -208 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 65 -208 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 17 -143 tabwrite~ signal-debug;
+#X obj 202 -185 metro 250;
+#X obj 202 -208 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 81 -182 *~;
+#X obj 97 -208 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X obj 84 -264 phasor~ 440;
+#X obj 172 -264 osc~ 880;
+#X obj 246 -255 nbx 5 14 0.01 1 1 0 empty empty empty 0 -6 0 10 -262144
+-1 -1 0.01 256;
+#X obj 184 -229 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144
+-1 -1;
+#X obj 18 -230 pdj~ pdj_test_tilde;
+#X connect 1 0 15 0;
+#X connect 2 0 6 0;
+#X connect 3 0 6 0;
+#X connect 4 0 2 1;
+#X connect 5 0 3 1;
+#X connect 7 0 6 0;
+#X connect 8 0 7 0;
+#X connect 9 0 6 0;
+#X connect 10 0 9 1;
+#X connect 11 0 15 1;
+#X connect 12 0 15 2;
+#X connect 13 0 15 3;
+#X connect 14 0 15 3;
+#X connect 15 0 2 0;
+#X connect 15 1 3 0;
+#X connect 15 2 9 0;

Added: vendor/pdj/current/src/MSPBuffer.c
===================================================================
--- vendor/pdj/current/src/MSPBuffer.c	                        (rev 0)
+++ vendor/pdj/current/src/MSPBuffer.c	2008-03-22 02:13:11 UTC (rev 9619)
@@ -0,0 +1,159 @@
+#include "native_classes.h"
+#include "type_handler.h"
+#include "pdj.h"
+
+
+static t_garray *getArray(JNIEnv *env, jstring name) {
+	t_symbol *s = jstring2symbol(env, name);
+	t_garray *ret = (t_garray *)pd_findbyclass(s, garray_class);
+
+  	if ( ret == NULL ) {
+  		post("pdj: array %s not found", s->s_name);
+  		return NULL;
+  	}
+
+	return ret;	
+}
+
+
+JNIEXPORT jlong JNICALL Java_com_cycling74_msp_MSPBuffer_getSize
+  (JNIEnv *env, jclass cls, jstring name) {
+	t_garray *array = getArray(env, name);  	
+  	
+  	if ( array == NULL )
+  		return -1;
+
+	return garray_npoints(array);	
+}
+
+
+JNIEXPORT jfloatArray JNICALL Java_com_cycling74_msp_MSPBuffer_peek
+  (JNIEnv *env , jclass cls, jstring name) {
+	t_garray *array = getArray(env, name);  	
+	t_sample *vec;
+	jfloatArray ret;
+  	int size;
+  	
+  	if ( array == NULL )
+  		return NULL;
+  	
+  	if ( ! garray_getfloatarray(array, &size, &vec) )
+  		return NULL;
+  	
+	ret = (*env)->NewFloatArray(env, size);
+	
+  	if ( ret == NULL ) {
+  		SHOWEXC;
+  		return NULL;
+  	}
+  		
+  	(*env)->SetFloatArrayRegion(env, ret, 0, size, (jfloat *) vec);
+
+  	return ret;
+}
+
+
+JNIEXPORT void JNICALL Java_com_cycling74_msp_MSPBuffer_poke
+  (JNIEnv *env, jclass cls, jstring name, jfloatArray values) {
+	t_garray *array = getArray(env, name);  	
+	t_sample *vec;
+	jsize jarray_length;
+  	int size;
+
+	if ( array == NULL )
+		return;
+		
+  	if ( ! garray_getfloatarray(array, &size, &vec) )
+  		return;
+	 	
+	jarray_length = (*env)->GetArrayLength(env, values);
+	
+	if ( jarray_length < size ) {
+		error("pdj: warning: array too short");
+	} else {
+		size = jarray_length;
+	}
+	
+	(*env)->GetFloatArrayRegion(env, values, 0, size, vec);
+	garray_redraw(array);
+}
+
+
+JNIEXPORT void JNICALL Java_com_cycling74_msp_MSPBuffer_setSize
+  (JNIEnv *env, jclass cls, jstring name, jint channel, jlong size) {
+  	t_garray *array = getArray(env, name);
+  	
+  	if ( array == NULL )
+  		return;
+  	
+	garray_resize(array, size);  	
+}
+
+
+JNIEXPORT jfloatArray JNICALL Java_com_cycling74_msp_MSPBuffer_getArray
+  (JNIEnv *env, jclass cls, jstring name, jlong from, jlong arraySize) {
+	t_garray *array = getArray(env, name);  	
+	t_sample *vec;
+	jfloatArray ret;
+  	int size, ifrom = (int) from, iarraySize = (int) arraySize;
+  	
+  	if ( array == NULL )
+  		return NULL;
+  	
+  	if ( ! garray_getfloatarray(array, &size, &vec) )
+  		return NULL;
+  	
+  	if ( iarraySize != -1 ) {
+	  	if ( size < ifrom ) {
+	  		error("pdj: array is shorter than the starting point");
+	  		return NULL;
+	  	}
+  	
+	  	if ( size < ifrom + iarraySize ) {
+	  		error("pdj: array is not big enough to fill the array");
+	  		return NULL;
+	  	}
+	  	size = iarraySize;
+  	}
+  	
+	ret = (*env)->NewFloatArray(env, size);
+  	if ( ret == NULL ) {
+  		SHOWEXC;
+  		return NULL;
+  	}
+  	
+  	vec += ifrom;
+  	(*env)->SetFloatArrayRegion(env, ret, 0, size, (jfloat *) vec);
+
+  	return ret;
+}
+
+
+JNIEXPORT void JNICALL Java_com_cycling74_msp_MSPBuffer_setArray
+  (JNIEnv *env, jclass cls, jstring name, jlong from, jfloatArray values) {
+	t_garray *array = getArray(env, name);  	
+	t_sample *vec;
+	jsize jarray_length;
+  	int size, ifrom = from;
+
+	if ( array == NULL )
+		return;
+		
+  	if ( ! garray_getfloatarray(array, &size, &vec) )
+  		return;
+  		
+	if ( size < from ) {
+		error("pdj: array too short from starting point");
+		return;
+	}
+	jarray_length = (*env)->GetArrayLength(env, values);
+	
+	if ( jarray_length + ifrom > size ) {
+		error("pdj: warning: array too short from java array size");
+		return;
+	} 
+
+	vec += from;	
+	(*env)->GetFloatArrayRegion(env, values, 0, jarray_length, vec);
+	garray_redraw(array);
+}

Added: vendor/pdj/current/src/MaxClock.c
===================================================================
--- vendor/pdj/current/src/MaxClock.c	                        (rev 0)
+++ vendor/pdj/current/src/MaxClock.c	2008-03-22 02:13:11 UTC (rev 9619)
@@ -0,0 +1,74 @@
+#include <stdlib.h>
+#include "native_classes.h"
+#include "type_handler.h"
+#include "pdj.h"
+
+typedef struct _clockCtnr {
+	jobject instance;
+	jmethodID tick;
+	t_clock *pd_clock;
+} t_clockCtnr;
+
+
+static t_clockCtnr *getClock(JNIEnv *env, jobject obj) {
+  	return (t_clockCtnr *) (*env)->GetLongField(env, obj, pdjCaching.FIDMaxClock_clock_ptr);
+}
+
+
+void clock_callback(t_clockCtnr *clk) {
+	JNIEnv *env = pdjAttachVM();
+	JASSERT(clk->instance);
+	
+	(*env)->CallVoidMethod(env, clk->instance , clk->tick, NULL);
+	pdjDetachVM(env);
+}
+
+
+JNIEXPORT jdouble JNICALL Java_com_cycling74_max_MaxClock_getTime
+  (JNIEnv *env, jclass cls) {
+	return sys_getrealtime() * 1000;  	
+}
+
+
+JNIEXPORT void JNICALL Java_com_cycling74_max_MaxClock_create_1clock
+  (JNIEnv *env, jobject obj) {
+  	jclass cls = (*env)->GetObjectClass(env, obj);
+  	t_clockCtnr *clk;
+  	
+	clk = malloc(sizeof(t_clockCtnr));  	 	
+  	ASSERT(clk);
+  	
+    clk->pd_clock = clock_new(clk, (t_method) clock_callback);
+  	(*env)->SetLongField(env, obj, pdjCaching.FIDMaxClock_clock_ptr, (long) clk);
+
+	clk->instance = (*env)->NewGlobalRef(env, obj);
+	JASSERT(clk->instance);
+	clk->tick = (*env)->GetMethodID(env, cls, "tick", "()V");
+  	JASSERT(clk->tick);
+}
+
+
+JNIEXPORT void JNICALL Java_com_cycling74_max_MaxClock_delay
+  (JNIEnv *env, jobject obj, jdouble value) {
+	t_clockCtnr *clk = getClock(env, obj);
+	clock_delay(clk->pd_clock, value);
+}
+
+
+JNIEXPORT void JNICALL Java_com_cycling74_max_MaxClock_unset
+  (JNIEnv *env, jobject obj) {
+  	t_clockCtnr *clk = getClock(env, obj);
+  	clock_unset(clk->pd_clock);
+}
+
+
+JNIEXPORT void JNICALL Java_com_cycling74_max_MaxClock_release
+  (JNIEnv *env, jobject obj) {
+  	t_clockCtnr *clk = getClock(env, obj);
+  	clock_unset(clk->pd_clock);
+  	clock_free(clk->pd_clock);
+  	free(clk);
+  	
+  	(*env)->SetObjectField(env, obj, pdjCaching.FIDMaxClock_clock_ptr, 0);
+  	(*env)->DeleteGlobalRef(env, obj);
+}

Added: vendor/pdj/current/src/MaxObject.c
===================================================================
--- vendor/pdj/current/src/MaxObject.c	                        (rev 0)
+++ vendor/pdj/current/src/MaxObject.c	2008-03-22 02:13:11 UTC (rev 9619)
@@ -0,0 +1,131 @@
+#include "native_classes.h"
+#include "type_handler.h"
+#include "pdj.h"
+
+
+static t_pdj *getMaxObject(JNIEnv *env, jobject obj) {
+  	t_pdj *ret = (t_pdj *) (*env)->GetLongField(env, obj, 
+  			pdjCaching.FIDMaxObject_pdobj_ptr);
+  	
+  	if ( ret == NULL ) 
+		error("pdj: using a native method without pd context");
+  	
+  	return ret;
+}
+
+
+JNIEXPORT jlong JNICALL Java_com_cycling74_max_MaxObject_newInlet
+  (JNIEnv *env, jobject obj, jint type) {
+  	t_pdj *pdj = getMaxObject(env, obj); 	
+  	t_inlet_proxy *proxy; 
+
+	if ( pdj == NULL )
+		return 0;
+  	if ( type == com_cycling74_msp_MSPObject_SIGNAL ) {
+  		inlet_new(&pdj->x_obj, &pdj->x_obj.ob_pd, &s_signal, 0);	
+  		return 0;
+  	}
+  	
+  	proxy = (t_inlet_proxy *) pd_new(inlet_proxy);
+  	pdj->nb_inlet++;
+  	proxy->idx = pdj->nb_inlet;
+  	proxy->peer = pdj;
+  		
+  	return (jlong) inlet_new(&pdj->x_obj, &proxy->x_obj.ob_pd, 0, 0); 
+}
+
+
+JNIEXPORT jlong JNICALL Java_com_cycling74_max_MaxObject_newOutlet
+  (JNIEnv *env, jobject obj, jint type) {
+  	t_pdj *pdj = getMaxObject(env, obj); 	
+
+	if ( pdj == NULL )
+		return 0;
+	  	
+  	if ( type == com_cycling74_msp_MSPObject_SIGNAL ) {
+  		outlet_new(&pdj->x_obj, &s_signal);
+  		return 0;
+  	}
+  	
+  	return (jlong) outlet_new(&pdj->x_obj, NULL); 
+}
+
+
+JNIEXPORT void JNICALL Java_com_cycling74_max_MaxObject_doOutletBang
+  (JNIEnv *env, jobject obj, jlong outlet) {
+  	t_outlet *x = (t_outlet *) ((unsigned int) outlet);
+  	outlet_bang(x);
+}
+
+
+JNIEXPORT void JNICALL Java_com_cycling74_max_MaxObject_doOutletFloat
+  (JNIEnv *env, jobject obj, jlong outlet , jfloat value) {
+  	t_outlet *x = (t_outlet *) ((unsigned int) outlet);
+  	outlet_float(x, value);
+}
+
+
+JNIEXPORT void JNICALL Java_com_cycling74_max_MaxObject_doOutletSymbol
+  (JNIEnv *env, jobject obj, jlong outlet, jstring value) {
+  	t_outlet *x = (t_outlet *) ((unsigned int) outlet);
+  	outlet_symbol(x, jstring2symbol(env, value));
+}
+
+
+JNIEXPORT void JNICALL Java_com_cycling74_max_MaxObject_doOutletAnything
+  (JNIEnv *env, jobject obj, jlong outlet, jstring str, jobjectArray value) {
+  	t_outlet *x = (t_outlet *) ((unsigned int) outlet);
+  	t_atom args[MAX_ATOMS_STACK];
+  	int argc;
+
+  	jatoms2atoms(env, value, &argc, args);
+  	if ( str == NULL ) {
+  		if ( args[0].a_type == A_FLOAT ) {
+  			outlet_anything(x, &s_list, argc, args);
+  		} else {
+	  		t_symbol *sym = atom_getsymbol(&(args[0]));
+	  		outlet_anything(x, sym, argc-1, args+1);
+  		}
+  	} else {
+  		outlet_anything(x, jstring2symbol(env, str), argc, args);
+  	}
+}
+
+JNIEXPORT jstring JNICALL Java_com_cycling74_max_MaxObject_getPatchPath
+  (JNIEnv *env, jobject obj) {
+  	t_pdj *pdj = getMaxObject(env, obj);
+  	
+  	if ( pdj == NULL )
+  		return NULL;
+  		
+	return (*env)->NewStringUTF(env, pdj->patch_path);
+  	
+}
+
+// UGLY UGLY UGLY, but this is used not force the user from using
+// a constructor. MaxObject CAN be used outside the pdj object
+// but all the natives calls will break. Theses methods are always called
+// within a synchronized() block. This is ugly, but less ugly than
+// putting the information in a ThreadLocals? ... or using a MaxContext ?
+// ===========================================================================
+static t_pdj *pdjConstructor = NULL;
+JNIEXPORT void JNICALL Java_com_cycling74_max_MaxObject_pushPdjPointer
+  (JNIEnv *env, jclass cls, jlong ptr) {
+  	pdjConstructor = (t_pdj *) ptr;
+}
+
+
+JNIEXPORT jlong JNICALL Java_com_cycling74_max_MaxObject_popPdjPointer
+  (JNIEnv *env, jclass cls) {
+  	t_pdj *tmp;
+ 
+ 	// the object has been used instanciated without pdj. Return a null
+ 	// pointer. 	
+  	if ( pdjConstructor == NULL ) {
+   		return 0;
+  	}
+  	tmp = pdjConstructor;
+  	pdjConstructor = NULL;
+  	
+  	return tmp;
+}

Added: vendor/pdj/current/src/MaxSystem.c
===================================================================
--- vendor/pdj/current/src/MaxSystem.c	                        (rev 0)
+++ vendor/pdj/current/src/MaxSystem.c	2008-03-22 02:13:11 UTC (rev 9619)
@@ -0,0 +1,178 @@
+#include "native_classes.h"
+#include "type_handler.h"
+#include "pdj.h"
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#ifdef MSW
+	#include <io.h>
+#else
+	#include <unistd.h>
+#endif
+
+/* from m_imp.h... todo: ask Miller ??? */
+EXTERN void outlet_setstacklim(void);
+
+
+/**
+ * Using a { or } in a post or error will lock PD, we substitute
+ * them with a ( and ).
+ */
+static char* removePdAcc(char *str, jboolean isCopy) {
+	char *work;
+	
+	if ( isCopy == JNI_TRUE ) {
+		work = str;
+		while(*work != 0) {
+			switch(*work) {
+				case '{' :
+					*work = '(';
+					break;
+				case '}' :
+					*work = ')';
+					break;
+			}
+			work++;
+		}
+		return str;
+	}
+		
+	work = malloc(strlen(str)+1);
+	while(*str != 0) {
+		switch(*str) {
+			case '{' :
+				*work = '(';
+				break;
+			case '}' :
+				*work = ')';
+				break;
+			default:
+				*work = *str;
+		}
+		work++;
+		str++;
+	}
+	
+	*work = 0;
+	return work;
+}
+
+
+JNIEXPORT void JNICALL Java_com_cycling74_max_MaxSystem_error
+	(JNIEnv *env, jclass cls, jstring message) {
+	jboolean isCopy;
+	
+	char *msg = (*env)->GetStringUTFChars(env, message, &isCopy);
+	msg = removePdAcc(msg, isCopy);
+	
+	if ( REDIRECT_PD_IO ) {
+		error(msg);
+	} else {
+		fprintf(stderr, msg);
+		fprintf(stderr, "\n");
+	}
+
+	if ( isCopy == JNI_FALSE )
+		free(msg);
+	
+	(*env)->ReleaseStringUTFChars(env, message, msg);
+}
+  
+
+JNIEXPORT void JNICALL Java_com_cycling74_max_MaxSystem_post
+	(JNIEnv *env, jclass cls, jstring message) {
+	jboolean isCopy;
+	
+	char *msg = (*env)->GetStringUTFChars(env, message, &isCopy);
+	msg = removePdAcc(msg, isCopy);
+	
+	if ( REDIRECT_PD_IO ) {
+		post(msg);
+	} else {
+		fprintf(stdout, msg);
+		fprintf(stdout, "\n");
+	}
+	
+	if ( isCopy == JNI_FALSE )
+		free(msg);
+	
+	(*env)->ReleaseStringUTFChars(env, message, msg);
+}
+
+
+JNIEXPORT void JNICALL Java_com_cycling74_max_MaxSystem_ouch
+	(JNIEnv *env, jclass cls, jstring message) {
+	jboolean isCopy;
+	
+	char *msg = (*env)->GetStringUTFChars(env, message, &isCopy);
+	fprintf(stderr, msg);
+	fprintf(stderr, "\n");
+	msg = removePdAcc(msg, isCopy);
+	bug(msg);
+	
+	if ( isCopy == JNI_FALSE )
+		free(msg);
+		
+	(*env)->ReleaseStringUTFChars(env, message, msg);
+}
+
+
+JNIEXPORT jboolean JNICALL Java_com_cycling74_max_MaxSystem_sendMessageToBoundObject
+  (JNIEnv *env, jclass cls, jstring jname, jstring jmsg, jobjectArray jatoms) {
+  	t_symbol *name = jstring2symbol(env, jname);
+  	t_symbol *msg  = jstring2symbol(env, jmsg);
+ 	t_pd *dest = findPDObject(name);
+	t_atom argv[MAX_ATOMS_STACK];
+	int argc;
+  	
+  	if ( dest == NULL ) {
+  		post("pdj: unable to get object %s for sendMessageToBoundObject", name->s_name);
+  		return 0;
+  	}
+
+	/* reset the stack pointer for pd events */
+	outlet_setstacklim();
+  	
+  	if ( msg == &s_bang ) {
+  		pd_bang(dest);	
+  		return 1;
+  	}
+
+	if ( jatoms == NULL ) {
+		pd_symbol(dest, msg);
+		return 1;
+	}
+
+  	jatoms2atoms(env, jatoms, &argc, argv);
+
+  	if ( msg == &s_float ) {
+  		pd_float(dest, atom_getfloatarg(0, argc, argv));
+  		return 1;
+  	}
+  	
+  	pd_list(dest, msg, argc, argv);
+  	return 1;
+}
+
+
+JNIEXPORT jstring JNICALL Java_com_cycling74_max_MaxSystem_locateFile
+  (JNIEnv *env, jclass cls, jstring filename) {
+	const jbyte *file = (*env)->GetStringUTFChars(env, filename, NULL);
+	char fullpath[MAXPDSTRING], *pfullpath;
+	FILE *fd;
+	
+	fd = open_via_path("", file, "", fullpath, &pfullpath, MAXPDSTRING, 0);
+	(*env)->ReleaseStringUTFChars(env, filename, file);
+	if ( fd != NULL ) {
+		close(fd);
+		if ( fullpath[0] != 0 ) {
+        	if ( pfullpath == &fullpath ) {
+        		getcwd(fullpath, MAXPDSTRING);
+        	} 
+        	return (*env)->NewStringUTF(env, fullpath);
+        }
+	}
+
+	return NULL;		
+}

Added: vendor/pdj/current/src/init.c
===================================================================
--- vendor/pdj/current/src/init.c	                        (rev 0)
+++ vendor/pdj/current/src/init.c	2008-03-22 02:13:11 UTC (rev 9619)
@@ -0,0 +1,349 @@
+/**
+ * This code is very ugly and needs rewrite. PERIOD.
+ */
+ 
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include "pdj.h"
+
+#define MAX_PROPERTIES 40
+char *properties[MAX_PROPERTIES+1][2];
+
+char *pdj_getProperty(char *name) {
+	int i;
+	
+	for(i=0; properties[i][0] != NULL; i++) {
+		if ( !strcmp(properties[i][0], name) ) {
+			return properties[i][1];
+		}
+	}
+	return NULL;
+}
+
+
+static void load_properties() {
+	char propPath[BUFFER_SIZE];
+	int  propIdx = 0;
+	char *alloc;
+	FILE *f;
+	
+	getuglylibpath(propPath);
+	
+	properties[0][0] = "pdj.home";
+	alloc = malloc(strlen(propPath)+1);
+	strcpy(alloc, propPath);
+	properties[0][1] = alloc;
+	
+	strcat(propPath, DIR_SEP "pdj.properties");
+	f = fopen(propPath, "r");
+	
+	if ( f == NULL ) {
+		post("pdj: warning: property file not found at %s", propPath);
+		return;
+	}
+	
+	while(!feof(f)) {
+		char buffer[BUFFER_SIZE];
+		char *work, *key, *value;
+		
+		fgets(buffer, BUFFER_SIZE-1, f);
+		
+		work = strchr(buffer, '\n');
+		if ( work != 0 ) {
+			*work = 0;
+			
+			if ( work == buffer )
+				continue;
+		}
+		
+		/* cuts comments */
+		work = strchr(buffer, '#');
+		if ( work != NULL ) {
+			*work = 0;
+			
+			if ( work == buffer ) 
+				continue;
+		}
+		
+		key = strtok(buffer, "=");
+		if ( key == NULL ) {
+			continue;
+		}
+		
+		value = strtok(NULL, "");
+		if ( value == NULL ) {
+			value = "";
+		}
+
+		if ( propIdx == MAX_PROPERTIES ) {
+			error("pdj: maximum defined properties");
+			break;
+		}
+		propIdx++;
+		
+		alloc = malloc(strlen(key)+1);
+		strcpy(alloc, key);
+		properties[propIdx][0] = alloc;
+		
+		alloc = malloc(strlen(value)+1);
+		strcpy(alloc, value);
+		properties[propIdx][1] = alloc;
+	}
+
+	properties[propIdx+1][0] = NULL;
+	properties[propIdx+1][1] = NULL;
+	fclose(f);
+}
+
+
+static void copyToJavaSystemProperties(JNIEnv *env) {
+	jclass system = (*env)->FindClass(env, "java/lang/System");		
+	jmethodID id = (*env)->GetStaticMethodID(env, system, "setProperty", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;");
+	int i;
+	
+	for(i=0; properties[i][0] != NULL; i++) {
+		jobject key, value;
+		
+		key = (*env)->NewStringUTF(env, properties[i][0]);
+		JASSERT(key);
+		value = (*env)->NewStringUTF(env, properties[i][1]);
+		JASSERT(value);
+
+		(*env)->CallStaticObjectMethod(env, system, id, key, value);
+	}
+}
+
+
+PdjCaching pdjCaching;
+static int initIDCaching(JNIEnv *env) {
+	pdjCaching.cls_Atom = (*env)->FindClass(env, "com/cycling74/max/Atom");
+	if ( pdjCaching.cls_Atom == NULL ) {
+		// if the Atom class is not found... it means that pdj.jar is not on
+		// classpath and the installation is broken.
+		error("pdj: com.cycling74.max.Atom is not found on classpath ! pdj.jar must in the same directory of the external!");
+		return 1;
+	}
+	pdjCaching.cls_Atom = (*env)->NewGlobalRef(env, pdjCaching.cls_Atom);
+	
+	pdjCaching.cls_MaxClock = (*env)->FindClass(env, "com/cycling74/max/MaxClock");
+	JASSERT(pdjCaching.cls_MaxClock);
+	pdjCaching.cls_MaxClock = (*env)->NewGlobalRef(env, pdjCaching.cls_MaxClock);
+
+	pdjCaching.cls_MaxObject = (*env)->FindClass(env, "com/cycling74/max/MaxObject");
+	JASSERT(pdjCaching.cls_MaxObject);
+	pdjCaching.cls_MaxObject = (*env)->NewGlobalRef(env, pdjCaching.cls_MaxObject);
+
+	pdjCaching.cls_MSPObject = (*env)->FindClass(env, "com/cycling74/msp/MSPObject");
+	JASSERT(pdjCaching.cls_MSPObject);
+	pdjCaching.cls_MSPObject = (*env)->NewGlobalRef(env, pdjCaching.cls_MSPObject);
+
+	pdjCaching.cls_MSPSignal = (*env)->FindClass(env, "com/cycling74/msp/MSPSignal");
+	JASSERT(pdjCaching.cls_MSPSignal);
+	pdjCaching.cls_MSPSignal = (*env)->NewGlobalRef(env, pdjCaching.cls_MSPSignal);
+	
+	pdjCaching.MIDAtom_newAtom_Float = 
+		(*env)->GetStaticMethodID(env, pdjCaching.cls_Atom, "newAtom", "(F)Lcom/cycling74/max/Atom;");
+	JASSERT(pdjCaching.MIDAtom_newAtom_Float);
+	
+	pdjCaching.MIDAtom_newAtom_String =
+		(*env)->GetStaticMethodID(env, pdjCaching.cls_Atom, "newAtom", "(Ljava/lang/String;)Lcom/cycling74/max/Atom;");
+	JASSERT(pdjCaching.MIDAtom_newAtom_String);
+	
+	pdjCaching.FIDAtom_type = 
+		(*env)->GetFieldID(env, pdjCaching.cls_Atom, "type", "I");
+	JASSERT(pdjCaching.FIDAtom_type);
+	
+	pdjCaching.cls_AtomFloat = (*env)->FindClass(env, "com/cycling74/max/AtomFloat");
+	JASSERT(pdjCaching.cls_AtomFloat);
+	
+	pdjCaching.FIDAtomFloat_value =
+		(*env)->GetFieldID(env, pdjCaching.cls_AtomFloat, "value", "F");
+	JASSERT(pdjCaching.FIDAtomFloat_value);
+	
+	pdjCaching.cls_AtomString = (*env)->FindClass(env, "com/cycling74/max/AtomString");
+	JASSERT(pdjCaching.cls_AtomString);
+
+	pdjCaching.FIDAtomString_value = 
+		(*env)->GetFieldID(env, pdjCaching.cls_AtomString, "value", "Ljava/lang/String;");
+	JASSERT(pdjCaching.FIDAtomString_value);
+	
+	pdjCaching.FIDMaxClock_clock_ptr =
+		(*env)->GetFieldID(env, pdjCaching.cls_MaxClock, "_clock_ptr", "J");
+	JASSERT(pdjCaching.FIDMaxClock_clock_ptr);
+	
+	pdjCaching.FIDMaxObject_pdobj_ptr =
+		(*env)->GetFieldID(env, pdjCaching.cls_MaxObject, "_pdobj_ptr", "J");
+	JASSERT(pdjCaching.FIDMaxObject_pdobj_ptr);
+
+	pdjCaching.FIDMaxObject_activity_inlet =
+		(*env)->GetFieldID(env, pdjCaching.cls_MaxObject, "_activity_inlet", "I");
+	JASSERT(pdjCaching.FIDMaxObject_activity_inlet);
+	
+	pdjCaching.MIDMaxObject_trySetter =
+		(*env)->GetMethodID(env, pdjCaching.cls_MaxObject, "_trySetter", "(Ljava/lang/String;[Lcom/cycling74/max/Atom;)Z");
+	JASSERT(pdjCaching.MIDMaxObject_trySetter);
+	
+	pdjCaching.FIDMSPObject_used_inputs = 
+		(*env)->GetFieldID(env, pdjCaching.cls_MSPObject, "_used_inputs", "[Lcom/cycling74/msp/MSPSignal;");
+	JASSERT(pdjCaching.FIDMSPObject_used_inputs);
+	
+	pdjCaching.FIDMSPObject_used_outputs = 
+		(*env)->GetFieldID(env, pdjCaching.cls_MSPObject, "_used_outputs", "[Lcom/cycling74/msp/MSPSignal;");
+	JASSERT(pdjCaching.FIDMSPObject_used_outputs);
+
+	pdjCaching.MIDMSPObject_dspinit = 
+		(*env)->GetMethodID(env, pdjCaching.cls_MSPObject, "_dspinit", "(FI)Ljava/lang/reflect/Method;");
+	JASSERT(pdjCaching.MIDMSPObject_dspinit);
+
+	pdjCaching.MIDMSPObject_emptyPerformer = 
+		(*env)->GetMethodID(env, pdjCaching.cls_MSPObject, "_emptyPerformer", "([Lcom/cycling74/msp/MSPSignal;[Lcom/cycling74/msp/MSPSignal;)V");
+	JASSERT(pdjCaching.MIDMSPObject_emptyPerformer);
+
+	pdjCaching.FIDMSPSignal_vec = 
+		(*env)->GetFieldID(env, pdjCaching.cls_MSPSignal, "vec", "[F");
+	JASSERT(pdjCaching.FIDMSPSignal_vec);
+	
+	return 0;
+}
+
+
+static int linkClasses(JNIEnv *env) {
+	jclass pdjSystem = (*env)->FindClass(env, "com/e1/pdj/PDJSystem");
+	jmethodID id;
+	if ( pdjSystem == NULL ) {
+		SHOWEXC;
+		return 1;
+	}	
+	
+	id = (*env)->GetStaticMethodID(env, pdjSystem, "_init_system", "()V");
+	if ( id == NULL ) {
+		SHOWEXC;
+		return 1;
+	}	
+	
+	(*env)->CallStaticVoidMethod(env, pdjSystem, id);
+	if ( (*env)->ExceptionOccurred(env) ) {
+		(*env)->ExceptionDescribe(env);
+		return 1;
+	}
+	
+	return 0;
+}
+
+
+void buildVMOptions(jint *nb, JavaVMOption *options) {
+	static char cp[BUFFER_SIZE], pdj_cp[BUFFER_SIZE];
+	char installPath[BUFFER_SIZE];
+	char *prop;
+	char *token, *work;
+	int i;
+	*nb = 0;
+
+	getuglylibpath(installPath);
+	
+	// first; we set the system classpath
+	strcpy(cp, "-Djava.class.path=");
+	strcat(cp, installPath);
+	strcat(cp, DIR_SEP "pdj.jar" PATH_SEP);
+	prop = pdj_getProperty("pdj.system-classpath");
+	if ( prop != NULL ) 
+		strcat(cp, prop);
+	options[0].optionString = cp;
+	
+	prop = pdj_getProperty("pdj.vm_args");
+	if ( prop == NULL ) {
+		*nb = 1;
+		return; 
+	}
+	
+	work = malloc(strlen(prop)+1);
+	strcpy(work, prop);
+	token = strtok(work, " ");
+
+	for(i=*nb; i<32; i++) {
+		*nb += 1;
+		
+		if ( token == NULL ) {		
+			free(work);
+			return;
+		}
+
+		options[*nb].optionString = malloc(strlen(token)+1);	
+		strcpy(options[*nb].optionString, token);
+		token = strtok(NULL, " ");
+	}
+	
+	bug("pdj: maximum vm_args properties defined. Go see the source Luke.");
+}
+
+
+int REDIRECT_PD_IO;
+static void redirectIoInit(void) {
+	char *ret;
+	
+	ret = pdj_getProperty("pdj.redirect-pdio");
+	if ( ret == NULL ) {
+		REDIRECT_PD_IO = 1;
+		return;
+	}
+	
+	if ( ret[0] == '0' ) {
+		REDIRECT_PD_IO = 0;
+		return;
+	}
+	
+	if ( strcmp(ret, "false") == 0 ) {
+		REDIRECT_PD_IO = 0;
+		return;
+	}	
+	
+	REDIRECT_PD_IO = 1;	
+}
+
+
+JNIEnv *init_jvm(void) {
+	JNI_CreateJavaVM_func *func;
+	JavaVMOption opt[32];
+	JavaVMInitArgs vm_args;  
+	JNIEnv *jni_env;
+	char *vm_type;
+	int rc;
+	
+	load_properties();
+	
+	buildVMOptions(&(vm_args.nOptions), opt);
+	vm_args.options = opt;
+    vm_args.version = JNI_VERSION_1_4;
+    vm_args.ignoreUnrecognized = JNI_FALSE; 
+		
+	vm_type = pdj_getProperty("pdj.vm_type");
+	if ( vm_type == NULL ) {
+		error("pdj: unknown vm_type, using client");
+		vm_type = "client";
+	}
+	
+	func = linkjvm(vm_type);	
+	if ( func == NULL )
+		return NULL;
+		
+	rc = func(&jni_jvm, &jni_env, &vm_args);
+	if ( rc != 0 ) {
+		error("pdj: unable to create JVM: JNI_CreateJavaVM = %d", rc);
+		return NULL;
+	}
+
+	copyToJavaSystemProperties(jni_env);
+	if ( initIDCaching(jni_env) != 0) {
+		return NULL;
+	}
+	
+	if ( linkClasses(jni_env) != 0 ) {
+		return NULL;
+	}
+	
+	redirectIoInit();
+		
+	return jni_env;
+}
+

Added: vendor/pdj/current/src/java/com/cycling74/io/ErrorStream.java
===================================================================
--- vendor/pdj/current/src/java/com/cycling74/io/ErrorStream.java	                        (rev 0)
+++ vendor/pdj/current/src/java/com/cycling74/io/ErrorStream.java	2008-03-22 02:13:11 UTC (rev 9619)
@@ -0,0 +1,10 @@
+package com.cycling74.io;
+
+import com.e1.pdj.*;
+import java.io.*;
+
+public class ErrorStream extends PrintStream {
+	public ErrorStream() {
+		super(PDJSystem.err, true);
+	}
+}

Added: vendor/pdj/current/src/java/com/cycling74/io/PostStream.java
===================================================================
--- vendor/pdj/current/src/java/com/cycling74/io/PostStream.java	                        (rev 0)
+++ vendor/pdj/current/src/java/com/cycling74/io/PostStream.java	2008-03-22 02:13:11 UTC (rev 9619)
@@ -0,0 +1,10 @@
+package com.cycling74.io;
+
+import com.e1.pdj.*;
+import java.io.*;
+
+public class PostStream extends PrintStream {
+	public PostStream() {
+		super(PDJSystem.out, true);
+	}
+}

Added: vendor/pdj/current/src/java/com/cycling74/max/Atom.java
===================================================================
--- vendor/pdj/current/src/java/com/cycling74/max/Atom.java	                        (rev 0)
+++ vendor/pdj/current/src/java/com/cycling74/max/Atom.java	2008-03-22 02:13:11 UTC (rev 9619)
@@ -0,0 +1,715 @@
+package com.cycling74.max;
+
+import java.io.*;
+import java.util.*;
+
+/**
+ * PD element that is used in message or arguments. It can contains a 
+ * float, a int (always map to a float in pd) or a string.
+ */
+public abstract class Atom implements Comparable, Serializable {
+    
+    /**
+     * Empty array to use with the API when theres is no arguments.
+     */
+    public static final Atom[] emptyArray = new Atom[] {};
+    
+	int type;
+	
+	Atom(int type) {
+		this.type = type;
+	}
+
+	// Atom factories
+	///////////////////////////////////////////////////////////////////
+	
+	/**
+	 * Creates a new atom with the specified type.
+	 * @param value the value of the atom
+	 * @return the new Atom
+	 */
+	public static Atom newAtom(int value) {
+		return new AtomFloat(value);
+	}
+
+	/**
+	 * Creates a new atom with the specified type.
+	 * @param value the value of the atom
+	 * @return the new Atom
+	 */
+	public static Atom[] newAtom(int value[]) {
+		Atom[] ret = new Atom[value.length];
+		for(int i=0;i<value.length;i++) {
+			ret[i] = newAtom(value[i]);
+		}
+		return ret;
+	}
+
+	/**
+	 * Creates a new atom with the specified type.
+	 * @param value the value of the atom
+	 * @return the new Atom
+	 */
+	public static Atom newAtom(long value) {
+		return new AtomFloat(value);
+	}
+
+	/**
+	 * Creates a new atom with the specified type.
+	 * @param value the value of the atom
+	 * @return the new Atom
+	 */
+	public static Atom[] newAtom(long value[]) {
+		Atom[] ret = new Atom[value.length];
+		for(int i=0;i<value.length;i++) {
+			ret[i] = newAtom(value[i]);
+		}
+		return ret;
+	}
+		
+	/**
+	 * Creates a new atom with the specified type.
+	 * @param value the value of the atom
+	 * @return the new Atom
+	 */
+	public static Atom newAtom(short value) {
+		return new AtomFloat(value);
+	}
+
+	/**
+	 * Creates a new atom with the specified type.
+	 * @param value the value of the atom
+	 * @return the new Atom
+	 */
+	public static Atom[] newAtom(short value[]) {
+		Atom[] ret = new Atom[value.length];
+		for(int i=0;i<value.length;i++) {
+			ret[i] = newAtom(value[i]);
+		}
+		return ret;
+	}
+		
+	/**
+	 * Creates a new atom with the specified type.
+	 * @param value the value of the atom
+	 * @return the new Atom
+	 */
+	public static Atom newAtom(byte value) {
+		return new AtomFloat(value);
+	}
+
+	/**
+	 * Creates a new atom with the specified type.
+	 * @param value the value of the atom
+	 * @return the new Atom
+	 */
+	public static Atom[] newAtom(byte value[]) {
+		Atom[] ret = new Atom[value.length];
+		for(int i=0;i<value.length;i++) {
+			ret[i] = newAtom(value[i]);
+		}
+		return ret;
+	}
+	
+	/**
+	 * Creates a new atom with the specified type.
+	 * @param value the value of the atom
+	 * @return the new Atom
+	 */
+	public static Atom newAtom(char value) {
+		return new AtomString(String.valueOf(value));
+	}
+	
+	/**
+	 * Creates a new atom with the specified type.
+	 * @param value the value of the atom
+	 * @return the new Atom
+	 */
+	public static Atom[] newAtom(char value[]) {
+		Atom[] ret = new Atom[value.length];
+		for(int i=0;i<value.length;i++) {
+			ret[i] = newAtom(value[i]);
+		}
+		return ret;
+	}
+	
+	/**
+	 * Creates a new atom with the specified type.
+	 * @param value the value of the atom
+	 * @return the new Atom
+	 */
+	public static Atom newAtom(boolean value) {
+		return new AtomFloat( value ? 1:0 );
+	}
+	
+	/**
+	 * Creates a new atom with the specified type.
+	 * @param value the value of the atom
+	 * @return the new Atom
+	 */
+	public static Atom[] newAtom(boolean value[]) {
+		Atom[] ret = new Atom[value.length];
+		for(int i=0;i<value.length;i++) {
+			ret[i] = newAtom(value[i]);
+		}
+		return ret;
+	}
+	
+	/**
+	 * Creates a new atom with the specified type.
+	 * @param value the value of the atom
+	 * @return the new Atom
+	 */
+	public static Atom newAtom(float value) {
+		return new AtomFloat(value);
+	}
+	
+	/**
+	 * Creates a new atom with the specified type.
+	 * @param value the value of the atom
+	 * @return the new Atom
+	 */
+	public static Atom[] newAtom(float value[]) {
+		Atom[] ret = new Atom[value.length];
+		for(int i=0;i<value.length;i++) {
+			ret[i] = newAtom(value[i]);
+		}
+		return ret;
+	}
+	
+	/**
+	 * Creates a new atom with the specified type.
+	 * @param value the value of the atom
+	 * @return the new Atom
+	 */
+	public static Atom newAtom(double value) {
+		return new AtomFloat((float) value);
+	}
+	
+	/**
+	 * Creates a new atom with the specified type.
+	 * @param value the value of the atom
+	 * @return the new Atom
+	 */
+	public static Atom[] newAtom(double value[]) {
+		Atom[] ret = new Atom[value.length];
+		for(int i=0;i<value.length;i++) {
+			ret[i] = newAtom(value[i]);
+		}
+		return ret;
+	}
+	
+	/**
+	 * Creates a new atom with the specified type.
+	 * @param value the value of the atom
+	 * @return the new Atom
+	 */
+	public static Atom newAtom(String value) {
+		return new AtomString(value);
+	}
+	
+	/**
+	 * Creates a new atom with the specified type.
+	 * @param value the value of the atom
+	 * @return the new Atom
+	 */
+	public static Atom[] newAtom(String value[]) {
+		Atom[] ret = new Atom[value.length];
+		for(int i=0;i<value.length;i++) {
+			ret[i] = newAtom(value[i]);
+		}
+		return ret;
+	}
+    
+	/**
+	 * Creates an array of atoms from string tokens. 
+	 * @param values the atoms value seperated by string
+	 * @return the array of atoms created from the list
+	 */
+	public static Atom[] parse(String values) {
+	    return parse(values, false);
+	}
+
+	/**
+	 * Creates an array of atoms from strings tokens. 
+	 * @param values the atoms value seperated by string
+	 * @param skipfirst skip the first token
+	 * @return the array of atoms created from the list
+	 */
+	public static Atom[] parse(String values, boolean skipfirst) {
+	    ArrayList list = new ArrayList();
+	    StringTokenizer token = new StringTokenizer(values);
+	    
+	    if ( skipfirst && token.hasMoreTokens() ) {
+	        token.nextToken();
+	    }
+	    
+	    while(token.hasMoreTokens()) {
+	        list.add(newAtom(token.nextToken()));
+	    }
+	    
+	    Iterator i = list.iterator();
+	    Atom[] ret = new Atom[list.size()];
+	    for(int idx=0; i.hasNext(); idx++) {
+	        ret[idx] = (Atom) i.next();
+	    }
+	    
+	    return ret;
+	}
+	
+	// Atom methods
+	///////////////////////////////////////////////////////////////////
+	
+	/**
+	 * Get string value for this Atom. If the Atom does not contains a 
+	 * string it will throw an UnsupportedOperationException.
+	 */
+	public String getString() {
+		throw new UnsupportedOperationException("pdj: this atom is not a string");
+	}
+
+	/**
+	 * Get int value for this Atom. If the Atom does not contains a 
+	 * int it will throw an UnsupportedOperationException.
+	 */
+	public int getInt() {
+		throw new UnsupportedOperationException("pdj: this atom is not a int");
+	}
+	
+	/**
+	 * Get float value for this Atom. If the Atom does not contains a 
+	 * float it will throw an UnsupportedOperationException.
+	 */
+	public float getFloat() {
+		throw new UnsupportedOperationException("pdj: this atom is not a float");
+	}
+	
+	/**
+	 * Returns the Object representation of the Atom. If it is an int or a 
+	 * float, it will return a Int/Float object.
+	 * @return The java.lang.* representation of the object
+	 */
+	abstract Object toObject();
+	
+	/**
+	 * Returns the double value of this atom.
+	 * @return the double value
+	 */
+	public double toDouble() {
+		return 0;
+	}
+	
+	/**
+	 * Transform an array of Atom into an array of doubles.
+	 * @param values the array of atoms
+	 * @return array of doubles
+	 */
+	public static double[] toDouble(Atom[] values) {
+	    double[] ret = new double[values.length];
+	    
+	    for(int i=0;i<values.length;i++) {
+	        ret[i] = values[i].toDouble();
+	    }
+	    return ret;
+	}
+	
+	/**
+	 * Returns the int value of this atom.
+	 * @return the int value
+	 */
+	public int toInt() {
+		return 0;
+	}
+
+	/**
+	 * Transform an array of Atom into an array of ints.
+	 * @param values the array of atoms
+	 * @return array of ints
+	 */
+	public static int[] toInt(Atom[] values) {
+	    int[] ret = new int[values.length];
+	    
+	    for(int i=0;i<values.length;i++) {
+	        ret[i] = values[i].toInt();
+	    }
+	    return ret;
+	}
+
+	
+	/**
+	 * Returns the char value of this atom.
+	 * @return the char value
+	 */
+	public char toChar() {
+		return 0;
+	}
+	
+	/**
+	 * Transform an array of Atom into an array of chars.
+	 * @param values the array of atoms
+	 * @return array of chars
+	 */
+	public static char[] toChar(Atom[] values) {
+	    char[] ret = new char[values.length];
+	    
+	    for(int i=0;i<values.length;i++) {
+	        ret[i] = values[i].toChar();
+	    }
+	    return ret;
+	}
+	
+	
+	/**
+	 * Returns the byte value of this atom.
+	 * @return the byte value
+	 */
+	public byte toByte() {
+		return 0;
+	}
+	
+	/**
+	 * Transform an array of Atom into an array of bytes.
+	 * @param values the array of atoms
+	 * @return array of bytes
+	 */
+	public static byte[] toByte(Atom[] values) {
+	    byte[] ret = new byte[values.length];
+	    
+	    for(int i=0;i<values.length;i++) {
+	        ret[i] = values[i].toByte();
+	    }
+	    return ret;
+	}
+	
+	/**
+	 * Returns the long value of this atom.
+	 * @return the long value
+	 */
+	public long toLong() {
+		return 0;
+	}
+	
+	/**
+	 * Transform an array of Atom into an array of longs.
+	 * @param values the array of atoms
+	 * @return array of longs
+	 */
+	public static long[] toLong(Atom[] values) {
+	    long[] ret = new long[values.length];
+	    
+	    for(int i=0;i<values.length;i++) {
+	        ret[i] = values[i].toLong();
+	    }
+	    return ret;
+	}
+	
+	/**
+	 * Returns the short value of this atom.
+	 * @return the short value
+	 */
+	public short toShort() {
+		return 0;
+	}
+	
+	/**
+	 * Transform an array of Atom into an array of shorts.
+	 * @param values the array of atoms
+	 * @return array of shorts
+	 */
+	public static short[] toShort(Atom[] values) {
+	    short[] ret = new short[values.length];
+	    
+	    for(int i=0;i<values.length;i++) {
+	        ret[i] = values[i].toShort();
+	    }
+	    return ret;
+	}
+	
+	/**
+	 * Returns the float value of this atom.
+	 * @return the float value
+	 */
+	public float toFloat() {
+		return 0;
+	}
+	
+	/**
+	 * Transform an array of Atom into an array of floats.
+	 * @param values the array of atoms
+	 * @return array of floats
+	 */
+	public static float[] toFloat(Atom[] values) {
+	    float[] ret = new float[values.length];
+	    
+	    for(int i=0;i<values.length;i++) {
+	        ret[i] = values[i].toFloat();
+	    }
+	    return ret;
+	}
+	
+	/**
+	 * Returns the boolean value of this atom.
+	 * @return the boolean value
+	 */
+	public boolean toBoolean() {
+		return true;
+	}
+	
+	/**
+	 * Transform an array of Atom into an array of booleans.
+	 * @param values the array of atoms
+	 * @return array of booleans
+	 */
+	public static boolean[] toBoolean(Atom[] values) {
+	    boolean[] ret = new boolean[values.length];
+	    
+	    for(int i=0;i<values.length;i++) {
+	        ret[i] = values[i].toBoolean();
+	    }
+	    return ret;
+	}
+
+	/**
+	 * Transform an array of Atom into an array of strings.
+	 * @param array the array of atoms
+	 * @return array of strings
+	 */
+	public static String[] toString(Atom[] array) {
+	    String[] ret = new String[array.length];
+	    
+	    for(int i=0;i<array.length;i++) {
+	        ret[i] = array[i].toString();
+	    }
+	    return ret;
+	}
+	
+	/**
+	 * Returns true if the Atom has been created with a float.
+	 * @return true if the Atom has been created with a float
+	 */
+	public boolean isFloat() {
+		return false;
+	}
+	
+	/**
+	 * Returns true if the Atom has been created with a String.
+	 * @return true if the Atom has been created with a String
+	 */
+	public boolean isString() {
+		return false;
+	}
+	
+	/**
+	 * Returns true if the Atom has been created with a int.
+	 * @return true if the Atom has been created with a int
+	 */
+	public boolean isInt() {
+		return false;
+	}
+	
+	/**
+	 * Returns the array of Atom into one string. Atom elements are 
+	 * seperated by spaces.
+	 * @param array the array of atom
+	 * @return one string representation of the atom
+	 */
+	public static String toOneString(Atom[] array) {
+	    StringBuffer sb = new StringBuffer();
+	    boolean appendSpace = false;
+	    
+	    for(int i=0;i<array.length;i++) {
+	        if ( !appendSpace ) { 
+	            sb.append(' ');
+	            appendSpace = true;
+	        }
+	        sb.append(array[i].toString());
+	    }
+	    
+	    return sb.toString();
+	}
+	
+	/**
+	 * Returns true if the instance has the same value of the object
+	 * <code>object</code>. Similar to <code>"ok".equals("ok");</code>
+	 */
+	public abstract boolean equals(Object object);
+
+	/**
+	 * Returns the hashCode representation for this Atom. If it is an float,
+	 * the float into bit value is return and if it is an String, the hashcode
+	 * value of the string is returned.
+	 */
+	public abstract int hashCode();
+	
+	// Array utility classes
+	///////////////////////////////////////////////////////////////////
+
+	/**
+	 * Returns the index of the first atom that is found in the list.
+	 * @param org the atom to find
+	 * @param list the list of atom to search
+	 * @return the index of the atom found. -1 if not found.
+	 */
+	public static int isIn(Atom org, Atom[] list) {
+		return isIn(org, list, 0, list.length-1);
+	}
+
+	/**
+	 * Returns the index of the first atom that is found in the list.
+	 * @param org the atom to find
+	 * @param list the list of atom to search
+	 * @param from the start index to check
+	 * @param to the last index to check
+	 * @return the index of the atom found. -1 if not found.
+	 */
+	public static int isIn(Atom org, Atom[] list, int from, int to) {
+		for(int i=from;i<to+1;i++) {
+			if ( list[i].equals(org) ) 
+				return i;
+		}
+		return -1;
+	}
+
+	/**
+	 * Remove at index <code>from</code> to index <code>to</code>.
+	 * @param list the list to strip
+	 * @param from the start index
+	 * @param to the last index
+	 * @return the stripped array
+	 */
+	public static Atom[] removeSome(Atom[] list, int from, int to) {
+		if ( from == 0 && from == list.length - 1 ) 
+			return new Atom[] {};
+
+		Atom[] ret = new Atom[list.length - (to-from+1)];
+		System.arraycopy(list, 0, ret, 0, from);
+	    System.arraycopy(list, to + 1, ret, from, list.length - to - 1);
+		
+		return ret;
+	}
+	
+	/**
+	 * Removes one atom in the list.
+	 * @param list the list to strip
+	 * @param i the index of the atom to remove
+	 * @return the stripped array
+	 */
+	public static Atom[] removeOne(Atom[] list, int i) {
+		return removeSome(list, i, i);
+	}
+	
+	/**
+	 * Removes the first atom in the list.
+	 * @param list the list to strip
+	 * @return the stripped array
+	 */
+	public static Atom[] removeFirst(Atom[] list) {
+	    return removeFirst(list, 1);
+	}
+	
+	/**
+	 * Removes the first <code>howmany</code> atoms in the list. 
+	 * @param list the list to strip
+	 * @param howmany how many element to remove
+	 * @return the stripped array
+	 */
+	public static Atom[] removeFirst(Atom[] list, int howmany) {
+	    return removeSome(list, 0, howmany-1);
+	}
+
+	/**
+	 * Remove the last atom in the list.
+	 * @param list the list to strip
+	 * @return the stripped array
+	 */
+	public static Atom[] removeLast(Atom[] list) {
+	    return removeLast(list, 1);
+	}
+	
+	/**
+	 * Removes the last <code>howmany</code> atoms in the list.
+	 * @param list the list to strip
+	 * @param howmany how many element to remove
+	 * @return the stripped array
+	 */
+	public static Atom[] removeLast(Atom[] list, int howmany) {
+	    return removeSome(list, list.length-howmany, list.length-1);
+	}
+	
+	/**
+	 * Reverses the element content; the first element is the last and so on.
+	 * @param list the list to reverse
+	 * @return the reversed list
+	 */
+	public static Atom[] reverse(Atom[] list) {
+	    Atom[] ret = new Atom[list.length];
+	    int last = list.length - 1;
+	    for(int i=0;i<list.length;i++) {
+	        ret[last-i] = list[i];
+	    }
+	    return ret;
+	}
+	
+	/**
+	 * Rotates array content x number of times.
+	 * @param list the list to rotate
+	 * @param nbTimes the number of time that the array must be rotated
+	 * @return the rotated list
+	 */
+	public static Atom[] rotate(Atom[] list, int nbTimes) {
+	    Atom ret[] = new Atom[list.length];
+	    
+	    for(int i=0;i<list.length;i++) {
+	        ret[(i+nbTimes) % list.length] = list[i];
+	    }
+	    
+	    return ret;
+	}
+
+	/**
+	 * Don't know what this does. Max/MSP says: it does an union. If
+	 * you want me to support this, send me an email and what it does.
+	 * @param first
+	 * @param second
+	 * @return nothing yet
+	 * @throws UnsupportedOperationException
+	 */
+	public static Atom[] union(Atom[] first, Atom[] second) throws UnsupportedOperationException {
+	    throw new UnsupportedOperationException("not implemented.");
+	}
+	
+	/**
+	 * Don't know what this does. Max/MSP says: it does an intersection. 
+	 * If you want me to support this, send me an email and what it does.
+	 * @param first
+	 * @param second
+	 * @return nothing yet
+	 * @throws UnsupportedOperationException
+	 */
+	public static Atom[] intersection(Atom[] first, Atom[] second)  throws UnsupportedOperationException {
+	    throw new UnsupportedOperationException("not implemented.");
+	}
+	
+	/**
+	 * Used to return a string representation of the list with atom type.
+	 * @param values the array of atoms
+	 * @return the string representation of the array
+	 */
+	public static String toDebugString(Atom[] values) {
+	    StringBuffer sb = new StringBuffer();
+	    
+	    sb.append("Atom[");
+	    sb.append(values.length);
+	    sb.append("]=");
+	    for(int i=0;i<values.length;i++) {
+	        sb.append('{');
+	        sb.append(values[i].toString());
+	        if ( values[i] instanceof AtomString ) 
+	            sb.append(":S}");
+	        else 
+	            sb.append(":F}");
+	    }
+	    
+	    return sb.toString();
+	}
+}

Added: vendor/pdj/current/src/java/com/cycling74/max/AtomFloat.java
===================================================================
--- vendor/pdj/current/src/java/com/cycling74/max/AtomFloat.java	                        (rev 0)
+++ vendor/pdj/current/src/java/com/cycling74/max/AtomFloat.java	2008-03-22 02:13:11 UTC (rev 9619)
@@ -0,0 +1,96 @@
+package com.cycling74.max;
+
+class AtomFloat extends Atom {
+    private static final long serialVersionUID = 6497612039215711052L;
+    private float value;
+	
+	AtomFloat(float value) {
+		super(DataTypes.FLOAT);
+		this.value = value;
+	}
+	
+	public int compareTo(Object obj) {
+		if ( obj instanceof AtomFloat ) {
+			AtomFloat f = (AtomFloat) obj;
+			if ( f.getFloat() <= getFloat() ) 
+				return 1;
+			else 
+				return -1;
+		}
+		
+		if ( obj instanceof AtomString ) {
+			return 1;
+		}
+
+		throw new ClassCastException();
+	}
+	
+	public boolean isFloat() {
+		return true;
+	}
+	
+	public boolean isInt() {
+		return true;
+	}
+	
+	public Object toObject() {
+		return new Float(value);
+	}
+	
+	public int toInt() {
+		return (int) value;
+	}
+	
+	public double toDouble() {
+		return value;
+	}
+	
+	public long toLong() {
+		return (long) value;
+	}
+	
+	public float toFloat() {
+		return value;
+	}
+	
+	public short toShort() {
+		return (short) value;
+	}
+	
+	public byte toByte() {
+		return (byte) value;
+	}
+	
+	public char toChar() {
+		return (char) value;
+	}
+	
+	public String toString() {
+		return new Float(value).toString();
+	}
+	
+	public boolean toBoolean() {
+		return value != 0;
+	}
+	
+	public float getFloat() {
+		return value;
+	}
+    
+    public int getInt() {
+        return (int) value;
+    }
+	
+	public boolean equals(Object comp) {
+	    if ( !(comp instanceof AtomFloat) ) {
+	        return false;
+	    }
+	    AtomFloat test = (AtomFloat) comp;
+	    
+	    return test.value == value; 
+	}
+	
+	public int hashCode() {
+	    return new Float(value).hashCode();
+	}
+}

Added: vendor/pdj/current/src/java/com/cycling74/max/AtomString.java
===================================================================
--- vendor/pdj/current/src/java/com/cycling74/max/AtomString.java	                        (rev 0)
+++ vendor/pdj/current/src/java/com/cycling74/max/AtomString.java	2008-03-22 02:13:11 UTC (rev 9619)
@@ -0,0 +1,63 @@
+package com.cycling74.max;
+
+class AtomString extends Atom {
+    private static final long serialVersionUID = 1738861344247036680L;
+    private String value;
+	
+	AtomString(String value) {
+		super(DataTypes.MESSAGE);
+		this.value = value;
+	}
+	
+	public int compareTo(Object obj) {
+		if ( obj instanceof AtomString ) {
+			AtomString s = (AtomString) obj;
+			return s.getString().compareTo(getString());
+		}
+		if ( obj instanceof AtomFloat ) {
+			return -1;
+		}
+		throw new ClassCastException();
+	}
+	
+	public boolean isString() {
+		return true;
+	}
+	
+	public Object toObject() {
+		return value;
+	}
+	
+	public byte toByte() {
+		return (byte) value.charAt(0);
+	}
+	
+	public char toChar() {
+		return value.charAt(0);
+	}
+	
+	public String toString() {
+		return value;
+	}
+	
+	public boolean toBoolean() {
+		return !value.equals("false");
+	}
+	
+	public String getString() {
+		return value;
+	}
+	
+	public boolean equals(Object comp) {
+	    if ( !(comp instanceof AtomString) ) {
+	        return false;
+	    }
+	    AtomString test = (AtomString) comp;
+	    
+	    return test.value.equals(value);
+	}
+	
+	public int hashCode() {
+	    return value.hashCode();
+	}
+}

Added: vendor/pdj/current/src/java/com/cycling74/max/Attribute.java
===================================================================
--- vendor/pdj/current/src/java/com/cycling74/max/Attribute.java	                        (rev 0)
+++ vendor/pdj/current/src/java/com/cycling74/max/Attribute.java	2008-03-22 02:13:11 UTC (rev 9619)
@@ -0,0 +1,463 @@
+package com.cycling74.max;
+
+import java.lang.reflect.*;
+import com.e1.pdj.PDJError;
+
+class Attribute {
+    boolean readOnly = false;
+    
+    // the method setter and getter if specified
+	Method setter;
+	Method getter;
+    
+    // the field to update if no setter or getter is specified
+	Field  field;
+    
+    // attribute type
+	char type;
+    
+    // the owner of the field or method
+	Object obj;
+    
+    // tells if the arguments are a array
+	boolean isArray;
+    
+	Attribute(Object obj, String name, String setter_name, String getter_name) {
+        char typeCheck = 0;
+        
+		try {
+			this.obj = obj;
+			if ( getter == null ) {
+				field = obj.getClass().getDeclaredField(name);
+				field.setAccessible(true);
+				type = mapType(field.getType());
+                if ( type == '-' ) {
+                    throw new PDJError("Field: " + name + " is a unsupported type");
+                }
+                isArray = Character.isLowerCase(type);
+			} else {
+				getter = obj.getClass().getDeclaredMethod(getter_name, null);
+                type = mapType(getter.getReturnType());
+                if ( type == '-' ) {
+                    throw new PDJError("Method: " + getter_name + " returns a unsupported type");
+                }
+                isArray = Character.isLowerCase(type);
+			}
+
+			if ( setter == null ) {
+				field = obj.getClass().getDeclaredField(name);
+				field.setAccessible(true);
+				typeCheck = mapType(field.getType());
+			} else {
+                Method methods[] = obj.getClass().getMethods();
+                
+                for(int i=0;i<methods.length;i++) {
+                    if ( methods[i].getName().equals(setter_name) ) {
+                        Class c[] = methods[i].getParameterTypes();
+                        if ( c.length > 1 ) 
+                            throw new PDJError("Method: " + setter_name + " has too much parameters to be a setter");
+                        typeCheck = mapType(c[0]);
+                        setter = methods[i];
+                        break;
+                    }
+                }
+                if ( typeCheck == 0 ) {
+                    throw new NoSuchMethodException(setter_name);
+                }
+			}
+		} catch ( Exception e ) {
+			throw new PDJError(e);
+		}
+
+        if ( typeCheck != type ) {
+            throw new PDJError("Object type for setter and getter is not the same");
+        }
+        
+	}
+	
+	private char mapType(Class clz) {
+		if ( clz == Integer.TYPE )
+			return 'i';
+        if ( clz == int[].class ) 
+            return 'I';
+		if ( clz == Float.TYPE )
+			return 'f';
+        if ( clz == float[].class ) 
+            return 'F';
+		if ( clz == Double.TYPE )
+			return 'd';
+        if ( clz == double[].class ) 
+            return 'D';
+		if ( clz == Boolean.TYPE )
+			return 'z';
+        if ( clz == Boolean[].class ) 
+            return 'Z';
+		if ( clz == Byte.TYPE )
+			return 'b';
+        if ( clz == byte[].class ) 
+            return 'B';
+		if ( clz == Character.TYPE ) 
+			return 'c';
+        if ( clz == char[].class )
+            return 'C';
+		if ( clz == Short.TYPE )
+			return 's';
+        if ( clz == short[].class )
+            return 'S';
+		if ( clz == String.class ) 
+			return 'g';
+        if ( clz == String[].class )
+            return 'G';
+        if ( clz == Atom.class )
+            return 'a';
+        if ( clz == Atom[].class ) 
+            return 'A';
+		return '-';
+	}
+	
+	private void fieldSetter(Atom[] value) throws Exception {
+        Object work;
+        int i;
+        
+		switch ( type ) {
+		case 'z' :
+			field.setBoolean(obj, value[0].toBoolean());
+			break;
+        case 'Z' :
+            work = field.get(obj);
+            for (i=0;i<value.length;i++) 
+                Array.setBoolean(work, i, value[i].toBoolean());
+            break;
+		case 'f' :
+			field.setFloat(obj, value[0].toFloat());
+			break;
+        case 'F' :
+            work = field.get(obj);
+            for (i=0;i<value.length;i++)
+                Array.setFloat(work, i, value[i].toFloat());
+            break;
+		case 'i' :
+			field.setInt(obj, value[0].toInt());
+			break;
+        case 'I' :
+            work = field.get(obj);
+            for (i=0;i<value.length;i++)
+                Array.setInt(work, i, value[i].toInt());
+            break;
+		case 'd' :
+			field.setDouble(obj, value[0].toDouble());
+			break;
+        case 'D' :
+            work = field.get(obj);
+            for (i=0;i<value.length;i++)
+                Array.setDouble(work, i, value[i].toDouble());
+            break;
+		case 'b' :
+			field.setByte(obj, value[0].toByte());
+			break;
+        case 'B' :
+            work = field.get(obj);
+            for (i=0;i<value.length;i++)
+                Array.setByte(work, i, value[i].toByte());
+            break;
+		case 'c' :
+			field.setChar(obj, value[0].toChar());
+            break;
+        case 'C' :
+            work = field.get(obj);
+            for (i=0;i<value.length;i++)
+                Array.setChar(work, i, value[i].toChar());
+            break;
+		case 's' :
+			field.setShort(obj, value[0].toShort());
+			break;
+        case 'S' :
+            work = field.get(obj);
+            for (i=0;i<value.length;i++)
+                Array.setShort(work, i, value[i].toShort());
+            break;
+		case 'g' :
+			field.set(obj, value.toString());
+			break;
+        case 'G' :
+            work = field.get(obj);
+            for (i=0;i<value.length;i++)
+                Array.set(work, i, value[i].toString());
+            break;
+        case 'a' :
+            field.set(obj, value[0]);
+            break;
+        case 'A' :
+            field.set(obj, value);
+            break;
+		default:
+			throw new PDJError("Unable to pass attribute value");
+		}
+	}
+	
+	private Atom[] fieldGetter() throws Exception {
+        Object array = null;
+	    Atom[] ret;
+        int i;
+        
+        if ( isArray ) {
+            ret = new Atom[1];
+        } else { 
+            array = field.get(obj);
+            ret = new Atom[Array.getLength(array)];
+        }
+        
+        switch ( type ) {
+        case 'z' :
+            ret[0] = Atom.newAtom(field.getBoolean(obj));
+            break;
+        case 'Z' :
+            for (i=0;i<ret.length;i++) 
+                ret[i] = Atom.newAtom(Array.getBoolean(array, i));
+            break;
+        case 'f' :
+            ret[0] = Atom.newAtom(field.getFloat(obj));
+            break;
+        case 'F' :
+            for (i=0;i<ret.length;i++) 
+                ret[i] = Atom.newAtom(Array.getFloat(array, i));
+            break;
+        case 'i' :
+            ret[0] = Atom.newAtom(field.getInt(obj));
+            break;
+        case 'I' :
+            for (i=0;i<ret.length;i++) 
+                ret[i] = Atom.newAtom(Array.getInt(array, i));
+            break;
+        case 'd' :
+            ret[0] = Atom.newAtom(field.getDouble(obj));
+            break;
+        case 'D' :
+            for (i=0;i<ret.length;i++) 
+                ret[i] = Atom.newAtom(Array.getDouble(array, i));
+            break;
+        case 'b' :
+            ret[0] = Atom.newAtom(field.getByte(obj));
+            break;
+        case 'B' :
+            for (i=0;i<ret.length;i++) 
+                ret[i] = Atom.newAtom(Array.getByte(array, i));
+            break;
+        case 'c' :
+            ret[0] = Atom.newAtom(field.getChar(obj));
+            break;
+        case 'C' :
+            for (i=0;i<ret.length;i++) 
+                ret[i] = Atom.newAtom(Array.getChar(array, i));
+            break;
+        case 's' :
+            ret[0] = Atom.newAtom(field.getShort(obj));
+            break;
+        case 'S' :
+            for (i=0;i<ret.length;i++) 
+                ret[i] = Atom.newAtom(Array.getShort(array, i));
+            break;
+        case 'g' :
+            ret[0] = Atom.newAtom((String) field.get(obj));
+            break;
+        case 'G' :
+            for (i=0;i<ret.length;i++) 
+                ret[i] = Atom.newAtom((String) Array.get(array, i));
+            break;
+        case 'a' :
+            ret[0] = (Atom) field.get(obj);
+            break;
+        case 'A' :
+            for (i=0;i<ret.length;i++) 
+                ret[i] = (Atom) Array.get(array, i);
+            break;
+        default:
+            throw new PDJError("Unable to pass attribute value");
+        }
+        
+		return ret;
+	}
+	
+    private Atom[] methodGetter() throws Exception {
+        Object array = null;
+        Atom[] ret;
+        int i;
+        
+        if ( isArray ) {
+            ret = new Atom[1];
+        } else { 
+            array = field.get(obj);
+            ret = new Atom[Array.getLength(array)];
+        }
+        
+        switch ( type ) {
+        case 'z' :
+            ret[0] = Atom.newAtom(((Boolean)getter.invoke(obj, null)).booleanValue());
+            break;
+        case 'Z' :
+            boolean tmpz[] = (boolean[]) getter.invoke(obj, null);
+            for (i=0;i<ret.length;i++) 
+                ret[i] = Atom.newAtom(tmpz[i]);
+            break;
+        case 'f' :
+            ret[0] = Atom.newAtom(((Float)getter.invoke(obj, null)).floatValue());
+            break;
+        case 'F' :
+            float tmpf[] = (float[]) getter.invoke(obj, null);
+            for (i=0;i<ret.length;i++) 
+                ret[i] = Atom.newAtom(tmpf[i]);
+            break;
+        case 'i' :
+            ret[0] = Atom.newAtom(((Integer)getter.invoke(obj, null)).intValue());
+            break;
+        case 'I' :
+            int tmpi[] = (int[]) getter.invoke(obj, null);
+            for (i=0;i<ret.length;i++) 
+                ret[i] = Atom.newAtom(tmpi[i]);
+            break;
+        case 'd' :
+            ret[0] = Atom.newAtom(((Double)getter.invoke(obj, null)).doubleValue());
+            break;
+        case 'D' :
+            double tmpd[] = (double[]) getter.invoke(obj, null);
+            for (i=0;i<ret.length;i++) 
+                ret[i] = Atom.newAtom(tmpd[i]);
+            break;
+        case 'b' :
+            ret[0] = Atom.newAtom(((Byte)getter.invoke(obj, null)).byteValue());
+            break;
+        case 'B' :
+            byte tmpb[] = (byte[]) getter.invoke(obj, null);
+            for (i=0;i<ret.length;i++) 
+                ret[i] = Atom.newAtom(tmpb[i]);
+            break;
+        case 'c' :
+            ret[0] = Atom.newAtom(((Character)getter.invoke(obj, null)).charValue());
+            break;
+        case 'C' :
+            char tmpc[] = (char[]) getter.invoke(obj, null);
+            for (i=0;i<ret.length;i++) 
+                ret[i] = Atom.newAtom(tmpc[i]);
+            break;
+        case 's' :
+            ret[0] = Atom.newAtom(((Short)getter.invoke(obj, null)).shortValue());
+            break;
+        case 'S' :
+            short tmps[] = (short[]) getter.invoke(obj, null);
+            for (i=0;i<ret.length;i++) 
+                ret[i] = Atom.newAtom(tmps[i]);
+            break;
+        case 'g' :
+            ret[0] = Atom.newAtom((String) getter.invoke(obj, null));
+            break;
+        case 'G' :
+            for (i=0;i<ret.length;i++) 
+                ret[i] = Atom.newAtom((String) Array.get(array, i));
+            break;
+        case 'a' :
+            ret[0] = (Atom) getter.invoke(obj, null);
+            break;
+        case 'A' :
+            ret = (Atom []) getter.invoke(obj, null);
+            break;
+        default:
+            throw new PDJError("Unable to pass attribute value");
+        }
+        
+        return ret;
+    }
+    
+    private Object setterCast(Atom values[]) throws Exception {
+        int i;
+        
+        switch ( type ) {
+        case 'z' :
+            return new Boolean(values[0].toBoolean());
+        case 'Z' :
+            boolean tmpz[] = new boolean[values.length];
+            for (i=0;i<values.length; i++) 
+                tmpz[i] = values[i].toBoolean();
+            return tmpz;
+        case 'f' :
+            return new Float(values[0].toFloat());
+        case 'F' :
+            float tmpf[] = new float[values.length];
+            for (i=0;i<values.length; i++) 
+                tmpf[i] = values[i].toFloat();
+            return tmpf;
+        case 'i' :
+            return new Integer(values[0].toInt());
+        case 'I' :
+            int tmpi[] = new int[values.length];
+            for (i=0;i<values.length; i++) 
+                tmpi[i] = values[i].toInt();
+            return tmpi;
+        case 'd' :
+            return new Double(values[0].toDouble());
+        case 'D' :
+            double tmpd[] = new double[values.length];
+            for (i=0;i<values.length; i++) 
+                tmpd[i] = values[i].toDouble();
+            return tmpd;
+        case 'b' :
+            return new Byte(values[0].toByte());
+        case 'B' :
+            byte tmpb[] = new byte[values.length];
+            for (i=0;i<values.length; i++) 
+                tmpb[i] = values[i].toByte();
+            return tmpb;
+        case 'c' :
+            return new Character(values[0].toChar());
+        case 'C' :
+            char tmpc[] = new char[values.length];
+            for (i=0;i<values.length; i++) 
+                tmpc[i] = values[i].toChar();
+            return tmpc;
+        case 's' :
+            return new Short(values[0].toShort());
+        case 'S' :
+            short tmps[] = new short[values.length];
+            for (i=0;i<values.length; i++) 
+                tmps[i] = values[i].toShort();
+            return tmps;
+        case 'g' :
+            return values[0].toString();
+        case 'G' :
+            String tmpg[] = new String[values.length];
+            for (i=0;i<values.length;i++) 
+                tmpg[i] = values[0].toString();
+            return tmpg;
+        case 'a' :
+            return values[0];
+        case 'A' :
+            return values;
+        default:
+            throw new PDJError("Unable to pass attribute value");
+        }
+    }
+    
+	Atom[] get() {
+		try {
+			if ( getter == null )
+				return fieldGetter();
+			return methodGetter();
+		} catch ( Exception e ){
+			throw new PDJError(e);
+		}
+	}
+	
+	void set(Atom values[]) {
+        if ( readOnly )
+            throw new PDJError("Field is readonly");
+        
+		try {
+			if ( setter == null )
+				fieldSetter(values);
+			else
+				setter.invoke(obj, new Object[] { setterCast(values) });
+		} catch (Exception e) {
+			throw new PDJError(e);
+		}
+	}
+
+}

Added: vendor/pdj/current/src/java/com/cycling74/max/Callback.java
===================================================================
--- vendor/pdj/current/src/java/com/cycling74/max/Callback.java	                        (rev 0)
+++ vendor/pdj/current/src/java/com/cycling74/max/Callback.java	2008-03-22 02:13:11 UTC (rev 9619)
@@ -0,0 +1,213 @@
+package com.cycling74.max;
+
+import java.lang.reflect.*;
+
+/**
+ * Used to transform a java method into an Executable object. This
+ * simplify the job of always implementing the executable 
+ * interface on all your objects since you can define it dynamically
+ * with this class.
+ * <p><blockquote><pre>
+ * 
+ * class Myclass  {
+ *    public void doit() {
+ *		do_something_fun()
+ *    }
+ * }
+ * 
+ * ...
+ * 
+ *      Myclass myclass = new Myclass();
+ *      Executable e = new Callback(myclass, "doit");
+ *      MaxClock clock = new MaxClock(e);
+ * 
+ * </pre></blockquote></p>
+ */
+public class Callback implements Executable {
+	private Method method;
+	private String methodName;
+	private Object obj;
+	private Object args[];
+	
+	/**
+	 * Will call method <i>methodName</i> with no argument by using execute()
+	 * @param obj the object with the method
+	 * @param methodName the name of the method
+	 */
+	public Callback(Object obj, String methodName) {
+		this(obj, methodName, null, null);
+	}
+
+	/**
+	 * Will call method <i>methodName</i> with a int by using execute()
+	 * @param obj the object with the method
+	 * @param methodName the name of the method
+	 * @param i the int value
+	 */
+	public Callback(Object obj, String methodName, int i) {
+		this(obj, methodName, new Object[] { new Integer(i) }, new Class[] { Integer.TYPE });
+	}
+
+	/**
+	 * Will call method <i>methodName</i> with a float by using execute()
+	 * @param obj the object with the method
+	 * @param methodName the name of the method
+	 * @param f the float value
+	 */
+	public Callback(Object obj, String methodName, float f) {
+		this(obj, methodName, new Object[] { new Float(f) }, new Class[] { Float.TYPE });
+	}
+	
+	/**
+	 * Will call method <i>methodName</i> with a Stringt by using execute()
+	 * @param obj the object with the method
+	 * @param methodName the name of the method
+	 * @param str the string value
+	 */
+	public Callback(Object obj, String methodName, String str) {
+		this(obj, methodName, new Object[] { str });
+	}
+	
+	/**
+	 * Will call method <i>methodName</i> with a boolean by using execute()
+	 * @param obj the object with the method
+	 * @param methodName the name of the method
+	 * @param flag the boolean value
+	 */
+	public Callback(Object obj, String methodName, boolean flag) {
+		this(obj, methodName, new Object[] { flag ? Boolean.TRUE : Boolean.FALSE });

@@ Diff output truncated at 100000 characters. @@

This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Pd-cvs mailing list