Ejemplo n.º 1
0
    private void EmitPublicEvent(CodeBuilder b, int cbIndex, CefCallbackFunction cb)
    {
        var isSimpleGetterEvent = cb.Signature.ManagedParameters.Length == 1 &&
                                  cb.Signature.ReturnType.IsCefStructPtrType;

        b.AppendSummaryAndRemarks(cb.Comments, false, true);
        b.BeginBlock("public event {0} {1}", cb.EventHandlerName, CSharp.Escape(cb.PublicName));
        b.BeginBlock("add");
        b.BeginBlock("lock(eventLock)");
        if (isSimpleGetterEvent)
        {
            b.BeginBlock("if(m_{0} != null)", cb.PublicName);
            b.AppendLine("throw new CfxException(\"Can't add more than one event handler to this type of event.\");");
            b.EndBlock();
        }
        else
        {
            b.BeginBlock("if(m_{0} == null)", cb.PublicName);
        }
        b.AppendLine("CfxApi.{3}.{0}_set_callback(NativePtr, {1}, {2}_native_ptr);", CefStruct.CfxName, cbIndex, cb.Name, CefStruct.ClassName.Substring(3));
        if (!isSimpleGetterEvent)
        {
            b.EndBlock();
        }
        b.AppendLine("m_{0} += value;", cb.PublicName);
        b.EndBlock();
        b.EndBlock();
        b.BeginBlock("remove");
        b.BeginBlock("lock(eventLock)");
        b.AppendLine("m_{0} -= value;", cb.PublicName);
        b.BeginBlock("if(m_{0} == null)", cb.PublicName);
        b.AppendLine("CfxApi.{2}.{0}_set_callback(NativePtr, {1}, IntPtr.Zero);", CefStruct.CfxName, cbIndex, CefStruct.ClassName.Substring(3));
        b.EndBlock();
        b.EndBlock();
        b.EndBlock();
        b.EndBlock();
        b.AppendLine();

        if (isSimpleGetterEvent)
        {
            b.AppendLine("/// <summary>");
            b.AppendLine("/// Retrieves the {0} provided by the event handler attached to the {1} event, if any.", cb.Signature.ReturnType.PublicSymbol, CSharp.Escape(cb.PublicName));
            b.AppendLine("/// Returns null if no event handler is attached.");
            b.AppendLine("/// </summary>");
            b.BeginBlock("public {0} Retrieve{1}()", cb.Signature.ReturnType.PublicSymbol, cb.Signature.ReturnType.PublicSymbol.Substring(3));
            b.AppendLine("var h = m_{0};", cb.PublicName);
            b.BeginIf("h != null");
            b.AppendLine("var e = new {0}();", cb.PublicEventArgsClassName);
            b.AppendLine("h(this, e);");
            b.AppendLine("return e.m_returnValue;");
            b.BeginElse();
            b.AppendLine("return null;");
            b.EndBlock();
            b.EndBlock();
            b.AppendLine();
        }

        b.AppendLine("private {0} m_{1};", cb.EventHandlerName, cb.PublicName);
    }
Ejemplo n.º 2
0
    public bool IsPropertySetterFor(CefCallbackFunction getter)
    {
        var retval = IsPropertySetterForPrivate(getter);

        if (retval)
        {
            m_callMode = CfxCallMode.PropertySetter;
        }
        return(retval);
    }
Ejemplo n.º 3
0
 public StructProperty(CefCallbackFunction getter, CefCallbackFunction setter, bool isBoolean)
 {
     this.Getter               = getter;
     this.Setter               = setter;
     this.IsBoolean            = isBoolean;
     getter.IsProperty         = true;
     getter.PublicPropertyName = PropertyName;
     if (setter != null)
     {
         setter.IsProperty         = true;
         setter.PublicPropertyName = PropertyName;
     }
 }
