Пример #1
0
        void GenerateEventArgs(Method m, StreamWriter sw, string indent, CodeGenerationOptions opt)
        {
            string args_name = GetArgsName(m);

            if (m.RetVal.IsVoid || m.IsEventHandlerWithHandledProperty)
            {
                if (!m.IsSimpleEventHandler || m.IsEventHandlerWithHandledProperty)
                {
                    sw.WriteLine("{0}public partial class {1} : global::System.EventArgs {{", indent, args_name);
                    sw.WriteLine();
                    var signature = m.Parameters.GetSignatureDropSender(opt);
                    sw.WriteLine("{0}\tpublic {1} ({2}{3}{4})", indent, args_name,
                                 m.IsEventHandlerWithHandledProperty ? "bool handled" : "",
                                 (m.IsEventHandlerWithHandledProperty && signature.Length != 0) ? ", " : "",
                                 signature);
                    sw.WriteLine("{0}\t{{", indent);
                    if (m.IsEventHandlerWithHandledProperty)
                    {
                        sw.WriteLine("{0}\t\tthis.handled = handled;", indent);
                    }
                    foreach (Parameter p in m.Parameters)
                    {
                        if (!p.IsSender)
                        {
                            sw.WriteLine("{0}\t\tthis.{1} = {1};", indent, opt.GetSafeIdentifier(p.Name));
                        }
                    }
                    sw.WriteLine("{0}\t}}", indent);
                    if (m.IsEventHandlerWithHandledProperty)
                    {
                        sw.WriteLine();
                        sw.WriteLine("{0}\tbool handled;", indent);
                        sw.WriteLine("{0}\tpublic bool Handled {{", indent);
                        sw.WriteLine("{0}\t\tget {{ return handled; }}", indent);
                        sw.WriteLine("{0}\t\tset {{ handled = value; }}", indent);
                        sw.WriteLine("{0}\t}}", indent);
                    }
                    foreach (Parameter p in m.Parameters)
                    {
                        if (p.IsSender)
                        {
                            continue;
                        }
                        sw.WriteLine();
                        sw.WriteLine("{0}\t{1} {2};", indent, opt.GetOutputName(p.Type), opt.GetSafeIdentifier(p.Name));
                        // AbsListView.IMultiChoiceModeListener.onItemCheckedStateChanged() hit this strict name check, at parameter "@checked".
                        sw.WriteLine("{0}\tpublic {1} {2} {{", indent, opt.GetOutputName(p.Type), p.PropertyName);
                        sw.WriteLine("{0}\t\tget {{ return {1}; }}", indent, opt.GetSafeIdentifier(p.Name));
                        sw.WriteLine("{0}\t}}", indent);
                    }
                    sw.WriteLine("{0}}}", indent);
                    sw.WriteLine();
                }
            }
            else
            {
                sw.WriteLine("{0}public delegate {1} {2} ({3});", indent, opt.GetOutputName(m.RetVal.FullName), GetEventDelegateName(m), GenBase.GetSignature(m, opt));
                sw.WriteLine();
            }
        }
Пример #2
0
        public string GetCall(CodeGenerationOptions opt)
        {
            var rgm = sym as IRequireGenericMarshal;
            var c   = rgm != null
                                ? opt.GetSafeIdentifier(rgm.ToInteroperableJavaObject(Name))
                                : ToNative(opt);

            c = opt.GetSafeIdentifier(c);
            if (opt.CodeGenerationTarget == CodeGenerationTarget.XamarinAndroid)
            {
                return(c);
            }
            if (sym.NativeType != "IntPtr")
            {
                return(c);
            }
            if (!NeedsPrep)
            {
                return(c);
            }
            if (sym.PreCall(opt, Name).Length == 0)
            {
                return(string.Format("({0} == null) ? IntPtr.Zero : {0}.Handle", c));
            }
            return(c);
        }
Пример #3
0
 public string[] PostCallback(CodeGenerationOptions opt, string var_name)
 {
     string[] result = new string [2];
     result [0] = String.Format("if ({0} != null)", opt.GetSafeIdentifier(var_name));
     result [1] = String.Format("\tJNIEnv.CopyArray ({0}, {1});", opt.GetSafeIdentifier(var_name), opt.GetSafeIdentifier(SymbolTable.GetNativeName(var_name)));
     return(result);
 }
