コード例 #1
0
ファイル: VcfReader.cs プロジェクト: FolkerKinzel/VCards
 internal VcfReader(TextReader reader, VcfDeserializationInfo info, VCdVersion versionHint = VCdVersion.V2_1)
 {
     this._reader      = reader;
     this._info        = info;
     this.EOF          = false;
     this._versionHint = versionHint;
 }
コード例 #2
0
    /// <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();
        }
    }
コード例 #3
0
    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);
    }
コード例 #4
0
ファイル: VcfRow_Method.cs プロジェクト: FolkerKinzel/VCards
    /// <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);
    }
コード例 #5
0
ファイル: VcfRow_ctor.cs プロジェクト: FolkerKinzel/VCards
    /// <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();
        }
    }
コード例 #6
0
    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);
    }
コード例 #7
0
    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);
    }
コード例 #8
0
ファイル: Name.cs プロジェクト: FolkerKinzel/VCards
    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();
    }
コード例 #9
0
    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();
    }