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); }
public bool IsPropertySetterFor(CefCallbackFunction getter) { var retval = IsPropertySetterForPrivate(getter); if (retval) { m_callMode = CfxCallMode.PropertySetter; } return(retval); }
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; } }
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; }
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(); }
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); }
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(); }
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); }