示例#1
0
        private static string Serialize(Address address, VCardVersion version)
        {
            string type = address.Type.ToVCardString();

            string key = "ADR";

            if (version == VCardVersion.V4)
            {
                if (address.Longitude != null && address.Latitude != null)
                {
                    key = key + ";GEO=\"" + address.Longitude.Value.ToString("N4") + "," + address.Latitude.Value.ToString("N4") + "\"";
                }

                if (address.Preference > 0)
                {
                    key = key + ";PREF=" + address.Preference;
                }

                if (!string.IsNullOrWhiteSpace(address.Label))
                {
                    key = key + ";LABEL=\"" + address.Label.Escape() + "\"";
                }

                if (address.TimeZone != null)
                {
                    key = key + ";TZ=\"" + TimeZoneInfoProcessor.ToVCardValue(address.TimeZone) + "\"";
                }
            }

            return(GroupProcessor.Serialize(key, version, type, true, address.PoBox, address.ExtendedAddress, address.Street, address.Locality, address.Region, address.PostalCode, address.Country));
        }
示例#2
0
        public static void Parse(Token token, ref VCard vcard)
        {
            if (string.IsNullOrWhiteSpace(string.Join("", token.Values).Trim()))
            {
                return;
            }

            var address = new Address();

            if (vcard.Version == VCardVersion.V4)
            {
                var geo = token.AdditionalKeyMembers.FirstOrDefault(x => x.Key == "GEO");
                if (!string.IsNullOrWhiteSpace(geo.Value))
                {
                    var coordinates = geo.Value.Split(',').Select(x => x.Trim()).ToList();

                    if (coordinates.Count > 0)
                    {
                        address.Longitude = coordinates[0].ConvertToNullableT <double>();
                    }

                    if (coordinates.Count > 1)
                    {
                        address.Latitude = coordinates[0].ConvertToNullableT <double>();
                    }
                }

                var type = token.AdditionalKeyMembers.FirstOrDefault(x => x.Key == "TYPE");
                address.Type = AddressTypeLookup.Parse(type.Value);

                var pref = token.AdditionalKeyMembers.FirstOrDefault(x => x.Key == "PREF");
                address.Preference = pref.Value.ConvertTo <int>();

                var label = token.AdditionalKeyMembers.FirstOrDefault(x => x.Key == "LABEL");
                address.Label = label.Value;

                var timezone = token.AdditionalKeyMembers.FirstOrDefault(x => x.Key == "TZ");
                address.TimeZone = TimeZoneInfoProcessor.FromVCardValue(timezone.Value);
            }

            if (token.Values.Length > 0)
            {
                address.PoBox = token.Values[0];
            }

            if (token.Values.Length > 1)
            {
                address.ExtendedAddress = token.Values[1];
            }

            if (token.Values.Length > 2)
            {
                address.Street = token.Values[2];
            }

            if (token.Values.Length > 3)
            {
                address.Locality = token.Values[3];
            }

            if (token.Values.Length > 4)
            {
                address.Region = token.Values[4];
            }

            if (token.Values.Length > 5)
            {
                address.PostalCode = token.Values[5];
            }

            if (token.Values.Length > 6)
            {
                address.Country = token.Values[6];
            }

            var addresses = (List <Address>)vcard.Addresses ?? new List <Address>();

            addresses.Add(address);
            vcard.Addresses = addresses;
        }
示例#3
0
        public static void Parse(Token token, ref VCard vcard)
        {
            if (string.IsNullOrWhiteSpace(string.Join("", token.Values).Trim()))
            {
                return;
            }

            var address = new Address();

            if (vcard.Version == VCardVersion.V4)
            {
                var geo = token.AdditionalKeyMembers.FirstOrDefault(x => x.Key == "GEO");
                if (!string.IsNullOrWhiteSpace(geo.Value))
                {
                    var coordinates = geo.Value.Split(',').Select(x => x.Trim()).ToList();

                    if (coordinates.Count > 0)
                    {
                        address.Longitude = coordinates[0].ConvertToNullableT <double>();
                    }

                    if (coordinates.Count > 1)
                    {
                        address.Latitude = coordinates[0].ConvertToNullableT <double>();
                    }
                }

                var type = token.AdditionalKeyMembers.FirstOrDefault(x => x.Key == "TYPE");
                address.Type = AddressTypeLookup.Parse(type.Value);

                var pref = token.AdditionalKeyMembers.FirstOrDefault(x => x.Key == "PREF");
                address.Preference = pref.Value.ConvertTo <int>();

                var label = token.AdditionalKeyMembers.FirstOrDefault(x => x.Key == "LABEL");
                address.Label = label.Value;

                var timezone = token.AdditionalKeyMembers.FirstOrDefault(x => x.Key == "TZ");
                address.TimeZone = TimeZoneInfoProcessor.FromVCardValue(timezone.Value);
            }

            if (token.Values.Length > 0)
            {
                address.PoBox = token.Values[0];
            }

            if (token.Values.Length > 1)
            {
                address.ExtendedAddress = token.Values[1];
            }

            if (token.Values.Length > 2)
            {
                address.Street = token.Values[2];
            }

            if (token.Values.Length > 3)
            {
                address.Locality = token.Values[3];
            }

            if (token.Values.Length > 4)
            {
                address.Region = token.Values[4];
            }

            if (token.Values.Length > 5)
            {
                address.PostalCode = token.Values[5];
            }

            if (token.Values.Length > 6)
            {
                address.Country = token.Values[6];
            }

            // fix issues deseralizing Non-US Addresses
            if (vcard.Version == VCardVersion.V2_1 && vcard.SerializedCard != null)
            {
                Match match = Regex.Match(vcard.SerializedCard,
                                          "ADR;WORK;PREF(;ENCODING=QUOTED-PRINTABLE)?:;;(?<address>.*)LABEL;WORK;PREF;",
                                          RegexOptions.Singleline);
                if (match.Success)
                {
                    // clean the string
                    string adrstring = match.Groups["address"].Value;
                    adrstring = adrstring.Replace("=0D=0A=", ";")
                                .Replace("\r\n", ";").Replace("\r", ";").Replace("\n", ";");
                    var newtokens = adrstring.Split(';').Where(x => !string.IsNullOrEmpty(x)).ToArray();
                    // interpret depending on token count
                    if (newtokens.Length == 4)
                    {
                        address.Street     = newtokens[0];
                        address.Locality   = newtokens[1];
                        address.PostalCode = newtokens[2];
                        address.Region     = newtokens[3];
                        address.Country    = address.Region;
                    }
                    else if (newtokens.Length == 5)
                    {
                        address.Street     = newtokens[0];
                        address.Locality   = newtokens[1];
                        address.Region     = newtokens[2];
                        address.PostalCode = newtokens[3];
                        address.Country    = newtokens[4];
                    }
                    else if (newtokens.Length == 6)
                    {
                        address.Street     = newtokens[0] + ", " + newtokens[1];
                        address.Locality   = newtokens[2];
                        address.Region     = newtokens[3];
                        address.PostalCode = newtokens[4];
                        address.Country    = newtokens[5];
                    }
                }
            }

            var addresses = (List <Address>)vcard.Addresses ?? new List <Address>();

            addresses.Add(address);
            vcard.Addresses = addresses;
        }