Ejemplo n.º 4
0
    public CfxLibraryClass(CefStructType cefStruct, Parser.StructData sd, ApiTypeBuilder api)
        : base(cefStruct, sd, api)
    {
        var flist = new List <CefExportFunction>();

        foreach (var fd in sd.CefFunctions)
        {
            flist.Add(new CefExportFunction(cefStruct, fd, api));
        }
        ExportFunctions = flist.ToArray();

        GetCallbackFunctions(sd, api);

        foreach (var cb in CallbackFunctions)
        {
            var isBoolean = false;
            if (cb.IsPropertyGetter(ref isBoolean))
            {
                CefCallbackFunction setter = null;
                foreach (var cb2 in CallbackFunctions)
                {
                    if (cb2.IsPropertySetterFor(cb))
                    {
                        setter = cb2;
                        setter.Signature.ManagedArguments[1].IsPropertySetterArgument = true;
                        break;
                    }
                }
                var prop = new StructProperty(cb, setter, isBoolean);
                m_structProperties.Add(prop);
            }
        }
        foreach (var sm in CallbackFunctions)
        {
            if (!sm.IsProperty)
            {
                m_structFunctions.Add(sm);
            }
        }

        NeedsWrapFunction = true;
    }
Ejemplo n.º 5
0
    private void EmitEventToString(CodeBuilder b, CefCallbackFunction cb)
    {
        b.BeginBlock("public override string ToString()");
        var format      = new List <string>();
        var vars        = new List <string>();
        var formatIndex = 0;

        for (var i = 1; i <= cb.Signature.ManagedParameters.Count() - 1; i++)
        {
            var arg = cb.Signature.ManagedParameters[i];
            if (arg.ParameterType.IsIn)
            {
                format.Add(string.Format("{0}={{{{{{{1}}}}}}}", arg.PublicPropertyName, formatIndex));
                vars.Add(arg.PublicPropertyName);
                formatIndex += 1;
            }
        }
        b.AppendLine("return String.Format(\"{0}\", {1});", string.Join(", ", format.ToArray()), string.Join(", ", vars.ToArray()));
        b.EndBlock();
    }
Ejemplo n.º 6
0
 public bool IsPropertySetterForPrivate(CefCallbackFunction getter)
 {
     if (!Signature.PublicReturnType.IsVoid)
     {
         return(false);
     }
     if (!(Signature.ManagedParameters.Count() == 2))
     {
         return(false);
     }
     if (!Signature.ManagedParameters[1].ParameterType.Equals(getter.Signature.PublicReturnType))
     {
         if (!(getter.Signature.PublicReturnType.Name == "cef_string_userfree_t" && Signature.ManagedParameters[1].ParameterType.IsCefStringPtrTypeConst))
         {
             return(false);
         }
     }
     if (!Name.Substring(1).Equals(getter.Name.Substring(1)))
     {
         return(false);
     }
     return(true);
 }