Пример #4
0
        public string[] PostCall(CodeGenerationOptions opt, string var_name)
        {
            string managed_name = opt.GetSafeIdentifier(var_name);
            string native_name  = opt.GetSafeIdentifier(TypeNameUtilities.GetNativeName(var_name));

            if (opt.CodeGenerationTarget == CodeGenerationTarget.JavaInterop1)
            {
                if (IsParams)
                {
                    return(new[] {
                        $"if ({managed_name} != null) {{",
                        $"\t{native_name}.CopyTo ({managed_name}, 0);",
                        $"\t{native_name}.Dispose ();",
                        $"}}",
                    });
                }
                return(new[] {
                    $"if ({managed_name} != null) {{",
                    $"\t{native_name}.DisposeUnlessReferenced ();",
                    $"}}",
                });
            }
            return(new[] {
                $"if ({managed_name} != null) {{",
                $"\tJNIEnv.CopyArray ({native_name}, {managed_name});",
                $"\tJNIEnv.DeleteLocalRef ({native_name});",
                $"}}",
            });
        }
        internal override void WriteFieldSetBody(Field field, StreamWriter sw, string indent, CodeGenerationOptions opt)
        {
            sw.WriteLine("{0}if ({1} == IntPtr.Zero)", indent, field.ID);
            sw.WriteLine("{0}\t{1} = JNIEnv.Get{2}FieldID (class_ref, \"{3}\", \"{4}\");", indent, field.ID, field.IsStatic ? "Static" : String.Empty, field.JavaName, field.Symbol.JniName);

            string arg;
            bool   have_prep = false;

            if (field.Symbol.IsArray)
            {
                arg = opt.GetSafeIdentifier(SymbolTable.GetNativeName("value"));
                sw.WriteLine("{0}IntPtr {1} = global::Android.Runtime.JavaArray<{2}>.ToLocalJniHandle (value);", indent, arg, opt.GetOutputName(field.Symbol.ElementType));
            }
            else
            {
                foreach (string prep in field.SetParameters.GetCallPrep(opt))
                {
                    have_prep = true;
                    sw.WriteLine("{0}{1}", indent, prep);
                }

                arg = field.SetParameters [0].ToNative(opt);
                if (field.SetParameters.HasCleanup && !have_prep)
                {
                    arg = opt.GetSafeIdentifier(SymbolTable.GetNativeName("value"));
                    sw.WriteLine("{0}IntPtr {1} = JNIEnv.ToLocalJniHandle (value);", indent, arg);
                }
            }

            sw.WriteLine("{0}try {{", indent);

            sw.WriteLine("{0}\tJNIEnv.Set{1}Field ({2}, {3}, {4});",
                         indent,
                         field.IsStatic
                                                ? "Static"
                                                : String.Empty,
                         field.IsStatic
                                                ? "class_ref"
                                                : opt.ContextType.GetObjectHandleProperty("this"),
                         field.ID,
                         arg);

            sw.WriteLine("{0}}} finally {{", indent);
            if (field.Symbol.IsArray)
            {
                sw.WriteLine("{0}\tJNIEnv.DeleteLocalRef ({1});", indent, arg);
            }
            else
            {
                foreach (string cleanup in field.SetParameters.GetCallCleanup(opt))
                {
                    sw.WriteLine("{0}\t{1}", indent, cleanup);
                }
                if (field.SetParameters.HasCleanup && !have_prep)
                {
                    sw.WriteLine("{0}\tJNIEnv.DeleteLocalRef ({1});", indent, arg);
                }
            }
            sw.WriteLine("{0}}}", indent);
        }
