// Reads the elements from the passed dictionary, which comes from the previous extended attributes entry, // and inserts or replaces those elements into the current header's dictionary. // If any of the dictionary entries use the name of a standard attribute, that attribute's value gets replaced with the one from the dictionary. // Unlike the historic header, numeric values in extended attributes are stored using decimal, not octal. // Throws if any conversion from string to the expected data type fails. internal void ReplaceNormalAttributesWithExtended(Dictionary <string, string>?dictionaryFromExtendedAttributesHeader) { if (dictionaryFromExtendedAttributesHeader == null || dictionaryFromExtendedAttributesHeader.Count == 0) { return; } InitializeExtendedAttributesWithExisting(dictionaryFromExtendedAttributesHeader); // Find all the extended attributes with known names and save them in the expected standard attribute. // The 'name' header field only fits 100 bytes, so we always store the full name text to the dictionary. if (ExtendedAttributes.TryGetValue(PaxEaName, out string?paxEaName)) { _name = paxEaName; } // The 'linkName' header field only fits 100 bytes, so we always store the full linkName text to the dictionary. if (ExtendedAttributes.TryGetValue(PaxEaLinkName, out string?paxEaLinkName)) { _linkName = paxEaLinkName; } // The 'mtime' header field only fits 12 bytes, so a more precise timestamp goes in the extended attributes if (TarHelpers.TryGetDateTimeOffsetFromTimestampString(ExtendedAttributes, PaxEaMTime, out DateTimeOffset mTime)) { _mTime = mTime; } // The user could've stored an override in the extended attributes if (TarHelpers.TryGetStringAsBaseTenInteger(ExtendedAttributes, PaxEaMode, out int mode)) { _mode = mode; } // The 'size' header field only fits 12 bytes, so the data section length that surpases that limit needs to be retrieved if (TarHelpers.TryGetStringAsBaseTenLong(ExtendedAttributes, PaxEaSize, out long size)) { _size = size; } // The 'uid' header field only fits 8 bytes, or the user could've stored an override in the extended attributes if (TarHelpers.TryGetStringAsBaseTenInteger(ExtendedAttributes, PaxEaUid, out int uid)) { _uid = uid; } // The 'gid' header field only fits 8 bytes, or the user could've stored an override in the extended attributes if (TarHelpers.TryGetStringAsBaseTenInteger(ExtendedAttributes, PaxEaGid, out int gid)) { _gid = gid; } // The 'uname' header field only fits 32 bytes if (ExtendedAttributes.TryGetValue(PaxEaUName, out string?paxEaUName)) { _uName = paxEaUName; } // The 'gname' header field only fits 32 bytes if (ExtendedAttributes.TryGetValue(PaxEaGName, out string?paxEaGName)) { _gName = paxEaGName; } // The 'devmajor' header field only fits 8 bytes, or the user could've stored an override in the extended attributes if (TarHelpers.TryGetStringAsBaseTenInteger(ExtendedAttributes, PaxEaDevMajor, out int devMajor)) { _devMajor = devMajor; } // The 'devminor' header field only fits 8 bytes, or the user could've stored an override in the extended attributes if (TarHelpers.TryGetStringAsBaseTenInteger(ExtendedAttributes, PaxEaDevMinor, out int devMinor)) { _devMinor = devMinor; } }