public IList <ExtraField> GetExtraField(ushort fieldID, ZipHeaderLocation location = ZipHeaderLocation.Any, bool required = false) { OperationFlags flags = OperationFlags.None; if (!TranslateLocation(location, out flags)) { return(null); } var ret = new List <ExtraField> (); if (flags == OperationFlags.None) { GatherExtraFields(GetFieldCount(fieldID, location, OperationFlags.Local), fieldID, OperationFlags.Local, ret, required); if (location == ZipHeaderLocation.Any && ret.Count > 0) { return(ret); } GatherExtraFields(GetFieldCount(fieldID, location, OperationFlags.Central), fieldID, OperationFlags.Central, ret, required); } else { GatherExtraFields(GetFieldCount(fieldID, location, flags), fieldID, flags, ret, required); } return(ret.Count > 0 ? ret : null); }
bool TranslateLocation(ZipHeaderLocation location, out OperationFlags flags) { flags = OperationFlags.None; switch (location) { case ZipHeaderLocation.Both: case ZipHeaderLocation.Any: if (localExtraFieldsCount <= 0 && centralExtraFieldsCount <= 0) { return(false); } // Don't set any flags here, native api errors out if it has both central and local flags set break; case ZipHeaderLocation.Central: if (centralExtraFieldsCount <= 0) { return(false); } flags = OperationFlags.Central; break; case ZipHeaderLocation.Local: if (localExtraFieldsCount <= 0) { return(false); } flags = OperationFlags.Local; break; } return(true); }
ushort GetFieldCount(ushort fieldID, ZipHeaderLocation location, OperationFlags flags) { short count = Native.zip_file_extra_fields_count_by_id(archive.ArchivePointer, Index, fieldID, flags); if (count < 0) { count = 0; } return((ushort)count); }
public bool ExtraFieldPresent(ushort fieldID, ZipHeaderLocation location = ZipHeaderLocation.Any) { OperationFlags flags = OperationFlags.None; if (!TranslateLocation(location, out flags)) { return(false); } if (flags != OperationFlags.Central && GetFieldCount(fieldID, location, OperationFlags.Local) > 0) { return(true); } return(GetFieldCount(fieldID, location, OperationFlags.Central) > 0); }