Пример #6
0
        internal override void WriteFieldSetBody(Field field, TextWriter writer, string indent, CodeGenerationOptions opt, GenBase type)
        {
            writer.WriteLine("{0}const string __id = \"{1}.{2}\";", indent, field.JavaName, field.Symbol.JniName);
            writer.WriteLine();

            var invokeType = GetInvokeType(field.GetMethodPrefix);
            var indirect   = field.IsStatic ? "StaticFields" : "InstanceFields";

            string arg;
            bool   have_prep = false;

            if (field.Symbol.IsArray)
            {
                arg = opt.GetSafeIdentifier(SymbolTable.GetNativeName("value"));
                writer.WriteLine("{0}IntPtr {1} = global::Android.Runtime.JavaArray<{2}>.ToLocalJniHandle (value);", indent, arg, opt.GetOutputName(field.Symbol.ElementType));
            }
            else
            {
                foreach (string prep in field.SetParameters.GetCallPrep(opt))
                {
                    have_prep = true;
                    writer.WriteLine("{0}{1}", indent, prep);
                }

                arg = field.SetParameters [0].ToNative(opt);
                if (field.SetParameters.HasCleanup && !have_prep)
                {
                    arg = opt.GetSafeIdentifier(SymbolTable.GetNativeName("value"));
                    writer.WriteLine("{0}IntPtr {1} = global::Android.Runtime.JNIEnv.ToLocalJniHandle (value);", indent, arg);
                }
            }

            writer.WriteLine("{0}try {{", indent);

            writer.WriteLine("{0}\t_members.{1}.SetValue (__id{2}, {3});",
                             indent,
                             indirect,
                             field.IsStatic ? "" : ", this",
                             invokeType != "Object" ? arg : "new JniObjectReference (" + arg + ")");

            writer.WriteLine("{0}}} finally {{", indent);
            if (field.Symbol.IsArray)
            {
                writer.WriteLine("{0}\tglobal::Android.Runtime.JNIEnv.DeleteLocalRef ({1});", indent, arg);
            }
            else
            {
                foreach (string cleanup in field.SetParameters.GetCallCleanup(opt))
                {
                    writer.WriteLine("{0}\t{1}", indent, cleanup);
                }
                if (field.SetParameters.HasCleanup && !have_prep)
                {
                    writer.WriteLine("{0}\tglobal::Android.Runtime.JNIEnv.DeleteLocalRef ({1});", indent, arg);
                }
            }
            writer.WriteLine("{0}}}", indent);
        }
Пример #7
0
 public string[] PreCall(CodeGenerationOptions opt, string var_name)
 {
     return(new string[] {
         string.Format("IntPtr {0} = global::Android.Runtime.{1}Adapter.ToLocalJniHandle ({2});",
                       opt.GetSafeIdentifier(TypeNameUtilities.GetNativeName(var_name)),
                       base_name,
                       opt.GetSafeIdentifier(var_name)),
     });
 }
Пример #8
0
 public string[] PreCall(CodeGenerationOptions opt, string var_name)
 {
     return(new string[] {
         string.Format("var {0} = {2};",
                       opt.GetSafeIdentifier(TypeNameUtilities.GetNativeName(var_name)),
                       GetManagedTypeName(opt),
                       opt.GetSafeIdentifier(var_name)),
     });
 }
Пример #9
0
 public string[] PreCall(CodeGenerationOptions opt, string var_name)
 {
     return(new string[] {
         string.Format("IntPtr {0} = {1}.ToLocalJniHandle ({2});",
                       opt.GetSafeIdentifier(SymbolTable.GetNativeName(var_name)),
                       GetManagedTypeName(opt),
                       opt.GetSafeIdentifier(var_name)),
     });
 }
Пример #10
0
        public string[] PostCall(CodeGenerationOptions opt, string var_name)
        {
            string native_name = opt.GetSafeIdentifier(TypeNameUtilities.GetNativeName(var_name));

            string[] result = new string [2];
            result [0] = String.Format("if ({0} != null)", opt.GetSafeIdentifier(var_name));
            result [1] = String.Format("\t{0}.CopyTo({1}, 0);", native_name, opt.GetSafeIdentifier(var_name));
            return(result);
        }
Пример #11
0
 public string[] PreCallback(CodeGenerationOptions opt, string var_name, bool owned)
 {
     return(new string[] {
         string.Format("var {0} = global::Java.Util.InteroperableArrays.ToLocal{1} ({2}, {3});",
                       opt.GetSafeIdentifier(var_name),
                       GetManagedTypeName(opt),
                       opt.GetSafeIdentifier(TypeNameUtilities.GetNativeName(var_name)),
                       owned ? "JniHandleOwnership.TransferLocalRef" : "JniHandleOwnership.DoNotTransfer"),
     });
 }
