Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
 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");
 }