From beb0f8ebb2e1cdd23486c39c145b1c3cdf02c124 Mon Sep 17 00:00:00 2001 From: dmendez Date: Fri, 25 Feb 2022 13:49:52 -0300 Subject: [PATCH 01/13] Issue:94665 ajax parameters modification hash based detection --- .../GxClasses/Core/Web/HttpAjaxContext.cs | 43 ++++++++++++++- .../GxClasses/Middleware/GXHttp.cs | 52 +++++++++++++------ 2 files changed, 78 insertions(+), 17 deletions(-) diff --git a/dotnet/src/dotnetframework/GxClasses/Core/Web/HttpAjaxContext.cs b/dotnet/src/dotnetframework/GxClasses/Core/Web/HttpAjaxContext.cs index 384869724..c11acc2ce 100644 --- a/dotnet/src/dotnetframework/GxClasses/Core/Web/HttpAjaxContext.cs +++ b/dotnet/src/dotnetframework/GxClasses/Core/Web/HttpAjaxContext.cs @@ -58,10 +58,45 @@ internal enum SessionType RO_SESSION, NO_SESSION, } + public interface IDynAjaxEventContext + { + void Clear(); + void SetParmHash(string fieldName, object value); + bool isParmModified(string fieldName, object value); + } + public class DynAjaxEventContext: IDynAjaxEventContext + { + StringDictionary inParmsHashValue = new StringDictionary(); + public void Clear() + { + inParmsHashValue.Clear(); + } + public void SetParmHash(string fieldName, object value) + { + IGxJSONSerializable jsonValue = value as IGxJSONSerializable; + if (jsonValue != null) + { + inParmsHashValue.Add(fieldName, GXUtil.GetHash(jsonValue.ToJSonString())); + } + } + public bool isParmModified(string fieldName, object value) + { + IGxJSONSerializable jsonValue = value as IGxJSONSerializable; + if (value != null) + { + if (!inParmsHashValue.ContainsKey(fieldName)) + return true; + return GXUtil.GetHash(jsonValue.ToJSonString()) != inParmsHashValue[fieldName]; + } + return true; + } + } + + public class HttpAjaxContext : IHttpAjaxContext { - private IGxContext _context; + private IGxContext _context; static readonly ILog log = log4net.LogManager.GetLogger(typeof(HttpAjaxContext)); private Stack cmpContents = new Stack(); private GXAjaxCommandCollection commands = new GXAjaxCommandCollection(); @@ -75,6 +110,8 @@ public class HttpAjaxContext : IHttpAjaxContext private JObject _ComponentObjects = new JObject(); private JArray _StylesheetsToLoad = new JArray(); private NameValueCollection _formVars; + private IDynAjaxEventContext _DynAjaxEventContext = new DynAjaxEventContext(); + #if !NETCORE private GXWebRow _currentGridRow; #endif @@ -82,6 +119,8 @@ public class HttpAjaxContext : IHttpAjaxContext internal SessionType SessionType { get; set; } + public IDynAjaxEventContext DynAjaxEventContext { get { return _DynAjaxEventContext; } } + public string FormCaption { get; set; } public JObject HiddenValues @@ -275,7 +314,7 @@ public void ajax_rsp_assign_sdt_attri(String CmpContext, bool IsMasterPage, Stri try { JObject obj = GetGxObject(AttValues, CmpContext, IsMasterPage); - if (obj != null) + if (obj != null && DynAjaxEventContext.isParmModified(AttName, SdtObj)) { IGxJSONAble SdtObjJson = SdtObj as IGxJSONAble; if (SdtObjJson != null) diff --git a/dotnet/src/dotnetframework/GxClasses/Middleware/GXHttp.cs b/dotnet/src/dotnetframework/GxClasses/Middleware/GXHttp.cs index 2e576f463..edd38d087 100644 --- a/dotnet/src/dotnetframework/GxClasses/Middleware/GXHttp.cs +++ b/dotnet/src/dotnetframework/GxClasses/Middleware/GXHttp.cs @@ -208,7 +208,7 @@ private static bool IsNumericType(Type t) } #if !NETCORE - protected IGxContext _Context; + protected IGxContext _Context; bool _isMain; #endif bool _isStatic; @@ -321,7 +321,15 @@ public class DynAjaxEvent string row, pRow = string.Empty; JArray inParmsMetadata; private HashSet inParmsMetadataHash; + JArray outParmsMetadata; + private HashSet outParmsMetadataHash; bool anyError; + IDynAjaxEventContext DynAjaxEventContext; + + public DynAjaxEvent(IDynAjaxEventContext DynAjaxEventContext) + { + this.DynAjaxEventContext = DynAjaxEventContext; + } private void ParseInputJSonMessage(JObject objMessage, GXHttpHandler targetObj) { @@ -373,10 +381,10 @@ private void ParseInputJSonMessage(JObject objMessage, GXHttpHandler targetObj) pRow = (string)objMessage["pRow"]; if (objMessage.Contains("gxstate")) { - ParseGXStateParms((JObject)objMessage["gxstate"]); - } - if (objMessage.Contains("fullPost")) - { + ParseGXStateParms((JObject)objMessage["gxstate"]); + } + if (objMessage.Contains("fullPost")) + { this.targetObj._Context.httpAjaxContext.ParseGXState((Jayrock.Json.JObject)objMessage["fullPost"]); } } @@ -411,10 +419,12 @@ private string BuildOutputJSonMessage() return ((GxContext)(targetObj._Context)).getJSONResponse(this.cmpContext); } - private void ClearInputParmsMetadata() + private void ClearParmsMetadata() { inParmsMetadata = new JArray(); inParmsMetadataHash = new HashSet(); + outParmsMetadata = new JArray(); + outParmsMetadataHash = new HashSet(); } private bool IsInternalParm(JObject parm) @@ -422,7 +432,7 @@ private bool IsInternalParm(JObject parm) return parm.Contains("sPrefix") || parm.Contains("sSFPrefix") || parm.Contains("sCompEvt"); } - private void AddInputParmsMetadata(JObject inputParm) + private void AddInputParmsMetadata(JObject inputParm, JArray ParmsList, HashSet ParmsListHash) { string key = string.Empty; @@ -443,12 +453,12 @@ private void AddInputParmsMetadata(JObject inputParm) key = (string)inputParm["ctrl"]; } - if (String.IsNullOrEmpty(key) || !inParmsMetadataHash.Contains(key)) + if (String.IsNullOrEmpty(key) || !ParmsListHash.Contains(key)) { - inParmsMetadata.Add(inputParm); + ParmsList.Add(inputParm); if (!String.IsNullOrEmpty(key)) { - inParmsMetadataHash.Add(key); + ParmsListHash.Add(key); } } } @@ -457,7 +467,7 @@ private void ParseMetadata() { try { - ClearInputParmsMetadata(); + ClearParmsMetadata(); eventHandlers = new string[events.Length]; eventUseInternalParms = new bool[events.Length]; int eventCount = 0; @@ -468,9 +478,14 @@ private void ParseMetadata() JArray eventInputParms = (JArray)eventMetadata["iparms"]; foreach (JObject inputParm in eventInputParms) { - AddInputParmsMetadata(inputParm); + AddInputParmsMetadata(inputParm, inParmsMetadata, inParmsMetadataHash); eventUseInternalParms[eventCount] = eventUseInternalParms[eventCount] || IsInternalParm(inputParm); } + JArray eventOutputParms = (JArray)eventMetadata["oparms"]; + foreach (JObject outputParm in eventOutputParms) + { + AddInputParmsMetadata(outputParm, outParmsMetadata, outParmsMetadataHash); + } eventCount++; } } @@ -527,7 +542,7 @@ private void SetScalarOrCollectionValue(string fieldName, object value, JArray v FieldInfo fieldInfo = getfieldInfo(targetObj, fieldName); if (fieldInfo != null) { - if (typeof(IGxCollection).IsAssignableFrom(fieldInfo.FieldType)) + if (typeof(IGxCollection).IsAssignableFrom(fieldInfo.FieldType)) SetCollectionFieldValue(fieldInfo, values); else SetFieldValue(fieldInfo, value); @@ -674,7 +689,13 @@ private Array GetArrayFieldValue(FieldInfo fieldInfo, object value) return null; } - + public void initializeParmHashes() { + DynAjaxEventContext.Clear(); + foreach (JObject parm in outParmsMetadata) { + object TypedValue = getFieldValue(targetObj, (string)parm["av"]); + DynAjaxEventContext.SetParmHash((string)parm["av"], TypedValue); + } + } private object[] BeforeInvoke() { List MethodParms = new List(); @@ -851,6 +872,7 @@ private object[] BeforeInvoke() } SetFieldValue("wbLoad", true); } + initializeParmHashes(); return MethodParms.ToArray(); } @@ -963,7 +985,7 @@ public virtual void webAjaxEvent() } setAjaxCallMode(); context.setFullAjaxMode(); - DynAjaxEvent dynAjaxEvent = new DynAjaxEvent(); + DynAjaxEvent dynAjaxEvent = new DynAjaxEvent( context.httpAjaxContext.DynAjaxEventContext); string jsonRequest; if (context.IsMultipartRequest) jsonRequest = cgiGet(GX_AJAX_MULTIPART_ID); From 55c8bdede7583c7385cfb68315c10094151b025b Mon Sep 17 00:00:00 2001 From: dmendez Date: Fri, 4 Mar 2022 14:33:20 -0300 Subject: [PATCH 02/13] IGXUndefined to detect unassigned empty var values at user events --- .../GxClasses/Core/Web/HttpAjaxContext.cs | 54 +++++-- .../GxClasses/Domain/GxCollections.cs | 14 +- .../GxClasses/Domain/GxGenericCollections.cs | 136 +++++++++++++++++- .../GxClasses/Middleware/GXHttp.cs | 50 +++---- 4 files changed, 207 insertions(+), 47 deletions(-) diff --git a/dotnet/src/dotnetframework/GxClasses/Core/Web/HttpAjaxContext.cs b/dotnet/src/dotnetframework/GxClasses/Core/Web/HttpAjaxContext.cs index c11acc2ce..9807932d9 100644 --- a/dotnet/src/dotnetframework/GxClasses/Core/Web/HttpAjaxContext.cs +++ b/dotnet/src/dotnetframework/GxClasses/Core/Web/HttpAjaxContext.cs @@ -58,15 +58,39 @@ internal enum SessionType RO_SESSION, NO_SESSION, } - public interface IDynAjaxEventContext + internal interface IDynAjaxEventContext { void Clear(); + void ClearParmsMetadata(); + bool isInputParm(string key); void SetParmHash(string fieldName, object value); bool isParmModified(string fieldName, object value); + JArray inParmsMetadata { get; } + HashSet inParmsMetadataHash { get; } + JArray outParmsMetadata { get; } + HashSet outParmsMetadataHash { get; } } - public class DynAjaxEventContext: IDynAjaxEventContext + internal class DynAjaxEventContext: IDynAjaxEventContext { - StringDictionary inParmsHashValue = new StringDictionary(); + public JArray inParmsMetadata { get; set; } + public HashSet inParmsMetadataHash { get; set; } + public JArray outParmsMetadata { get; set; } + public HashSet outParmsMetadataHash { get; set; } + private StringDictionary inParmsHashValue = new StringDictionary(); + + public void ClearParmsMetadata() + { + inParmsMetadata = new JArray(); + inParmsMetadataHash = new HashSet(); + outParmsMetadata = new JArray(); + outParmsMetadataHash = new HashSet(); + } + + public bool isInputParm(string key) + { + return inParmsMetadataHash.Contains(key); + } + public void Clear() { inParmsHashValue.Clear(); @@ -92,8 +116,6 @@ public bool isParmModified(string fieldName, object value) } } - - public class HttpAjaxContext : IHttpAjaxContext { private IGxContext _context; @@ -108,18 +130,18 @@ public class HttpAjaxContext : IHttpAjaxContext private JObject _Messages = new JObject(); private JArray _Grids = new JArray(); private JObject _ComponentObjects = new JObject(); - private JArray _StylesheetsToLoad = new JArray(); - private NameValueCollection _formVars; + private JArray _StylesheetsToLoad = new JArray(); + private NameValueCollection _formVars; private IDynAjaxEventContext _DynAjaxEventContext = new DynAjaxEventContext(); #if !NETCORE private GXWebRow _currentGridRow; #endif - private bool _isJsOutputEnabled = true; + private bool _isJsOutputEnabled = true; internal SessionType SessionType { get; set; } - public IDynAjaxEventContext DynAjaxEventContext { get { return _DynAjaxEventContext; } } + internal IDynAjaxEventContext DynAjaxEventContext { get { return _DynAjaxEventContext; } } public string FormCaption { get; set; } @@ -305,6 +327,18 @@ public void ajax_rsp_assign_attri(String CmpContext, bool IsMasterPage, String A } } } + + private bool isUndefinedOutParam(string key, Object SdtObj) { + + if (!DynAjaxEventContext.isInputParm(key)) + { + if (SdtObj is IGXUndefined parm) + { + return parm.IsUndefined; + } + } + return false; + } public void ajax_rsp_assign_sdt_attri(String CmpContext, bool IsMasterPage, String AttName, Object SdtObj) { if (isJsOutputEnabled) @@ -314,7 +348,7 @@ public void ajax_rsp_assign_sdt_attri(String CmpContext, bool IsMasterPage, Stri try { JObject obj = GetGxObject(AttValues, CmpContext, IsMasterPage); - if (obj != null && DynAjaxEventContext.isParmModified(AttName, SdtObj)) + if (obj != null && (DynAjaxEventContext.isParmModified(AttName, SdtObj) || !isUndefinedOutParam( AttName, SdtObj))) { IGxJSONAble SdtObjJson = SdtObj as IGxJSONAble; if (SdtObjJson != null) diff --git a/dotnet/src/dotnetframework/GxClasses/Domain/GxCollections.cs b/dotnet/src/dotnetframework/GxClasses/Domain/GxCollections.cs index 11edf6fe1..592110025 100644 --- a/dotnet/src/dotnetframework/GxClasses/Domain/GxCollections.cs +++ b/dotnet/src/dotnetframework/GxClasses/Domain/GxCollections.cs @@ -288,7 +288,7 @@ public bool FromJSonFile(GxFile file, GXBaseCollection Mess [Serializable] [CollectionDataContract(Name = "GxSimpleCollection")] - public class GxSimpleCollection : List, IGxXMLSerializable, ICloneable, IGxJSONAble, IGxCollection, IGxJSONSerializable + public class GxSimpleCollection : GXBaseList, IGxXMLSerializable, ICloneable, IGxJSONAble, IGxCollection, IGxJSONSerializable { protected CollectionBase _jsonArr; @@ -361,7 +361,7 @@ public Geospatial GetGeospatial(int i) { return new Geospatial(this[i - 1]); } - public int Add(Object o) + public override int Add(Object o) { base.Add((T)o); return base.Count; @@ -435,7 +435,7 @@ public virtual object Clone() collection.AddRange(this); return collection; } - public int IndexOf(object value) + public override int IndexOf(object value) { T TObject = ConvertToT(value); return base.IndexOf(TObject) + 1; @@ -1030,14 +1030,15 @@ public string Name [Serializable] [XmlType(IncludeInSchema = false)] - public class GxUserType : IGxXMLSerializable, ICloneable, IGxJSONAble, IGxJSONSerializable + public class GxUserType : IGxXMLSerializable, ICloneable, IGxJSONAble, IGxJSONSerializable, IGXUndefined { static readonly ILog log = log4net.LogManager.GetLogger(typeof(GeneXus.Utils.GxUserType)); protected GXProperties dirties = new GXProperties(); static object setupChannelObject = null; static bool setupChannelInitialized; - + public bool IsUndefined { get; set; } + static void loadConfigurator() { if (GxUserType.setupChannelObject == null && !GxUserType.setupChannelInitialized) @@ -1085,9 +1086,10 @@ JObject JsonObj public GxUserType() { + IsUndefined = false; } - public virtual void SetDirty(string fieldName) + public virtual void SetDirty(string fieldName) { dirties[fieldName.ToLower()] = "true"; } diff --git a/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs b/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs index 1de47ed49..64d3bd2e8 100644 --- a/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs +++ b/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs @@ -11,9 +11,137 @@ namespace GeneXus.Utils { + internal interface IGXUndefined + { + bool IsUndefined { get; set; } + } + + public class GXBaseList : IGXUndefined, IList, ICollection, IEnumerable, IEnumerable, IReadOnlyCollection, IReadOnlyList, ICollection, IList + { + + List m_list = new List(); + + public GXBaseList() + { + IsUndefined = false; + } + + public T this[int index] { get => ((IList)m_list)[index]; set => ((IList)m_list)[index] = value; } + + public bool IsUndefined { get; set; } + + public void AddRange(IEnumerable collection) { + m_list.AddRange(collection); + } + public int Count => ((ICollection)m_list).Count; + + public bool IsReadOnly => ((ICollection)m_list).IsReadOnly; + + public bool IsSynchronized => ((ICollection)m_list).IsSynchronized; + + public object SyncRoot => ((ICollection)m_list).SyncRoot; + + public bool IsFixedSize => ((IList)m_list).IsFixedSize; + + object IList.this[int index] { get => ((IList)m_list)[index]; set => ((IList)m_list)[index] = value; } + + public void Add(T item) + { + ((ICollection)m_list).Add(item); + IsUndefined = false; + } + + public void Clear() + { + ((ICollection)m_list).Clear(); + IsUndefined = false; + } + + public bool Contains(T item) + { + return ((ICollection)m_list).Contains(item); + } + + public void CopyTo(T[] array, int arrayIndex) + { + ((ICollection)m_list).CopyTo(array, arrayIndex); + } + + public IEnumerator GetEnumerator() + { + return ((IEnumerable)m_list).GetEnumerator(); + } + + public virtual int IndexOf(T item) + { + return ((IList)m_list).IndexOf(item); + } + + public void Insert(int index, T item) + { + ((IList)m_list).Insert(index, item); + } + + public bool Remove(T item) + { + IsUndefined = false; + return ((ICollection)m_list).Remove(item); + } + + public void RemoveAt(int index) + { + IsUndefined = false; + ((IList)m_list).RemoveAt(index); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return ((IEnumerable)m_list).GetEnumerator(); + } + + public void Sort(IComparer comparer) + { + m_list.Sort(comparer); + } + public void Sort() + { + m_list.Sort(); + } + + public void CopyTo(Array array, int index) + { + ((ICollection)m_list).CopyTo(array, index); + } + + public virtual int Add(object value) + { + return ((IList)m_list).Add(value); + } + + public bool Contains(object value) + { + return ((IList)m_list).Contains(value); + } + + public virtual int IndexOf(object value) + { + return ((IList)m_list).IndexOf(value); + } + + public void Insert(int index, object value) + { + ((IList)m_list).Insert(index, value); + } + + public void Remove(object value) + { + IsUndefined = false; + ((IList)m_list).Remove(value); + } + } [Serializable] - public class GXBaseCollection : List, IGxXMLSerializable, IGxJSONAble, IGxCollection, IGxJSONSerializable where T : GxUserType, IGxXMLSerializable, IGxJSONAble, new() + public class GXBaseCollection : GXBaseList, IGxXMLSerializable, IGxJSONAble, IGxCollection, IGxJSONSerializable where T : GxUserType, IGxXMLSerializable, IGxJSONAble, new() { static readonly ILog log = log4net.LogManager.GetLogger(typeof(GeneXus.Utils.GXBaseCollection)); @@ -109,7 +237,7 @@ public void Add(object o, int idx) else Insert(idx - 1, o as T); } - public virtual int Add(object o) + public override int Add(object o) { base.Add(o as T); return 0; @@ -141,7 +269,7 @@ public virtual object Clone() } return collection; } - public int IndexOf(object value) + public override int IndexOf(object value) { return base.IndexOf((T)value) + 1; } @@ -364,7 +492,7 @@ public IList ExternalInstance { get { - return this; + return (IList) this; } set { diff --git a/dotnet/src/dotnetframework/GxClasses/Middleware/GXHttp.cs b/dotnet/src/dotnetframework/GxClasses/Middleware/GXHttp.cs index edd38d087..233bcf411 100644 --- a/dotnet/src/dotnetframework/GxClasses/Middleware/GXHttp.cs +++ b/dotnet/src/dotnetframework/GxClasses/Middleware/GXHttp.cs @@ -308,7 +308,7 @@ public DataIntegrityException(string message) : base(message) } } - public class DynAjaxEvent + internal class DynAjaxEvent { JArray inParmsValues; JArray inHashValues; @@ -319,14 +319,10 @@ public class DynAjaxEvent string cmpContext = string.Empty; int grid; string row, pRow = string.Empty; - JArray inParmsMetadata; - private HashSet inParmsMetadataHash; - JArray outParmsMetadata; - private HashSet outParmsMetadataHash; bool anyError; - IDynAjaxEventContext DynAjaxEventContext; + internal IDynAjaxEventContext DynAjaxEventContext; - public DynAjaxEvent(IDynAjaxEventContext DynAjaxEventContext) + internal DynAjaxEvent(IDynAjaxEventContext DynAjaxEventContext) { this.DynAjaxEventContext = DynAjaxEventContext; } @@ -419,20 +415,12 @@ private string BuildOutputJSonMessage() return ((GxContext)(targetObj._Context)).getJSONResponse(this.cmpContext); } - private void ClearParmsMetadata() - { - inParmsMetadata = new JArray(); - inParmsMetadataHash = new HashSet(); - outParmsMetadata = new JArray(); - outParmsMetadataHash = new HashSet(); - } - private bool IsInternalParm(JObject parm) { return parm.Contains("sPrefix") || parm.Contains("sSFPrefix") || parm.Contains("sCompEvt"); } - private void AddInputParmsMetadata(JObject inputParm, JArray ParmsList, HashSet ParmsListHash) + private void AddParmsMetadata(JObject inputParm, JArray ParmsList, HashSet ParmsListHash) { string key = string.Empty; @@ -467,7 +455,7 @@ private void ParseMetadata() { try { - ClearParmsMetadata(); + DynAjaxEventContext.ClearParmsMetadata(); eventHandlers = new string[events.Length]; eventUseInternalParms = new bool[events.Length]; int eventCount = 0; @@ -478,13 +466,13 @@ private void ParseMetadata() JArray eventInputParms = (JArray)eventMetadata["iparms"]; foreach (JObject inputParm in eventInputParms) { - AddInputParmsMetadata(inputParm, inParmsMetadata, inParmsMetadataHash); + AddParmsMetadata(inputParm, DynAjaxEventContext.inParmsMetadata, DynAjaxEventContext.inParmsMetadataHash); eventUseInternalParms[eventCount] = eventUseInternalParms[eventCount] || IsInternalParm(inputParm); } JArray eventOutputParms = (JArray)eventMetadata["oparms"]; foreach (JObject outputParm in eventOutputParms) { - AddInputParmsMetadata(outputParm, outParmsMetadata, outParmsMetadataHash); + AddParmsMetadata(outputParm, DynAjaxEventContext.outParmsMetadata, DynAjaxEventContext.outParmsMetadataHash); } eventCount++; } @@ -689,11 +677,19 @@ private Array GetArrayFieldValue(FieldInfo fieldInfo, object value) return null; } - public void initializeParmHashes() { + public void initializeOutParms() { DynAjaxEventContext.Clear(); - foreach (JObject parm in outParmsMetadata) { - object TypedValue = getFieldValue(targetObj, (string)parm["av"]); - DynAjaxEventContext.SetParmHash((string)parm["av"], TypedValue); + foreach (JObject parm in DynAjaxEventContext.outParmsMetadata) { + string parmName = (string)parm["av"]; + if (!String.IsNullOrEmpty(parmName)) + { + object TypedValue = getFieldValue(targetObj, parmName); + DynAjaxEventContext.SetParmHash(parmName, TypedValue); + if (!DynAjaxEventContext.isInputParm(parmName) && TypedValue is IGXUndefined param) + { + param.IsUndefined = true; + } + } } } private object[] BeforeInvoke() @@ -705,7 +701,7 @@ private object[] BeforeInvoke() bool multipart = targetObj.context.IsMultipartRequest; int hash_i = 0; int parm_i = 0; - foreach (JObject parm in inParmsMetadata) + foreach (JObject parm in DynAjaxEventContext.inParmsMetadata) { if (parm["postForm"] != null) @@ -777,7 +773,7 @@ private object[] BeforeInvoke() { SetScalarOrCollectionValue((string)parm["av"], columnValues[rowIdx - 1], columnValues); object TypedValue = getFieldValue(targetObj, (string)parm["av"]); - CheckParmIntegrity(TypedValue, (string)columnHash, sRow, inParmsMetadata[parm_i], hash_i, Picture); + CheckParmIntegrity(TypedValue, (string)columnHash, sRow, DynAjaxEventContext.inParmsMetadata[parm_i], hash_i, Picture); } rowIdx++; } @@ -830,7 +826,7 @@ private object[] BeforeInvoke() string hash = hashObj.Contains("hsh") ? (string)hashObj["hsh"] : string.Empty; SetScalarOrCollectionValue((string)parm["av"], inParmsValues[parm_i], columnValues); object TypedValue = getFieldValue(targetObj, (string)parm["av"]); - CheckParmIntegrity(TypedValue, hash, sRow, inParmsMetadata[parm_i], hash_i, Picture); + CheckParmIntegrity(TypedValue, hash, sRow, DynAjaxEventContext.inParmsMetadata[parm_i], hash_i, Picture); } catch (Exception ex) { @@ -872,7 +868,7 @@ private object[] BeforeInvoke() } SetFieldValue("wbLoad", true); } - initializeParmHashes(); + initializeOutParms(); return MethodParms.ToArray(); } From 703dbdf7e400ccc4687a8d691a8146ccb5b33348 Mon Sep 17 00:00:00 2001 From: dmendez Date: Fri, 4 Mar 2022 16:51:39 -0300 Subject: [PATCH 03/13] IGXUndefined -> IGXUnassigned --- .../GxClasses/Core/Web/HttpAjaxContext.cs | 4 ++-- .../GxClasses/Domain/GxCollections.cs | 6 +++--- .../GxClasses/Domain/GxGenericCollections.cs | 20 +++++++++---------- .../GxClasses/Middleware/GXHttp.cs | 4 ++-- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/dotnet/src/dotnetframework/GxClasses/Core/Web/HttpAjaxContext.cs b/dotnet/src/dotnetframework/GxClasses/Core/Web/HttpAjaxContext.cs index 9807932d9..1e5c78352 100644 --- a/dotnet/src/dotnetframework/GxClasses/Core/Web/HttpAjaxContext.cs +++ b/dotnet/src/dotnetframework/GxClasses/Core/Web/HttpAjaxContext.cs @@ -332,9 +332,9 @@ private bool isUndefinedOutParam(string key, Object SdtObj) { if (!DynAjaxEventContext.isInputParm(key)) { - if (SdtObj is IGXUndefined parm) + if (SdtObj is IGXUnassigned parm) { - return parm.IsUndefined; + return parm.IsUnassigned; } } return false; diff --git a/dotnet/src/dotnetframework/GxClasses/Domain/GxCollections.cs b/dotnet/src/dotnetframework/GxClasses/Domain/GxCollections.cs index 592110025..df6d67d26 100644 --- a/dotnet/src/dotnetframework/GxClasses/Domain/GxCollections.cs +++ b/dotnet/src/dotnetframework/GxClasses/Domain/GxCollections.cs @@ -1030,14 +1030,14 @@ public string Name [Serializable] [XmlType(IncludeInSchema = false)] - public class GxUserType : IGxXMLSerializable, ICloneable, IGxJSONAble, IGxJSONSerializable, IGXUndefined + public class GxUserType : IGxXMLSerializable, ICloneable, IGxJSONAble, IGxJSONSerializable, IGXUnassigned { static readonly ILog log = log4net.LogManager.GetLogger(typeof(GeneXus.Utils.GxUserType)); protected GXProperties dirties = new GXProperties(); static object setupChannelObject = null; static bool setupChannelInitialized; - public bool IsUndefined { get; set; } + public bool IsUnassigned { get; set; } static void loadConfigurator() { @@ -1086,7 +1086,7 @@ JObject JsonObj public GxUserType() { - IsUndefined = false; + IsUnassigned = false; } public virtual void SetDirty(string fieldName) diff --git a/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs b/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs index 64d3bd2e8..465b9fa8a 100644 --- a/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs +++ b/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs @@ -11,24 +11,24 @@ namespace GeneXus.Utils { - internal interface IGXUndefined + internal interface IGXUnassigned { - bool IsUndefined { get; set; } + bool IsUnassigned { get; set; } } - public class GXBaseList : IGXUndefined, IList, ICollection, IEnumerable, IEnumerable, IReadOnlyCollection, IReadOnlyList, ICollection, IList + public class GXBaseList : IGXUnassigned, IList, ICollection, IEnumerable, IEnumerable, IReadOnlyCollection, IReadOnlyList, ICollection, IList { List m_list = new List(); public GXBaseList() { - IsUndefined = false; + IsUnassigned = false; } public T this[int index] { get => ((IList)m_list)[index]; set => ((IList)m_list)[index] = value; } - public bool IsUndefined { get; set; } + public bool IsUnassigned { get; set; } public void AddRange(IEnumerable collection) { m_list.AddRange(collection); @@ -48,13 +48,13 @@ public void AddRange(IEnumerable collection) { public void Add(T item) { ((ICollection)m_list).Add(item); - IsUndefined = false; + IsUnassigned = false; } public void Clear() { ((ICollection)m_list).Clear(); - IsUndefined = false; + IsUnassigned = false; } public bool Contains(T item) @@ -84,13 +84,13 @@ public void Insert(int index, T item) public bool Remove(T item) { - IsUndefined = false; + IsUnassigned = false; return ((ICollection)m_list).Remove(item); } public void RemoveAt(int index) { - IsUndefined = false; + IsUnassigned = false; ((IList)m_list).RemoveAt(index); } @@ -135,7 +135,7 @@ public void Insert(int index, object value) public void Remove(object value) { - IsUndefined = false; + IsUnassigned = false; ((IList)m_list).Remove(value); } } diff --git a/dotnet/src/dotnetframework/GxClasses/Middleware/GXHttp.cs b/dotnet/src/dotnetframework/GxClasses/Middleware/GXHttp.cs index 233bcf411..dfde463c7 100644 --- a/dotnet/src/dotnetframework/GxClasses/Middleware/GXHttp.cs +++ b/dotnet/src/dotnetframework/GxClasses/Middleware/GXHttp.cs @@ -685,9 +685,9 @@ public void initializeOutParms() { { object TypedValue = getFieldValue(targetObj, parmName); DynAjaxEventContext.SetParmHash(parmName, TypedValue); - if (!DynAjaxEventContext.isInputParm(parmName) && TypedValue is IGXUndefined param) + if (!DynAjaxEventContext.isInputParm(parmName) && TypedValue is IGXUnassigned param) { - param.IsUndefined = true; + param.IsUnassigned = true; } } } From c445eda030e7c7fdc0d66fb500d51d4e1d40e1d7 Mon Sep 17 00:00:00 2001 From: dmendez Date: Sat, 5 Mar 2022 20:48:29 -0300 Subject: [PATCH 04/13] conversion from GXBaseList to List --- .../GxClasses/Domain/GxGenericCollections.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs b/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs index 465b9fa8a..5ede22983 100644 --- a/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs +++ b/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs @@ -26,6 +26,15 @@ public GXBaseList() IsUnassigned = false; } + public static explicit operator List(GXBaseList l) + { + return l.m_list; + } + public List ToList(GXBaseList l) + { + return l.m_list; + } + public T this[int index] { get => ((IList)m_list)[index]; set => ((IList)m_list)[index] = value; } public bool IsUnassigned { get; set; } From c71afc6b595637fb9ef69411376e1d2b05ec4cd2 Mon Sep 17 00:00:00 2001 From: dmendez Date: Sun, 6 Mar 2022 21:13:54 -0300 Subject: [PATCH 05/13] List type operator --- .../dotnetframework/GxClasses/Domain/GxCollections.cs | 10 ++++++++++ .../GxClasses/Domain/GxGenericCollections.cs | 11 ++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/dotnet/src/dotnetframework/GxClasses/Domain/GxCollections.cs b/dotnet/src/dotnetframework/GxClasses/Domain/GxCollections.cs index df6d67d26..7b55e474f 100644 --- a/dotnet/src/dotnetframework/GxClasses/Domain/GxCollections.cs +++ b/dotnet/src/dotnetframework/GxClasses/Domain/GxCollections.cs @@ -291,6 +291,16 @@ public bool FromJSonFile(GxFile file, GXBaseCollection Mess public class GxSimpleCollection : GXBaseList, IGxXMLSerializable, ICloneable, IGxJSONAble, IGxCollection, IGxJSONSerializable { + public static explicit operator List(GxSimpleCollection l) + { + return l.ToList(); + } + + public List ToList(GxSimpleCollection l) + { + return ToList(l); + } + protected CollectionBase _jsonArr; protected CollectionBase jsonArr { diff --git a/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs b/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs index 5ede22983..eb89e60f3 100644 --- a/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs +++ b/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs @@ -30,7 +30,7 @@ public static explicit operator List(GXBaseList l) { return l.m_list; } - public List ToList(GXBaseList l) + public static List ToList(GXBaseList l) { return l.m_list; } @@ -177,6 +177,15 @@ public GXBaseCollection(GXBaseCollection value) } } + public static explicit operator List(GXBaseCollection l) + { + return GXBaseList.ToList(l); + } + public List ToList(GXBaseCollection l) + { + return GXBaseList.ToList(l); + } + protected CollectionBase jsonArr { get From b4d1ce01de0aa43e98a85312168c5cde69f8bd76 Mon Sep 17 00:00:00 2001 From: dmendez Date: Mon, 7 Mar 2022 12:52:31 -0300 Subject: [PATCH 06/13] Keep List as base class for compatibility reasons --- .../GxClasses/Core/Web/HttpAjaxContext.cs | 4 +- .../GxClasses/Domain/GxCollections.cs | 20 +-- .../GxClasses/Domain/GxGenericCollections.cs | 153 +++--------------- .../GxClasses/Middleware/GXHttp.cs | 4 +- 4 files changed, 29 insertions(+), 152 deletions(-) diff --git a/dotnet/src/dotnetframework/GxClasses/Core/Web/HttpAjaxContext.cs b/dotnet/src/dotnetframework/GxClasses/Core/Web/HttpAjaxContext.cs index 1e5c78352..a5646f56a 100644 --- a/dotnet/src/dotnetframework/GxClasses/Core/Web/HttpAjaxContext.cs +++ b/dotnet/src/dotnetframework/GxClasses/Core/Web/HttpAjaxContext.cs @@ -332,9 +332,9 @@ private bool isUndefinedOutParam(string key, Object SdtObj) { if (!DynAjaxEventContext.isInputParm(key)) { - if (SdtObj is IGXUnassigned parm) + if (SdtObj is IGXAssigned parm) { - return parm.IsUnassigned; + return !parm.IsAssigned; } } return false; diff --git a/dotnet/src/dotnetframework/GxClasses/Domain/GxCollections.cs b/dotnet/src/dotnetframework/GxClasses/Domain/GxCollections.cs index 7b55e474f..8856e094e 100644 --- a/dotnet/src/dotnetframework/GxClasses/Domain/GxCollections.cs +++ b/dotnet/src/dotnetframework/GxClasses/Domain/GxCollections.cs @@ -291,16 +291,6 @@ public bool FromJSonFile(GxFile file, GXBaseCollection Mess public class GxSimpleCollection : GXBaseList, IGxXMLSerializable, ICloneable, IGxJSONAble, IGxCollection, IGxJSONSerializable { - public static explicit operator List(GxSimpleCollection l) - { - return l.ToList(); - } - - public List ToList(GxSimpleCollection l) - { - return ToList(l); - } - protected CollectionBase _jsonArr; protected CollectionBase jsonArr { @@ -371,7 +361,7 @@ public Geospatial GetGeospatial(int i) { return new Geospatial(this[i - 1]); } - public override int Add(Object o) + public int Add(Object o) { base.Add((T)o); return base.Count; @@ -445,7 +435,7 @@ public virtual object Clone() collection.AddRange(this); return collection; } - public override int IndexOf(object value) + public int IndexOf(object value) { T TObject = ConvertToT(value); return base.IndexOf(TObject) + 1; @@ -1040,14 +1030,14 @@ public string Name [Serializable] [XmlType(IncludeInSchema = false)] - public class GxUserType : IGxXMLSerializable, ICloneable, IGxJSONAble, IGxJSONSerializable, IGXUnassigned + public class GxUserType : IGxXMLSerializable, ICloneable, IGxJSONAble, IGxJSONSerializable, IGXAssigned { static readonly ILog log = log4net.LogManager.GetLogger(typeof(GeneXus.Utils.GxUserType)); protected GXProperties dirties = new GXProperties(); static object setupChannelObject = null; static bool setupChannelInitialized; - public bool IsUnassigned { get; set; } + public bool IsAssigned { get; set; } static void loadConfigurator() { @@ -1096,7 +1086,7 @@ JObject JsonObj public GxUserType() { - IsUnassigned = false; + IsAssigned = true; } public virtual void SetDirty(string fieldName) diff --git a/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs b/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs index eb89e60f3..827078413 100644 --- a/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs +++ b/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs @@ -11,141 +11,37 @@ namespace GeneXus.Utils { - internal interface IGXUnassigned + internal interface IGXAssigned { - bool IsUnassigned { get; set; } + bool IsAssigned { get; set; } } - public class GXBaseList : IGXUnassigned, IList, ICollection, IEnumerable, IEnumerable, IReadOnlyCollection, IReadOnlyList, ICollection, IList + public class GXBaseList : List, IGXAssigned, ICollection, IEnumerable, IEnumerable, IReadOnlyCollection, IReadOnlyList, ICollection, IList { - - List m_list = new List(); - public GXBaseList() { - IsUnassigned = false; - } - - public static explicit operator List(GXBaseList l) - { - return l.m_list; - } - public static List ToList(GXBaseList l) - { - return l.m_list; - } - - public T this[int index] { get => ((IList)m_list)[index]; set => ((IList)m_list)[index] = value; } - - public bool IsUnassigned { get; set; } - - public void AddRange(IEnumerable collection) { - m_list.AddRange(collection); - } - public int Count => ((ICollection)m_list).Count; - - public bool IsReadOnly => ((ICollection)m_list).IsReadOnly; - - public bool IsSynchronized => ((ICollection)m_list).IsSynchronized; - - public object SyncRoot => ((ICollection)m_list).SyncRoot; - - public bool IsFixedSize => ((IList)m_list).IsFixedSize; - - object IList.this[int index] { get => ((IList)m_list)[index]; set => ((IList)m_list)[index] = value; } - - public void Add(T item) - { - ((ICollection)m_list).Add(item); - IsUnassigned = false; - } - - public void Clear() - { - ((ICollection)m_list).Clear(); - IsUnassigned = false; - } - - public bool Contains(T item) - { - return ((ICollection)m_list).Contains(item); - } - - public void CopyTo(T[] array, int arrayIndex) - { - ((ICollection)m_list).CopyTo(array, arrayIndex); - } - - public IEnumerator GetEnumerator() - { - return ((IEnumerable)m_list).GetEnumerator(); - } - - public virtual int IndexOf(T item) - { - return ((IList)m_list).IndexOf(item); - } - - public void Insert(int index, T item) - { - ((IList)m_list).Insert(index, item); - } - - public bool Remove(T item) - { - IsUnassigned = false; - return ((ICollection)m_list).Remove(item); - } - - public void RemoveAt(int index) - { - IsUnassigned = false; - ((IList)m_list).RemoveAt(index); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return ((IEnumerable)m_list).GetEnumerator(); - } - - public void Sort(IComparer comparer) - { - m_list.Sort(comparer); - } - public void Sort() - { - m_list.Sort(); + IsAssigned = true; } + public bool IsAssigned { get; set; } - public void CopyTo(Array array, int index) - { - ((ICollection)m_list).CopyTo(array, index); - } - - public virtual int Add(object value) - { - return ((IList)m_list).Add(value); - } - - public bool Contains(object value) - { - return ((IList)m_list).Contains(value); + public new void Clear() { + base.Clear(); + IsAssigned = true; } - - public virtual int IndexOf(object value) + public new void RemoveAt(int idx) { - return ((IList)m_list).IndexOf(value); + base.RemoveAt(idx); + IsAssigned = true; } - - public void Insert(int index, object value) + public new void Add(T TObject) { - ((IList)m_list).Insert(index, value); + base.Add(TObject); + IsAssigned = true; } - - public void Remove(object value) + public new void Insert(int idx, T TObject) { - IsUnassigned = false; - ((IList)m_list).Remove(value); + base.Insert(idx - 1, TObject); + IsAssigned = true; } } @@ -177,15 +73,6 @@ public GXBaseCollection(GXBaseCollection value) } } - public static explicit operator List(GXBaseCollection l) - { - return GXBaseList.ToList(l); - } - public List ToList(GXBaseCollection l) - { - return GXBaseList.ToList(l); - } - protected CollectionBase jsonArr { get @@ -255,7 +142,7 @@ public void Add(object o, int idx) else Insert(idx - 1, o as T); } - public override int Add(object o) + public int Add(object o) { base.Add(o as T); return 0; @@ -287,7 +174,7 @@ public virtual object Clone() } return collection; } - public override int IndexOf(object value) + public int IndexOf(object value) { return base.IndexOf((T)value) + 1; } @@ -671,7 +558,7 @@ public GXBCLevelCollection(IGxContext context, _containedName = containedName; _containedXmlNamespace = containedXmlNamespace; } - public override int Add(object item) + public new int Add(object item) { SetModeNewSilentItem(item as T); base.Add(item); diff --git a/dotnet/src/dotnetframework/GxClasses/Middleware/GXHttp.cs b/dotnet/src/dotnetframework/GxClasses/Middleware/GXHttp.cs index dfde463c7..7b9d0a3f7 100644 --- a/dotnet/src/dotnetframework/GxClasses/Middleware/GXHttp.cs +++ b/dotnet/src/dotnetframework/GxClasses/Middleware/GXHttp.cs @@ -685,9 +685,9 @@ public void initializeOutParms() { { object TypedValue = getFieldValue(targetObj, parmName); DynAjaxEventContext.SetParmHash(parmName, TypedValue); - if (!DynAjaxEventContext.isInputParm(parmName) && TypedValue is IGXUnassigned param) + if (!DynAjaxEventContext.isInputParm(parmName) && TypedValue is IGXAssigned param) { - param.IsUnassigned = true; + param.IsAssigned = false; } } } From 0ffb8cd4b7caf0d66e92f8a428eaa45c95336999 Mon Sep 17 00:00:00 2001 From: dmendez Date: Tue, 8 Mar 2022 10:39:58 -0300 Subject: [PATCH 07/13] Disable serialization for IsAssigned --- .../dotnetframework/GxClasses/Domain/GxGenericCollections.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs b/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs index 827078413..6cee7abaf 100644 --- a/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs +++ b/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs @@ -22,6 +22,8 @@ public GXBaseList() { IsAssigned = true; } + [XmlIgnore] + [NonSerialized] public bool IsAssigned { get; set; } public new void Clear() { From 51007596ad8db5387cfb04ec5d20b8dc194d84e7 Mon Sep 17 00:00:00 2001 From: Claudia Murialdo Date: Tue, 8 Mar 2022 10:47:26 -0300 Subject: [PATCH 08/13] Fix build error. --- .../src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs b/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs index 6cee7abaf..187d76328 100644 --- a/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs +++ b/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs @@ -23,7 +23,6 @@ public GXBaseList() IsAssigned = true; } [XmlIgnore] - [NonSerialized] public bool IsAssigned { get; set; } public new void Clear() { From 70eb3eb0f0b7dfe481fab3f6825437798aae33dd Mon Sep 17 00:00:00 2001 From: dmendez Date: Tue, 8 Mar 2022 10:51:50 -0300 Subject: [PATCH 09/13] Compile fixing --- .../src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs b/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs index 6cee7abaf..187d76328 100644 --- a/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs +++ b/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs @@ -23,7 +23,6 @@ public GXBaseList() IsAssigned = true; } [XmlIgnore] - [NonSerialized] public bool IsAssigned { get; set; } public new void Clear() { From 896b48334e153fa789cd4ebbb92530db62de25df Mon Sep 17 00:00:00 2001 From: Claudia Murialdo Date: Tue, 8 Mar 2022 11:24:19 -0300 Subject: [PATCH 10/13] Fix at GXBaseList insert method. --- .../dotnetframework/GxClasses/Domain/GxGenericCollections.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs b/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs index 187d76328..5adf5e81a 100644 --- a/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs +++ b/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs @@ -41,7 +41,7 @@ public GXBaseList() } public new void Insert(int idx, T TObject) { - base.Insert(idx - 1, TObject); + base.Insert(idx, TObject); IsAssigned = true; } } From b3859a89390004999522372a46edb4c7d06b87c4 Mon Sep 17 00:00:00 2001 From: Claudia Murialdo Date: Tue, 8 Mar 2022 13:19:44 -0300 Subject: [PATCH 11/13] Add XMLIgnore for IsAssigned on GxUserType --- dotnet/src/dotnetframework/GxClasses/Domain/GxCollections.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/dotnet/src/dotnetframework/GxClasses/Domain/GxCollections.cs b/dotnet/src/dotnetframework/GxClasses/Domain/GxCollections.cs index 8856e094e..cde4a563c 100644 --- a/dotnet/src/dotnetframework/GxClasses/Domain/GxCollections.cs +++ b/dotnet/src/dotnetframework/GxClasses/Domain/GxCollections.cs @@ -1037,6 +1037,7 @@ public class GxUserType : IGxXMLSerializable, ICloneable, IGxJSONAble, IGxJSONSe static object setupChannelObject = null; static bool setupChannelInitialized; + [XmlIgnore] public bool IsAssigned { get; set; } static void loadConfigurator() From 8175aa456d88435271c6e78f56f12ed7c520f01b Mon Sep 17 00:00:00 2001 From: Claudia Murialdo Date: Tue, 8 Mar 2022 19:45:17 -0300 Subject: [PATCH 12/13] Restore virtual Add(object o) method in GXBaseCollection. --- .../dotnetframework/GxClasses/Domain/GxGenericCollections.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs b/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs index 5adf5e81a..673f1920f 100644 --- a/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs +++ b/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs @@ -143,7 +143,7 @@ public void Add(object o, int idx) else Insert(idx - 1, o as T); } - public int Add(object o) + public virtual int Add(object o) { base.Add(o as T); return 0; @@ -559,7 +559,7 @@ public GXBCLevelCollection(IGxContext context, _containedName = containedName; _containedXmlNamespace = containedXmlNamespace; } - public new int Add(object item) + public override int Add(object item) { SetModeNewSilentItem(item as T); base.Add(item); From 8b2874e91609c36210f09c5cf299d36dd967a1fc Mon Sep 17 00:00:00 2001 From: Claudia Murialdo Date: Tue, 19 Apr 2022 13:31:43 -0300 Subject: [PATCH 13/13] Remove unnecessary base classes of GXList added by mistake (List extends all of them). Make initializeOutParms private. --- .../dotnetframework/GxClasses/Domain/GxGenericCollections.cs | 2 +- dotnet/src/dotnetframework/GxClasses/Middleware/GXHttp.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs b/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs index 673f1920f..1a22837ac 100644 --- a/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs +++ b/dotnet/src/dotnetframework/GxClasses/Domain/GxGenericCollections.cs @@ -16,7 +16,7 @@ internal interface IGXAssigned bool IsAssigned { get; set; } } - public class GXBaseList : List, IGXAssigned, ICollection, IEnumerable, IEnumerable, IReadOnlyCollection, IReadOnlyList, ICollection, IList + public class GXBaseList : List, IGXAssigned { public GXBaseList() { diff --git a/dotnet/src/dotnetframework/GxClasses/Middleware/GXHttp.cs b/dotnet/src/dotnetframework/GxClasses/Middleware/GXHttp.cs index 7b9d0a3f7..b94251187 100644 --- a/dotnet/src/dotnetframework/GxClasses/Middleware/GXHttp.cs +++ b/dotnet/src/dotnetframework/GxClasses/Middleware/GXHttp.cs @@ -677,7 +677,7 @@ private Array GetArrayFieldValue(FieldInfo fieldInfo, object value) return null; } - public void initializeOutParms() { + private void initializeOutParms() { DynAjaxEventContext.Clear(); foreach (JObject parm in DynAjaxEventContext.outParmsMetadata) { string parmName = (string)parm["av"];