Пример #12
0
 public string[] PreCallback(CodeGenerationOptions opt, string var_name, bool owned)
 {
     return(new string[] {
         string.Format("var {0} = {1}.FromJniHandle ({2}, {3});",
                       opt.GetSafeIdentifier(var_name),
                       GetManagedTypeName(opt),
                       opt.GetSafeIdentifier(SymbolTable.GetNativeName(var_name)),
                       owned ? "JniHandleOwnership.TransferLocalRef" : "JniHandleOwnership.DoNotTransfer"),
     });
 }
Пример #13
0
        void GenerateEventOrProperty(Method m, StreamWriter sw, string indent, ClassGen target, CodeGenerationOptions opt, string name, string connector_fmt, string add, string remove)
        {
            if (m.EventName == string.Empty)
            {
                return;
            }
            string nameSpec           = Methods.Count > 1 ? m.AdjustedName : String.Empty;
            int    idx                = FullName.LastIndexOf(".");
            int    start              = Name.StartsWith("IOn") ? 3 : 1;
            string full_delegate_name = FullName.Substring(0, idx + 1) + Name.Substring(start, Name.Length - start - 8) + nameSpec;

            if (m.IsSimpleEventHandler)
            {
                full_delegate_name = "EventHandler";
            }
            else if (m.RetVal.IsVoid || m.IsEventHandlerWithHandledProperty)
            {
                full_delegate_name = "EventHandler<" + FullName.Substring(0, idx + 1) + GetArgsName(m) + ">";
            }
            else
            {
                full_delegate_name += "Handler";
            }
            if (m.RetVal.IsVoid || m.IsEventHandlerWithHandledProperty)
            {
                if (opt.GetSafeIdentifier(name) != name)
                {
                    Report.Warning(0, Report.WarningInterfaceGen + 5, "event name for {0}.{1} is invalid. `eventName' or `argsType` can be used to assign a valid member name.", FullName, name);
                    return;
                }
                else
                {
                    GenerateEvent(sw, indent, opt, name, nameSpec, m.AdjustedName, full_delegate_name, !m.Parameters.HasSender, connector_fmt, add, remove);
                }
            }
            else
            {
                if (opt.GetSafeIdentifier(name) != name)
                {
                    Report.Warning(0, Report.WarningInterfaceGen + 6, "event property name for {0}.{1} is invalid. `eventName' or `argsType` can be used to assign a valid member name.", FullName, name);
                    return;
                }
                sw.WriteLine("{0}WeakReference weak_implementor_{1};", indent, name);
                sw.WriteLine("{0}{1}Implementor Impl{2} {{", indent, opt.GetOutputName(FullName), name);
                sw.WriteLine("{0}\tget {{", indent);
                sw.WriteLine("{0}\t\tif (weak_implementor_{1} == null || !weak_implementor_{1}.IsAlive)", indent, name);
                sw.WriteLine("{0}\t\t\treturn null;", indent);
                sw.WriteLine("{0}\t\treturn weak_implementor_{1}.Target as {2}Implementor;", indent, name, opt.GetOutputName(FullName));
                sw.WriteLine("{0}\t}}", indent);
                sw.WriteLine("{0}\tset {{ weak_implementor_{1} = new WeakReference (value, true); }}", indent, name);
                sw.WriteLine("{0}}}", indent);
                sw.WriteLine();
                GenerateProperty(sw, indent, opt, name, nameSpec, m.AdjustedName, connector_fmt, full_delegate_name);
            }
        }
Пример #14
0
        public string[] PostCall(CodeGenerationOptions opt, string var_name)
        {
            string native_name = opt.GetSafeIdentifier(TypeNameUtilities.GetNativeName(var_name));

            string[] result = new string [4];
            result [0] = String.Format("if ({0} != null) {{", opt.GetSafeIdentifier(var_name));
            result [1] = String.Format("\tJNIEnv.CopyArray ({0}, {1});", native_name, opt.GetSafeIdentifier(var_name));
            result [2] = String.Format("\tJNIEnv.DeleteLocalRef ({0});", native_name);
            result [3] = "}";
            return(result);
        }