Ejemplo n.º 7
0
    public void EmitRemoteEventArgsAndHandler(CodeBuilder b, CefCallbackFunction cb)
    {
        if (cb.IsBasicEvent)
        {
            return;
        }

        if (!ShouldEmitEventHandler(emittedRemoteHandlers, cb))
        {
            return;
        }

        b.AppendSummaryAndRemarks(cb.Comments, true, true);
        b.AppendLine("public delegate void {0}(object sender, {1} e);", cb.RemoteEventHandlerName, cb.RemoteEventArgsClassName);
        b.AppendLine();

        b.AppendSummaryAndRemarks(cb.Comments, true, true);
        b.BeginClass(cb.RemoteEventArgsClassName + " : CfrEventArgs", GeneratorConfig.ClassModifiers(cb.RemoteEventArgsClassName));
        b.AppendLine();

        b.AppendLine("private {0}RemoteEventCall call;", cb.RemoteCallName);
        b.AppendLine();

        for (var i = 1; i <= cb.Signature.ManagedParameters.Count() - 1; i++)
        {
            cb.Signature.ManagedParameters[i].EmitRemoteEventArgFields(b);
        }
        b.AppendLine();

        if (!cb.Signature.PublicReturnType.IsVoid)
        {
            b.AppendLine("internal {0} m_returnValue;", cb.Signature.PublicReturnType.RemoteSymbol);
            b.AppendLine("private bool returnValueSet;");
            b.AppendLine();
        }

        b.AppendLine("internal {0}({1}RemoteEventCall call) {{ this.call = call; }}", cb.RemoteEventArgsClassName, cb.RemoteCallName);
        b.AppendLine();

        for (var i = 1; i <= cb.Signature.ManagedParameters.Count() - 1; i++)
        {
            var arg = cb.Signature.ManagedParameters[i];
            var cd  = new CommentNode();
            if (arg.ParameterType.IsIn && arg.ParameterType.IsOut)
            {
                cd.Lines = new string[] { string.Format("Get or set the {0} parameter for the <see cref=\"{1}.{2}\"/> render process callback.", arg.PublicPropertyName, CefStruct.RemoteSymbol, cb.PublicFunctionName) };
            }
            else if (arg.ParameterType.IsIn)
            {
                cd.Lines = new string[] { string.Format("Get the {0} parameter for the <see cref=\"{1}.{2}\"/> render process callback.", arg.PublicPropertyName, CefStruct.RemoteSymbol, cb.PublicFunctionName) };
            }
            else
            {
                cd.Lines = new string[] { string.Format("Set the {0} out parameter for the <see cref=\"{1}.{2}\"/> render process callback.", arg.PublicPropertyName, CefStruct.RemoteSymbol, cb.PublicFunctionName) };
            }
            if (arg.ParameterType is CefStructArrayType && arg.ParameterType.IsIn)
            {
                cd.Lines = cd.Lines.Concat(new string[] { "Do not keep a reference to the elements of this array outside of this function." }).ToArray();
            }
            b.AppendSummary(cd);
            b.BeginBlock("public {0} {1}", arg.ParameterType.RemoteSymbol, arg.PublicPropertyName);
            if (arg.ParameterType.IsIn)
            {
                b.BeginBlock("get");
                b.AppendLine("CheckAccess();");
                arg.EmitRemoteEventArgGetterStatements(b);
                b.EndBlock();
            }
            if (arg.ParameterType.IsOut)
            {
                b.BeginBlock("set");
                b.AppendLine("CheckAccess();");
                arg.EmitRemoteEventArgSetterStatements(b);
                b.EndBlock();
            }
            b.EndBlock();
        }
        if (!cb.Signature.PublicReturnType.IsVoid)
        {
            var cd = new CommentNode();
            cd.Lines = new string[] {
                string.Format("Set the return value for the <see cref=\"{0}.{1}\"/> render process callback.", CefStruct.RemoteClassName, cb.PublicFunctionName),
                "Calling SetReturnValue() more then once per callback or from different event handlers will cause an exception to be thrown."
            };
            b.AppendSummary(cd);
            b.BeginBlock("public void SetReturnValue({0} returnValue)", cb.Signature.PublicReturnType.RemoteSymbol);
            b.BeginIf("returnValueSet");
            b.AppendLine("throw new CfxException(\"The return value has already been set\");");
            b.EndBlock();
            b.AppendLine("m_returnValue = returnValue;");
            b.AppendLine("returnValueSet = true;");
            b.EndBlock();
        }

        if (cb.Signature.ManagedParameters.Count() > 1)
        {
            b.AppendLine();
            EmitEventToString(b, cb);
        }
        b.EndBlock();
    }
Ejemplo n.º 8
0
 private bool ShouldEmitEventHandler(Dictionary <string, CommentNode> emittedHandlers, CefCallbackFunction cb)
 {
     if (emittedHandlers.ContainsKey(cb.EventName))
     {
         var c0 = emittedHandlers[cb.EventName];
         if (c0 != null)
         {
             if (c0.Lines.Length != cb.Comments.Lines.Length)
             {
                 System.Diagnostics.Debugger.Break();
             }
             for (var i = 0; i <= c0.Lines.Length - 1; i++)
             {
                 if (c0.Lines[i] != cb.Comments.Lines[i])
                 {
                     // two handlers use same event but with different cb.Comments
                     System.Diagnostics.Debugger.Break();
                 }
             }
         }
         return(false);
     }
     emittedHandlers.Add(cb.EventName, cb.Comments);
     return(true);
 }