From 1a23dbff9ea7cba27901edb6ead38db22f3ea51a Mon Sep 17 00:00:00 2001 From: Aptivi CEO Date: Sun, 31 Mar 2024 14:08:41 +0300 Subject: [PATCH] imp - prt - Condensed to/from parsers --- We've successfully managed to condense parsers. Now, we need to also condense the vCard string builder to maintain consistency. The equality comparison, however, needs to be fixed. --- Type: imp Breaking: False Doc Required: False Part: 1/2 --- VisualCard.ShowContacts/Program.cs | 11 --- VisualCard/Parsers/VcardParser.cs | 16 ++-- VisualCard/Parsers/VcardParserTools.cs | 90 +++++++++---------- VisualCard/Parts/BaseCardPartInfo.cs | 15 +++- .../Parts/Implementations/AddressInfo.cs | 17 ++-- VisualCard/Parts/Implementations/AgentInfo.cs | 13 ++- .../Parts/Implementations/AnniversaryInfo.cs | 9 +- .../Parts/Implementations/BirthDateInfo.cs | 34 ++----- .../Parts/Implementations/CategoryInfo.cs | 26 ++---- VisualCard/Parts/Implementations/EmailInfo.cs | 56 ++---------- .../Parts/Implementations/GenderInfo.cs | 28 ++---- VisualCard/Parts/Implementations/GeoInfo.cs | 49 ++-------- VisualCard/Parts/Implementations/ImppInfo.cs | 66 +++----------- .../Parts/Implementations/LabelAddressInfo.cs | 66 ++------------ VisualCard/Parts/Implementations/LangInfo.cs | 55 ++---------- VisualCard/Parts/Implementations/LogoInfo.cs | 62 +++---------- VisualCard/Parts/Implementations/NameInfo.cs | 46 ++-------- .../Parts/Implementations/NicknameInfo.cs | 57 +++--------- .../Parts/Implementations/OrganizationInfo.cs | 64 +++---------- VisualCard/Parts/Implementations/PhotoInfo.cs | 62 +++---------- .../Parts/Implementations/RevisionInfo.cs | 24 ++--- VisualCard/Parts/Implementations/RoleInfo.cs | 42 +++------ VisualCard/Parts/Implementations/SoundInfo.cs | 62 +++---------- .../Parts/Implementations/TelephoneInfo.cs | 55 ++---------- .../Parts/Implementations/TimeDateZoneInfo.cs | 52 ++--------- VisualCard/Parts/Implementations/TitleInfo.cs | 39 ++------ VisualCard/Parts/Implementations/XNameInfo.cs | 57 +++--------- VisualCard/Parts/Implementations/XmlInfo.cs | 34 ++----- 28 files changed, 264 insertions(+), 943 deletions(-) diff --git a/VisualCard.ShowContacts/Program.cs b/VisualCard.ShowContacts/Program.cs index 4f2a9fb..f0ebf9f 100644 --- a/VisualCard.ShowContacts/Program.cs +++ b/VisualCard.ShowContacts/Program.cs @@ -94,8 +94,6 @@ static void Main(string[] args) TextWriterColor.Write("First name: {0}", name.ContactFirstName); TextWriterColor.Write("Last name: {0}", name.ContactLastName); TextWriterColor.Write("ALTID: {0}", name.AltId); - if (name.AltArguments?.Length > 0) - TextWriterColor.Write("Reason for ALTID: {0}", name.AltArguments); } // List titles @@ -103,8 +101,6 @@ static void Main(string[] args) { TextWriterColor.Write("Title or Job: {0}", title.ContactTitle); TextWriterColor.Write("ALTID: {0}", title.AltId); - if (title.AltArguments?.Length > 0) - TextWriterColor.Write("Reason for ALTID: {0}", title.AltArguments); } // List addresses @@ -122,7 +118,6 @@ static void Main(string[] args) // List e-mails foreach (EmailInfo Email in Contact.GetPartsArray(PartsArrayEnum.Mails)) { - TextWriterColor.Write("Email types: {0}", Email.ContactEmailTypes); TextWriterColor.Write("Email address: {0}", Email.ContactEmailAddress); } @@ -137,7 +132,6 @@ static void Main(string[] args) // List telephones foreach (TelephoneInfo Telephone in Contact.GetPartsArray(PartsArrayEnum.Telephones)) { - TextWriterColor.Write("Phone types: {0}", Telephone.ContactPhoneTypes); TextWriterColor.Write("Phone number: {0}", Telephone.ContactPhoneNumber); } @@ -145,11 +139,8 @@ static void Main(string[] args) foreach (PhotoInfo Photo in Contact.GetPartsArray(PartsArrayEnum.Photos)) { TextWriterColor.Write("Photo encoding: {0}", Photo.Encoding); - TextWriterColor.Write("Photo type: {0}", Photo.PhotoType); TextWriterColor.Write("Photo value type: {0}", Photo.ValueType); TextWriterColor.Write("ALTID: {0}", Photo.AltId); - if (Photo.AltArguments?.Length > 0) - TextWriterColor.Write("Reason for ALTID: {0}", Photo.AltArguments); TextWriterColor.Write("Photo data: \n{0}", Photo.PhotoEncoded); } @@ -158,8 +149,6 @@ static void Main(string[] args) { TextWriterColor.Write("Role: {0}", Role.ContactRole); TextWriterColor.Write("ALTID: {0}", Role.AltId); - if (Role.AltArguments?.Length > 0) - TextWriterColor.Write("Reason for ALTID: {0}", Role.AltArguments); } // List remaining diff --git a/VisualCard/Parsers/VcardParser.cs b/VisualCard/Parsers/VcardParser.cs index b6f65fa..702bd1d 100644 --- a/VisualCard/Parsers/VcardParser.cs +++ b/VisualCard/Parsers/VcardParser.cs @@ -138,7 +138,10 @@ public Card Parse() // Get the part type and handle it bool xNonstandard = prefix.StartsWith(VcardConstants._xSpecifier); - var (type, enumeration, classType, fromString, fromStringWithType) = VcardParserTools.GetPartType(xNonstandard ? VcardConstants._xSpecifier : prefix); + bool specifierRequired = CardVersion.Major >= 3; + var (type, enumeration, classType, fromString, defaultType, defaultValue) = VcardParserTools.GetPartType(xNonstandard ? VcardConstants._xSpecifier : prefix); + string[] elementTypes = VcardParserTools.GetTypes(splitArgs, defaultType, specifierRequired); + string values = VcardParserTools.GetValuesString(splitArgs, defaultValue, VcardConstants._valueArgumentSpecifier); switch (type) { case PartType.Strings: @@ -195,10 +198,7 @@ public Card Parse() continue; // Now, get the part info - var partInfo = - isWithType ? - fromStringWithType(_value, [.. finalArgs], altId, CardVersion) : - fromString(_value, altId, CardVersion); + var partInfo = fromString(value, [.. finalArgs], altId, elementTypes, values, CardVersion); card.SetPart(partsType, partInfo); } break; @@ -211,10 +211,8 @@ public Card Parse() continue; // Now, get the part info - var partInfo = - isWithType ? - fromStringWithType(_value, [.. finalArgs], altId, CardVersion) : - fromString(_value, altId, CardVersion); + string finalValue = partsArrayType == PartsArrayEnum.NonstandardNames ? _value : value; + var partInfo = fromString(finalValue, [.. finalArgs], altId, elementTypes, values, CardVersion); card.AddPartToArray(partsArrayType, partInfo); } break; diff --git a/VisualCard/Parsers/VcardParserTools.cs b/VisualCard/Parsers/VcardParserTools.cs index f8261c0..dba02e6 100644 --- a/VisualCard/Parsers/VcardParserTools.cs +++ b/VisualCard/Parsers/VcardParserTools.cs @@ -32,12 +32,10 @@ internal class VcardParserTools { internal static string GetTypesString(string[] args, string @default, bool isSpecifierRequired = true) { - // We're given a split of this: "IMPP;TYPE=home:sip:test" delimited by the colon. Split by semicolon to get list of args. - string[] splitArgs = args[0].Split(VcardConstants._fieldDelimiter); - + // We're given an array of split arguments of an element delimited by the colon, such as: "...TYPE=home..." // Filter list of arguments with the arguments that start with the type argument specifier, or, if specifier is not required, // that doesn't have an equals sign - var ArgType = splitArgs.Where((arg) => arg.StartsWith(VcardConstants._typeArgumentSpecifier) || !arg.Contains("=")).ToArray(); + var ArgType = args.Where((arg) => arg.StartsWith(VcardConstants._typeArgumentSpecifier) || !arg.Contains("=")).ToArray(); // Trying to specify type without TYPE= is illegal according to RFC2426 in vCard 3.0 and 4.0 if (ArgType.Count() > 0 && !ArgType[0].StartsWith(VcardConstants._typeArgumentSpecifier) && isSpecifierRequired) @@ -66,15 +64,13 @@ internal static string GetTypesString(string[] args, string @default, bool isSpe } internal static string[] GetTypes(string[] args, string @default, bool isSpecifierRequired = true) => - GetTypesString(args, @default, isSpecifierRequired).Split(VcardConstants._valueDelimiter); + GetTypesString(args, @default, isSpecifierRequired).Split([VcardConstants._valueDelimiter], StringSplitOptions.RemoveEmptyEntries); internal static string GetValuesString(string[] args, string @default, string argSpecifier) { - // We're given a split of this: "IMPP;ARGSPECIFIER=etc;TYPE=home:sip:test" delimited by the colon. Split by semicolon to get list of args. - string[] splitArgs = args[0].Split(VcardConstants._fieldDelimiter); - + // We're given an array of split arguments of an element delimited by the colon, such as: "...TYPE=home..." // Filter list of arguments with the arguments that start with the specified specifier (key) - var argFromSpecifier = splitArgs.Where((arg) => arg.StartsWith(argSpecifier)); + var argFromSpecifier = args.Where((arg) => arg.StartsWith(argSpecifier)); // Attempt to get the value from the key string argString = @@ -85,7 +81,7 @@ internal static string GetValuesString(string[] args, string @default, string ar } internal static string[] GetValues(string[] args, string @default, string argSpecifier) => - GetValuesString(args, @default, argSpecifier).Split(VcardConstants._valueDelimiter); + GetValuesString(args, @default, argSpecifier).Split([VcardConstants._valueDelimiter], StringSplitOptions.RemoveEmptyEntries); internal static bool StringSupported(StringsEnum stringsEnum, Version cardVersion) => stringsEnum switch @@ -201,45 +197,45 @@ partsArrayEnum switch throw new NotImplementedException($"String enumeration {partsArrayEnum} is not implemented.") }; - internal static (PartType type, object enumeration, Type enumType, Func fromStringFunc, Func fromStringWithTypeFunc) GetPartType(string prefix) => + internal static (PartType type, object enumeration, Type enumType, Func fromStringFunc, string defaultType, string defaultValue) GetPartType(string prefix) => prefix switch { - VcardConstants._nameSpecifier => (PartType.PartsArray, PartsArrayEnum.Names, typeof(NameInfo), NameInfo.FromStringVcardStatic, NameInfo.FromStringVcardWithTypeStatic), - VcardConstants._telephoneSpecifier => (PartType.PartsArray, PartsArrayEnum.Telephones, typeof(TelephoneInfo), TelephoneInfo.FromStringVcardStatic, TelephoneInfo.FromStringVcardWithTypeStatic), - VcardConstants._addressSpecifier => (PartType.PartsArray, PartsArrayEnum.Addresses, typeof(AddressInfo), AddressInfo.FromStringVcardStatic, AddressInfo.FromStringVcardWithTypeStatic), - VcardConstants._labelSpecifier => (PartType.PartsArray, PartsArrayEnum.Labels, typeof(LabelAddressInfo), LabelAddressInfo.FromStringVcardStatic, LabelAddressInfo.FromStringVcardWithTypeStatic), - VcardConstants._agentSpecifier => (PartType.PartsArray, PartsArrayEnum.Agents, typeof(AgentInfo), AgentInfo.FromStringVcardStatic, AgentInfo.FromStringVcardWithTypeStatic), - VcardConstants._emailSpecifier => (PartType.PartsArray, PartsArrayEnum.Mails, typeof(EmailInfo), EmailInfo.FromStringVcardStatic, EmailInfo.FromStringVcardWithTypeStatic), - VcardConstants._orgSpecifier => (PartType.PartsArray, PartsArrayEnum.Organizations, typeof(OrganizationInfo), OrganizationInfo.FromStringVcardStatic, OrganizationInfo.FromStringVcardWithTypeStatic), - VcardConstants._titleSpecifier => (PartType.PartsArray, PartsArrayEnum.Titles, typeof(TitleInfo), TitleInfo.FromStringVcardStatic, TitleInfo.FromStringVcardWithTypeStatic), - VcardConstants._photoSpecifier => (PartType.PartsArray, PartsArrayEnum.Photos, typeof(PhotoInfo), PhotoInfo.FromStringVcardStatic, PhotoInfo.FromStringVcardWithTypeStatic), - VcardConstants._nicknameSpecifier => (PartType.PartsArray, PartsArrayEnum.Nicknames, typeof(NicknameInfo), NicknameInfo.FromStringVcardStatic, NicknameInfo.FromStringVcardWithTypeStatic), - VcardConstants._roleSpecifier => (PartType.PartsArray, PartsArrayEnum.Roles, typeof(RoleInfo), RoleInfo.FromStringVcardStatic, RoleInfo.FromStringVcardWithTypeStatic), - VcardConstants._logoSpecifier => (PartType.PartsArray, PartsArrayEnum.Logos, typeof(LogoInfo), LogoInfo.FromStringVcardStatic, LogoInfo.FromStringVcardWithTypeStatic), - VcardConstants._timeZoneSpecifier => (PartType.PartsArray, PartsArrayEnum.TimeZone, typeof(TimeDateZoneInfo), TimeDateZoneInfo.FromStringVcardStatic, TimeDateZoneInfo.FromStringVcardWithTypeStatic), - VcardConstants._geoSpecifier => (PartType.PartsArray, PartsArrayEnum.Geo, typeof(GeoInfo), GeoInfo.FromStringVcardStatic, GeoInfo.FromStringVcardWithTypeStatic), - VcardConstants._soundSpecifier => (PartType.PartsArray, PartsArrayEnum.Sounds, typeof(SoundInfo), SoundInfo.FromStringVcardStatic, SoundInfo.FromStringVcardWithTypeStatic), - VcardConstants._imppSpecifier => (PartType.PartsArray, PartsArrayEnum.Impps, typeof(ImppInfo), ImppInfo.FromStringVcardStatic, ImppInfo.FromStringVcardWithTypeStatic), - VcardConstants._categoriesSpecifier => (PartType.PartsArray, PartsArrayEnum.Categories, typeof(CategoryInfo), CategoryInfo.FromStringVcardStatic, CategoryInfo.FromStringVcardWithTypeStatic), - VcardConstants._langSpecifier => (PartType.PartsArray, PartsArrayEnum.Langs, typeof(LangInfo), LangInfo.FromStringVcardStatic, LangInfo.FromStringVcardWithTypeStatic), - VcardConstants._xmlSpecifier => (PartType.PartsArray, PartsArrayEnum.Xml, typeof(XmlInfo), XmlInfo.FromStringVcardStatic, XmlInfo.FromStringVcardWithTypeStatic), - VcardConstants._xSpecifier => (PartType.PartsArray, PartsArrayEnum.NonstandardNames, typeof(XNameInfo), XNameInfo.FromStringVcardStatic, XNameInfo.FromStringVcardWithTypeStatic), - VcardConstants._revSpecifier => (PartType.Parts, PartsEnum.Revision, typeof(RevisionInfo), RevisionInfo.FromStringVcardStatic, RevisionInfo.FromStringVcardWithTypeStatic), - VcardConstants._birthSpecifier => (PartType.Parts, PartsEnum.Birthdate, typeof(BirthDateInfo), BirthDateInfo.FromStringVcardStatic, BirthDateInfo.FromStringVcardWithTypeStatic), - VcardConstants._anniversarySpecifier => (PartType.Parts, PartsEnum.Anniversary, typeof(AnniversaryInfo), AnniversaryInfo.FromStringVcardStatic, AnniversaryInfo.FromStringVcardWithTypeStatic), - VcardConstants._genderSpecifier => (PartType.Parts, PartsEnum.Gender, typeof(GenderInfo), GenderInfo.FromStringVcardStatic, GenderInfo.FromStringVcardWithTypeStatic), - VcardConstants._fullNameSpecifier => (PartType.Strings, StringsEnum.FullName, null, null, null), - VcardConstants._urlSpecifier => (PartType.Strings, StringsEnum.Url, null, null, null), - VcardConstants._noteSpecifier => (PartType.Strings, StringsEnum.Notes, null, null, null), - VcardConstants._sourceSpecifier => (PartType.Strings, StringsEnum.Source, null, null, null), - VcardConstants._kindSpecifier => (PartType.Strings, StringsEnum.Kind, null, null, null), - VcardConstants._mailerSpecifier => (PartType.Strings, StringsEnum.Mailer, null, null, null), - VcardConstants._productIdSpecifier => (PartType.Strings, StringsEnum.ProductId, null, null, null), - VcardConstants._sortStringSpecifier => (PartType.Strings, StringsEnum.SortString, null, null, null), - VcardConstants._classSpecifier => (PartType.Strings, StringsEnum.AccessClassification, null, null, null), - VcardConstants._fbUrlSpecifier => (PartType.Strings, StringsEnum.FreeBusyUrl, null, null, null), - VcardConstants._calUriSpecifier => (PartType.Strings, StringsEnum.CalendarUrl, null, null, null), - VcardConstants._caladrUriSpecifier => (PartType.Strings, StringsEnum.CalendarSchedulingRequestUrl, null, null, null), + VcardConstants._nameSpecifier => (PartType.PartsArray, PartsArrayEnum.Names, typeof(NameInfo), NameInfo.FromStringVcardStatic, "", ""), + VcardConstants._telephoneSpecifier => (PartType.PartsArray, PartsArrayEnum.Telephones, typeof(TelephoneInfo), TelephoneInfo.FromStringVcardStatic, "CELL", ""), + VcardConstants._addressSpecifier => (PartType.PartsArray, PartsArrayEnum.Addresses, typeof(AddressInfo), AddressInfo.FromStringVcardStatic, "HOME", ""), + VcardConstants._labelSpecifier => (PartType.PartsArray, PartsArrayEnum.Labels, typeof(LabelAddressInfo), LabelAddressInfo.FromStringVcardStatic, "", ""), + VcardConstants._agentSpecifier => (PartType.PartsArray, PartsArrayEnum.Agents, typeof(AgentInfo), AgentInfo.FromStringVcardStatic, "", ""), + VcardConstants._emailSpecifier => (PartType.PartsArray, PartsArrayEnum.Mails, typeof(EmailInfo), EmailInfo.FromStringVcardStatic, "HOME", ""), + VcardConstants._orgSpecifier => (PartType.PartsArray, PartsArrayEnum.Organizations, typeof(OrganizationInfo), OrganizationInfo.FromStringVcardStatic, "", ""), + VcardConstants._titleSpecifier => (PartType.PartsArray, PartsArrayEnum.Titles, typeof(TitleInfo), TitleInfo.FromStringVcardStatic, "", ""), + VcardConstants._photoSpecifier => (PartType.PartsArray, PartsArrayEnum.Photos, typeof(PhotoInfo), PhotoInfo.FromStringVcardStatic, "", ""), + VcardConstants._nicknameSpecifier => (PartType.PartsArray, PartsArrayEnum.Nicknames, typeof(NicknameInfo), NicknameInfo.FromStringVcardStatic, "", ""), + VcardConstants._roleSpecifier => (PartType.PartsArray, PartsArrayEnum.Roles, typeof(RoleInfo), RoleInfo.FromStringVcardStatic, "", ""), + VcardConstants._logoSpecifier => (PartType.PartsArray, PartsArrayEnum.Logos, typeof(LogoInfo), LogoInfo.FromStringVcardStatic, "", ""), + VcardConstants._timeZoneSpecifier => (PartType.PartsArray, PartsArrayEnum.TimeZone, typeof(TimeDateZoneInfo), TimeDateZoneInfo.FromStringVcardStatic, "", ""), + VcardConstants._geoSpecifier => (PartType.PartsArray, PartsArrayEnum.Geo, typeof(GeoInfo), GeoInfo.FromStringVcardStatic, "", ""), + VcardConstants._soundSpecifier => (PartType.PartsArray, PartsArrayEnum.Sounds, typeof(SoundInfo), SoundInfo.FromStringVcardStatic, "", ""), + VcardConstants._imppSpecifier => (PartType.PartsArray, PartsArrayEnum.Impps, typeof(ImppInfo), ImppInfo.FromStringVcardStatic, "", ""), + VcardConstants._categoriesSpecifier => (PartType.PartsArray, PartsArrayEnum.Categories, typeof(CategoryInfo), CategoryInfo.FromStringVcardStatic, "", ""), + VcardConstants._langSpecifier => (PartType.PartsArray, PartsArrayEnum.Langs, typeof(LangInfo), LangInfo.FromStringVcardStatic, "", ""), + VcardConstants._xmlSpecifier => (PartType.PartsArray, PartsArrayEnum.Xml, typeof(XmlInfo), XmlInfo.FromStringVcardStatic, "", ""), + VcardConstants._xSpecifier => (PartType.PartsArray, PartsArrayEnum.NonstandardNames, typeof(XNameInfo), XNameInfo.FromStringVcardStatic, "", ""), + VcardConstants._revSpecifier => (PartType.Parts, PartsEnum.Revision, typeof(RevisionInfo), RevisionInfo.FromStringVcardStatic, "", ""), + VcardConstants._birthSpecifier => (PartType.Parts, PartsEnum.Birthdate, typeof(BirthDateInfo), BirthDateInfo.FromStringVcardStatic, "", ""), + VcardConstants._anniversarySpecifier => (PartType.Parts, PartsEnum.Anniversary, typeof(AnniversaryInfo), AnniversaryInfo.FromStringVcardStatic, "", ""), + VcardConstants._genderSpecifier => (PartType.Parts, PartsEnum.Gender, typeof(GenderInfo), GenderInfo.FromStringVcardStatic, "", ""), + VcardConstants._fullNameSpecifier => (PartType.Strings, StringsEnum.FullName, null, null, "", ""), + VcardConstants._urlSpecifier => (PartType.Strings, StringsEnum.Url, null, null, "", ""), + VcardConstants._noteSpecifier => (PartType.Strings, StringsEnum.Notes, null, null, "", ""), + VcardConstants._sourceSpecifier => (PartType.Strings, StringsEnum.Source, null, null, "", ""), + VcardConstants._kindSpecifier => (PartType.Strings, StringsEnum.Kind, null, null, "", ""), + VcardConstants._mailerSpecifier => (PartType.Strings, StringsEnum.Mailer, null, null, "", ""), + VcardConstants._productIdSpecifier => (PartType.Strings, StringsEnum.ProductId, null, null, "", ""), + VcardConstants._sortStringSpecifier => (PartType.Strings, StringsEnum.SortString, null, null, "", ""), + VcardConstants._classSpecifier => (PartType.Strings, StringsEnum.AccessClassification, null, null, "", ""), + VcardConstants._fbUrlSpecifier => (PartType.Strings, StringsEnum.FreeBusyUrl, null, null, "", ""), + VcardConstants._calUriSpecifier => (PartType.Strings, StringsEnum.CalendarUrl, null, null, "", ""), + VcardConstants._caladrUriSpecifier => (PartType.Strings, StringsEnum.CalendarSchedulingRequestUrl, null, null, "", ""), _ => throw new InvalidOperationException($"Unknown prefix {prefix}"), }; diff --git a/VisualCard/Parts/BaseCardPartInfo.cs b/VisualCard/Parts/BaseCardPartInfo.cs index 4128977..1f93af3 100644 --- a/VisualCard/Parts/BaseCardPartInfo.cs +++ b/VisualCard/Parts/BaseCardPartInfo.cs @@ -73,8 +73,8 @@ public bool Equals(BaseCardPartInfo source, BaseCardPartInfo target) // Check all the properties return source.Arguments.SequenceEqual(target.Arguments) && + source.ElementTypes.SequenceEqual(target.ElementTypes) && source.AltId == target.AltId && - source.ElementTypes == target.ElementTypes && source.ValueType == target.ValueType ; } @@ -96,7 +96,7 @@ public override int GetHashCode() /// public static bool operator ==(BaseCardPartInfo left, BaseCardPartInfo right) => - EqualityComparer.Default.Equals(left, right); + left.Equals(right); /// public static bool operator !=(BaseCardPartInfo left, BaseCardPartInfo right) => @@ -105,5 +105,16 @@ public override int GetHashCode() internal abstract BaseCardPartInfo FromStringVcardInternal(string value, string[] finalArgs, int altId, string[] elementTypes, string valueType, Version cardVersion); internal abstract string ToStringVcardInternal(Version cardVersion); + + internal BaseCardPartInfo() + { } + + internal BaseCardPartInfo(string[] arguments, int altId, string[] elementTypes, string valueType) + { + Arguments = arguments; + AltId = altId; + ElementTypes = elementTypes; + ValueType = valueType; + } } } diff --git a/VisualCard/Parts/Implementations/AddressInfo.cs b/VisualCard/Parts/Implementations/AddressInfo.cs index 8083aa1..fd67f97 100644 --- a/VisualCard/Parts/Implementations/AddressInfo.cs +++ b/VisualCard/Parts/Implementations/AddressInfo.cs @@ -102,14 +102,14 @@ internal override BaseCardPartInfo FromStringVcardInternal(string value, string[ bool altIdSupported = cardVersion.Major >= 4; // Get the value - string[] splitAdr = value.Split(VcardConstants._argumentDelimiter); + string[] splitAdr = value.Split(VcardConstants._fieldDelimiter); // Check the provided address if (splitAdr.Length < 7) throw new InvalidDataException("Address information must specify exactly seven values (P.O. Box, extended address, street address, locality, region, postal code, and country)"); // Populate the fields - string[] _addressTypes = elementTypes.Length >= 0 ? elementTypes : ["HOME"]; + string[] _addressTypes = elementTypes.Length >= 1 ? elementTypes : ["HOME"]; string _addressPOBox = Regex.Unescape(splitAdr[0]); string _addressExtended = Regex.Unescape(splitAdr[1]); string _addressStreet = Regex.Unescape(splitAdr[2]); @@ -175,20 +175,19 @@ public override int GetHashCode() /// public static bool operator ==(AddressInfo left, AddressInfo right) => - EqualityComparer.Default.Equals(left, right); + left.Equals(right); /// public static bool operator !=(AddressInfo left, AddressInfo right) => !(left == right); - internal AddressInfo() { } + internal AddressInfo() : + base() + { } - internal AddressInfo(int altId, string[] arguments, string[] elementTypes, string valueType, string postOfficeBox, string extendedAddress, string streetAddress, string locality, string region, string postalCode, string country) + internal AddressInfo(int altId, string[] arguments, string[] elementTypes, string valueType, string postOfficeBox, string extendedAddress, string streetAddress, string locality, string region, string postalCode, string country) : + base(arguments, altId, elementTypes, valueType) { - AltId = altId; - Arguments = arguments; - ElementTypes = elementTypes; - ValueType = valueType; PostOfficeBox = postOfficeBox; ExtendedAddress = extendedAddress; StreetAddress = streetAddress; diff --git a/VisualCard/Parts/Implementations/AgentInfo.cs b/VisualCard/Parts/Implementations/AgentInfo.cs index 22692f8..35dce36 100644 --- a/VisualCard/Parts/Implementations/AgentInfo.cs +++ b/VisualCard/Parts/Implementations/AgentInfo.cs @@ -128,20 +128,19 @@ public override int GetHashCode() /// public static bool operator ==(AgentInfo left, AgentInfo right) => - EqualityComparer.Default.Equals(left, right); + left.Equals(right); /// public static bool operator !=(AgentInfo left, AgentInfo right) => !(left == right); - internal AgentInfo() { } + internal AgentInfo() : + base() + { } - internal AgentInfo(int altId, string[] arguments, string[] elementTypes, string valueType, Card[] agentCard) + internal AgentInfo(int altId, string[] arguments, string[] elementTypes, string valueType, Card[] agentCard) : + base(arguments, altId, elementTypes, valueType) { - AltId = altId; - Arguments = arguments; - ElementTypes = elementTypes; - ValueType = valueType; AgentCards = agentCard; } } diff --git a/VisualCard/Parts/Implementations/AnniversaryInfo.cs b/VisualCard/Parts/Implementations/AnniversaryInfo.cs index 7a96514..acd3848 100644 --- a/VisualCard/Parts/Implementations/AnniversaryInfo.cs +++ b/VisualCard/Parts/Implementations/AnniversaryInfo.cs @@ -105,7 +105,7 @@ public override int GetHashCode() /// public static bool operator ==(AnniversaryInfo left, AnniversaryInfo right) => - EqualityComparer.Default.Equals(left, right); + left.Equals(right); /// public static bool operator !=(AnniversaryInfo left, AnniversaryInfo right) => @@ -113,12 +113,9 @@ public override int GetHashCode() internal AnniversaryInfo() { } - internal AnniversaryInfo(int altId, string[] arguments, string[] elementTypes, string valueType, DateTime? anniversary) + internal AnniversaryInfo(int altId, string[] arguments, string[] elementTypes, string valueType, DateTime? anniversary) : + base(arguments, altId, elementTypes, valueType) { - AltId = altId; - Arguments = arguments; - ElementTypes = elementTypes; - ValueType = valueType; Anniversary = anniversary; } } diff --git a/VisualCard/Parts/Implementations/BirthDateInfo.cs b/VisualCard/Parts/Implementations/BirthDateInfo.cs index 651cbc1..8888d2a 100644 --- a/VisualCard/Parts/Implementations/BirthDateInfo.cs +++ b/VisualCard/Parts/Implementations/BirthDateInfo.cs @@ -43,27 +43,6 @@ public class BirthDateInfo : BaseCardPartInfo, IEquatable $"{VcardConstants._birthSpecifier}:{BirthDate:yyyyMMdd}"; internal override BaseCardPartInfo FromStringVcardInternal(string value, string[] finalArgs, int altId, string[] elementTypes, string valueType, Version cardVersion) - { - // Get the value - string bdayValue = value.Substring(VcardConstants._birthSpecifier.Length + 1); - - // Populate the fields - return InstallInfo(bdayValue, altId, cardVersion); - } - - internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion) - { - // Get the value - string bdayValue = value.Substring(value.IndexOf(VcardConstants._argumentDelimiter) + 1); - - // Populate the fields - return InstallInfo(bdayValue, finalArgs, altId, cardVersion); - } - - private BirthDateInfo InstallInfo(string value, int altId, Version cardVersion) => - InstallInfo(value, [], altId, cardVersion); - - private BirthDateInfo InstallInfo(string value, string[] finalArgs, int altId, Version cardVersion) { // Populate field DateTime bday; @@ -111,7 +90,6 @@ public bool Equals(BirthDateInfo source, BirthDateInfo target) // Check all the properties return - source.AltArguments.SequenceEqual(target.AltArguments) && base.Equals(source, target) && source.BirthDate == target.BirthDate ; @@ -120,16 +98,15 @@ public bool Equals(BirthDateInfo source, BirthDateInfo target) /// public override int GetHashCode() { - int hashCode = -480211805; - hashCode = hashCode * -1521134295 + AltId.GetHashCode(); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(AltArguments); + int hashCode = 653635456; + hashCode = hashCode * -1521134295 + base.GetHashCode(); hashCode = hashCode * -1521134295 + BirthDate.GetHashCode(); return hashCode; } /// public static bool operator ==(BirthDateInfo left, BirthDateInfo right) => - EqualityComparer.Default.Equals(left, right); + left.Equals(right); /// public static bool operator !=(BirthDateInfo left, BirthDateInfo right) => @@ -137,10 +114,9 @@ public override int GetHashCode() internal BirthDateInfo() { } - internal BirthDateInfo(int altId, string[] arguments, string[] elementTypes, string valueType, DateTime? birth) + internal BirthDateInfo(int altId, string[] arguments, string[] elementTypes, string valueType, DateTime? birth) : + base(arguments, altId, elementTypes, valueType) { - AltId = altId; - Arguments = arguments; BirthDate = birth; } } diff --git a/VisualCard/Parts/Implementations/CategoryInfo.cs b/VisualCard/Parts/Implementations/CategoryInfo.cs index d6d9a2e..191931d 100644 --- a/VisualCard/Parts/Implementations/CategoryInfo.cs +++ b/VisualCard/Parts/Implementations/CategoryInfo.cs @@ -49,23 +49,11 @@ internal override string ToStringVcardInternal(Version cardVersion) internal override BaseCardPartInfo FromStringVcardInternal(string value, string[] finalArgs, int altId, string[] elementTypes, string valueType, Version cardVersion) { - // Get the value - string categoryValue = value.Substring(VcardConstants._categoriesSpecifier.Length + 1); - // Populate the fields - return InstallInfo(categoryValue); - } - - internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion) => - FromStringVcardInternal(value, altId, cardVersion); - - private CategoryInfo InstallInfo(string value) - { - // Populate field var categories = Regex.Unescape(value).Split(','); // Add the fetched information - CategoryInfo _time = new(0, [], categories); + CategoryInfo _time = new(0, [], elementTypes, valueType, categories); return _time; } @@ -95,7 +83,6 @@ public bool Equals(CategoryInfo source, CategoryInfo target) // Check all the properties return - source.AltArguments.SequenceEqual(target.AltArguments) && base.Equals(source, target) && source.Category == target.Category ; @@ -104,17 +91,15 @@ public bool Equals(CategoryInfo source, CategoryInfo target) /// public override int GetHashCode() { - int hashCode = 1152977432; + int hashCode = -723142617; hashCode = hashCode * -1521134295 + base.GetHashCode(); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(AltArguments); - hashCode = hashCode * -1521134295 + AltId.GetHashCode(); hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(Category); return hashCode; } /// public static bool operator ==(CategoryInfo left, CategoryInfo right) => - EqualityComparer.Default.Equals(left, right); + left.Equals(right); /// public static bool operator !=(CategoryInfo left, CategoryInfo right) => @@ -122,10 +107,9 @@ public override int GetHashCode() internal CategoryInfo() { } - internal CategoryInfo(int altId, string[] arguments, string[] elementTypes, string valueType, string[] category) + internal CategoryInfo(int altId, string[] arguments, string[] elementTypes, string valueType, string[] category) : + base(arguments, altId, elementTypes, valueType) { - AltId = altId; - Arguments = arguments; Category = category; } } diff --git a/VisualCard/Parts/Implementations/EmailInfo.cs b/VisualCard/Parts/Implementations/EmailInfo.cs index a92bda6..8a059b3 100644 --- a/VisualCard/Parts/Implementations/EmailInfo.cs +++ b/VisualCard/Parts/Implementations/EmailInfo.cs @@ -33,10 +33,6 @@ namespace VisualCard.Parts.Implementations [DebuggerDisplay("E-mail = {ContactEmailAddress}")] public class EmailInfo : BaseCardPartInfo, IEquatable { - /// - /// The contact's email types - /// - public string[] ContactEmailTypes { get; } /// /// The contact's email address /// @@ -54,54 +50,27 @@ internal override string ToStringVcardInternal(Version cardVersion) return $"{VcardConstants._emailSpecifier};" + $"{(installAltId ? VcardConstants._altIdArgumentSpecifier + AltId + VcardConstants._fieldDelimiter : "")}" + - $"{VcardConstants._typeArgumentSpecifier}{string.Join(",", ContactEmailTypes)}{VcardConstants._argumentDelimiter}" + + $"{VcardConstants._typeArgumentSpecifier}{string.Join(",", ElementTypes)}{VcardConstants._argumentDelimiter}" + $"{ContactEmailAddress}"; } else { return $"{VcardConstants._emailSpecifier};" + - $"{VcardConstants._typeArgumentSpecifier}{string.Join(",", ContactEmailTypes)}{VcardConstants._argumentDelimiter}" + + $"{VcardConstants._typeArgumentSpecifier}{string.Join(",", ElementTypes)}{VcardConstants._argumentDelimiter}" + $"{ContactEmailAddress}"; } } internal override BaseCardPartInfo FromStringVcardInternal(string value, string[] finalArgs, int altId, string[] elementTypes, string valueType, Version cardVersion) - { - // Get the value - string mailValue = value.Substring(VcardConstants._emailSpecifier.Length + 1); - string[] splitMail = mailValue.Split(VcardConstants._argumentDelimiter); - - // Populate the fields - return InstallInfo(splitMail, altId, cardVersion); - } - - internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion) - { - // Get the value - string mailValue = value.Substring(VcardConstants._emailSpecifier.Length + 1); - string[] splitMail = mailValue.Split(VcardConstants._argumentDelimiter); - if (splitMail.Length < 2) - throw new InvalidDataException("E-mail field must specify exactly two values (Type (must be prepended with TYPE=), and a valid e-mail address)"); - - // Populate the fields - return InstallInfo(splitMail, finalArgs, altId, cardVersion); - } - - private EmailInfo InstallInfo(string[] splitMail, int altId, Version cardVersion) => - InstallInfo(splitMail, [], altId, cardVersion); - - private EmailInfo InstallInfo(string[] splitMail, string[] finalArgs, int altId, Version cardVersion) { MailAddress mail; bool altIdSupported = cardVersion.Major >= 4; - bool installType = splitMail.Length > 1; - bool specifierRequired = cardVersion.Major >= 3; // Try to create mail address try { - mail = new MailAddress(installType ? splitMail[1] : splitMail[0]); + mail = new MailAddress(value); } catch (ArgumentException aex) { @@ -109,9 +78,8 @@ private EmailInfo InstallInfo(string[] splitMail, string[] finalArgs, int altId, } // Populate the fields - string[] _emailTypes = installType ? VcardParserTools.GetTypes(splitMail, "HOME", specifierRequired) : ["HOME"]; string _emailAddress = mail.Address; - EmailInfo _address = new(altIdSupported ? altId : 0, finalArgs, elementTypes, valueType, _emailTypes, _emailAddress); + EmailInfo _address = new(altIdSupported ? altId : 0, finalArgs, elementTypes, valueType, _emailAddress); return _address; } @@ -149,17 +117,15 @@ public bool Equals(EmailInfo source, EmailInfo target) /// public override int GetHashCode() { - int hashCode = 2091849342; - hashCode = hashCode * -1521134295 + AltId.GetHashCode(); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(AltArguments); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(ContactEmailTypes); + int hashCode = -1504605771; + hashCode = hashCode * -1521134295 + base.GetHashCode(); hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(ContactEmailAddress); return hashCode; } /// public static bool operator ==(EmailInfo left, EmailInfo right) => - EqualityComparer.Default.Equals(left, right); + left.Equals(right); /// public static bool operator !=(EmailInfo left, EmailInfo right) => @@ -167,13 +133,9 @@ public override int GetHashCode() internal EmailInfo() { } - internal EmailInfo(int altId, string[] arguments, string[] elementTypes, string valueType, string[] contactEmailTypes, string contactEmailAddress) + internal EmailInfo(int altId, string[] arguments, string[] elementTypes, string valueType, string contactEmailAddress) : + base(arguments, altId, elementTypes, valueType) { - AltId = altId; - Arguments = arguments; - ElementTypes = elementTypes; - ValueType = valueType; - ContactEmailTypes = contactEmailTypes; ContactEmailAddress = contactEmailAddress; } } diff --git a/VisualCard/Parts/Implementations/GenderInfo.cs b/VisualCard/Parts/Implementations/GenderInfo.cs index 30363cb..ede834d 100644 --- a/VisualCard/Parts/Implementations/GenderInfo.cs +++ b/VisualCard/Parts/Implementations/GenderInfo.cs @@ -51,18 +51,6 @@ public class GenderInfo : BaseCardPartInfo, IEquatable (!string.IsNullOrEmpty(GenderDescription) ? $"{VcardConstants._fieldDelimiter}{GenderDescription}" : ""); internal override BaseCardPartInfo FromStringVcardInternal(string value, string[] finalArgs, int altId, string[] elementTypes, string valueType, Version cardVersion) - { - // Get the value - string genderValue = value.Substring(VcardConstants._genderSpecifier.Length + 1); - - // Populate the fields - return InstallInfo(genderValue); - } - - internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion) => - FromStringVcardInternal(value, altId, cardVersion); - - private GenderInfo InstallInfo(string value) { // Populate field string genderString = value; @@ -85,13 +73,13 @@ private GenderInfo InstallInfo(string value) "O" => Gender.Other, "N" => Gender.NotApplicable, "U" => Gender.Unknown, - "" => Gender.Unspecified, + "" => Gender.Unspecified, _ => throw new InvalidDataException($"Invalid gender string {genderString}") }; // Add the fetched information - GenderInfo _gender = new(0, [], gender, genderDescription); + GenderInfo _gender = new(0, [], elementTypes, valueType, gender, genderDescription); return _gender; } @@ -121,7 +109,6 @@ public bool Equals(GenderInfo source, GenderInfo target) // Check all the properties return - source.AltArguments.SequenceEqual(target.AltArguments) && base.Equals(source, target) && source.Gender == target.Gender && source.GenderDescription == target.GenderDescription @@ -131,10 +118,8 @@ public bool Equals(GenderInfo source, GenderInfo target) /// public override int GetHashCode() { - int hashCode = -446160983; + int hashCode = 1213594384; hashCode = hashCode * -1521134295 + base.GetHashCode(); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(AltArguments); - hashCode = hashCode * -1521134295 + AltId.GetHashCode(); hashCode = hashCode * -1521134295 + Gender.GetHashCode(); hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(GenderDescription); return hashCode; @@ -142,7 +127,7 @@ public override int GetHashCode() /// public static bool operator ==(GenderInfo left, GenderInfo right) => - EqualityComparer.Default.Equals(left, right); + left.Equals(right); /// public static bool operator !=(GenderInfo left, GenderInfo right) => @@ -150,10 +135,9 @@ public override int GetHashCode() internal GenderInfo() { } - internal GenderInfo(int altId, string[] arguments, string[] elementTypes, string valueType, Gender gender, string genderDescription) + internal GenderInfo(int altId, string[] arguments, string[] elementTypes, string valueType, Gender gender, string genderDescription) : + base(arguments, altId, elementTypes, valueType) { - AltId = altId; - Arguments = arguments; Gender = gender; GenderDescription = genderDescription; } diff --git a/VisualCard/Parts/Implementations/GeoInfo.cs b/VisualCard/Parts/Implementations/GeoInfo.cs index 738b80d..55a2111 100644 --- a/VisualCard/Parts/Implementations/GeoInfo.cs +++ b/VisualCard/Parts/Implementations/GeoInfo.cs @@ -33,10 +33,6 @@ namespace VisualCard.Parts.Implementations [DebuggerDisplay("Geography = {Geo}")] public class GeoInfo : BaseCardPartInfo, IEquatable { - /// - /// The contact's geographical information types - /// - public string[] GeoTypes { get; } /// /// The contact's geographical information /// @@ -54,7 +50,7 @@ internal override string ToStringVcardInternal(Version cardVersion) return $"{VcardConstants._geoSpecifier}{(installAltId ? VcardConstants._fieldDelimiter : VcardConstants._argumentDelimiter)}" + $"{(installAltId ? VcardConstants._altIdArgumentSpecifier + AltId + VcardConstants._fieldDelimiter : "")}" + - $"{(installAltId ? string.Join(VcardConstants._fieldDelimiter.ToString(), AltArguments) + VcardConstants._argumentDelimiter : "")}" + + $"{(installAltId ? string.Join(VcardConstants._fieldDelimiter.ToString(), Arguments) + VcardConstants._argumentDelimiter : "")}" + $"{Geo}"; } else @@ -71,35 +67,10 @@ internal override BaseCardPartInfo FromStringVcardInternal(string value, string[ string geoValue = value.Substring(VcardConstants._geoSpecifier.Length + 1); string _geoStr = Regex.Unescape(geoValue); - // Populate the fields - return InstallInfo([_geoStr], false, altId, cardVersion); - } - - internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion) - { - // Get the value - string geoValue = value.Substring(VcardConstants._geoSpecifier.Length + 1); - string[] splitGeo = geoValue.Split(VcardConstants._argumentDelimiter); - if (splitGeo.Length < 2) - throw new InvalidDataException("Geo field must specify exactly two values (VALUE=\"uri\", and geo info)"); - - // Populate the fields - return InstallInfo(splitGeo, true, finalArgs, altId, cardVersion); - } - - private GeoInfo InstallInfo(string[] splitGeo, bool installType, int altId, Version cardVersion) => - InstallInfo(splitGeo, installType, [], altId, cardVersion); - - private GeoInfo InstallInfo(string[] splitGeo, bool installType, string[] finalArgs, int altId, Version cardVersion) - { bool altIdSupported = cardVersion.Major >= 4; - bool typesSupported = cardVersion.Major >= 3; - - string[] _geoTypes = typesSupported ? installType ? VcardParserTools.GetValues(splitGeo, "", VcardConstants._valueArgumentSpecifier) : ["uri"] : []; - string _geoStr = Regex.Unescape(typesSupported ? installType ? splitGeo[1] : splitGeo[0] : splitGeo[0]); // Populate the fields - GeoInfo _geo = new(altIdSupported ? altId : 0, finalArgs, elementTypes, valueType, _geoTypes, _geoStr); + GeoInfo _geo = new(altIdSupported ? altId : 0, finalArgs, elementTypes, valueType, _geoStr); return _geo; } @@ -129,8 +100,6 @@ public bool Equals(GeoInfo source, GeoInfo target) // Check all the properties return - source.AltArguments.SequenceEqual(target.AltArguments) && - source.GeoTypes.SequenceEqual(target.GeoTypes) && base.Equals(source, target) && source.Geo == target.Geo ; @@ -139,17 +108,15 @@ public bool Equals(GeoInfo source, GeoInfo target) /// public override int GetHashCode() { - int hashCode = -772623698; - hashCode = hashCode * -1521134295 + AltId.GetHashCode(); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(AltArguments); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(GeoTypes); + int hashCode = -456581192; + hashCode = hashCode * -1521134295 + base.GetHashCode(); hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(Geo); return hashCode; } /// public static bool operator ==(GeoInfo left, GeoInfo right) => - EqualityComparer.Default.Equals(left, right); + left.Equals(right); /// public static bool operator !=(GeoInfo left, GeoInfo right) => @@ -157,11 +124,9 @@ public override int GetHashCode() internal GeoInfo() { } - internal GeoInfo(int altId, string[] arguments, string[] elementTypes, string valueType, string[] geoTypes, string geo) + internal GeoInfo(int altId, string[] arguments, string[] elementTypes, string valueType, string geo) : + base(arguments, altId, elementTypes, valueType) { - AltId = altId; - Arguments = arguments; - GeoTypes = geoTypes; Geo = geo; } } diff --git a/VisualCard/Parts/Implementations/ImppInfo.cs b/VisualCard/Parts/Implementations/ImppInfo.cs index 44f235a..3e5daf4 100644 --- a/VisualCard/Parts/Implementations/ImppInfo.cs +++ b/VisualCard/Parts/Implementations/ImppInfo.cs @@ -37,10 +37,6 @@ public class ImppInfo : BaseCardPartInfo, IEquatable /// The contact's IMPP information, such as SIP and XMPP /// public string ContactIMPP { get; } - /// - /// The contact's IMPP info types - /// - public string[] ImppTypes { get; } internal static BaseCardPartInfo FromStringVcardStatic(string value, string[] finalArgs, int altId, string[] elementTypes, string valueType, Version cardVersion) => new ImppInfo().FromStringVcardInternal(value, finalArgs, altId, elementTypes, valueType, cardVersion); @@ -51,62 +47,30 @@ internal override string ToStringVcardInternal(Version cardVersion) if (altIdSupported) { bool installAltId = AltId >= 0 && Arguments.Length > 0; - bool installType = ImppTypes.Length > 0 && ImppTypes[0].ToUpper() != "HOME"; + bool installType = ElementTypes.Length > 0 && ElementTypes[0].ToUpper() != "HOME"; return $"{VcardConstants._imppSpecifier}{(installType || installAltId ? VcardConstants._fieldDelimiter : VcardConstants._argumentDelimiter)}" + $"{(installAltId ? VcardConstants._altIdArgumentSpecifier + AltId + (installType ? VcardConstants._fieldDelimiter : VcardConstants._argumentDelimiter) : "")}" + - $"{(installType ? $"{VcardConstants._typeArgumentSpecifier}{string.Join(",", ImppTypes)}{VcardConstants._argumentDelimiter}" : "")}" + + $"{(installType ? $"{VcardConstants._typeArgumentSpecifier}{string.Join(",", ElementTypes)}{VcardConstants._argumentDelimiter}" : "")}" + $"{ContactIMPP}"; } else { - bool installType = ImppTypes.Length > 0 && ImppTypes[0].ToUpper() != "HOME"; + bool installType = ElementTypes.Length > 0 && ElementTypes[0].ToUpper() != "HOME"; return $"{VcardConstants._imppSpecifier}{(installType ? VcardConstants._fieldDelimiter : VcardConstants._argumentDelimiter)}" + - $"{(installType ? $"{VcardConstants._typeArgumentSpecifier}{string.Join(",", ImppTypes)}{VcardConstants._argumentDelimiter}" : "")}" + + $"{(installType ? $"{VcardConstants._typeArgumentSpecifier}{string.Join(",", ElementTypes)}{VcardConstants._argumentDelimiter}" : "")}" + $"{ContactIMPP}"; } } internal override BaseCardPartInfo FromStringVcardInternal(string value, string[] finalArgs, int altId, string[] elementTypes, string valueType, Version cardVersion) - { - // Get the value - string imppValue = value.Substring(VcardConstants._imppSpecifier.Length + 1); - string[] _imppTypes = ["HOME"]; - - // Populate the fields - return InstallInfo(_imppTypes, imppValue, altId, cardVersion); - } - - internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion) - { - bool specifierRequired = cardVersion.Major >= 3; - - // Get the value - string imppValue = value.Substring(VcardConstants._imppSpecifier.Length + 1); - string[] splitImpp = imppValue.Split(VcardConstants._argumentDelimiter); - if (splitImpp.Length < 2) - throw new InvalidDataException("IMPP information field must specify exactly two values (Type (must be prepended with TYPE=), and impp)"); - - // Install the values - string[] _imppTypes = VcardParserTools.GetTypes(splitImpp, "SIP", specifierRequired); - - // Populate the fields - return InstallInfo(_imppTypes, imppValue, finalArgs, altId, cardVersion); - } - - private ImppInfo InstallInfo(string[] types, string imppValue, int altId, Version cardVersion) => - InstallInfo(types, imppValue, [], altId, cardVersion); - - private ImppInfo InstallInfo(string[] types, string imppValue, string[] finalArgs, int altId, Version cardVersion) { bool altIdSupported = cardVersion.Major >= 4; - string _impp = - imppValue.Contains(':') ? - Regex.Unescape(imppValue.Substring(imppValue.IndexOf(":") + 1)) : - Regex.Unescape(imppValue); - ImppInfo _imppInstance = new(altIdSupported ? altId : 0, finalArgs, elementTypes, valueType, _impp, types); + // Populate the fields + string _impp = Regex.Unescape(value); + ImppInfo _imppInstance = new(altIdSupported ? altId : 0, finalArgs, elementTypes, valueType, _impp); return _imppInstance; } @@ -136,8 +100,6 @@ public bool Equals(ImppInfo source, ImppInfo target) // Check all the properties return - source.AltArguments.SequenceEqual(target.AltArguments) && - source.ImppTypes.SequenceEqual(target.ImppTypes) && base.Equals(source, target) && source.ContactIMPP == target.ContactIMPP ; @@ -146,17 +108,15 @@ public bool Equals(ImppInfo source, ImppInfo target) /// public override int GetHashCode() { - int hashCode = -700274766; - hashCode = hashCode * -1521134295 + AltId.GetHashCode(); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(AltArguments); + int hashCode = 175591591; + hashCode = hashCode * -1521134295 + base.GetHashCode(); hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(ContactIMPP); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(ImppTypes); return hashCode; } /// public static bool operator ==(ImppInfo left, ImppInfo right) => - EqualityComparer.Default.Equals(left, right); + left.Equals(right); /// public static bool operator !=(ImppInfo left, ImppInfo right) => @@ -164,12 +124,10 @@ public override int GetHashCode() internal ImppInfo() { } - internal ImppInfo(int altId, string[] arguments, string[] elementTypes, string valueType, string contactImpp, string[] imppTypes) + internal ImppInfo(int altId, string[] arguments, string[] elementTypes, string valueType, string contactImpp) : + base(arguments, altId, elementTypes, valueType) { - AltId = altId; - Arguments = arguments; ContactIMPP = contactImpp; - ImppTypes = imppTypes; } } } diff --git a/VisualCard/Parts/Implementations/LabelAddressInfo.cs b/VisualCard/Parts/Implementations/LabelAddressInfo.cs index f7d11fa..584b695 100644 --- a/VisualCard/Parts/Implementations/LabelAddressInfo.cs +++ b/VisualCard/Parts/Implementations/LabelAddressInfo.cs @@ -33,10 +33,6 @@ namespace VisualCard.Parts.Implementations [DebuggerDisplay("LabelAddress = {DeliveryLabel}")] public class LabelAddressInfo : BaseCardPartInfo, IEquatable { - /// - /// The contact's address types - /// - public string[] AddressTypes { get; } /// /// The contact's delivery address label /// @@ -54,63 +50,25 @@ internal override string ToStringVcardInternal(Version cardVersion) return $"{VcardConstants._labelSpecifier};" + $"{(installAltId ? VcardConstants._altIdArgumentSpecifier + AltId + VcardConstants._fieldDelimiter : "")}" + - $"{VcardConstants._typeArgumentSpecifier}{string.Join(",", AddressTypes)}{VcardConstants._argumentDelimiter}" + + $"{VcardConstants._typeArgumentSpecifier}{string.Join(",", ElementTypes)}{VcardConstants._argumentDelimiter}" + $"{DeliveryLabel}"; } else { return $"{VcardConstants._labelSpecifier};" + - $"{VcardConstants._typeArgumentSpecifier}{string.Join(",", AddressTypes)}{VcardConstants._argumentDelimiter}" + + $"{VcardConstants._typeArgumentSpecifier}{string.Join(",", ElementTypes)}{VcardConstants._argumentDelimiter}" + $"{DeliveryLabel}"; } } internal override BaseCardPartInfo FromStringVcardInternal(string value, string[] finalArgs, int altId, string[] elementTypes, string valueType, Version cardVersion) - { - // Get the value - string adrValue = value.Substring(VcardConstants._labelSpecifier.Length + 1); - string[] splitAdr = adrValue.Split(VcardConstants._argumentDelimiter); - - // Check the provided address - string[] splitAddressValues = splitAdr[0].Split(VcardConstants._fieldDelimiter); - if (splitAddressValues.Length < 1) - throw new InvalidDataException("Label address information must specify exactly one value (address label)"); - - // Populate the fields - return InstallInfo(splitAdr, splitAddressValues, altId, cardVersion); - } - - internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion) - { - // Get the value - string adrValue = value.Substring(VcardConstants._labelSpecifier.Length + 1); - string[] splitAdr = adrValue.Split(VcardConstants._argumentDelimiter); - if (splitAdr.Length < 2) - throw new InvalidDataException("Label address field must specify exactly two values (Type (optionally prepended with TYPE=), and address information)"); - - // Check the provided address - string[] splitAddressValues = splitAdr[1].Split(VcardConstants._fieldDelimiter); - if (splitAddressValues.Length < 1) - throw new InvalidDataException("Label address information must specify exactly one value (address label)"); - - // Populate the fields - return InstallInfo(splitAdr, splitAddressValues, finalArgs, altId, cardVersion); - } - - private LabelAddressInfo InstallInfo(string[] splitAdr, string[] splitAddressValues, int altId, Version cardVersion) => - InstallInfo(splitAdr, splitAddressValues, [], altId, cardVersion); - - private LabelAddressInfo InstallInfo(string[] splitAdr, string[] splitAddressValues, string[] finalArgs, int altId, Version cardVersion) { bool altIdSupported = cardVersion.Major >= 4; - bool defaultType = splitAdr.Length < 2; - bool specifierRequired = cardVersion.Major >= 3; // Populate the fields - string[] _addressTypes = defaultType ? ["HOME"] : VcardParserTools.GetTypes(splitAdr, "HOME", specifierRequired); - string _addressLabel = Regex.Unescape(splitAddressValues[0]); - LabelAddressInfo _address = new(altIdSupported ? altId : 0, finalArgs, elementTypes, valueType, _addressTypes, _addressLabel); + string _addressLabel = Regex.Unescape(value); + LabelAddressInfo _address = new(altIdSupported ? altId : 0, finalArgs, elementTypes, valueType, _addressLabel); return _address; } @@ -140,8 +98,6 @@ public bool Equals(LabelAddressInfo source, LabelAddressInfo target) // Check all the properties return - source.AddressTypes.SequenceEqual(target.AddressTypes) && - source.AltArguments.SequenceEqual(target.AltArguments) && base.Equals(source, target) && source.DeliveryLabel == target.DeliveryLabel ; @@ -150,17 +106,15 @@ public bool Equals(LabelAddressInfo source, LabelAddressInfo target) /// public override int GetHashCode() { - int hashCode = 1313918102; - hashCode = hashCode * -1521134295 + AltId.GetHashCode(); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(AltArguments); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(AddressTypes); + int hashCode = 1203542083; + hashCode = hashCode * -1521134295 + base.GetHashCode(); hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(DeliveryLabel); return hashCode; } /// public static bool operator ==(LabelAddressInfo left, LabelAddressInfo right) => - EqualityComparer.Default.Equals(left, right); + left.Equals(right); /// public static bool operator !=(LabelAddressInfo left, LabelAddressInfo right) => @@ -168,11 +122,9 @@ public override int GetHashCode() internal LabelAddressInfo() { } - internal LabelAddressInfo(int altId, string[] arguments, string[] elementTypes, string valueType, string[] addressTypes, string label) + internal LabelAddressInfo(int altId, string[] arguments, string[] elementTypes, string valueType, string label) : + base(arguments, altId, elementTypes, valueType) { - AltId = altId; - Arguments = arguments; - AddressTypes = addressTypes; DeliveryLabel = label; } } diff --git a/VisualCard/Parts/Implementations/LangInfo.cs b/VisualCard/Parts/Implementations/LangInfo.cs index 84364df..92b7deb 100644 --- a/VisualCard/Parts/Implementations/LangInfo.cs +++ b/VisualCard/Parts/Implementations/LangInfo.cs @@ -32,10 +32,6 @@ namespace VisualCard.Parts.Implementations [DebuggerDisplay("Language = {ContactLang}")] public class LangInfo : BaseCardPartInfo, IEquatable { - /// - /// The contact's language types - /// - public string[] ContactLangTypes { get; } /// /// The contact's preference order /// @@ -57,7 +53,7 @@ internal override string ToStringVcardInternal(Version cardVersion) return $"{VcardConstants._langSpecifier};" + $"{(installAltId ? VcardConstants._altIdArgumentSpecifier + AltId + VcardConstants._fieldDelimiter : "")}" + - $"{VcardConstants._typeArgumentSpecifier}{string.Join(",", ContactLangTypes)}{VcardConstants._fieldDelimiter}" + + $"{VcardConstants._typeArgumentSpecifier}{string.Join(",", ElementTypes)}{VcardConstants._fieldDelimiter}" + $"{VcardConstants._prefArgumentSpecifier}{ContactLangPreference}{VcardConstants._argumentDelimiter}" + $"{ContactLang}"; } @@ -65,7 +61,7 @@ internal override string ToStringVcardInternal(Version cardVersion) { return $"{VcardConstants._langSpecifier};" + - $"{VcardConstants._typeArgumentSpecifier}{string.Join(",", ContactLangTypes)}{VcardConstants._fieldDelimiter}" + + $"{VcardConstants._typeArgumentSpecifier}{string.Join(",", ElementTypes)}{VcardConstants._fieldDelimiter}" + $"{VcardConstants._prefArgumentSpecifier}{ContactLangPreference}{VcardConstants._argumentDelimiter}" + $"{ContactLang}"; } @@ -73,37 +69,8 @@ internal override string ToStringVcardInternal(Version cardVersion) internal override BaseCardPartInfo FromStringVcardInternal(string value, string[] finalArgs, int altId, string[] elementTypes, string valueType, Version cardVersion) { - // Get the value - string langValue = value.Substring(VcardConstants._langSpecifier.Length + 1); - string[] splitLang = langValue.Split(VcardConstants._argumentDelimiter); - - // Populate the fields - return InstallInfo(splitLang, altId); - } - - internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion) - { - // Get the value - string langValue = value.Substring(VcardConstants._langSpecifier.Length + 1); - string[] splitLang = langValue.Split(VcardConstants._argumentDelimiter); - if (splitLang.Length < 2) - throw new InvalidDataException("Language field must specify exactly two values (Type (must be prepended with TYPE=), and a valid language code)"); - - // Populate the fields - return InstallInfo(splitLang, finalArgs, altId); - } - - private LangInfo InstallInfo(string[] splitLang, int altId) => - InstallInfo(splitLang, [], altId); - - private LangInfo InstallInfo(string[] splitLang, string[] finalArgs, int altId) - { - bool installType = splitLang.Length > 1; - // Populate the fields - string[] _langTypes = installType ? VcardParserTools.GetTypes(splitLang, "HOME", true) : ["HOME"]; - string _langCode = installType ? splitLang[1] : splitLang[0]; - LangInfo _lang = new(altId, finalArgs, _langTypes, _langCode); + LangInfo _lang = new(altId, finalArgs, elementTypes, valueType, value); return _lang; } @@ -133,7 +100,6 @@ public bool Equals(LangInfo source, LangInfo target) // Check all the properties return - source.ContactLangTypes.SequenceEqual(target.ContactLangTypes) && base.Equals(source, target) && source.ContactLang == target.ContactLang ; @@ -142,17 +108,16 @@ public bool Equals(LangInfo source, LangInfo target) /// public override int GetHashCode() { - int hashCode = 2091849342; - hashCode = hashCode * -1521134295 + AltId.GetHashCode(); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(AltArguments); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(ContactLangTypes); + int hashCode = -2101786561; + hashCode = hashCode * -1521134295 + base.GetHashCode(); + hashCode = hashCode * -1521134295 + ContactLangPreference.GetHashCode(); hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(ContactLang); return hashCode; } /// public static bool operator ==(LangInfo left, LangInfo right) => - EqualityComparer.Default.Equals(left, right); + left.Equals(right); /// public static bool operator !=(LangInfo left, LangInfo right) => @@ -160,11 +125,9 @@ public override int GetHashCode() internal LangInfo() { } - internal LangInfo(int altId, string[] arguments, string[] elementTypes, string valueType, string[] contactLangTypes, string contactLangCode) + internal LangInfo(int altId, string[] arguments, string[] elementTypes, string valueType, string contactLangCode) : + base(arguments, altId, elementTypes, valueType) { - AltId = altId; - Arguments = arguments; - ContactLangTypes = contactLangTypes; ContactLang = contactLangCode; } } diff --git a/VisualCard/Parts/Implementations/LogoInfo.cs b/VisualCard/Parts/Implementations/LogoInfo.cs index 0ff2e2a..6408dbe 100644 --- a/VisualCard/Parts/Implementations/LogoInfo.cs +++ b/VisualCard/Parts/Implementations/LogoInfo.cs @@ -32,19 +32,11 @@ namespace VisualCard.Parts.Implementations [DebuggerDisplay("Logo, {Encoding}, {LogoType}, {ValueType}")] public class LogoInfo : BaseCardPartInfo, IEquatable { - /// - /// Value type - /// - public string ValueType { get; } /// /// Logo encoding type /// public string Encoding { get; } /// - /// Logo type (JPEG, ...) - /// - public string LogoType { get; } - /// /// Encoded logo /// public string LogoEncoded { get; } @@ -63,7 +55,7 @@ internal override string ToStringVcardInternal(Version cardVersion) return $"{VcardConstants._logoSpecifier};" + $"{(installAltId ? VcardConstants._altIdArgumentSpecifier + AltId + VcardConstants._fieldDelimiter : "")}" + - $"{(installAltId ? string.Join(VcardConstants._fieldDelimiter.ToString(), AltArguments) + VcardConstants._fieldDelimiter : "")}" + + $"{(installAltId ? string.Join(VcardConstants._fieldDelimiter.ToString(), Arguments) + VcardConstants._fieldDelimiter : "")}" + $"{VcardConstants._valueArgumentSpecifier}{ValueType}{VcardConstants._argumentDelimiter}" + $"{LogoEncoded}"; } @@ -72,10 +64,10 @@ internal override string ToStringVcardInternal(Version cardVersion) string logoArgsLine = $"{VcardConstants._logoSpecifier};" + $"{(installAltId ? VcardConstants._altIdArgumentSpecifier + AltId + VcardConstants._fieldDelimiter : "")}" + - $"{(installAltId ? string.Join(VcardConstants._fieldDelimiter.ToString(), AltArguments) + VcardConstants._fieldDelimiter : "")}" + + $"{(installAltId ? string.Join(VcardConstants._fieldDelimiter.ToString(), Arguments) + VcardConstants._fieldDelimiter : "")}" + $"{VcardConstants._valueArgumentSpecifier}{ValueType}{VcardConstants._fieldDelimiter}" + $"{VcardConstants._encodingArgumentSpecifier}{Encoding}{VcardConstants._fieldDelimiter}" + - $"{VcardConstants._typeArgumentSpecifier}{LogoType}{VcardConstants._argumentDelimiter}"; + $"{VcardConstants._typeArgumentSpecifier}{string.Join(VcardConstants._valueDelimiter.ToString(), ElementTypes)}{VcardConstants._argumentDelimiter}"; return logoArgsLine + VcardParserTools.MakeStringBlock(LogoEncoded, logoArgsLine.Length); } } @@ -94,42 +86,21 @@ internal override string ToStringVcardInternal(Version cardVersion) $"{VcardConstants._logoSpecifier};" + $"{VcardConstants._valueArgumentSpecifier}{ValueType}{VcardConstants._fieldDelimiter}" + $"{VcardConstants._encodingArgumentSpecifier}{Encoding}{VcardConstants._fieldDelimiter}" + - $"{VcardConstants._typeArgumentSpecifier}{LogoType}{VcardConstants._argumentDelimiter}"; + $"{VcardConstants._typeArgumentSpecifier}{string.Join(VcardConstants._valueDelimiter.ToString(), ElementTypes)}{VcardConstants._argumentDelimiter}"; return logoArgsLine + VcardParserTools.MakeStringBlock(LogoEncoded, logoArgsLine.Length); } } } - internal override BaseCardPartInfo FromStringVcardInternal(string value, string[] finalArgs, int altId, string[] elementTypes, string valueType, Version cardVersion) => - throw new InvalidDataException("Logo field must not have empty type."); - - internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion) - { - // Get the value - string logoValue = value.Substring(VcardConstants._logoSpecifier.Length + 1); - string[] splitLogo = logoValue.Split(VcardConstants._argumentDelimiter); - if (splitLogo.Length < 2) - throw new InvalidDataException("Logo field must specify exactly two values (Type and arguments, and logo information)"); - - // Populate the fields - return InstallInfo(splitLogo, finalArgs, altId, cardVersion); - } - - private LogoInfo InstallInfo(string[] splitLogo, string[] finalArgs, int altId, Version cardVersion) + internal override BaseCardPartInfo FromStringVcardInternal(string value, string[] finalArgs, int altId, string[] elementTypes, string valueType, Version cardVersion) { bool altIdSupported = cardVersion.Major >= 4; - // Check to see if the value is prepended by the VALUE= argument - string valueType = VcardParserTools.GetValuesString(splitLogo, "", VcardConstants._valueArgumentSpecifier).ToLower(); - // Check to see if the value is prepended by the ENCODING= argument - string logoEncoding = VcardParserTools.GetValuesString(splitLogo, "BASE64", VcardConstants._encodingArgumentSpecifier); - - // Check to see if the value is prepended with the TYPE= argument - string logoType = VcardParserTools.GetTypesString(splitLogo, "JPEG", false); + string logoEncoding = VcardParserTools.GetValuesString(finalArgs, "BASE64", VcardConstants._encodingArgumentSpecifier); // Populate the fields - LogoInfo _logo = new(altIdSupported ? altId : 0, finalArgs, elementTypes, valueType, valueType, logoEncoding, logoType, splitLogo[1]); + LogoInfo _logo = new(altIdSupported ? altId : 0, finalArgs, elementTypes, valueType, logoEncoding, value); return _logo; } @@ -159,11 +130,8 @@ public bool Equals(LogoInfo source, LogoInfo target) // Check all the properties return - source.AltArguments.SequenceEqual(target.AltArguments) && base.Equals(source, target) && - source.ValueType == target.ValueType && source.Encoding == target.Encoding && - source.LogoType == target.LogoType && source.LogoEncoded == target.LogoEncoded ; } @@ -171,19 +139,16 @@ public bool Equals(LogoInfo source, LogoInfo target) /// public override int GetHashCode() { - int hashCode = -1881924127; - hashCode = hashCode * -1521134295 + AltId.GetHashCode(); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(AltArguments); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(ValueType); + int hashCode = 2051368178; + hashCode = hashCode * -1521134295 + base.GetHashCode(); hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(Encoding); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(LogoType); hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(LogoEncoded); return hashCode; } /// public static bool operator ==(LogoInfo left, LogoInfo right) => - EqualityComparer.Default.Equals(left, right); + left.Equals(right); /// public static bool operator !=(LogoInfo left, LogoInfo right) => @@ -191,13 +156,10 @@ public override int GetHashCode() internal LogoInfo() { } - internal LogoInfo(int altId, string[] arguments, string[] elementTypes, string valueType, string valueType, string encoding, string logoType, string logoEncoded) + internal LogoInfo(int altId, string[] arguments, string[] elementTypes, string valueType, string encoding, string logoEncoded) : + base(arguments, altId, elementTypes, valueType) { - AltId = altId; - Arguments = arguments; - ValueType = valueType; Encoding = encoding; - LogoType = logoType; LogoEncoded = logoEncoded; } } diff --git a/VisualCard/Parts/Implementations/NameInfo.cs b/VisualCard/Parts/Implementations/NameInfo.cs index c8fbb2c..1bee789 100644 --- a/VisualCard/Parts/Implementations/NameInfo.cs +++ b/VisualCard/Parts/Implementations/NameInfo.cs @@ -69,7 +69,7 @@ internal override string ToStringVcardInternal(Version cardVersion) return $"{VcardConstants._nameSpecifier}{(installAltId ? VcardConstants._fieldDelimiter : VcardConstants._argumentDelimiter)}" + $"{(installAltId ? VcardConstants._altIdArgumentSpecifier + AltId + VcardConstants._fieldDelimiter : "")}" + - $"{(installAltId ? string.Join(VcardConstants._fieldDelimiter.ToString(), AltArguments) + VcardConstants._argumentDelimiter : "")}" + + $"{(installAltId ? string.Join(VcardConstants._fieldDelimiter.ToString(), Arguments) + VcardConstants._argumentDelimiter : "")}" + $"{ContactLastName}{VcardConstants._fieldDelimiter}" + $"{ContactFirstName}{VcardConstants._fieldDelimiter}" + $"{altNamesStr}{VcardConstants._fieldDelimiter}" + @@ -93,36 +93,11 @@ internal override string ToStringVcardInternal(Version cardVersion) internal override BaseCardPartInfo FromStringVcardInternal(string value, string[] finalArgs, int altId, string[] elementTypes, string valueType, Version cardVersion) { - // Check the line - string nameValue = value.Substring(VcardConstants._nameSpecifier.Length + 1); - string[] splitName = nameValue.Split(VcardConstants._fieldDelimiter); - if (splitName.Length < 2) - throw new InvalidDataException("Name field must specify the first two or more of the five values (Last name, first name, alt names, prefixes, and suffixes)"); - - // Populate the fields - return InstallInfo(splitName, altId, cardVersion); - } - - internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion) - { - // Check the line - string nameValue = value.Substring(VcardConstants._nameSpecifier.Length + 1); - string[] splitNameParts = nameValue.Split(VcardConstants._argumentDelimiter); - string[] splitName = splitNameParts[1].Split(VcardConstants._fieldDelimiter); + bool altIdSupported = cardVersion.Major >= 4; + string[] splitName = value.Split(VcardConstants._fieldDelimiter); if (splitName.Length < 2) throw new InvalidDataException("Name field must specify the first two or more of the five values (Last name, first name, alt names, prefixes, and suffixes)"); - // Populate the fields - return InstallInfo(splitName, finalArgs, altId, cardVersion); - } - - private NameInfo InstallInfo(string[] splitName, int altId, Version cardVersion) => - InstallInfo(splitName, [], altId, cardVersion); - - private NameInfo InstallInfo(string[] splitName, string[] finalArgs, int altId, Version cardVersion) - { - bool altIdSupported = cardVersion.Major >= 4; - // Populate fields string _lastName = Regex.Unescape(splitName[0]); string _firstName = Regex.Unescape(splitName[1]); @@ -159,11 +134,10 @@ public bool Equals(NameInfo source, NameInfo target) // Check all the properties return - source.AltArguments.SequenceEqual(target.AltArguments) && + base.Equals(source, target) && source.AltNames.SequenceEqual(target.AltNames) && source.Prefixes.SequenceEqual(target.Prefixes) && source.Suffixes.SequenceEqual(target.Suffixes) && - base.Equals(source, target) && source.ContactFirstName == target.ContactFirstName && source.ContactLastName == target.ContactLastName ; @@ -172,9 +146,8 @@ public bool Equals(NameInfo source, NameInfo target) /// public override int GetHashCode() { - int hashCode = 357851718; - hashCode = hashCode * -1521134295 + AltId.GetHashCode(); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(AltArguments); + int hashCode = -465884477; + hashCode = hashCode * -1521134295 + base.GetHashCode(); hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(ContactFirstName); hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(ContactLastName); hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(AltNames); @@ -185,7 +158,7 @@ public override int GetHashCode() /// public static bool operator ==(NameInfo left, NameInfo right) => - EqualityComparer.Default.Equals(left, right); + left.Equals(right); /// public static bool operator !=(NameInfo left, NameInfo right) => @@ -193,10 +166,9 @@ public override int GetHashCode() internal NameInfo() { } - internal NameInfo(int altId, string[] arguments, string[] elementTypes, string valueType, string contactFirstName, string contactLastName, string[] altNames, string[] prefixes, string[] suffixes) + internal NameInfo(int altId, string[] arguments, string[] elementTypes, string valueType, string contactFirstName, string contactLastName, string[] altNames, string[] prefixes, string[] suffixes) : + base(arguments, altId, elementTypes, valueType) { - AltId = altId; - Arguments = arguments; ContactFirstName = contactFirstName; ContactLastName = contactLastName; AltNames = altNames; diff --git a/VisualCard/Parts/Implementations/NicknameInfo.cs b/VisualCard/Parts/Implementations/NicknameInfo.cs index 82ce341..f19ec5b 100644 --- a/VisualCard/Parts/Implementations/NicknameInfo.cs +++ b/VisualCard/Parts/Implementations/NicknameInfo.cs @@ -37,10 +37,6 @@ public class NicknameInfo : BaseCardPartInfo, IEquatable /// The contact's nickname /// public string ContactNickname { get; } - /// - /// The contact's nickname types - /// - public string[] NicknameTypes { get; } internal static BaseCardPartInfo FromStringVcardStatic(string value, string[] finalArgs, int altId, string[] elementTypes, string valueType, Version cardVersion) => new NicknameInfo().FromStringVcardInternal(value, finalArgs, altId, elementTypes, valueType, cardVersion); @@ -54,53 +50,26 @@ internal override string ToStringVcardInternal(Version cardVersion) return $"{VcardConstants._nicknameSpecifier};" + $"{(installAltId ? VcardConstants._altIdArgumentSpecifier + AltId + VcardConstants._fieldDelimiter : "")}" + - $"{(installAltId ? string.Join(VcardConstants._fieldDelimiter.ToString(), AltArguments) + VcardConstants._fieldDelimiter : "")}" + - $"{VcardConstants._typeArgumentSpecifier}{string.Join(",", NicknameTypes)}{VcardConstants._argumentDelimiter}" + + $"{(installAltId ? string.Join(VcardConstants._fieldDelimiter.ToString(), Arguments) + VcardConstants._fieldDelimiter : "")}" + + $"{VcardConstants._typeArgumentSpecifier}{string.Join(",", ElementTypes)}{VcardConstants._argumentDelimiter}" + $"{ContactNickname}"; } else { return $"{VcardConstants._nicknameSpecifier};" + - $"{VcardConstants._typeArgumentSpecifier}{string.Join(",", NicknameTypes)}{VcardConstants._argumentDelimiter}" + + $"{VcardConstants._typeArgumentSpecifier}{string.Join(",", ElementTypes)}{VcardConstants._argumentDelimiter}" + $"{ContactNickname}"; } } internal override BaseCardPartInfo FromStringVcardInternal(string value, string[] finalArgs, int altId, string[] elementTypes, string valueType, Version cardVersion) - { - // Get the value - string nickValue = value.Substring(VcardConstants._nicknameSpecifier.Length + 1); - - // Populate the fields - return InstallInfo([nickValue], altId, cardVersion); - } - - internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion) - { - // Get the value - string nickValue = value.Substring(VcardConstants._nicknameSpecifier.Length + 1); - string[] splitNick = nickValue.Split(VcardConstants._argumentDelimiter); - if (splitNick.Length < 2) - throw new InvalidDataException("Nickname field must specify exactly two values (Type (must be prepended with TYPE=), and nickname)"); - - // Populate the fields - return InstallInfo(splitNick, finalArgs, altId, cardVersion); - } - - private NicknameInfo InstallInfo(string[] splitNick, int altId, Version cardVersion) => - InstallInfo(splitNick, [], altId, cardVersion); - - private NicknameInfo InstallInfo(string[] splitNick, string[] finalArgs, int altId, Version cardVersion) { bool altIdSupported = cardVersion.Major >= 4; - bool installType = splitNick.Length > 1; - bool specifierRequired = cardVersion.Major >= 3; // Populate the fields - string[] _nicknameTypes = installType ? VcardParserTools.GetTypes(splitNick, "WORK", specifierRequired) : ["HOME"]; - string _nick = Regex.Unescape(installType ? splitNick[1] : splitNick[0]); - NicknameInfo _nickInstance = new(altIdSupported ? altId : 0, finalArgs, elementTypes, valueType, _nick, _nicknameTypes); + string _nick = Regex.Unescape(value); + NicknameInfo _nickInstance = new(altIdSupported ? altId : 0, finalArgs, elementTypes, valueType, _nick); return _nickInstance; } @@ -130,8 +99,6 @@ public bool Equals(NicknameInfo source, NicknameInfo target) // Check all the properties return - source.AltArguments.SequenceEqual(target.AltArguments) && - source.NicknameTypes.SequenceEqual(target.NicknameTypes) && base.Equals(source, target) && source.ContactNickname == target.ContactNickname ; @@ -140,17 +107,15 @@ public bool Equals(NicknameInfo source, NicknameInfo target) /// public override int GetHashCode() { - int hashCode = -1183179154; - hashCode = hashCode * -1521134295 + AltId.GetHashCode(); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(AltArguments); + int hashCode = 536678633; + hashCode = hashCode * -1521134295 + base.GetHashCode(); hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(ContactNickname); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(NicknameTypes); return hashCode; } /// public static bool operator ==(NicknameInfo left, NicknameInfo right) => - EqualityComparer.Default.Equals(left, right); + left.Equals(right); /// public static bool operator !=(NicknameInfo left, NicknameInfo right) => @@ -158,12 +123,10 @@ public override int GetHashCode() internal NicknameInfo() { } - internal NicknameInfo(int altId, string[] arguments, string[] elementTypes, string valueType, string contactNickname, string[] nicknameTypes) + internal NicknameInfo(int altId, string[] arguments, string[] elementTypes, string valueType, string contactNickname) : + base(arguments, altId, elementTypes, valueType) { - AltId = altId; - Arguments = arguments; ContactNickname = contactNickname; - NicknameTypes = nicknameTypes; } } } diff --git a/VisualCard/Parts/Implementations/OrganizationInfo.cs b/VisualCard/Parts/Implementations/OrganizationInfo.cs index 5972816..5be197d 100644 --- a/VisualCard/Parts/Implementations/OrganizationInfo.cs +++ b/VisualCard/Parts/Implementations/OrganizationInfo.cs @@ -33,10 +33,6 @@ namespace VisualCard.Parts.Implementations [DebuggerDisplay("OrgName = {Name}, {Unit}, {Role}")] public class OrganizationInfo : BaseCardPartInfo, IEquatable { - /// - /// The contact's organization types - /// - public string[] OrgTypes { get; } /// /// The contact's organization name /// @@ -59,21 +55,21 @@ internal override string ToStringVcardInternal(Version cardVersion) if (altIdSupported) { bool installAltId = AltId >= 0 && Arguments.Length > 0; - bool installType = (installAltId || OrgTypes.Length > 0) && OrgTypes[0].ToUpper() != "WORK"; + bool installType = (installAltId || ElementTypes.Length > 0) && ElementTypes[0].ToUpper() != "WORK"; return $"{VcardConstants._orgSpecifier}{(installType || installAltId ? VcardConstants._fieldDelimiter : VcardConstants._argumentDelimiter)}" + $"{(installAltId ? VcardConstants._altIdArgumentSpecifier + AltId + (installType ? VcardConstants._fieldDelimiter : VcardConstants._argumentDelimiter) : "")}" + - $"{(installType ? $"{VcardConstants._typeArgumentSpecifier}{string.Join(",", OrgTypes)}{VcardConstants._argumentDelimiter}" : "")}" + + $"{(installType ? $"{VcardConstants._typeArgumentSpecifier}{string.Join(",", ElementTypes)}{VcardConstants._argumentDelimiter}" : "")}" + $"{Name}{VcardConstants._fieldDelimiter}" + $"{Unit}{VcardConstants._fieldDelimiter}" + $"{Role}"; } else { - bool installType = OrgTypes.Length > 0 && OrgTypes[0].ToUpper() != "WORK"; + bool installType = ElementTypes.Length > 0 && ElementTypes[0].ToUpper() != "WORK"; return $"{VcardConstants._orgSpecifier}{(installType ? VcardConstants._fieldDelimiter : VcardConstants._argumentDelimiter)}" + - $"{(installType ? $"{VcardConstants._typeArgumentSpecifier}{string.Join(",", OrgTypes)}{VcardConstants._argumentDelimiter}" : "")}" + + $"{(installType ? $"{VcardConstants._typeArgumentSpecifier}{string.Join(",", ElementTypes)}{VcardConstants._argumentDelimiter}" : "")}" + $"{Name}{VcardConstants._fieldDelimiter}" + $"{Unit}{VcardConstants._fieldDelimiter}" + $"{Role}"; @@ -81,47 +77,15 @@ internal override string ToStringVcardInternal(Version cardVersion) } internal override BaseCardPartInfo FromStringVcardInternal(string value, string[] finalArgs, int altId, string[] elementTypes, string valueType, Version cardVersion) - { - // Get the value - string orgValue = value.Substring(VcardConstants._orgSpecifier.Length + 1); - string[] splitOrg = orgValue.Split(VcardConstants._fieldDelimiter); - - // Populate the fields - return InstallInfo(splitOrg, ["WORK"], altId, cardVersion); - } - - internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion) - { - bool specifierRequired = cardVersion.Major >= 3; - - // Get the value - string orgValue = value.Substring(VcardConstants._orgSpecifier.Length + 1); - string[] splitOrg = orgValue.Split(VcardConstants._argumentDelimiter); - if (splitOrg.Length < 2) - throw new InvalidDataException("Organization field must specify exactly two values (Type, and address information)"); - - // Check the provided organization - string[] splitOrganizationValues = splitOrg[1].Split(VcardConstants._fieldDelimiter); - if (splitOrganizationValues.Length < 3) - throw new InvalidDataException("Organization information must specify exactly three values (name, unit, and role)"); - - // Populate the fields - string[] _orgTypes = VcardParserTools.GetTypes(splitOrg, "WORK", specifierRequired); - return InstallInfo(splitOrganizationValues, _orgTypes, finalArgs, altId, cardVersion); - } - - private OrganizationInfo InstallInfo(string[] splitOrg, string[] _orgTypes, int altId, Version cardVersion) => - InstallInfo(splitOrg, _orgTypes, [], altId, cardVersion); - - private OrganizationInfo InstallInfo(string[] splitOrg, string[] _orgTypes, string[] finalArgs, int altId, Version cardVersion) { bool altIdSupported = cardVersion.Major >= 4; + string[] splitOrg = value.Split(VcardConstants._fieldDelimiter); // Populate the fields string _orgName = Regex.Unescape(splitOrg[0]); string _orgUnit = Regex.Unescape(splitOrg.Length >= 2 ? splitOrg[1] : ""); string _orgUnitRole = Regex.Unescape(splitOrg.Length >= 3 ? splitOrg[2] : ""); - OrganizationInfo _org = new(altIdSupported ? altId : 0, finalArgs, elementTypes, valueType, _orgName, _orgUnit, _orgUnitRole, _orgTypes); + OrganizationInfo _org = new(altIdSupported ? altId : 0, finalArgs, elementTypes, valueType, _orgName, _orgUnit, _orgUnitRole); return _org; } @@ -151,8 +115,6 @@ public bool Equals(OrganizationInfo source, OrganizationInfo target) // Check all the properties return - source.OrgTypes.SequenceEqual(target.OrgTypes) && - source.AltArguments.SequenceEqual(target.AltArguments) && base.Equals(source, target) && source.Name == target.Name && source.Unit == target.Unit && @@ -163,10 +125,8 @@ public bool Equals(OrganizationInfo source, OrganizationInfo target) /// public override int GetHashCode() { - int hashCode = 374840165; - hashCode = hashCode * -1521134295 + AltId.GetHashCode(); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(AltArguments); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(OrgTypes); + int hashCode = 1382759124; + hashCode = hashCode * -1521134295 + base.GetHashCode(); hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(Name); hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(Unit); hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(Role); @@ -175,7 +135,7 @@ public override int GetHashCode() /// public static bool operator ==(OrganizationInfo left, OrganizationInfo right) => - EqualityComparer.Default.Equals(left, right); + left.Equals(right); /// public static bool operator !=(OrganizationInfo left, OrganizationInfo right) => @@ -183,14 +143,12 @@ public override int GetHashCode() internal OrganizationInfo() { } - internal OrganizationInfo(int altId, string[] arguments, string[] elementTypes, string valueType, string name, string unit, string role, string[] orgTypes) + internal OrganizationInfo(int altId, string[] arguments, string[] elementTypes, string valueType, string name, string unit, string role) : + base(arguments, altId, elementTypes, valueType) { - AltId = altId; - Arguments = arguments; Name = name; Unit = unit; Role = role; - OrgTypes = orgTypes; } } } diff --git a/VisualCard/Parts/Implementations/PhotoInfo.cs b/VisualCard/Parts/Implementations/PhotoInfo.cs index 0b373fc..4aea47a 100644 --- a/VisualCard/Parts/Implementations/PhotoInfo.cs +++ b/VisualCard/Parts/Implementations/PhotoInfo.cs @@ -32,19 +32,11 @@ namespace VisualCard.Parts.Implementations [DebuggerDisplay("Photo, {Encoding}, {PhotoType}, {ValueType}")] public class PhotoInfo : BaseCardPartInfo, IEquatable { - /// - /// Value type - /// - public string ValueType { get; } /// /// Photo encoding type /// public string Encoding { get; } /// - /// Photo type (JPEG, ...) - /// - public string PhotoType { get; } - /// /// Encoded photo /// public string PhotoEncoded { get; } @@ -63,7 +55,7 @@ internal override string ToStringVcardInternal(Version cardVersion) return $"{VcardConstants._photoSpecifier};" + $"{(installAltId ? VcardConstants._altIdArgumentSpecifier + AltId + VcardConstants._fieldDelimiter : "")}" + - $"{(installAltId ? string.Join(VcardConstants._fieldDelimiter.ToString(), AltArguments) + VcardConstants._fieldDelimiter : "")}" + + $"{(installAltId ? string.Join(VcardConstants._fieldDelimiter.ToString(), Arguments) + VcardConstants._fieldDelimiter : "")}" + $"{VcardConstants._valueArgumentSpecifier}{ValueType}{VcardConstants._argumentDelimiter}" + $"{PhotoEncoded}"; } @@ -72,10 +64,10 @@ internal override string ToStringVcardInternal(Version cardVersion) string photoArgsLine = $"{VcardConstants._photoSpecifier};" + $"{(installAltId ? VcardConstants._altIdArgumentSpecifier + AltId + VcardConstants._fieldDelimiter : "")}" + - $"{(installAltId ? string.Join(VcardConstants._fieldDelimiter.ToString(), AltArguments) + VcardConstants._fieldDelimiter : "")}" + + $"{(installAltId ? string.Join(VcardConstants._fieldDelimiter.ToString(), Arguments) + VcardConstants._fieldDelimiter : "")}" + $"{VcardConstants._valueArgumentSpecifier}{ValueType}{VcardConstants._fieldDelimiter}" + $"{VcardConstants._encodingArgumentSpecifier}{Encoding}{VcardConstants._fieldDelimiter}" + - $"{VcardConstants._typeArgumentSpecifier}{PhotoType}{VcardConstants._argumentDelimiter}"; + $"{VcardConstants._typeArgumentSpecifier}{string.Join(VcardConstants._valueDelimiter.ToString(), ElementTypes)}{VcardConstants._argumentDelimiter}"; return photoArgsLine + VcardParserTools.MakeStringBlock(PhotoEncoded, photoArgsLine.Length); } } @@ -94,42 +86,21 @@ internal override string ToStringVcardInternal(Version cardVersion) $"{VcardConstants._photoSpecifier};" + $"{VcardConstants._valueArgumentSpecifier}{ValueType}{VcardConstants._fieldDelimiter}" + $"{VcardConstants._encodingArgumentSpecifier}{Encoding}{VcardConstants._fieldDelimiter}" + - $"{VcardConstants._typeArgumentSpecifier}{PhotoType}{VcardConstants._argumentDelimiter}"; + $"{VcardConstants._typeArgumentSpecifier}{string.Join(VcardConstants._valueDelimiter.ToString(), ElementTypes)}{VcardConstants._argumentDelimiter}"; return photoArgsLine + VcardParserTools.MakeStringBlock(PhotoEncoded, photoArgsLine.Length); } } } - internal override BaseCardPartInfo FromStringVcardInternal(string value, string[] finalArgs, int altId, string[] elementTypes, string valueType, Version cardVersion) => - throw new InvalidDataException("Photo field must not have empty type."); - - internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion) - { - // Get the value - string photoValue = value.Substring(VcardConstants._photoSpecifier.Length + 1); - string[] splitPhoto = photoValue.Split(VcardConstants._argumentDelimiter); - if (splitPhoto.Length < 2) - throw new InvalidDataException("Photo field must specify exactly two values (Type and arguments, and photo information)"); - - // Populate the fields - return InstallInfo(splitPhoto, finalArgs, altId, cardVersion); - } - - private PhotoInfo InstallInfo(string[] splitPhoto, string[] finalArgs, int altId, Version cardVersion) + internal override BaseCardPartInfo FromStringVcardInternal(string value, string[] finalArgs, int altId, string[] elementTypes, string valueType, Version cardVersion) { bool altIdSupported = cardVersion.Major >= 4; - // Check to see if the value is prepended by the VALUE= argument - string valueType = VcardParserTools.GetValuesString(splitPhoto, "", VcardConstants._valueArgumentSpecifier).ToLower(); - // Check to see if the value is prepended by the ENCODING= argument - string photoEncoding = VcardParserTools.GetValuesString(splitPhoto, "BASE64", VcardConstants._encodingArgumentSpecifier); - - // Check to see if the value is prepended with the TYPE= argument - string photoType = VcardParserTools.GetTypesString(splitPhoto, "JPEG", false); + string photoEncoding = VcardParserTools.GetValuesString(finalArgs, "BASE64", VcardConstants._encodingArgumentSpecifier); // Populate the fields - PhotoInfo _photo = new(altIdSupported ? altId : 0, finalArgs, elementTypes, valueType, valueType, photoEncoding, photoType, splitPhoto[1]); + PhotoInfo _photo = new(altIdSupported ? altId : 0, finalArgs, elementTypes, valueType, photoEncoding, value); return _photo; } @@ -159,11 +130,8 @@ public bool Equals(PhotoInfo source, PhotoInfo target) // Check all the properties return - source.AltArguments.SequenceEqual(target.AltArguments) && base.Equals(source, target) && - source.ValueType == target.ValueType && source.Encoding == target.Encoding && - source.PhotoType == target.PhotoType && source.PhotoEncoded == target.PhotoEncoded ; } @@ -171,19 +139,16 @@ public bool Equals(PhotoInfo source, PhotoInfo target) /// public override int GetHashCode() { - int hashCode = -1042689907; - hashCode = hashCode * -1521134295 + AltId.GetHashCode(); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(AltArguments); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(ValueType); + int hashCode = -365738507; + hashCode = hashCode * -1521134295 + base.GetHashCode(); hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(Encoding); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(PhotoType); hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(PhotoEncoded); return hashCode; } /// public static bool operator ==(PhotoInfo left, PhotoInfo right) => - EqualityComparer.Default.Equals(left, right); + left.Equals(right); /// public static bool operator !=(PhotoInfo left, PhotoInfo right) => @@ -191,13 +156,10 @@ public override int GetHashCode() internal PhotoInfo() { } - internal PhotoInfo(int altId, string[] arguments, string[] elementTypes, string valueType, string valueType, string encoding, string photoType, string photoEncoded) + internal PhotoInfo(int altId, string[] arguments, string[] elementTypes, string valueType, string encoding, string photoEncoded) : + base(arguments, altId, elementTypes, valueType) { - AltId = altId; - Arguments = arguments; - ValueType = valueType; Encoding = encoding; - PhotoType = photoType; PhotoEncoded = photoEncoded; } } diff --git a/VisualCard/Parts/Implementations/RevisionInfo.cs b/VisualCard/Parts/Implementations/RevisionInfo.cs index b796d3c..075913c 100644 --- a/VisualCard/Parts/Implementations/RevisionInfo.cs +++ b/VisualCard/Parts/Implementations/RevisionInfo.cs @@ -48,19 +48,7 @@ internal override BaseCardPartInfo FromStringVcardInternal(string value, string[ string revValue = value.Substring(VcardConstants._revSpecifier.Length + 1); // Populate the fields - return InstallInfo(revValue, altId, cardVersion); - } - - internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion) => - FromStringVcardInternal(value, altId, cardVersion); - - private RevisionInfo InstallInfo(string value, int altId, Version cardVersion) => - InstallInfo(value, [], altId, cardVersion); - - private RevisionInfo InstallInfo(string value, string[] finalArgs, int altId, Version cardVersion) - { - // Populate field - DateTime rev = DateTime.Parse(value); + DateTime rev = DateTime.Parse(revValue); // Add the fetched information bool altIdSupported = cardVersion.Major >= 4; @@ -94,7 +82,6 @@ public bool Equals(RevisionInfo source, RevisionInfo target) // Check all the properties return - source.AltArguments.SequenceEqual(target.AltArguments) && base.Equals(source, target) && source.Revision == target.Revision ; @@ -103,16 +90,15 @@ public bool Equals(RevisionInfo source, RevisionInfo target) /// public override int GetHashCode() { - int hashCode = -480211805; - hashCode = hashCode * -1521134295 + AltId.GetHashCode(); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(AltArguments); + int hashCode = 47832270; + hashCode = hashCode * -1521134295 + base.GetHashCode(); hashCode = hashCode * -1521134295 + Revision.GetHashCode(); return hashCode; } /// public static bool operator ==(RevisionInfo left, RevisionInfo right) => - EqualityComparer.Default.Equals(left, right); + left.Equals(right); /// public static bool operator !=(RevisionInfo left, RevisionInfo right) => @@ -124,6 +110,8 @@ internal RevisionInfo(int altId, string[] arguments, string[] elementTypes, stri { AltId = altId; Arguments = arguments; + ElementTypes = elementTypes; + ValueType = valueType; Revision = birth; } } diff --git a/VisualCard/Parts/Implementations/RoleInfo.cs b/VisualCard/Parts/Implementations/RoleInfo.cs index b4d9545..e89214e 100644 --- a/VisualCard/Parts/Implementations/RoleInfo.cs +++ b/VisualCard/Parts/Implementations/RoleInfo.cs @@ -21,6 +21,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq; +using System.Text.RegularExpressions; using VisualCard.Parsers; namespace VisualCard.Parts.Implementations @@ -48,7 +49,7 @@ internal override string ToStringVcardInternal(Version cardVersion) return $"{VcardConstants._roleSpecifier}{(installAltId ? VcardConstants._fieldDelimiter : VcardConstants._argumentDelimiter)}" + $"{(installAltId ? VcardConstants._altIdArgumentSpecifier + AltId + VcardConstants._fieldDelimiter : "")}" + - $"{(installAltId ? string.Join(VcardConstants._fieldDelimiter.ToString(), AltArguments) + VcardConstants._argumentDelimiter : "")}" + + $"{(installAltId ? string.Join(VcardConstants._fieldDelimiter.ToString(), Arguments) + VcardConstants._argumentDelimiter : "")}" + $"{ContactRole}"; } else @@ -60,33 +61,13 @@ internal override string ToStringVcardInternal(Version cardVersion) } internal override BaseCardPartInfo FromStringVcardInternal(string value, string[] finalArgs, int altId, string[] elementTypes, string valueType, Version cardVersion) - { - // Get the value - string roleValue = value.Substring(VcardConstants._roleSpecifier.Length + 1); - - // Populate the fields - return InstallInfo(roleValue, altId, cardVersion); - } - - internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion) - { - // Get the value - string roleValue = value.Substring(VcardConstants._roleSpecifier.Length + 1); - - // Populate the fields - return InstallInfo(roleValue, finalArgs, altId, cardVersion); - } - - private RoleInfo InstallInfo(string roleValue, int altId, Version cardVersion) => - InstallInfo(roleValue, [], altId, cardVersion); - - private RoleInfo InstallInfo(string roleValue, string[] finalArgs, int altId, Version cardVersion) { bool altIdSupported = cardVersion.Major >= 4; + string roleValue = Regex.Unescape(value); // Populate the fields - RoleInfo _telephone = new(altIdSupported ? altId : 0, finalArgs, elementTypes, valueType, roleValue); - return _telephone; + RoleInfo _role = new(altIdSupported ? altId : 0, finalArgs, elementTypes, valueType, roleValue); + return _role; } /// @@ -115,7 +96,6 @@ public bool Equals(RoleInfo source, RoleInfo target) // Check all the properties return - source.AltArguments.SequenceEqual(target.AltArguments) && base.Equals(source, target) && source.ContactRole == target.ContactRole ; @@ -124,16 +104,15 @@ public bool Equals(RoleInfo source, RoleInfo target) /// public override int GetHashCode() { - int hashCode = -1215418912; - hashCode = hashCode * -1521134295 + AltId.GetHashCode(); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(AltArguments); + int hashCode = -81571651; + hashCode = hashCode * -1521134295 + base.GetHashCode(); hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(ContactRole); return hashCode; } /// public static bool operator ==(RoleInfo left, RoleInfo right) => - EqualityComparer.Default.Equals(left, right); + left.Equals(right); /// public static bool operator !=(RoleInfo left, RoleInfo right) => @@ -141,10 +120,9 @@ public override int GetHashCode() internal RoleInfo() { } - internal RoleInfo(int altId, string[] arguments, string[] elementTypes, string valueType, string contactRole) + internal RoleInfo(int altId, string[] arguments, string[] elementTypes, string valueType, string contactRole) : + base(arguments, altId, elementTypes, valueType) { - AltId = altId; - Arguments = arguments; ContactRole = contactRole; } } diff --git a/VisualCard/Parts/Implementations/SoundInfo.cs b/VisualCard/Parts/Implementations/SoundInfo.cs index 0d88862..96adcc0 100644 --- a/VisualCard/Parts/Implementations/SoundInfo.cs +++ b/VisualCard/Parts/Implementations/SoundInfo.cs @@ -32,19 +32,11 @@ namespace VisualCard.Parts.Implementations [DebuggerDisplay("Sound, {Encoding}, {SoundType}, {ValueType}")] public class SoundInfo : BaseCardPartInfo, IEquatable { - /// - /// Value type - /// - public string ValueType { get; } /// /// Sound encoding type /// public string Encoding { get; } /// - /// Sound type (MP3, ...) - /// - public string SoundType { get; } - /// /// Encoded sound /// public string SoundEncoded { get; } @@ -63,7 +55,7 @@ internal override string ToStringVcardInternal(Version cardVersion) return $"{VcardConstants._soundSpecifier};" + $"{(installAltId ? VcardConstants._altIdArgumentSpecifier + AltId + VcardConstants._fieldDelimiter : "")}" + - $"{(installAltId ? string.Join(VcardConstants._fieldDelimiter.ToString(), AltArguments) + VcardConstants._fieldDelimiter : "")}" + + $"{(installAltId ? string.Join(VcardConstants._fieldDelimiter.ToString(), Arguments) + VcardConstants._fieldDelimiter : "")}" + $"{VcardConstants._valueArgumentSpecifier}{ValueType}{VcardConstants._argumentDelimiter}" + $"{SoundEncoded}"; } @@ -72,10 +64,10 @@ internal override string ToStringVcardInternal(Version cardVersion) string soundArgsLine = $"{VcardConstants._soundSpecifier};" + $"{(installAltId ? VcardConstants._altIdArgumentSpecifier + AltId + VcardConstants._fieldDelimiter : "")}" + - $"{(installAltId ? string.Join(VcardConstants._fieldDelimiter.ToString(), AltArguments) + VcardConstants._fieldDelimiter : "")}" + + $"{(installAltId ? string.Join(VcardConstants._fieldDelimiter.ToString(), Arguments) + VcardConstants._fieldDelimiter : "")}" + $"{VcardConstants._valueArgumentSpecifier}{ValueType}{VcardConstants._fieldDelimiter}" + $"{VcardConstants._encodingArgumentSpecifier}{Encoding}{VcardConstants._fieldDelimiter}" + - $"{VcardConstants._typeArgumentSpecifier}{SoundType}{VcardConstants._argumentDelimiter}"; + $"{VcardConstants._typeArgumentSpecifier}{string.Join(VcardConstants._valueDelimiter.ToString(), ElementTypes)}{VcardConstants._argumentDelimiter}"; return soundArgsLine + VcardParserTools.MakeStringBlock(SoundEncoded, soundArgsLine.Length); } } @@ -94,42 +86,21 @@ internal override string ToStringVcardInternal(Version cardVersion) $"{VcardConstants._soundSpecifier};" + $"{VcardConstants._valueArgumentSpecifier}{ValueType}{VcardConstants._fieldDelimiter}" + $"{VcardConstants._encodingArgumentSpecifier}{Encoding}{VcardConstants._fieldDelimiter}" + - $"{VcardConstants._typeArgumentSpecifier}{SoundType}{VcardConstants._argumentDelimiter}"; + $"{VcardConstants._typeArgumentSpecifier}{string.Join(VcardConstants._valueDelimiter.ToString(), ElementTypes)}{VcardConstants._argumentDelimiter}"; return soundArgsLine + VcardParserTools.MakeStringBlock(SoundEncoded, soundArgsLine.Length); } } } - internal override BaseCardPartInfo FromStringVcardInternal(string value, string[] finalArgs, int altId, string[] elementTypes, string valueType, Version cardVersion) => - throw new InvalidDataException("Sound field must not have empty type."); - - internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion) - { - // Get the value - string soundValue = value.Substring(VcardConstants._soundSpecifier.Length + 1); - string[] splitSound = soundValue.Split(VcardConstants._argumentDelimiter); - if (splitSound.Length < 2) - throw new InvalidDataException("Sound field must specify exactly two values (Type and arguments, and sound information)"); - - // Populate the fields - return InstallInfo(splitSound, finalArgs, altId, cardVersion); - } - - private SoundInfo InstallInfo(string[] splitSound, string[] finalArgs, int altId, Version cardVersion) + internal override BaseCardPartInfo FromStringVcardInternal(string value, string[] finalArgs, int altId, string[] elementTypes, string valueType, Version cardVersion) { bool altIdSupported = cardVersion.Major >= 4; - // Check to see if the value is prepended by the VALUE= argument - string valueType = VcardParserTools.GetValuesString(splitSound, "", VcardConstants._valueArgumentSpecifier).ToLower(); - // Check to see if the value is prepended by the ENCODING= argument - string soundEncoding = VcardParserTools.GetValuesString(splitSound, "BASE64", VcardConstants._encodingArgumentSpecifier); - - // Check to see if the value is prepended with the TYPE= argument - string soundType = VcardParserTools.GetTypesString(splitSound, "WAVE", false); + string soundEncoding = VcardParserTools.GetValuesString(finalArgs, "BASE64", VcardConstants._encodingArgumentSpecifier); // Populate the fields - SoundInfo _sound = new(altIdSupported ? altId : 0, finalArgs, elementTypes, valueType, valueType, soundEncoding, soundType, splitSound[1]); + SoundInfo _sound = new(altIdSupported ? altId : 0, finalArgs, elementTypes, valueType, soundEncoding, value); return _sound; } @@ -159,11 +130,8 @@ public bool Equals(SoundInfo source, SoundInfo target) // Check all the properties return - source.AltArguments.SequenceEqual(target.AltArguments) && base.Equals(source, target) && - source.ValueType == target.ValueType && source.Encoding == target.Encoding && - source.SoundType == target.SoundType && source.SoundEncoded == target.SoundEncoded ; } @@ -171,19 +139,16 @@ public bool Equals(SoundInfo source, SoundInfo target) /// public override int GetHashCode() { - int hashCode = 21154477; - hashCode = hashCode * -1521134295 + AltId.GetHashCode(); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(AltArguments); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(ValueType); + int hashCode = -1776094900; + hashCode = hashCode * -1521134295 + base.GetHashCode(); hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(Encoding); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(SoundType); hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(SoundEncoded); return hashCode; } /// public static bool operator ==(SoundInfo left, SoundInfo right) => - EqualityComparer.Default.Equals(left, right); + left.Equals(right); /// public static bool operator !=(SoundInfo left, SoundInfo right) => @@ -191,13 +156,10 @@ public override int GetHashCode() internal SoundInfo() { } - internal SoundInfo(int altId, string[] arguments, string[] elementTypes, string valueType, string valueType, string encoding, string soundType, string soundEncoded) + internal SoundInfo(int altId, string[] arguments, string[] elementTypes, string valueType, string encoding, string soundEncoded) : + base(arguments, altId, elementTypes, valueType) { - AltId = altId; - Arguments = arguments; - ValueType = valueType; Encoding = encoding; - SoundType = soundType; SoundEncoded = soundEncoded; } } diff --git a/VisualCard/Parts/Implementations/TelephoneInfo.cs b/VisualCard/Parts/Implementations/TelephoneInfo.cs index 75fe532..0e6f7c7 100644 --- a/VisualCard/Parts/Implementations/TelephoneInfo.cs +++ b/VisualCard/Parts/Implementations/TelephoneInfo.cs @@ -33,10 +33,6 @@ namespace VisualCard.Parts.Implementations [DebuggerDisplay("Telephone = {ContactPhoneNumber}")] public class TelephoneInfo : BaseCardPartInfo, IEquatable { - /// - /// The contact's phone types - /// - public string[] ContactPhoneTypes { get; } /// /// The contact's phone number /// @@ -54,52 +50,25 @@ internal override string ToStringVcardInternal(Version cardVersion) return $"{VcardConstants._telephoneSpecifier};" + $"{(installAltId ? VcardConstants._altIdArgumentSpecifier + AltId + VcardConstants._fieldDelimiter : "")}" + - $"{VcardConstants._typeArgumentSpecifier}{string.Join(",", ContactPhoneTypes)}{VcardConstants._argumentDelimiter}" + + $"{VcardConstants._typeArgumentSpecifier}{string.Join(",", ElementTypes)}{VcardConstants._argumentDelimiter}" + $"{ContactPhoneNumber}"; } else { return $"{VcardConstants._telephoneSpecifier};" + - $"{VcardConstants._typeArgumentSpecifier}{string.Join(",", ContactPhoneTypes)}{VcardConstants._argumentDelimiter}" + + $"{VcardConstants._typeArgumentSpecifier}{string.Join(",", ElementTypes)}{VcardConstants._argumentDelimiter}" + $"{ContactPhoneNumber}"; } } internal override BaseCardPartInfo FromStringVcardInternal(string value, string[] finalArgs, int altId, string[] elementTypes, string valueType, Version cardVersion) - { - // Get the value - string telValue = value.Substring(VcardConstants._telephoneSpecifier.Length + 1); - - // Populate the fields - return InstallInfo([telValue], altId, cardVersion); - } - - internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion) - { - // Get the value - string telValue = value.Substring(VcardConstants._telephoneSpecifier.Length + 1); - string[] splitTel = telValue.Split(VcardConstants._argumentDelimiter); - if (splitTel.Length < 2) - throw new InvalidDataException("Telephone field must specify exactly two values (Type (optionally prepended with TYPE=), and phone number)"); - - // Populate the fields - return InstallInfo(splitTel, finalArgs, altId, cardVersion); - } - - private TelephoneInfo InstallInfo(string[] splitTel, int altId, Version cardVersion) => - InstallInfo(splitTel, [], altId, cardVersion); - - private TelephoneInfo InstallInfo(string[] splitTel, string[] finalArgs, int altId, Version cardVersion) { bool altIdSupported = cardVersion.Major >= 4; - bool installType = splitTel.Length > 1; - bool specifierRequired = cardVersion.Major >= 3; // Populate the fields - string[] _telephoneTypes = installType ? VcardParserTools.GetTypes(splitTel, "CELL", specifierRequired) : ["CELL"]; - string _telephoneNumber = Regex.Unescape(installType ? splitTel[1] : splitTel[0]); - TelephoneInfo _telephone = new(altIdSupported ? altId : 0, finalArgs, elementTypes, valueType, _telephoneTypes, _telephoneNumber); + string _telephoneNumber = Regex.Unescape(value); + TelephoneInfo _telephone = new(altIdSupported ? altId : 0, finalArgs, elementTypes, valueType, _telephoneNumber); return _telephone; } @@ -129,8 +98,6 @@ public bool Equals(TelephoneInfo source, TelephoneInfo target) // Check all the properties return - source.ContactPhoneTypes.SequenceEqual(target.ContactPhoneTypes) && - source.AltArguments.SequenceEqual(target.AltArguments) && base.Equals(source, target) && source.ContactPhoneNumber == target.ContactPhoneNumber ; @@ -139,17 +106,15 @@ public bool Equals(TelephoneInfo source, TelephoneInfo target) /// public override int GetHashCode() { - int hashCode = -986063477; - hashCode = hashCode * -1521134295 + AltId.GetHashCode(); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(AltArguments); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(ContactPhoneTypes); + int hashCode = 292984562; + hashCode = hashCode * -1521134295 + base.GetHashCode(); hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(ContactPhoneNumber); return hashCode; } /// public static bool operator ==(TelephoneInfo left, TelephoneInfo right) => - EqualityComparer.Default.Equals(left, right); + left.Equals(right); /// public static bool operator !=(TelephoneInfo left, TelephoneInfo right) => @@ -157,11 +122,9 @@ public override int GetHashCode() internal TelephoneInfo() { } - internal TelephoneInfo(int altId, string[] arguments, string[] elementTypes, string valueType, string[] contactPhoneTypes, string contactPhoneNumber) + internal TelephoneInfo(int altId, string[] arguments, string[] elementTypes, string valueType, string contactPhoneNumber) : + base(arguments, altId, elementTypes, valueType) { - AltId = altId; - Arguments = arguments; - ContactPhoneTypes = contactPhoneTypes; ContactPhoneNumber = contactPhoneNumber; } } diff --git a/VisualCard/Parts/Implementations/TimeDateZoneInfo.cs b/VisualCard/Parts/Implementations/TimeDateZoneInfo.cs index 245b759..721b0f8 100644 --- a/VisualCard/Parts/Implementations/TimeDateZoneInfo.cs +++ b/VisualCard/Parts/Implementations/TimeDateZoneInfo.cs @@ -33,10 +33,6 @@ namespace VisualCard.Parts.Implementations [DebuggerDisplay("Time zone = {TimeZone}")] public class TimeDateZoneInfo : BaseCardPartInfo, IEquatable { - /// - /// The contact's time zone types - /// - public string[] TimeZoneTypes { get; } /// /// The contact's time zone /// @@ -54,7 +50,7 @@ internal override string ToStringVcardInternal(Version cardVersion) return $"{VcardConstants._timeZoneSpecifier}{(installAltId ? VcardConstants._fieldDelimiter : VcardConstants._argumentDelimiter)}" + $"{(installAltId ? VcardConstants._altIdArgumentSpecifier + AltId + VcardConstants._fieldDelimiter : "")}" + - $"{(installAltId ? string.Join(VcardConstants._fieldDelimiter.ToString(), AltArguments) + VcardConstants._argumentDelimiter : "")}" + + $"{(installAltId ? string.Join(VcardConstants._fieldDelimiter.ToString(), Arguments) + VcardConstants._argumentDelimiter : "")}" + $"{TimeZone}"; } else @@ -66,40 +62,14 @@ internal override string ToStringVcardInternal(Version cardVersion) } internal override BaseCardPartInfo FromStringVcardInternal(string value, string[] finalArgs, int altId, string[] elementTypes, string valueType, Version cardVersion) - { - // Get the value - string tzValue = value.Substring(VcardConstants._timeZoneSpecifier.Length + 1); - - // Populate the fields - return InstallInfo([tzValue], false, altId, cardVersion); - } - - internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion) - { - // Check the line - string tzValue = value.Substring(VcardConstants._timeZoneSpecifier.Length + 1); - string[] splitTz = tzValue.Split(VcardConstants._argumentDelimiter); - if (splitTz.Length < 2) - throw new InvalidDataException("Time Zone field must specify exactly two values (VALUE=\"text\" / \"uri\" / \"utc-offset\", and time zone info)"); - - // Populate the fields - return InstallInfo(splitTz, true, finalArgs, altId, cardVersion); - } - - private TimeDateZoneInfo InstallInfo(string[] splitTz, bool installType, int altId, Version cardVersion) => - InstallInfo(splitTz, installType, [], altId, cardVersion); - - private TimeDateZoneInfo InstallInfo(string[] splitTz, bool installType, string[] finalArgs, int altId, Version cardVersion) { bool altIdSupported = cardVersion.Major >= 4; - bool typesSupported = cardVersion.Major >= 3; // Get the types and the number - string[] _geoTypes = typesSupported ? installType ? VcardParserTools.GetValues(splitTz, "", VcardConstants._valueArgumentSpecifier) : ["uri-offset"] : []; - string _geoStr = Regex.Unescape(typesSupported ? installType ? splitTz[1] : splitTz[0] : splitTz[0]); + string _tzStr = Regex.Unescape(value); // Add the fetched information - TimeDateZoneInfo _timeZone = new(altIdSupported ? altId : 0, finalArgs, elementTypes, valueType, _geoTypes, _geoStr); + TimeDateZoneInfo _timeZone = new(altIdSupported ? altId : 0, finalArgs, elementTypes, valueType, _tzStr); return _timeZone; } @@ -129,8 +99,6 @@ public bool Equals(TimeDateZoneInfo source, TimeDateZoneInfo target) // Check all the properties return - source.AltArguments.SequenceEqual(target.AltArguments) && - source.TimeZoneTypes.SequenceEqual(target.TimeZoneTypes) && base.Equals(source, target) && source.TimeZone == target.TimeZone ; @@ -139,17 +107,15 @@ public bool Equals(TimeDateZoneInfo source, TimeDateZoneInfo target) /// public override int GetHashCode() { - int hashCode = 1304261678; - hashCode = hashCode * -1521134295 + AltId.GetHashCode(); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(AltArguments); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(TimeZoneTypes); + int hashCode = 1988546296; + hashCode = hashCode * -1521134295 + base.GetHashCode(); hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(TimeZone); return hashCode; } /// public static bool operator ==(TimeDateZoneInfo left, TimeDateZoneInfo right) => - EqualityComparer.Default.Equals(left, right); + left.Equals(right); /// public static bool operator !=(TimeDateZoneInfo left, TimeDateZoneInfo right) => @@ -157,11 +123,9 @@ public override int GetHashCode() internal TimeDateZoneInfo() { } - internal TimeDateZoneInfo(int altId, string[] arguments, string[] elementTypes, string valueType, string[] timeZoneTypes, string timeZone) + internal TimeDateZoneInfo(int altId, string[] arguments, string[] elementTypes, string valueType, string timeZone) : + base(arguments, altId, elementTypes, valueType) { - AltId = altId; - Arguments = arguments; - TimeZoneTypes = timeZoneTypes; TimeZone = timeZone; } } diff --git a/VisualCard/Parts/Implementations/TitleInfo.cs b/VisualCard/Parts/Implementations/TitleInfo.cs index 6f8828a..1c52f7f 100644 --- a/VisualCard/Parts/Implementations/TitleInfo.cs +++ b/VisualCard/Parts/Implementations/TitleInfo.cs @@ -49,7 +49,7 @@ internal override string ToStringVcardInternal(Version cardVersion) return $"{(installAltId ? $"{VcardConstants._titleSpecifier};" : $"{VcardConstants._titleSpecifier}:")}" + $"{(installAltId ? VcardConstants._altIdArgumentSpecifier + AltId + VcardConstants._fieldDelimiter : "")}" + - $"{(installAltId ? string.Join(VcardConstants._fieldDelimiter.ToString(), AltArguments) + VcardConstants._argumentDelimiter : "")}" + + $"{(installAltId ? string.Join(VcardConstants._fieldDelimiter.ToString(), Arguments) + VcardConstants._argumentDelimiter : "")}" + $"{ContactTitle}"; } else @@ -61,31 +61,9 @@ internal override string ToStringVcardInternal(Version cardVersion) } internal override BaseCardPartInfo FromStringVcardInternal(string value, string[] finalArgs, int altId, string[] elementTypes, string valueType, Version cardVersion) - { - // Get the value - string titleValue = value.Substring(VcardConstants._titleSpecifier.Length + 1); - - // Populate the fields - return InstallInfo([titleValue], altId, cardVersion); - } - - internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion) - { - // Get the value - string titleValue = value.Substring(VcardConstants._titleSpecifier.Length + 1); - string[] splitTitleParts = titleValue.Split(VcardConstants._argumentDelimiter); - - // Populate the fields - return InstallInfo(splitTitleParts, finalArgs, altId, cardVersion); - } - - private TitleInfo InstallInfo(string[] splitTitleParts, int altId, Version cardVersion) => - InstallInfo(splitTitleParts, [], altId, cardVersion); - - private TitleInfo InstallInfo(string[] splitTitleParts, string[] finalArgs, int altId, Version cardVersion) { bool altIdSupported = cardVersion.Major >= 4; - string _title = Regex.Unescape(splitTitleParts.Length > 1 ? splitTitleParts[1] : splitTitleParts[0]); + string _title = Regex.Unescape(value); TitleInfo _titleInfo = new(altIdSupported ? altId : 0, finalArgs, elementTypes, valueType, _title); return _titleInfo; } @@ -116,7 +94,6 @@ public bool Equals(TitleInfo source, TitleInfo target) // Check all the properties return - source.AltArguments.SequenceEqual(target.AltArguments) && base.Equals(source, target) && source.ContactTitle == target.ContactTitle ; @@ -125,16 +102,15 @@ public bool Equals(TitleInfo source, TitleInfo target) /// public override int GetHashCode() { - int hashCode = -1478940212; - hashCode = hashCode * -1521134295 + AltId.GetHashCode(); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(AltArguments); + int hashCode = -345092951; + hashCode = hashCode * -1521134295 + base.GetHashCode(); hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(ContactTitle); return hashCode; } /// public static bool operator ==(TitleInfo left, TitleInfo right) => - EqualityComparer.Default.Equals(left, right); + left.Equals(right); /// public static bool operator !=(TitleInfo left, TitleInfo right) => @@ -142,10 +118,9 @@ public override int GetHashCode() internal TitleInfo() { } - internal TitleInfo(int altId, string[] arguments, string[] elementTypes, string valueType, string contactTitle) + internal TitleInfo(int altId, string[] arguments, string[] elementTypes, string valueType, string contactTitle) : + base(arguments, altId, elementTypes, valueType) { - AltId = altId; - Arguments = arguments; ContactTitle = contactTitle; } } diff --git a/VisualCard/Parts/Implementations/XNameInfo.cs b/VisualCard/Parts/Implementations/XNameInfo.cs index c0b755b..fb218cd 100644 --- a/VisualCard/Parts/Implementations/XNameInfo.cs +++ b/VisualCard/Parts/Implementations/XNameInfo.cs @@ -38,10 +38,6 @@ public class XNameInfo : BaseCardPartInfo, IEquatable /// /// X- values /// - public string[] XKeyTypes { get; } - /// - /// X- values - /// public string[] XValues { get; } internal static BaseCardPartInfo FromStringVcardStatic(string value, string[] finalArgs, int altId, string[] elementTypes, string valueType, Version cardVersion) => @@ -53,49 +49,28 @@ internal override string ToStringVcardInternal(Version cardVersion) if (altIdSupported) { bool installAltId = AltId >= 0 && Arguments.Length > 0; - bool installType = installAltId && XKeyTypes.Length > 0; + bool installType = installAltId && ElementTypes.Length > 0; return $"{VcardConstants._xSpecifier}" + $"{XKeyName}{(installType ? VcardConstants._fieldDelimiter : VcardConstants._argumentDelimiter)}" + $"{(installAltId ? VcardConstants._altIdArgumentSpecifier + AltId + VcardConstants._fieldDelimiter : "")}" + - $"{(XKeyTypes.Length > 0 ? string.Join(VcardConstants._fieldDelimiter.ToString(), XKeyTypes) + VcardConstants._argumentDelimiter : "")}" + + $"{(ElementTypes.Length > 0 ? string.Join(VcardConstants._fieldDelimiter.ToString(), ElementTypes) + VcardConstants._argumentDelimiter : "")}" + $"{string.Join(VcardConstants._fieldDelimiter.ToString(), XValues)}"; } else { return $"{VcardConstants._xSpecifier}" + - $"{XKeyName}{(XKeyTypes.Length > 0 ? VcardConstants._fieldDelimiter : VcardConstants._argumentDelimiter)}" + - $"{(XKeyTypes.Length > 0 ? string.Join(VcardConstants._fieldDelimiter.ToString(), XKeyTypes) + VcardConstants._argumentDelimiter : "")}" + + $"{XKeyName}{(ElementTypes.Length > 0 ? VcardConstants._fieldDelimiter : VcardConstants._argumentDelimiter)}" + + $"{(ElementTypes.Length > 0 ? string.Join(VcardConstants._fieldDelimiter.ToString(), ElementTypes) + VcardConstants._argumentDelimiter : "")}" + $"{string.Join(VcardConstants._fieldDelimiter.ToString(), XValues)}"; } } internal override BaseCardPartInfo FromStringVcardInternal(string value, string[] finalArgs, int altId, string[] elementTypes, string valueType, Version cardVersion) { - // Get the value - string xValue = value.Substring(VcardConstants._xSpecifier.Length); - string[] splitX = xValue.Split(VcardConstants._argumentDelimiter); - - // Populate the fields - return InstallInfo(splitX, altId, cardVersion); - } - - internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion) - { - // Get the value string xValue = value.Substring(VcardConstants._xSpecifier.Length); string[] splitX = xValue.Split(VcardConstants._argumentDelimiter); - - // Populate the fields - return InstallInfo(splitX, finalArgs, altId, cardVersion); - } - - private XNameInfo InstallInfo(string[] splitX, int altId, Version cardVersion) => - InstallInfo(splitX, [], altId, cardVersion); - - private XNameInfo InstallInfo(string[] splitX, string[] finalArgs, int altId, Version cardVersion) - { bool altIdSupported = cardVersion.Major >= 4; // Populate the name @@ -104,12 +79,8 @@ private XNameInfo InstallInfo(string[] splitX, string[] finalArgs, int altId, Ve splitX[0]; // Populate the fields - string[] _xTypes = splitX[0].Contains(VcardConstants._fieldDelimiter.ToString()) ? - splitX[0].Substring(splitX[0].IndexOf(VcardConstants._fieldDelimiter) + 1) - .Split(VcardConstants._fieldDelimiter) : - []; string[] _xValues = splitX[1].Split(VcardConstants._fieldDelimiter); - XNameInfo _x = new(altIdSupported ? altId : 0, finalArgs, elementTypes, valueType, _xName, _xValues, _xTypes); + XNameInfo _x = new(altIdSupported ? altId : 0, finalArgs, elementTypes, valueType, _xName, _xValues); return _x; } @@ -139,10 +110,8 @@ public bool Equals(XNameInfo source, XNameInfo target) // Check all the properties return - source.AltArguments.SequenceEqual(target.AltArguments) && - source.XKeyTypes.SequenceEqual(target.XKeyTypes) && - source.XValues.SequenceEqual(target.XValues) && base.Equals(source, target) && + source.XValues.SequenceEqual(target.XValues) && source.XKeyName == target.XKeyName ; } @@ -150,18 +119,16 @@ public bool Equals(XNameInfo source, XNameInfo target) /// public override int GetHashCode() { - int hashCode = 1235403650; - hashCode = hashCode * -1521134295 + AltId.GetHashCode(); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(AltArguments); + int hashCode = 390070728; + hashCode = hashCode * -1521134295 + base.GetHashCode(); hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(XKeyName); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(XKeyTypes); hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(XValues); return hashCode; } /// public static bool operator ==(XNameInfo left, XNameInfo right) => - EqualityComparer.Default.Equals(left, right); + left.Equals(right); /// public static bool operator !=(XNameInfo left, XNameInfo right) => @@ -169,13 +136,11 @@ public override int GetHashCode() internal XNameInfo() { } - internal XNameInfo(int altId, string[] arguments, string[] elementTypes, string valueType, string xKeyName, string[] xValues, string[] xKeyTypes) + internal XNameInfo(int altId, string[] arguments, string[] elementTypes, string valueType, string xKeyName, string[] xValues) : + base(arguments, altId, elementTypes, valueType) { - AltId = altId; - Arguments = arguments; XKeyName = xKeyName; XValues = xValues; - XKeyTypes = xKeyTypes; } } } diff --git a/VisualCard/Parts/Implementations/XmlInfo.cs b/VisualCard/Parts/Implementations/XmlInfo.cs index 0fb7634..746f947 100644 --- a/VisualCard/Parts/Implementations/XmlInfo.cs +++ b/VisualCard/Parts/Implementations/XmlInfo.cs @@ -55,27 +55,6 @@ internal override string ToStringVcardInternal(Version cardVersion) } internal override BaseCardPartInfo FromStringVcardInternal(string value, string[] finalArgs, int altId, string[] elementTypes, string valueType, Version cardVersion) - { - // Get the value - string xmlValue = value.Substring(VcardConstants._xmlSpecifier.Length + 1); - - // Populate the fields - return InstallInfo(xmlValue, altId, cardVersion); - } - - internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion) - { - // Get the value - string xmlValue = value.Substring(value.IndexOf(VcardConstants._argumentDelimiter) + 1); - - // Populate the fields - return InstallInfo(xmlValue, finalArgs, altId, cardVersion); - } - - private XmlInfo InstallInfo(string value, int altId, Version cardVersion) => - InstallInfo(value, [], altId, cardVersion); - - private XmlInfo InstallInfo(string value, string[] finalArgs, int altId, Version cardVersion) { // Check to see if the XML document is valid or not string finalXml = @@ -120,7 +99,6 @@ public bool Equals(XmlInfo source, XmlInfo target) // Check all the properties return - source.AltArguments.SequenceEqual(target.AltArguments) && base.Equals(source, target) && source.Xml == target.Xml ; @@ -129,17 +107,16 @@ public bool Equals(XmlInfo source, XmlInfo target) /// public override int GetHashCode() { - int hashCode = -771740963; + int hashCode = 572884467; hashCode = hashCode * -1521134295 + base.GetHashCode(); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(AltArguments); - hashCode = hashCode * -1521134295 + AltId.GetHashCode(); hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(Xml); + hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(XmlString); return hashCode; } /// public static bool operator ==(XmlInfo left, XmlInfo right) => - EqualityComparer.Default.Equals(left, right); + left.Equals(right); /// public static bool operator !=(XmlInfo left, XmlInfo right) => @@ -147,10 +124,9 @@ public override int GetHashCode() internal XmlInfo() { } - internal XmlInfo(int altId, string[] arguments, string[] elementTypes, string valueType, XmlDocument xml, string xmlString) + internal XmlInfo(int altId, string[] arguments, string[] elementTypes, string valueType, XmlDocument xml, string xmlString) : + base(arguments, altId, elementTypes, valueType) { - AltId = altId; - Arguments = arguments; Xml = xml; XmlString = xmlString; }