private static CBORObject ResolveSharedRefs( CBORObject obj, SharedRefs sharedRefs) { if (obj == null) { return(null); } CBORType type = obj.Type; bool hasTag = obj.HasMostOuterTag(29); if (hasTag) { CBORObject untagged = obj.UntagOne(); if (untagged.IsTagged || untagged.Type != CBORType.Integer || untagged.AsNumber().IsNegative()) { throw new CBORException( "Shared ref index must be an untagged integer 0 or greater"); } return(sharedRefs.GetObject(untagged.AsEIntegerValue())); } hasTag = obj.HasMostOuterTag(28); if (hasTag) { obj = obj.UntagOne(); sharedRefs.AddObject(obj); } if (type == CBORType.Map) { foreach (CBORObject key in obj.Keys) { CBORObject value = obj[key]; CBORObject newvalue = ResolveSharedRefs(value, sharedRefs); if (value != newvalue) { obj[key] = newvalue; } } } else if (type == CBORType.Array) { for (var i = 0; i < obj.Count; ++i) { obj[i] = ResolveSharedRefs(obj[i], sharedRefs); } } return(obj); }
private string TryGetDateTimeFieldsInternal( CBORObject obj, EInteger[] year, int[] lesserFields) { if (obj == null) { return("Object is null"); } if (year == null) { throw new ArgumentNullException(nameof(year)); } EInteger[] outYear = year; if (outYear.Length < 1) { throw new ArgumentException("\"year\" + \"'s length\" (" + outYear.Length + ") is not greater or equal to 1"); } if (lesserFields == null) { throw new ArgumentNullException(nameof(lesserFields)); } if (lesserFields.Length < 7) { throw new ArgumentException("\"lesserFields\" + \"'s length\" (" + lesserFields.Length + ") is not greater or equal to 7"); } if (this.convType == ConversionType.UntaggedNumber) { if (obj.IsTagged) { return("May not be tagged"); } CBORObject untagobj = obj; if (!untagobj.IsNumber) { return("Not a finite number"); } CBORNumber num = untagobj.AsNumber(); if (!num.IsFinite()) { return("Not a finite number"); } if (num.CompareTo(Int64.MinValue) < 0 || num.CompareTo(Int64.MaxValue) > 0) { return("Too big or small to fit a DateTime"); } if (num.CanFitInInt64()) { CBORUtilities.BreakDownSecondsSinceEpoch( num.ToInt64Checked(), outYear, lesserFields); } else { EDecimal dec; dec = (EDecimal)untagobj.ToObject(typeof(EDecimal)); CBORUtilities.BreakDownSecondsSinceEpoch( dec, outYear, lesserFields); } return(null); // no error } if (obj.HasMostOuterTag(0)) { string str = obj.AsString(); try { CBORUtilities.ParseAtomDateTimeString(str, outYear, lesserFields); return(null); // no error } catch (OverflowException ex) { return(ex.Message); } catch (InvalidOperationException ex) { return(ex.Message); } catch (ArgumentException ex) { return(ex.Message); } } else if (obj.HasMostOuterTag(1)) { CBORObject untagobj = obj.UntagOne(); if (!untagobj.IsNumber) { return("Not a finite number"); } CBORNumber num = untagobj.AsNumber(); if (!num.IsFinite()) { return("Not a finite number"); } if (num.CanFitInInt64()) { CBORUtilities.BreakDownSecondsSinceEpoch( num.ToInt64Checked(), outYear, lesserFields); } else { EDecimal dec; dec = (EDecimal)untagobj.ToObject(typeof(EDecimal)); CBORUtilities.BreakDownSecondsSinceEpoch( dec, outYear, lesserFields); } return(null); // No error } return("Not tag 0 or 1"); }