Пример #15
0
        public string[] PreCall(CodeGenerationOptions opt, string var_name)
        {
            string managed_name = opt.GetSafeIdentifier(var_name);
            string native_name  = opt.GetSafeIdentifier(TypeNameUtilities.GetNativeName(var_name));

            if (opt.CodeGenerationTarget == CodeGenerationTarget.JavaInterop1)
            {
                return(new[] {
                    $"var {native_name} = global::{GetJavaInterop1MarshalMethod ()} ({managed_name});",
                });
            }
            return(new string[] { String.Format("IntPtr {0} = JNIEnv.NewArray ({1});", opt.GetSafeIdentifier(TypeNameUtilities.GetNativeName(var_name)), opt.GetSafeIdentifier(var_name)) });
        }
Пример #16
0
        public string[] PostCall(CodeGenerationOptions opt, string var_name)
        {
            string native_name = opt.GetSafeIdentifier(TypeNameUtilities.GetNativeName(var_name));

            if (opt.CodeGenerationTarget == CodeGenerationTarget.JavaInterop1)
            {
                return(new[] {
                    $"global::Java.Interop.JniObjectReference.Dispose (ref {native_name});",
                });
            }
            return(new string[] {
                string.Format("JNIEnv.DeleteLocalRef ({0});", opt.GetSafeIdentifier(TypeNameUtilities.GetNativeName(var_name))),
            });
        }
Пример #17
0
        public string[] PreCallback(CodeGenerationOptions opt, string var_name, bool owned)
        {
            var rgm = this as IRequireGenericMarshal;

            return(new string[] {
                string.Format("{0} {1} = {5}global::Java.Lang.Object.GetObject<{4}> ({2}, {3});",
                              opt.GetOutputName(FullName),
                              opt.GetSafeIdentifier(var_name),
                              opt.GetSafeIdentifier(SymbolTable.GetNativeName(var_name)),
                              owned ? "JniHandleOwnership.TransferLocalRef" : "JniHandleOwnership.DoNotTransfer",
                              opt.GetOutputName(rgm != null ? (rgm.GetGenericJavaObjectTypeOverride() ?? FullName) : FullName),
                              rgm != null ? "(" + opt.GetOutputName(FullName) + ")" : string.Empty)
            });
        }
Пример #18
0
        public string[] PreCall(CodeGenerationOptions opt, string var_name)
        {
            string managed_name = opt.GetSafeIdentifier(var_name);
            string native_name  = opt.GetSafeIdentifier(TypeNameUtilities.GetNativeName(var_name));

            if (opt.CodeGenerationTarget == CodeGenerationTarget.JavaInterop1)
            {
                return(new[] {
                    $"var {native_name} = global::Java.Interop.JniEnvironment.Strings.NewString ({managed_name});",
                });
            }
            return(new[] {
                $"IntPtr {native_name} = JNIEnv.NewString ({managed_name});",
            });
        }
Пример #19
0
        public string[] PostCallback(CodeGenerationOptions opt, string var_name)
        {
            string managed_name = opt.GetSafeIdentifier(var_name);
            string native_name  = opt.GetSafeIdentifier(TypeNameUtilities.GetNativeName(var_name));

            if (opt.CodeGenerationTarget == CodeGenerationTarget.JavaInterop1)
            {
                return(new string[] {
                    $"throw new NotSupportedException (\"ArraySymbol.PostCallback\");",
                });
            }
            return(new[] {
                $"if ({managed_name} != null)",
                $"\tJNIEnv.CopyArray ({managed_name}, {native_name});",
            });
        }
 public string[] PostCall(CodeGenerationOptions opt, string var_name)
 {
     return(new string[] {
         string.Format("JNIEnv.DeleteLocalRef ({0});",
                       opt.GetSafeIdentifier(TypeNameUtilities.GetNativeName(var_name))),
     });
 }
Пример #21
0
 public string FromNative(CodeGenerationOptions opt, string varname, bool owned)
 {
     return(String.Format("{0}.FromJniHandle ({1}, {2})",
                          GetManagedTypeName(opt),
                          opt.GetSafeIdentifier(varname),
                          owned ? "JniHandleOwnership.TransferLocalRef" : "JniHandleOwnership.DoNotTransfer"));
 }
 public string[] PreCall(CodeGenerationOptions opt, string var_name)
 {
     return(new string[] {
         string.Format("IntPtr {0} = JNIEnv.ToLocalJniHandle ({1});",
                       opt.GetSafeIdentifier(TypeNameUtilities.GetNativeName(var_name)), opt.GetSafeIdentifier(var_name)),
     });
 }
