internal VcfReader(TextReader reader, VcfDeserializationInfo info, VCdVersion versionHint = VCdVersion.V2_1) { this._reader = reader; this._info = info; this.EOF = false; this._versionHint = versionHint; }
/// <summary> /// ctor /// </summary> /// <param name="vCardRow">vCard-Zeile</param> /// <param name="valueSeparatorIndex">Index des des Trennzeichens <c>':'</c>, das den Wert von /// <paramref name="vCardRow"/> vom Schlüssel- und Parameterteil trennt.</param> /// <param name="info">Ein <see cref="VcfDeserializationInfo"/>-Objekt.</param> private VcfRow(string vCardRow, int valueSeparatorIndex, VcfDeserializationInfo info) { // vCardRow: // group.KEY;ATTRIBUTE1=AttributeValue;ATTRIBUTE2=AttributeValue:Value-Part Debug.Assert(valueSeparatorIndex > 0); this.Info = info; int valueStart = valueSeparatorIndex + 1; if (valueStart < vCardRow.Length) { this.Value = vCardRow.Substring(valueStart); } // keySection: // group.KEY | ATTRIBUTE1=AttributeValue;ATTRIBUTE2=AttributeValue string keySection = vCardRow.Substring(0, valueSeparatorIndex); int parameterSeparatorIndex = keySection.IndexOf(';'); int groupSeparatorIndex = -1; int keyPartLength = parameterSeparatorIndex == -1 ? keySection.Length : parameterSeparatorIndex; for (int i = 0; i < keyPartLength; i++) { if (keySection[i] == '.') { groupSeparatorIndex = i; } } // keyParts: // group | key int startOfKey = groupSeparatorIndex + 1; if (groupSeparatorIndex > 0) { this.Group = keySection.Substring(0, groupSeparatorIndex); this.Key = keySection.Substring(startOfKey, parameterSeparatorIndex == -1 ? keySection.Length - startOfKey : parameterSeparatorIndex - startOfKey).ToUpperInvariant(); } else { this.Key = keySection.Substring(0, parameterSeparatorIndex == -1 ? keySection.Length : parameterSeparatorIndex).ToUpperInvariant(); } if (parameterSeparatorIndex != -1 && parameterSeparatorIndex < keySection.Length - 1) { string parameterSection = keySection.Substring(parameterSeparatorIndex + 1); this.Parameters = new ParameterSection(this.Key, GetParameters(parameterSection, info.ParameterList), info); } else { this.Parameters = new ParameterSection(); } }
public void CleanParameterValueTest(string value) { var info = new VcfDeserializationInfo(); var para = new ParameterSection("BDAY", new Dictionary <string, string>() { { "VALUE", value } }, info); Assert.AreEqual(para.DataType, Enums.VCdDataType.Date); }
/// <summary> /// Parst eine Datenzeile der VCF-Datei. /// </summary> /// <param name="vCardRow">Die Datenzeile der vCard als <see cref="string"/>.</param> /// <param name="info">Ein <see cref="VcfDeserializationInfo"/>.</param> /// <returns><see cref="VcfRow"/>-Objekt</returns> internal static VcfRow?Parse(string vCardRow, VcfDeserializationInfo info) { // vCardRow: // group.KEY;ATTRIBUTE1=AttributeValue;ATTRIBUTE2=AttributeValue:Value-Part // vCardRowParts: // group.KEY;ATTRIBUTE1=AttributeValue;ATTRIBUTE2=AttributeValue | Value-Part int valueSeparatorIndex = GetValueSeparatorIndex(vCardRow); return(valueSeparatorIndex > 0 ? new VcfRow(vCardRow, valueSeparatorIndex, info) : null); }
/// <summary> /// ctor /// </summary> /// <param name="vCardRow">vCard-Zeile</param> /// <param name="valueSeparatorIndex">Index des des Trennzeichens <c>':'</c>, das den Wert von /// <paramref name="vCardRow"/> vom Schlüssel- und Parameterteil trennt.</param> /// <param name="info">Ein <see cref="VcfDeserializationInfo"/>-Objekt.</param> private VcfRow(string vCardRow, int valueSeparatorIndex, VcfDeserializationInfo info) { // vCardRow: // group.KEY;ATTRIBUTE1=AttributeValue;ATTRIBUTE2=AttributeValue:Value-Part Debug.Assert(valueSeparatorIndex > 0); this.Info = info; // vCardRowParts: // group.KEY;ATTRIBUTE1=AttributeValue;ATTRIBUTE2=AttributeValue | Value-Part int valueStart = valueSeparatorIndex + 1; if (valueStart < vCardRow.Length) { this.Value = vCardRow.Substring(valueStart); } // keySection: // group.KEY | ATTRIBUTE1=AttributeValue;ATTRIBUTE2=AttributeValue ReadOnlySpan <char> keySection = vCardRow.AsSpan(0, valueSeparatorIndex); int parameterSeparatorIndex = keySection.IndexOf(';'); int keyPartLength = parameterSeparatorIndex == -1 ? keySection.Length : parameterSeparatorIndex; ReadOnlySpan <char> keyPartSpan = keySection.Slice(0, keyPartLength); int groupSeparatorIndex = keyPartSpan.IndexOf('.'); // keyParts: // group | key int startOfKey = groupSeparatorIndex + 1; this.Key = startOfKey > 0 ? keyPartSpan.Slice(startOfKey).ToString().ToUpperInvariant() : keyPartSpan.ToString().ToUpperInvariant(); if (groupSeparatorIndex > 0) { this.Group = keySection.Slice(0, groupSeparatorIndex).ToString(); } if (parameterSeparatorIndex != -1 && parameterSeparatorIndex < keySection.Length - 1) { ReadOnlySpan <char> parameterSection = keySection.Slice(parameterSeparatorIndex + 1); this.Parameters = new ParameterSection(this.Key, GetParameters(parameterSection, info.ParameterList), info); } else { this.Parameters = new ParameterSection(); } }
public void ParseTest(string input, bool rowIsNull, string key, string?group, int parametersCount) { var info = new VcfDeserializationInfo(); _ = info.Builder.Append(input); var row = VcfRow.Parse(info.Builder.ToString(), info); if (rowIsNull) { Assert.IsNull(row); return; } Assert.IsNotNull(row); Assert.IsNotNull(row !.Parameters); Assert.AreEqual(parametersCount, row.Parameters.Count); Assert.AreEqual(key, row.Key, false); Assert.AreEqual(group, row.Group, false); }
public void SequenceOfTwoV3_0VcardsTest() { using StreamReader reader = File.OpenText(TestFiles.V3vcf); var info = new VcfDeserializationInfo(); var list = new List <VcfRow>(); var vcReader = new VcfReader(reader, info); foreach (VcfRow vcfRow in vcReader) { list.Add(vcfRow); } Assert.AreNotEqual(0, list.Count); Assert.IsFalse(vcReader.EOF); list.Clear(); foreach (VcfRow vcfRow in vcReader) { list.Add(vcfRow); } Assert.AreNotEqual(0, list.Count); Assert.IsFalse(vcReader.EOF); list.Clear(); foreach (VcfRow vcfRow in vcReader) { list.Add(vcfRow); } Assert.AreEqual(0, list.Count); Assert.IsTrue(vcReader.EOF); }
internal Name(string vCardValue, VcfDeserializationInfo info, VCdVersion version) { Debug.Assert(vCardValue != null); StringBuilder builder = info.Builder; ValueSplitter semicolonSplitter = info.SemiColonSplitter; ValueSplitter commaSplitter = info.CommaSplitter; semicolonSplitter.ValueString = vCardValue; int index = 0; foreach (var s in semicolonSplitter) { switch (index++) { case LAST_NAME: { if (s.Length == 0) { LastName = ReadOnlyCollectionConverter.Empty(); } else { var list = new List <string>(); commaSplitter.ValueString = s; foreach (var item in commaSplitter) { list.Add(item.UnMask(builder, version)); } LastName = ReadOnlyCollectionConverter.ToReadOnlyCollection(list); } break; } case FIRST_NAME: { if (s.Length == 0) { FirstName = ReadOnlyCollectionConverter.Empty(); } else { var list = new List <string>(); commaSplitter.ValueString = s; foreach (var item in commaSplitter) { list.Add(item.UnMask(builder, version)); } FirstName = ReadOnlyCollectionConverter.ToReadOnlyCollection(list); } break; } case MIDDLE_NAME: { if (s.Length == 0) { MiddleName = ReadOnlyCollectionConverter.Empty(); } else { var list = new List <string>(); commaSplitter.ValueString = s; foreach (var item in commaSplitter) { list.Add(item.UnMask(builder, version)); } MiddleName = ReadOnlyCollectionConverter.ToReadOnlyCollection(list); } break; } case PREFIX: { if (s.Length == 0) { Prefix = ReadOnlyCollectionConverter.Empty(); } else { var list = new List <string>(); commaSplitter.ValueString = s; foreach (var item in commaSplitter) { list.Add(item.UnMask(builder, version)); } Prefix = ReadOnlyCollectionConverter.ToReadOnlyCollection(list); } break; } case SUFFIX: { if (s.Length == 0) { Suffix = ReadOnlyCollectionConverter.Empty(); } else { var list = new List <string>(); commaSplitter.ValueString = s; foreach (var item in commaSplitter) { list.Add(item.UnMask(builder, version)); } Suffix = ReadOnlyCollectionConverter.ToReadOnlyCollection(list); } break; } } //switch } //foreach // Wenn die VCF-Datei fehlerhaft ist, könnten Properties null sein: FirstName ??= ReadOnlyCollectionConverter.Empty(); LastName ??= ReadOnlyCollectionConverter.Empty(); MiddleName ??= ReadOnlyCollectionConverter.Empty(); Prefix ??= ReadOnlyCollectionConverter.Empty(); Suffix ??= ReadOnlyCollectionConverter.Empty(); }
internal Address(string vCardValue, VcfDeserializationInfo info, VCdVersion version) { Debug.Assert(vCardValue != null); StringBuilder builder = info.Builder; ValueSplitter semicolonSplitter = info.SemiColonSplitter; ValueSplitter commaSplitter = info.CommaSplitter; int index = 0; semicolonSplitter.ValueString = vCardValue; foreach (var s in semicolonSplitter) { switch (index++) { #pragma warning disable CS0618 // Typ oder Element ist veraltet case POST_OFFICE_BOX: { if (s.Length == 0) { PostOfficeBox = ReadOnlyCollectionConverter.Empty(); } else { var list = new List <string>(); commaSplitter.ValueString = s; foreach (var item in commaSplitter) { list.Add(item.UnMask(builder, version)); } PostOfficeBox = ReadOnlyCollectionConverter.ToReadOnlyCollection(list); } break; } case EXTENDED_ADDRESS: { if (s.Length == 0) { ExtendedAddress = ReadOnlyCollectionConverter.Empty(); } else { var list = new List <string>(); commaSplitter.ValueString = s; foreach (var item in commaSplitter) { list.Add(item.UnMask(builder, version)); } ExtendedAddress = ReadOnlyCollectionConverter.ToReadOnlyCollection(list); } break; } #pragma warning restore CS0618 // Typ oder Element ist veraltet case STREET: { if (s.Length == 0) { Street = ReadOnlyCollectionConverter.Empty(); } else { var list = new List <string>(); commaSplitter.ValueString = s; foreach (var item in commaSplitter) { list.Add(item.UnMask(builder, version)); } Street = ReadOnlyCollectionConverter.ToReadOnlyCollection(list); } break; } case LOCALITY: { if (s.Length == 0) { Locality = ReadOnlyCollectionConverter.Empty(); } else { var list = new List <string>(); commaSplitter.ValueString = s; foreach (var item in commaSplitter) { list.Add(item.UnMask(builder, version)); } Locality = ReadOnlyCollectionConverter.ToReadOnlyCollection(list); } break; } case REGION: { if (s.Length == 0) { Region = ReadOnlyCollectionConverter.Empty(); } else { var list = new List <string>(); commaSplitter.ValueString = s; foreach (var item in commaSplitter) { list.Add(item.UnMask(builder, version)); } Region = ReadOnlyCollectionConverter.ToReadOnlyCollection(list); } break; } case POSTAL_CODE: { if (s.Length == 0) { PostalCode = ReadOnlyCollectionConverter.Empty(); } else { var list = new List <string>(); commaSplitter.ValueString = s; foreach (var item in commaSplitter) { list.Add(item.UnMask(builder, version)); } PostalCode = ReadOnlyCollectionConverter.ToReadOnlyCollection(list); } break; } case COUNTRY: { if (s.Length == 0) { Country = ReadOnlyCollectionConverter.Empty(); } else { var list = new List <string>(); commaSplitter.ValueString = s; foreach (var item in commaSplitter) { list.Add(item.UnMask(builder, version)); } Country = ReadOnlyCollectionConverter.ToReadOnlyCollection(list); } break; } default: break; } //switch } //foreach // Wenn die VCF-Datei fehlerhaft ist, könnten Properties null sein: #pragma warning disable CS0618 // Typ oder Element ist veraltet PostOfficeBox ??= ReadOnlyCollectionConverter.Empty(); ExtendedAddress ??= ReadOnlyCollectionConverter.Empty(); #pragma warning restore CS0618 // Typ oder Element ist veraltet Street ??= ReadOnlyCollectionConverter.Empty(); Locality ??= ReadOnlyCollectionConverter.Empty(); Region ??= ReadOnlyCollectionConverter.Empty(); PostalCode ??= ReadOnlyCollectionConverter.Empty(); Country ??= ReadOnlyCollectionConverter.Empty(); }