From 1903f3d6e4a81d0e97fde231cbea3bad7ed96ed1 Mon Sep 17 00:00:00 2001 From: Davide Morelli Date: Mon, 16 Jan 2006 12:44:45 +0000 Subject: added arguments at initialization time svn path=/trunk/externals/clr/; revision=4422 --- clr.c | 71 +++++++++++++++++++++++++++++++++++++++++++--------- external/External.cs | 6 +---- pd/Atom.cs | 6 +++++ pd/pd.cs | 7 +++++- 4 files changed, 72 insertions(+), 18 deletions(-) diff --git a/clr.c b/clr.c index 8f5e3b3..a699f03 100755 --- a/clr.c +++ b/clr.c @@ -106,17 +106,20 @@ static void mono_initialize() } // load the variables and init mono -static void mono_load(t_clr *x) +static void mono_load(t_clr *x, int argc, t_atom *argv) { // const char *file="D:\\Davide\\cygwin\\home\\Davide\\externalTest1.dll"; //const char *file="External.dll"; MonoMethod *m = NULL, *ctor = NULL, *fail = NULL, *mvalues; + MonoClassField *classPointer; gpointer iter; - gpointer args [1]; + gpointer *args; int val; - int i; - + int i,j; + int params; + t_symbol *strsymbol; + atom_simple *listparams; if (x->loaded == 0) { @@ -167,7 +170,13 @@ static void mono_load(t_clr *x) return; } x->obj = mono_object_new (x->domain, x->klass); - mono_runtime_object_init (x->obj); + + //mono_runtime_object_init (x->obj); + + if (argc>2) + params = argc - 2; + else + params = 0; /* retrieve all the methods we need */ iter = NULL; @@ -185,25 +194,63 @@ static void mono_load(t_clr *x) * as you see a contrsuctor is a method like any other. */ MonoMethodSignature * sig = mono_method_signature (m); - if (mono_signature_get_param_count (sig) == 2) { + if (mono_signature_get_param_count (sig) == params) { ctor = m; } } } - + // set the pointer + classPointer = 0; + classPointer = mono_class_get_field_from_name (x->klass, "x"); + if (classPointer) + { + mono_field_set_value (x->obj, classPointer, &x); + + } else + { + error("could not find the x field in %s, it is needed!", x->assemblyname->s_name); + return; + } // call the base functions if (x->setUp) { - val = x; - args [0] = &val; - mono_runtime_invoke (x->setUp, x->obj, args, NULL); + mono_runtime_invoke (x->setUp, x->obj, NULL, NULL); post("SetUp() invoked"); - } else { error("clr: the provided assembly is not valid! the SetUp function is missing"); return; } + // now call the class constructor + if (ctor) + { + args = malloc(sizeof(gpointer)*params); + listparams = malloc(sizeof(atom_simple)*params); + for (j=2; ja_type) + { + case A_FLOAT: + listparams[j-2].a_type = A_S_FLOAT; + listparams[j-2].float_value = (double) atom_getfloat(argv+j); + args[j-2] = &(listparams[j-2].float_value); + break; + case A_SYMBOL: + listparams[j-2].a_type = A_S_SYMBOL; + strsymbol = atom_getsymbol(argv+j); + listparams[j-2].string_value = mono_string_new (x->domain, strsymbol->s_name); + args[j-2] = listparams[j-2].string_value; + break; + } + } + mono_runtime_invoke (ctor, x->obj, args, NULL); + free(listparams); + free(args); + } else + { + error("%s doesn't have a constructor with %i parameters!",x->assemblyname->s_name, params); + } + // all done without errors x->loaded = 1; @@ -669,7 +716,7 @@ printf(" used did not specified filename, I guess it is %s\n", strtmp); } // load mono, init the needed vars - mono_load(x); + mono_load(x, argc, argv); return (x); } diff --git a/external/External.cs b/external/External.cs index ace63a3..00947db 100755 --- a/external/External.cs +++ b/external/External.cs @@ -9,15 +9,11 @@ namespace PureData public External() { - x = IntPtr.Zero; } // this function MUST exist - public void SetUp(IntPtr pdClass) + public void SetUp() { - // you must assign pdclass to x ! - x = pdClass; - // now you can do what you like... Console.WriteLine("pointer set!"); Console.WriteLine("setting selectors.."); diff --git a/pd/Atom.cs b/pd/Atom.cs index 7e0affa..17c7183 100755 --- a/pd/Atom.cs +++ b/pd/Atom.cs @@ -18,6 +18,12 @@ namespace PureData this.float_value = f; this.string_value = "float"; } + public Atom(int i) + { + this.type = AtomType.Float; + this.float_value = (float) i; + this.string_value = "float"; + } public Atom(string s) { this.type = AtomType.Symbol; diff --git a/pd/pd.cs b/pd/pd.cs index a94b9f1..a0f28aa 100755 --- a/pd/pd.cs +++ b/pd/pd.cs @@ -25,7 +25,12 @@ namespace PureData { ToOutlet (x, outlet, atoms.Length, atoms); } - + public static void SendToOutlet (IntPtr x, int outlet, Atom atom) + { + Atom [] atoms = new Atom[1]; + atoms[0] = atom; + ToOutlet (x, outlet, atoms.Length, atoms); + } // create an outlet [MethodImplAttribute (MethodImplOptions.InternalCall)] private extern static void CreateOutlet (IntPtr x, int type); -- cgit v1.2.1