diff --git a/.editorconfig b/.editorconfig
index 053e56b..6c289ef 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -46,3 +46,7 @@ end_of_line = crlf
insert_final_newline = true
indent_style = space
indent_size = 2
+
+[*.vcf]
+insert_final_newline = true
+indent_style = tab
diff --git a/VisualCard.ShowContacts/Properties/launchSettings.json b/VisualCard.ShowContacts/Properties/launchSettings.json
index 4b29e91..badb941 100644
--- a/VisualCard.ShowContacts/Properties/launchSettings.json
+++ b/VisualCard.ShowContacts/Properties/launchSettings.json
@@ -23,6 +23,10 @@
"vCard 5.0 test (with agents)": {
"commandName": "Project",
"commandLineArgs": "TestFiles/fourVCard5Agents.vcf"
+ },
+ "vCard - Picture test": {
+ "commandName": "Project",
+ "commandLineArgs": "TestFiles/picture.vcf"
}
}
}
\ No newline at end of file
diff --git a/VisualCard.ShowContacts/TestFiles/fourVCard4.vcf b/VisualCard.ShowContacts/TestFiles/fourVCard4.vcf
index 943e2bc..d81191d 100644
--- a/VisualCard.ShowContacts/TestFiles/fourVCard4.vcf
+++ b/VisualCard.ShowContacts/TestFiles/fourVCard4.vcf
@@ -15,7 +15,12 @@ IMPP;TYPE=HOME:aim:IM
IMPP;TYPE=HOME:msn:Windows LIVE
IMPP;TYPE=HOME:ymsgr:Yahoo
N:Navasquillo;Neville;Neville\,Nevile;Mr.;Jr.
-N;ALTID=0;LANGUAGE=de:NAVASQUILLO;Neville;Neville\,Nevile;Mr.;Jr.
+N;ALTID=0;LANGUAGE=de:
+ NAVASQUILLO;
+ Neville;
+ Neville\,Nevile;
+ Mr.;
+ Jr.
NOTE:Notes
ORG:Organization
TEL;TYPE=work:098-765-4321
@@ -24,7 +29,8 @@ TEL;TYPE=voice:078-494-6434
TEL;TYPE=home:348-404-8404
TITLE:Title
GENDER:M
-X-ANDROID-CUSTOM:vnd.android.cursor.item/nickname;NVL.N;1;;;;;;;;;;;;;
+X-ANDROID-CUSTOM:vnd.android.cursor.item/nickname;NVL.N;1
+ ;;;;;;;;;;;;;
END:VCARD
BEGIN:VCARD
diff --git a/VisualCard.ShowContacts/TestFiles/fourVCard5Agents.vcf b/VisualCard.ShowContacts/TestFiles/fourVCard5Agents.vcf
index 001bf0b..3f71745 100644
--- a/VisualCard.ShowContacts/TestFiles/fourVCard5Agents.vcf
+++ b/VisualCard.ShowContacts/TestFiles/fourVCard5Agents.vcf
@@ -53,7 +53,15 @@ IMPP:aim:john.s
N:Sanders;John;;;
NOTE:Note test for VisualCard
ORG:Acme Co.
-AGENT:BEGIN:VCARD\nVERSION:5.0\nFN:Joe Friday\nN:Friday;Joe;;;\nTEL:+1-919-555-7878\nTITLE:Area Administrator\, Assistant\nEMAIL\;TYPE=INTERNET:jfriday@host.com\nEND:VCARD\n
+AGENT:
+ BEGIN:VCARD\n
+ VERSION:5.0\n
+ FN:Joe Friday\n
+ N:Friday;Joe;;;\n
+ TEL:+1-919-555-7878\n
+ TITLE:Area Administrator\, Assistant\n
+ EMAIL\;TYPE=INTERNET:jfriday@host.com\n
+ END:VCARD\n
TEL;TYPE=cell:495-522-3560
TITLE:Product Manager
X-ANDROID-CUSTOM:vnd.android.cursor.item/nickname;JS;1;;;;;;;;;;;;;
diff --git a/VisualCard.ShowContacts/TestFiles/picture.vcf b/VisualCard.ShowContacts/TestFiles/picture.vcf
new file mode 100644
index 0000000..c0e76ff
--- /dev/null
+++ b/VisualCard.ShowContacts/TestFiles/picture.vcf
@@ -0,0 +1,248 @@
+BEGIN:VCARD
+VERSION:2.1
+N:ViceCity;EoflaOE;;;
+FN:EoflaOE ViceCity
+X-ANDROID-CUSTOM:vnd.android.cursor.item/nickname;AptiviCEO;;;;;;;;;;;;;;
+PHOTO;ENCODING=BASE64;PNG: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
+ B5VQAT8Q/6EUAAAAASUVORK5CYII=
+
+END:VCARD
diff --git a/VisualCard.ShowContacts/VisualCard.ShowContacts.csproj b/VisualCard.ShowContacts/VisualCard.ShowContacts.csproj
index 968fb81..a99f206 100644
--- a/VisualCard.ShowContacts/VisualCard.ShowContacts.csproj
+++ b/VisualCard.ShowContacts/VisualCard.ShowContacts.csproj
@@ -26,23 +26,7 @@
-
-
-
-
-
- Always
-
-
- Always
-
-
- Always
-
-
- Always
-
-
+
Always
diff --git a/VisualCard/CardTools.cs b/VisualCard/CardTools.cs
index e8e5fb3..fbd29e4 100644
--- a/VisualCard/CardTools.cs
+++ b/VisualCard/CardTools.cs
@@ -23,6 +23,7 @@
using VisualCard.Parsers;
using System;
using VisualCard.Parts;
+using Textify.General;
namespace VisualCard
{
@@ -79,6 +80,8 @@ public static Card[] GetCards(StreamReader stream)
CardLine = stream.ReadLine();
while (!stream.EndOfStream)
{
+ bool append = false;
+
// Skip empty lines
if (string.IsNullOrEmpty(CardLine))
{
@@ -90,7 +93,9 @@ public static Card[] GetCards(StreamReader stream)
else if (CardLine != VcardConstants._beginText &&
!CardLine.StartsWith(VcardConstants._versionSpecifier) &&
CardLine != VcardConstants._endText)
- CardContent.AppendLine(CardLine);
+ append = true;
+ if (append)
+ CardContent.Append(CardLine);
// All VCards must begin with BEGIN:VCARD
if (CardLine != VcardConstants._beginText && !BeginSpotted)
@@ -126,7 +131,9 @@ public static Card[] GetCards(StreamReader stream)
EndSpotted = true;
// Make a new parser instance
- VcardParser CardParser = new(CardContent.ToString(), CardVersion);
+ string content = CardContent.ToString();
+ string[] contentLines = content.SplitNewLines();
+ VcardParser CardParser = new(contentLines, CardVersion);
FinalParsers.Add(CardParser);
// Clear the content in case we want to make a second contact
@@ -134,6 +141,8 @@ public static Card[] GetCards(StreamReader stream)
BeginSpotted = false;
CardLine = stream.ReadLine();
}
+ else if (append)
+ CardContent.AppendLine();
}
// Close the stream to avoid stuck file handle
diff --git a/VisualCard/Parsers/VcardConstants.cs b/VisualCard/Parsers/VcardConstants.cs
index 47595e6..601433b 100644
--- a/VisualCard/Parsers/VcardConstants.cs
+++ b/VisualCard/Parsers/VcardConstants.cs
@@ -26,6 +26,10 @@ internal static class VcardConstants
internal const string _endText = "END:VCARD";
internal const string _versionSpecifier = "VERSION";
+ // Misc vCard constants
+ internal const string _spaceBreak = " ";
+ internal const string _tabBreak = "\x0009";
+
// Available in vCard 2.1, 3.0, 4.0, and 5.0
internal const char _fieldDelimiter = ';';
internal const char _valueDelimiter = ',';
diff --git a/VisualCard/Parsers/VcardParser.cs b/VisualCard/Parsers/VcardParser.cs
index b326b3e..ac5f3f2 100644
--- a/VisualCard/Parsers/VcardParser.cs
+++ b/VisualCard/Parsers/VcardParser.cs
@@ -25,6 +25,7 @@
using System.Reflection;
using System.Text;
using System.Text.RegularExpressions;
+using Textify.General;
using VisualCard.Exceptions;
using VisualCard.Parts;
using VisualCard.Parts.Enums;
@@ -39,44 +40,60 @@ namespace VisualCard.Parsers
internal class VcardParser
{
private readonly Version cardVersion = new();
- private readonly string cardContent = "";
+ private readonly string[] cardContent = [];
///
/// VCard card content
///
- public virtual string CardContent =>
+ public string[] CardContent =>
cardContent;
///
/// VCard card version
///
- public virtual Version CardVersion =>
+ public Version CardVersion =>
cardVersion;
///
/// Parses a VCard contact
///
/// A strongly-typed instance holding information about the card
- public virtual Card Parse()
+ public Card Parse()
{
// Check the content to ensure that we really have data
- if (string.IsNullOrEmpty(CardContent))
+ if (CardContent.Length == 0)
throw new InvalidDataException($"Card content is empty.");
- // Now, make a stream out of card content
- byte[] CardContentData = Encoding.Default.GetBytes(CardContent);
- MemoryStream CardContentStream = new(CardContentData, false);
- StreamReader CardContentReader = new(CardContentStream);
-
// Make a new vCard
var card = new Card(CardVersion);
// Iterate through all the lines
- int lineNumber = 0;
- while (!CardContentReader.EndOfStream)
+ bool constructing = false;
+ StringBuilder valueBuilder = new();
+ for (int i = 0; i < CardContent.Length; i++)
{
// Get line
- string _value = CardContentReader.ReadLine();
- lineNumber += 1;
+ string _value = CardContent[i];
+ int lineNumber = i + 1;
+ if (string.IsNullOrEmpty(_value))
+ continue;
+
+ // First, check to see if we need to construct blocks
+ string secondLine = i + 1 < CardContent.Length ? CardContent[i + 1] : "";
+ bool firstConstructedLine = !_value.StartsWith(VcardConstants._spaceBreak) && !_value.StartsWith(VcardConstants._tabBreak);
+ constructing = secondLine.StartsWithAnyOf([VcardConstants._spaceBreak, VcardConstants._tabBreak]);
+ secondLine = secondLine.Length > 1 ? secondLine.Substring(1) : "";
+ if (constructing)
+ {
+ if (firstConstructedLine)
+ valueBuilder.Append(_value);
+ valueBuilder.Append(secondLine);
+ continue;
+ }
+ else if (!firstConstructedLine)
+ {
+ _value = valueBuilder.ToString();
+ valueBuilder.Clear();
+ }
// Variables
string value = _value.Substring(_value.IndexOf(VcardConstants._argumentDelimiter) + 1);
@@ -186,8 +203,8 @@ public virtual Card Parse()
// Now, get the part info
var partInfo =
isWithType ?
- fromStringMethod.Invoke(null, [_value, finalArgs.ToArray(), altId, CardVersion, CardContentReader]) :
- fromStringMethod.Invoke(null, [_value, altId, CardVersion, CardContentReader]);
+ fromStringMethod.Invoke(null, [_value, finalArgs.ToArray(), altId, CardVersion]) :
+ fromStringMethod.Invoke(null, [_value, altId, CardVersion]);
card.SetPart(partsType, (BaseCardPartInfo)partInfo);
}
break;
@@ -205,8 +222,8 @@ public virtual Card Parse()
// Now, get the part info
var partInfo =
isWithType ?
- fromStringMethod.Invoke(null, [_value, finalArgs.ToArray(), altId, CardVersion, CardContentReader]) :
- fromStringMethod.Invoke(null, [_value, altId, CardVersion, CardContentReader]);
+ fromStringMethod.Invoke(null, [_value, finalArgs.ToArray(), altId, CardVersion]) :
+ fromStringMethod.Invoke(null, [_value, altId, CardVersion]);
card.AddPartToArray(partsArrayType, (BaseCardPartInfo)partInfo);
}
break;
@@ -266,7 +283,7 @@ internal void ValidateCard(Card card)
throw new InvalidDataException($"The following keys [{string.Join(", ", expectedFields)}] are required. Got [{string.Join(", ", actualFields)}].");
}
- internal VcardParser(string cardContent, Version cardVersion)
+ internal VcardParser(string[] cardContent, Version cardVersion)
{
this.cardContent = cardContent;
this.cardVersion = cardVersion;
diff --git a/VisualCard/Parts/BaseCardPartInfo.cs b/VisualCard/Parts/BaseCardPartInfo.cs
index 73bc453..1030212 100644
--- a/VisualCard/Parts/BaseCardPartInfo.cs
+++ b/VisualCard/Parts/BaseCardPartInfo.cs
@@ -89,9 +89,9 @@ public override int GetHashCode()
public static bool operator !=(BaseCardPartInfo left, BaseCardPartInfo right) =>
!(left == right);
- internal abstract BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion, StreamReader cardContentReader);
+ internal abstract BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion);
- internal abstract BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader);
+ internal abstract BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion);
internal abstract string ToStringVcardInternal(Version cardVersion);
}
diff --git a/VisualCard/Parts/Implementations/AddressInfo.cs b/VisualCard/Parts/Implementations/AddressInfo.cs
index 7d035ad..07ce452 100644
--- a/VisualCard/Parts/Implementations/AddressInfo.cs
+++ b/VisualCard/Parts/Implementations/AddressInfo.cs
@@ -66,11 +66,11 @@ public class AddressInfo : BaseCardPartInfo, IEquatable
///
public string Country { get; }
- internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new AddressInfo().FromStringVcardInternal(value, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion) =>
+ new AddressInfo().FromStringVcardInternal(value, altId, cardVersion);
- internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new AddressInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion) =>
+ new AddressInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion);
internal override string ToStringVcardInternal(Version cardVersion)
{
@@ -105,7 +105,7 @@ internal override string ToStringVcardInternal(Version cardVersion)
}
}
- internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion, StreamReader cardContentReader)
+ internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion)
{
// Get the value
string adrValue = value.Substring(VcardConstants._addressSpecifier.Length + 1);
@@ -120,7 +120,7 @@ internal override BaseCardPartInfo FromStringVcardInternal(string value, int alt
return InstallInfo([], splitAddressValues, altId, cardVersion);
}
- internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader)
+ internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion)
{
// Get the value
string adrValue = value.Substring(VcardConstants._addressSpecifier.Length + 1);
diff --git a/VisualCard/Parts/Implementations/AgentInfo.cs b/VisualCard/Parts/Implementations/AgentInfo.cs
index 4e39937..f0c02ef 100644
--- a/VisualCard/Parts/Implementations/AgentInfo.cs
+++ b/VisualCard/Parts/Implementations/AgentInfo.cs
@@ -40,11 +40,11 @@ public class AgentInfo : BaseCardPartInfo, IEquatable
///
public Card[] AgentCards { get; }
- internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new AgentInfo().FromStringVcardInternal(value, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion) =>
+ new AgentInfo().FromStringVcardInternal(value, altId, cardVersion);
- internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new AgentInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion) =>
+ new AgentInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion);
internal override string ToStringVcardInternal(Version cardVersion)
{
@@ -74,7 +74,7 @@ internal override string ToStringVcardInternal(Version cardVersion)
return agents.ToString();
}
- internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion, StreamReader cardContentReader)
+ internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion)
{
// Get the value
string agentValue = value.Substring(VcardConstants._agentSpecifier.Length + 1);
@@ -89,7 +89,7 @@ internal override BaseCardPartInfo FromStringVcardInternal(string value, int alt
return InstallInfo(agentValue, altId, cardVersion);
}
- internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader)
+ internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion)
{
// Get the value
string agentValue = value.Substring(VcardConstants._agentSpecifier.Length + 1);
diff --git a/VisualCard/Parts/Implementations/AnniversaryInfo.cs b/VisualCard/Parts/Implementations/AnniversaryInfo.cs
index 74224bd..007a310 100644
--- a/VisualCard/Parts/Implementations/AnniversaryInfo.cs
+++ b/VisualCard/Parts/Implementations/AnniversaryInfo.cs
@@ -37,16 +37,16 @@ public class AnniversaryInfo : BaseCardPartInfo, IEquatable
///
public DateTime? Anniversary { get; }
- internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new AnniversaryInfo().FromStringVcardInternal(value, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion) =>
+ new AnniversaryInfo().FromStringVcardInternal(value, altId, cardVersion);
- internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new AnniversaryInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion) =>
+ new AnniversaryInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion);
internal override string ToStringVcardInternal(Version cardVersion) =>
$"{VcardConstants._anniversarySpecifier}:{Anniversary:yyyyMMdd}";
- internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion, StreamReader cardContentReader)
+ internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion)
{
// Get the value
string anniversaryValue = value.Substring(VcardConstants._anniversarySpecifier.Length + 1);
@@ -55,8 +55,8 @@ internal override BaseCardPartInfo FromStringVcardInternal(string value, int alt
return InstallInfo(anniversaryValue);
}
- internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader) =>
- FromStringVcardInternal(value, altId, cardVersion, cardContentReader);
+ internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion) =>
+ FromStringVcardInternal(value, altId, cardVersion);
private AnniversaryInfo InstallInfo(string value)
{
diff --git a/VisualCard/Parts/Implementations/BirthDateInfo.cs b/VisualCard/Parts/Implementations/BirthDateInfo.cs
index 5507d32..1b3726a 100644
--- a/VisualCard/Parts/Implementations/BirthDateInfo.cs
+++ b/VisualCard/Parts/Implementations/BirthDateInfo.cs
@@ -37,16 +37,16 @@ public class BirthDateInfo : BaseCardPartInfo, IEquatable
///
public DateTime? BirthDate { get; }
- internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new BirthDateInfo().FromStringVcardInternal(value, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion) =>
+ new BirthDateInfo().FromStringVcardInternal(value, altId, cardVersion);
- internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new BirthDateInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion) =>
+ new BirthDateInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion);
internal override string ToStringVcardInternal(Version cardVersion) =>
$"{VcardConstants._birthSpecifier}:{BirthDate:yyyyMMdd}";
- internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion, StreamReader cardContentReader)
+ internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion)
{
// Get the value
string bdayValue = value.Substring(VcardConstants._birthSpecifier.Length + 1);
@@ -55,7 +55,7 @@ internal override BaseCardPartInfo FromStringVcardInternal(string value, int alt
return InstallInfo(bdayValue, altId, cardVersion);
}
- internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader)
+ internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion)
{
// Get the value
string bdayValue = value.Substring(value.IndexOf(VcardConstants._argumentDelimiter) + 1);
diff --git a/VisualCard/Parts/Implementations/CategoryInfo.cs b/VisualCard/Parts/Implementations/CategoryInfo.cs
index 4865013..097db14 100644
--- a/VisualCard/Parts/Implementations/CategoryInfo.cs
+++ b/VisualCard/Parts/Implementations/CategoryInfo.cs
@@ -38,11 +38,11 @@ public class CategoryInfo : BaseCardPartInfo, IEquatable
///
public string[] Category { get; }
- internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new CategoryInfo().FromStringVcardInternal(value, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion) =>
+ new CategoryInfo().FromStringVcardInternal(value, altId, cardVersion);
- internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new CategoryInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion) =>
+ new CategoryInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion);
internal override string ToStringVcardInternal(Version cardVersion)
{
@@ -51,7 +51,7 @@ internal override string ToStringVcardInternal(Version cardVersion)
$"{Category}";
}
- internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion, StreamReader cardContentReader)
+ internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion)
{
// Get the value
string categoryValue = value.Substring(VcardConstants._categoriesSpecifier.Length + 1);
@@ -60,8 +60,8 @@ internal override BaseCardPartInfo FromStringVcardInternal(string value, int alt
return InstallInfo(categoryValue);
}
- internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader) =>
- FromStringVcardInternal(value, altId, cardVersion, cardContentReader);
+ internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion) =>
+ FromStringVcardInternal(value, altId, cardVersion);
private CategoryInfo InstallInfo(string value)
{
diff --git a/VisualCard/Parts/Implementations/EmailInfo.cs b/VisualCard/Parts/Implementations/EmailInfo.cs
index 9773759..c2cec0a 100644
--- a/VisualCard/Parts/Implementations/EmailInfo.cs
+++ b/VisualCard/Parts/Implementations/EmailInfo.cs
@@ -42,11 +42,11 @@ public class EmailInfo : BaseCardPartInfo, IEquatable
///
public string ContactEmailAddress { get; }
- internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new EmailInfo().FromStringVcardInternal(value, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion) =>
+ new EmailInfo().FromStringVcardInternal(value, altId, cardVersion);
- internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new EmailInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion) =>
+ new EmailInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion);
internal override string ToStringVcardInternal(Version cardVersion)
{
@@ -69,7 +69,7 @@ internal override string ToStringVcardInternal(Version cardVersion)
}
}
- internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion, StreamReader cardContentReader)
+ internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion)
{
// Get the value
string mailValue = value.Substring(VcardConstants._emailSpecifier.Length + 1);
@@ -79,7 +79,7 @@ internal override BaseCardPartInfo FromStringVcardInternal(string value, int alt
return InstallInfo(splitMail, altId, cardVersion);
}
- internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader)
+ internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion)
{
// Get the value
string mailValue = value.Substring(VcardConstants._emailSpecifier.Length + 1);
diff --git a/VisualCard/Parts/Implementations/GenderInfo.cs b/VisualCard/Parts/Implementations/GenderInfo.cs
index 6609bfc..b1d7894 100644
--- a/VisualCard/Parts/Implementations/GenderInfo.cs
+++ b/VisualCard/Parts/Implementations/GenderInfo.cs
@@ -42,18 +42,18 @@ public class GenderInfo : BaseCardPartInfo, IEquatable
///
public string GenderDescription { get; }
- internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new GenderInfo().FromStringVcardInternal(value, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion) =>
+ new GenderInfo().FromStringVcardInternal(value, altId, cardVersion);
- internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new GenderInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion) =>
+ new GenderInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion);
internal override string ToStringVcardInternal(Version cardVersion) =>
$"{VcardConstants._genderSpecifier}{VcardConstants._argumentDelimiter}" +
(Gender != Gender.Unspecified ? Gender.ToString()[0] : "") +
(!string.IsNullOrEmpty(GenderDescription) ? $"{VcardConstants._fieldDelimiter}{GenderDescription}" : "");
- internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion, StreamReader cardContentReader)
+ internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion)
{
// Get the value
string genderValue = value.Substring(VcardConstants._genderSpecifier.Length + 1);
@@ -62,8 +62,8 @@ internal override BaseCardPartInfo FromStringVcardInternal(string value, int alt
return InstallInfo(genderValue);
}
- internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader) =>
- FromStringVcardInternal(value, altId, cardVersion, cardContentReader);
+ internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion) =>
+ FromStringVcardInternal(value, altId, cardVersion);
private GenderInfo InstallInfo(string value)
{
diff --git a/VisualCard/Parts/Implementations/GeoInfo.cs b/VisualCard/Parts/Implementations/GeoInfo.cs
index 582232b..3eeaf19 100644
--- a/VisualCard/Parts/Implementations/GeoInfo.cs
+++ b/VisualCard/Parts/Implementations/GeoInfo.cs
@@ -42,11 +42,11 @@ public class GeoInfo : BaseCardPartInfo, IEquatable
///
public string Geo { get; }
- internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new GeoInfo().FromStringVcardInternal(value, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion) =>
+ new GeoInfo().FromStringVcardInternal(value, altId, cardVersion);
- internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new GeoInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion) =>
+ new GeoInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion);
internal override string ToStringVcardInternal(Version cardVersion)
{
@@ -68,7 +68,7 @@ internal override string ToStringVcardInternal(Version cardVersion)
}
}
- internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion, StreamReader cardContentReader)
+ internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion)
{
// Get the value
string geoValue = value.Substring(VcardConstants._geoSpecifier.Length + 1);
@@ -78,7 +78,7 @@ internal override BaseCardPartInfo FromStringVcardInternal(string value, int alt
return InstallInfo([_geoStr], false, altId, cardVersion);
}
- internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader)
+ internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion)
{
// Get the value
string geoValue = value.Substring(VcardConstants._geoSpecifier.Length + 1);
diff --git a/VisualCard/Parts/Implementations/ImppInfo.cs b/VisualCard/Parts/Implementations/ImppInfo.cs
index aba5ec2..0d0915a 100644
--- a/VisualCard/Parts/Implementations/ImppInfo.cs
+++ b/VisualCard/Parts/Implementations/ImppInfo.cs
@@ -42,11 +42,11 @@ public class ImppInfo : BaseCardPartInfo, IEquatable
///
public string[] ImppTypes { get; }
- internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new ImppInfo().FromStringVcardInternal(value, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion) =>
+ new ImppInfo().FromStringVcardInternal(value, altId, cardVersion);
- internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new ImppInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion) =>
+ new ImppInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion);
internal override string ToStringVcardInternal(Version cardVersion)
{
@@ -71,7 +71,7 @@ internal override string ToStringVcardInternal(Version cardVersion)
}
}
- internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion, StreamReader cardContentReader)
+ internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion)
{
// Get the value
string imppValue = value.Substring(VcardConstants._imppSpecifier.Length + 1);
@@ -81,7 +81,7 @@ internal override BaseCardPartInfo FromStringVcardInternal(string value, int alt
return InstallInfo(_imppTypes, imppValue, altId, cardVersion);
}
- internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader)
+ internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion)
{
bool specifierRequired = cardVersion.Major >= 3;
diff --git a/VisualCard/Parts/Implementations/LabelAddressInfo.cs b/VisualCard/Parts/Implementations/LabelAddressInfo.cs
index 7ce5c32..95a52fa 100644
--- a/VisualCard/Parts/Implementations/LabelAddressInfo.cs
+++ b/VisualCard/Parts/Implementations/LabelAddressInfo.cs
@@ -42,11 +42,11 @@ public class LabelAddressInfo : BaseCardPartInfo, IEquatable
///
public string DeliveryLabel { get; }
- internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new LabelAddressInfo().FromStringVcardInternal(value, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion) =>
+ new LabelAddressInfo().FromStringVcardInternal(value, altId, cardVersion);
- internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new LabelAddressInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion) =>
+ new LabelAddressInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion);
internal override string ToStringVcardInternal(Version cardVersion)
{
@@ -69,7 +69,7 @@ internal override string ToStringVcardInternal(Version cardVersion)
}
}
- internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion, StreamReader cardContentReader)
+ internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion)
{
// Get the value
string adrValue = value.Substring(VcardConstants._labelSpecifier.Length + 1);
@@ -84,7 +84,7 @@ internal override BaseCardPartInfo FromStringVcardInternal(string value, int alt
return InstallInfo(splitAdr, splitAddressValues, altId, cardVersion);
}
- internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader)
+ internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion)
{
// Get the value
string adrValue = value.Substring(VcardConstants._labelSpecifier.Length + 1);
diff --git a/VisualCard/Parts/Implementations/LogoInfo.cs b/VisualCard/Parts/Implementations/LogoInfo.cs
index e1e3bdc..7a63dd0 100644
--- a/VisualCard/Parts/Implementations/LogoInfo.cs
+++ b/VisualCard/Parts/Implementations/LogoInfo.cs
@@ -50,11 +50,11 @@ public class LogoInfo : BaseCardPartInfo, IEquatable
///
public string LogoEncoded { get; }
- internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new LogoInfo().FromStringVcardInternal(value, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion) =>
+ new LogoInfo().FromStringVcardInternal(value, altId, cardVersion);
- internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new LogoInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion) =>
+ new LogoInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion);
internal override string ToStringVcardInternal(Version cardVersion)
{
@@ -104,10 +104,10 @@ internal override string ToStringVcardInternal(Version cardVersion)
}
}
- internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion, StreamReader cardContentReader) =>
+ internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion) =>
throw new InvalidDataException("Logo field must not have empty type.");
- internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader)
+ internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion)
{
// Get the value
string logoValue = value.Substring(VcardConstants._logoSpecifier.Length + 1);
@@ -116,16 +116,15 @@ internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value,
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, cardContentReader);
+ return InstallInfo(splitLogo, finalArgs, altId, cardVersion);
}
- private LogoInfo InstallInfo(string[] splitLogo, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader)
+ private LogoInfo InstallInfo(string[] splitLogo, string[] finalArgs, int altId, 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();
- bool isUrl = valueType == "url" || valueType == "uri";
// Check to see if the value is prepended by the ENCODING= argument
string logoEncoding = VcardParserTools.GetValuesString(splitLogo, "BASE64", VcardConstants._encodingArgumentSpecifier);
@@ -133,24 +132,8 @@ private LogoInfo InstallInfo(string[] splitLogo, string[] finalArgs, int altId,
// Check to see if the value is prepended with the TYPE= argument
string logoType = VcardParserTools.GetTypesString(splitLogo, "JPEG", false);
- // Now, get the encoded logo
- StringBuilder encodedLogo = new();
- if (splitLogo.Length == 2)
- encodedLogo.Append(splitLogo[1]);
-
- // Make sure to get all the blocks until we reach an empty line
- if (!isUrl)
- {
- string lineToBeAppended = cardContentReader.ReadLine();
- while (!string.IsNullOrWhiteSpace(lineToBeAppended) && lineToBeAppended.StartsWith(" "))
- {
- encodedLogo.Append(lineToBeAppended.Trim());
- lineToBeAppended = cardContentReader.ReadLine();
- }
- }
-
// Populate the fields
- LogoInfo _logo = new(altIdSupported ? altId : 0, altIdSupported ? finalArgs : [], valueType, logoEncoding, logoType, encodedLogo.ToString());
+ LogoInfo _logo = new(altIdSupported ? altId : 0, altIdSupported ? finalArgs : [], valueType, logoEncoding, logoType, splitLogo[1]);
return _logo;
}
diff --git a/VisualCard/Parts/Implementations/NameInfo.cs b/VisualCard/Parts/Implementations/NameInfo.cs
index ebb1f2d..90b6032 100644
--- a/VisualCard/Parts/Implementations/NameInfo.cs
+++ b/VisualCard/Parts/Implementations/NameInfo.cs
@@ -54,11 +54,11 @@ public class NameInfo : BaseCardPartInfo, IEquatable
///
public string[] Suffixes { get; }
- internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new NameInfo().FromStringVcardInternal(value, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion) =>
+ new NameInfo().FromStringVcardInternal(value, altId, cardVersion);
- internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new NameInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion) =>
+ new NameInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion);
internal override string ToStringVcardInternal(Version cardVersion)
{
@@ -94,7 +94,7 @@ internal override string ToStringVcardInternal(Version cardVersion)
}
}
- internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion, StreamReader cardContentReader)
+ internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion)
{
// Check the line
string nameValue = value.Substring(VcardConstants._nameSpecifier.Length + 1);
@@ -106,7 +106,7 @@ internal override BaseCardPartInfo FromStringVcardInternal(string value, int alt
return InstallInfo(splitName, altId, cardVersion);
}
- internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader)
+ internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion)
{
// Check the line
string nameValue = value.Substring(VcardConstants._nameSpecifier.Length + 1);
diff --git a/VisualCard/Parts/Implementations/NicknameInfo.cs b/VisualCard/Parts/Implementations/NicknameInfo.cs
index 535df6f..09c748c 100644
--- a/VisualCard/Parts/Implementations/NicknameInfo.cs
+++ b/VisualCard/Parts/Implementations/NicknameInfo.cs
@@ -42,11 +42,11 @@ public class NicknameInfo : BaseCardPartInfo, IEquatable
///
public string[] NicknameTypes { get; }
- internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new NicknameInfo().FromStringVcardInternal(value, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion) =>
+ new NicknameInfo().FromStringVcardInternal(value, altId, cardVersion);
- internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new NicknameInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion) =>
+ new NicknameInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion);
internal override string ToStringVcardInternal(Version cardVersion)
{
@@ -70,7 +70,7 @@ internal override string ToStringVcardInternal(Version cardVersion)
}
}
- internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion, StreamReader cardContentReader)
+ internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion)
{
// Get the value
string nickValue = value.Substring(VcardConstants._nicknameSpecifier.Length + 1);
@@ -79,7 +79,7 @@ internal override BaseCardPartInfo FromStringVcardInternal(string value, int alt
return InstallInfo([nickValue], altId, cardVersion);
}
- internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader)
+ internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion)
{
// Get the value
string nickValue = value.Substring(VcardConstants._nicknameSpecifier.Length + 1);
diff --git a/VisualCard/Parts/Implementations/OrganizationInfo.cs b/VisualCard/Parts/Implementations/OrganizationInfo.cs
index 40a3dfb..6daccfe 100644
--- a/VisualCard/Parts/Implementations/OrganizationInfo.cs
+++ b/VisualCard/Parts/Implementations/OrganizationInfo.cs
@@ -50,11 +50,11 @@ public class OrganizationInfo : BaseCardPartInfo, IEquatable
///
public string Role { get; }
- internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new OrganizationInfo().FromStringVcardInternal(value, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion) =>
+ new OrganizationInfo().FromStringVcardInternal(value, altId, cardVersion);
- internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new OrganizationInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion) =>
+ new OrganizationInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion);
internal override string ToStringVcardInternal(Version cardVersion)
{
@@ -83,7 +83,7 @@ internal override string ToStringVcardInternal(Version cardVersion)
}
}
- internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion, StreamReader cardContentReader)
+ internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion)
{
// Get the value
string orgValue = value.Substring(VcardConstants._orgSpecifier.Length + 1);
@@ -93,7 +93,7 @@ internal override BaseCardPartInfo FromStringVcardInternal(string value, int alt
return InstallInfo(splitOrg, ["WORK"], altId, cardVersion);
}
- internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader)
+ internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion)
{
bool specifierRequired = cardVersion.Major >= 3;
diff --git a/VisualCard/Parts/Implementations/PhotoInfo.cs b/VisualCard/Parts/Implementations/PhotoInfo.cs
index 48e9ecf..6f2e962 100644
--- a/VisualCard/Parts/Implementations/PhotoInfo.cs
+++ b/VisualCard/Parts/Implementations/PhotoInfo.cs
@@ -50,11 +50,11 @@ public class PhotoInfo : BaseCardPartInfo, IEquatable
///
public string PhotoEncoded { get; }
- internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new PhotoInfo().FromStringVcardInternal(value, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion) =>
+ new PhotoInfo().FromStringVcardInternal(value, altId, cardVersion);
- internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new PhotoInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion) =>
+ new PhotoInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion);
internal override string ToStringVcardInternal(Version cardVersion)
{
@@ -104,10 +104,10 @@ internal override string ToStringVcardInternal(Version cardVersion)
}
}
- internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion, StreamReader cardContentReader) =>
+ internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion) =>
throw new InvalidDataException("Photo field must not have empty type.");
- internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader)
+ internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion)
{
// Get the value
string photoValue = value.Substring(VcardConstants._photoSpecifier.Length + 1);
@@ -116,16 +116,15 @@ internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value,
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, cardContentReader);
+ return InstallInfo(splitPhoto, finalArgs, altId, cardVersion);
}
- private PhotoInfo InstallInfo(string[] splitPhoto, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader)
+ private PhotoInfo InstallInfo(string[] splitPhoto, string[] finalArgs, int altId, 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();
- bool isUrl = valueType == "url" || valueType == "uri";
// Check to see if the value is prepended by the ENCODING= argument
string photoEncoding = VcardParserTools.GetValuesString(splitPhoto, "BASE64", VcardConstants._encodingArgumentSpecifier);
@@ -133,24 +132,8 @@ private PhotoInfo InstallInfo(string[] splitPhoto, string[] finalArgs, int altId
// Check to see if the value is prepended with the TYPE= argument
string photoType = VcardParserTools.GetTypesString(splitPhoto, "JPEG", false);
- // Now, get the encoded photo
- StringBuilder encodedPhoto = new();
- if (splitPhoto.Length == 2)
- encodedPhoto.Append(splitPhoto[1]);
-
- // Make sure to get all the blocks until we reach an empty line
- if (!isUrl)
- {
- string lineToBeAppended = cardContentReader.ReadLine();
- while (!string.IsNullOrWhiteSpace(lineToBeAppended) && lineToBeAppended.StartsWith(" "))
- {
- encodedPhoto.Append(lineToBeAppended.Trim());
- lineToBeAppended = cardContentReader.ReadLine();
- }
- }
-
// Populate the fields
- PhotoInfo _photo = new(altIdSupported ? altId : 0, altIdSupported ? finalArgs : [], valueType, photoEncoding, photoType, encodedPhoto.ToString());
+ PhotoInfo _photo = new(altIdSupported ? altId : 0, altIdSupported ? finalArgs : [], valueType, photoEncoding, photoType, splitPhoto[1]);
return _photo;
}
diff --git a/VisualCard/Parts/Implementations/RevisionInfo.cs b/VisualCard/Parts/Implementations/RevisionInfo.cs
index 907d3ab..674eefe 100644
--- a/VisualCard/Parts/Implementations/RevisionInfo.cs
+++ b/VisualCard/Parts/Implementations/RevisionInfo.cs
@@ -37,16 +37,16 @@ public class RevisionInfo : BaseCardPartInfo, IEquatable
///
public DateTime? Revision { get; }
- internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new RevisionInfo().FromStringVcardInternal(value, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion) =>
+ new RevisionInfo().FromStringVcardInternal(value, altId, cardVersion);
- internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new RevisionInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion) =>
+ new RevisionInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion);
internal override string ToStringVcardInternal(Version cardVersion) =>
$"{VcardConstants._revSpecifier}:{Revision:yyyy-MM-dd HH:mm:ss}";
- internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion, StreamReader cardContentReader)
+ internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion)
{
// Get the value
string revValue = value.Substring(VcardConstants._revSpecifier.Length + 1);
@@ -55,8 +55,8 @@ internal override BaseCardPartInfo FromStringVcardInternal(string value, int alt
return InstallInfo(revValue, altId, cardVersion);
}
- internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader) =>
- FromStringVcardInternal(value, altId, cardVersion, cardContentReader);
+ 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);
diff --git a/VisualCard/Parts/Implementations/RoleInfo.cs b/VisualCard/Parts/Implementations/RoleInfo.cs
index 94376f8..f14fde6 100644
--- a/VisualCard/Parts/Implementations/RoleInfo.cs
+++ b/VisualCard/Parts/Implementations/RoleInfo.cs
@@ -37,11 +37,11 @@ public class RoleInfo : BaseCardPartInfo, IEquatable
///
public string ContactRole { get; }
- internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new RoleInfo().FromStringVcardInternal(value, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion) =>
+ new RoleInfo().FromStringVcardInternal(value, altId, cardVersion);
- internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new RoleInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion) =>
+ new RoleInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion);
internal override string ToStringVcardInternal(Version cardVersion)
{
@@ -63,7 +63,7 @@ internal override string ToStringVcardInternal(Version cardVersion)
}
}
- internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion, StreamReader cardContentReader)
+ internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion)
{
// Get the value
string roleValue = value.Substring(VcardConstants._roleSpecifier.Length + 1);
@@ -72,7 +72,7 @@ internal override BaseCardPartInfo FromStringVcardInternal(string value, int alt
return InstallInfo(roleValue, altId, cardVersion);
}
- internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader)
+ internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion)
{
// Get the value
string roleValue = value.Substring(VcardConstants._roleSpecifier.Length + 1);
diff --git a/VisualCard/Parts/Implementations/SoundInfo.cs b/VisualCard/Parts/Implementations/SoundInfo.cs
index 8b793f5..6685d0f 100644
--- a/VisualCard/Parts/Implementations/SoundInfo.cs
+++ b/VisualCard/Parts/Implementations/SoundInfo.cs
@@ -50,11 +50,11 @@ public class SoundInfo : BaseCardPartInfo, IEquatable
///
public string SoundEncoded { get; }
- internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new SoundInfo().FromStringVcardInternal(value, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion) =>
+ new SoundInfo().FromStringVcardInternal(value, altId, cardVersion);
- internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new SoundInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion) =>
+ new SoundInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion);
internal override string ToStringVcardInternal(Version cardVersion)
{
@@ -104,10 +104,10 @@ internal override string ToStringVcardInternal(Version cardVersion)
}
}
- internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion, StreamReader cardContentReader) =>
+ internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion) =>
throw new InvalidDataException("Sound field must not have empty type.");
- internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader)
+ internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion)
{
// Get the value
string soundValue = value.Substring(VcardConstants._soundSpecifier.Length + 1);
@@ -116,16 +116,15 @@ internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value,
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, cardContentReader);
+ return InstallInfo(splitSound, finalArgs, altId, cardVersion);
}
- private SoundInfo InstallInfo(string[] splitSound, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader)
+ private SoundInfo InstallInfo(string[] splitSound, string[] finalArgs, int altId, 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();
- bool isUrl = valueType == "url" || valueType == "uri";
// Check to see if the value is prepended by the ENCODING= argument
string soundEncoding = VcardParserTools.GetValuesString(splitSound, "BASE64", VcardConstants._encodingArgumentSpecifier);
@@ -133,24 +132,8 @@ private SoundInfo InstallInfo(string[] splitSound, string[] finalArgs, int altId
// Check to see if the value is prepended with the TYPE= argument
string soundType = VcardParserTools.GetTypesString(splitSound, "WAVE", false);
- // Now, get the encoded sound
- StringBuilder encodedSound = new();
- if (splitSound.Length == 2)
- encodedSound.Append(splitSound[1]);
-
- // Make sure to get all the blocks until we reach an empty line
- if (!isUrl)
- {
- string lineToBeAppended = cardContentReader.ReadLine();
- while (!string.IsNullOrWhiteSpace(lineToBeAppended))
- {
- encodedSound.Append(lineToBeAppended);
- lineToBeAppended = cardContentReader.ReadLine()?.Trim();
- }
- }
-
// Populate the fields
- SoundInfo _sound = new(altIdSupported ? altId : 0, altIdSupported ? finalArgs : [], valueType, soundEncoding, soundType, encodedSound.ToString());
+ SoundInfo _sound = new(altIdSupported ? altId : 0, altIdSupported ? finalArgs : [], valueType, soundEncoding, soundType, splitSound[1]);
return _sound;
}
diff --git a/VisualCard/Parts/Implementations/TelephoneInfo.cs b/VisualCard/Parts/Implementations/TelephoneInfo.cs
index 6c29426..4ba7f7a 100644
--- a/VisualCard/Parts/Implementations/TelephoneInfo.cs
+++ b/VisualCard/Parts/Implementations/TelephoneInfo.cs
@@ -42,11 +42,11 @@ public class TelephoneInfo : BaseCardPartInfo, IEquatable
///
public string ContactPhoneNumber { get; }
- internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new TelephoneInfo().FromStringVcardInternal(value, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion) =>
+ new TelephoneInfo().FromStringVcardInternal(value, altId, cardVersion);
- internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new TelephoneInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion) =>
+ new TelephoneInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion);
internal override string ToStringVcardInternal(Version cardVersion)
{
@@ -69,7 +69,7 @@ internal override string ToStringVcardInternal(Version cardVersion)
}
}
- internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion, StreamReader cardContentReader)
+ internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion)
{
// Get the value
string telValue = value.Substring(VcardConstants._telephoneSpecifier.Length + 1);
@@ -78,7 +78,7 @@ internal override BaseCardPartInfo FromStringVcardInternal(string value, int alt
return InstallInfo([telValue], altId, cardVersion);
}
- internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader)
+ internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion)
{
// Get the value
string telValue = value.Substring(VcardConstants._telephoneSpecifier.Length + 1);
diff --git a/VisualCard/Parts/Implementations/TimeDateZoneInfo.cs b/VisualCard/Parts/Implementations/TimeDateZoneInfo.cs
index 68140b2..0187ce8 100644
--- a/VisualCard/Parts/Implementations/TimeDateZoneInfo.cs
+++ b/VisualCard/Parts/Implementations/TimeDateZoneInfo.cs
@@ -42,11 +42,11 @@ public class TimeDateZoneInfo : BaseCardPartInfo, IEquatable
///
public string TimeZone { get; }
- internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new TimeDateZoneInfo().FromStringVcardInternal(value, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion) =>
+ new TimeDateZoneInfo().FromStringVcardInternal(value, altId, cardVersion);
- internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new TimeDateZoneInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion) =>
+ new TimeDateZoneInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion);
internal override string ToStringVcardInternal(Version cardVersion)
{
@@ -68,7 +68,7 @@ internal override string ToStringVcardInternal(Version cardVersion)
}
}
- internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion, StreamReader cardContentReader)
+ internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion)
{
// Get the value
string tzValue = value.Substring(VcardConstants._timeZoneSpecifier.Length + 1);
@@ -77,7 +77,7 @@ internal override BaseCardPartInfo FromStringVcardInternal(string value, int alt
return InstallInfo([tzValue], false, altId, cardVersion);
}
- internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader)
+ internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion)
{
// Check the line
string tzValue = value.Substring(VcardConstants._timeZoneSpecifier.Length + 1);
diff --git a/VisualCard/Parts/Implementations/TitleInfo.cs b/VisualCard/Parts/Implementations/TitleInfo.cs
index c717b51..91c0d84 100644
--- a/VisualCard/Parts/Implementations/TitleInfo.cs
+++ b/VisualCard/Parts/Implementations/TitleInfo.cs
@@ -38,11 +38,11 @@ public class TitleInfo : BaseCardPartInfo, IEquatable
///
public string ContactTitle { get; }
- internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new TitleInfo().FromStringVcardInternal(value, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion) =>
+ new TitleInfo().FromStringVcardInternal(value, altId, cardVersion);
- internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new TitleInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion) =>
+ new TitleInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion);
internal override string ToStringVcardInternal(Version cardVersion)
{
@@ -64,7 +64,7 @@ internal override string ToStringVcardInternal(Version cardVersion)
}
}
- internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion, StreamReader cardContentReader)
+ internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion)
{
// Get the value
string titleValue = value.Substring(VcardConstants._titleSpecifier.Length + 1);
@@ -73,7 +73,7 @@ internal override BaseCardPartInfo FromStringVcardInternal(string value, int alt
return InstallInfo([titleValue], altId, cardVersion);
}
- internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader)
+ internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion)
{
// Get the value
string titleValue = value.Substring(VcardConstants._titleSpecifier.Length + 1);
diff --git a/VisualCard/Parts/Implementations/XNameInfo.cs b/VisualCard/Parts/Implementations/XNameInfo.cs
index d9e41cb..821110c 100644
--- a/VisualCard/Parts/Implementations/XNameInfo.cs
+++ b/VisualCard/Parts/Implementations/XNameInfo.cs
@@ -45,11 +45,11 @@ public class XNameInfo : BaseCardPartInfo, IEquatable
///
public string[] XValues { get; }
- internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new XNameInfo().FromStringVcardInternal(value, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardStatic(string value, int altId, Version cardVersion) =>
+ new XNameInfo().FromStringVcardInternal(value, altId, cardVersion);
- internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader) =>
- new XNameInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion, cardContentReader);
+ internal static BaseCardPartInfo FromStringVcardWithTypeStatic(string value, string[] finalArgs, int altId, Version cardVersion) =>
+ new XNameInfo().FromStringVcardWithTypeInternal(value, finalArgs, altId, cardVersion);
internal override string ToStringVcardInternal(Version cardVersion)
{
@@ -75,7 +75,7 @@ internal override string ToStringVcardInternal(Version cardVersion)
}
}
- internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion, StreamReader cardContentReader)
+ internal override BaseCardPartInfo FromStringVcardInternal(string value, int altId, Version cardVersion)
{
// Get the value
string xValue = value.Substring(VcardConstants._xSpecifier.Length);
@@ -85,7 +85,7 @@ internal override BaseCardPartInfo FromStringVcardInternal(string value, int alt
return InstallInfo(splitX, altId, cardVersion);
}
- internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion, StreamReader cardContentReader)
+ internal override BaseCardPartInfo FromStringVcardWithTypeInternal(string value, string[] finalArgs, int altId, Version cardVersion)
{
// Get the value
string xValue = value.Substring(VcardConstants._xSpecifier.Length);