Пример #23
0
 public string FromNative(CodeGenerationOptions opt, string varname, bool owned)
 {
     return(String.Format("global::Java.Util.InteroperableArrays.ToLocal{0} (ref {1}, {2})",
                          GetManagedTypeName(opt),
                          opt.GetSafeIdentifier(varname),
                          owned ? "JniObjectReferenceOptions.CopyAndDispose" : "JniObjectReferenceOptions.None"));
 }
Пример #24
0
 public string[] PostCallback(CodeGenerationOptions opt, string var_name)
 {
     string[] result = new string [2];
     result [0] = String.Format("if ({0} != null)", opt.GetSafeIdentifier(var_name));
     result [1] = String.Format("\tglobal::Java.Util.InteroperableArrays.ArrayCopy({0}, {1});", opt.GetSafeIdentifier(var_name), opt.GetSafeIdentifier(TypeNameUtilities.GetNativeName(var_name)));
     return(result);
 }
 public string[] PreCallback(CodeGenerationOptions opt, string var_name, bool owned)
 {
     return(new string[] {
         string.Format("var {1} = global::Java.Lang.Object.GetObject<{0}> ({2}, {3});",
                       opt.GetOutputName(FullName),
                       var_name,
                       opt.GetSafeIdentifier(TypeNameUtilities.GetNativeName(var_name)),
                       owned ? "JniHandleOwnership.TransferLocalRef" : "JniHandleOwnership.DoNotTransfer"),
     });
 }
Пример #26
0
 public string[] PreCallback(CodeGenerationOptions opt, string var_name, bool owned)
 {
     return(new string[] {
         string.Format("System.IO.Stream {0} = global::Android.Runtime.{1}Invoker.FromJniHandle ({2}, {3});",
                       var_name,
                       base_name,
                       opt.GetSafeIdentifier(TypeNameUtilities.GetNativeName(var_name)),
                       owned ? "JniHandleOwnership.TransferLocalRef" : "JniHandleOwnership.DoNotTransfer"),
     });
 }
Пример #27
0
        public string GetCallbackSignature(CodeGenerationOptions opt)
        {
            StringBuilder sb = new StringBuilder();

            foreach (Parameter p in items)
            {
                sb.Append(", ");
                sb.Append(p.NativeType);
                sb.Append(" ");
                sb.Append(opt.GetSafeIdentifier(p.UnsafeNativeName));
            }
            return(sb.ToString());
        }
Пример #28
0
        public string GetCall(CodeGenerationOptions opt)
        {
            StringBuilder sb = new StringBuilder();

            foreach (Parameter p in items)
            {
                if (sb.Length > 0)
                {
                    sb.Append(", ");
                }
                sb.Append(opt.GetSafeIdentifier(p.Name));
            }
            return(sb.ToString());
        }
Пример #29
0
 public string[] GetPreCallback(CodeGenerationOptions opt)
 {
     if (Type == NativeType)
     {
         return(new string [0]);
     }
     else if (NeedsPrep)
     {
         return(sym.PreCallback(opt, Name, false));
     }
     else
     {
         return new string[] { opt.GetOutputName(Type) + " " + opt.GetSafeIdentifier(Name) + " = " + FromNative(opt, false) + ";" }
     };
 }
Пример #30
0
        public string GetGenericReturn(CodeGenerationOptions opt, string name, Dictionary <string, string> mappings)
        {
            string targetType = sym.GetGenericType(mappings);

            if (string.IsNullOrEmpty(targetType))
            {
                return(name);
            }
            if (targetType == "string")
            {
                return(string.Format("{0}.ToString ()", name));
            }
            var rgm = opt.SymbolTable.Lookup(targetType) as IRequireGenericMarshal;

            return(string.Format("global::Java.Interop.JavaObjectExtensions.JavaCast<{0}>({1})",
                                 rgm != null ? (rgm.GetGenericJavaObjectTypeOverride() ?? sym.FullName) : sym.FullName,
                                 opt.GetSafeIdentifier(rgm != null ? rgm.ToInteroperableJavaObject(name) : name)));
        }