public void Constructor_Name_Value()
        {

            // This function tests a constructor that accepts
            // a name and initial value.

            vCardProperty property = new vCardProperty("NAME", "VALUE");

            Assert.AreEqual(
                "NAME",
                property.Name,
                "The name is incorrect.");

            Assert.AreEqual(
                "VALUE",
                property.Value,
                "The value is incorrect.");

            Assert.IsNotNull(
                property.Subproperties,
                "The subproperties collection was not created.");

            Assert.IsEmpty(
                property.Subproperties,
                "The subproperties collection should be empty.");

        }
Exemple #2
0
        private void BuildProperties_FN(
            vCardPropertyCollection properties,
            vCard card)
        {
            // The FN property indicates the formatted
            // name of the person.  This can be something
            // like "John Smith".

            if (!string.IsNullOrEmpty(card.FormattedName))
            {
                vCardProperty property =
                    new vCardProperty("FN", card.FormattedName);

                properties.Add(property);
            }
        }
Exemple #3
0
        /// <summary>
        ///     Builds the MAILER property.
        /// </summary>
        private void BuildProperties_MAILER(
            vCardPropertyCollection properties,
            vCard card)
        {
            // The MAILER property indicates the software that
            // generated the vCard.  See section 2.4.3 of the
            // vCard 2.1 specification.  Support is not widespread.

            if (!string.IsNullOrEmpty(card.Mailer))
            {
                vCardProperty property =
                    new vCardProperty("MAILER", card.Mailer);

                properties.Add(property);
            }
        }
        /// <summary>
        ///     Builds the BDAY property.
        /// </summary>
        private void BuildProperties_BDAY(
            vCardPropertyCollection properties,
            vCard card)
        {
            // The BDAY property indicates the birthdate
            // of the person.  The output format here is based on
            // Microsoft Outlook, which writes the date as YYYMMDD.

            if (card.BirthDate.HasValue)
            {
                vCardProperty property =
                    new vCardProperty("BDAY", card.BirthDate.Value);

                properties.Add(property);
            }
        }
        private void BuildProperties_LABEL(
            vCardPropertyCollection properties,
            vCard card)
        {
            foreach (vCardDeliveryLabel label in card.DeliveryLabels)
            {
                if (label.Text.Length > 0)
                {
                    vCardProperty property = new vCardProperty("LABEL", label.Text);

                    if (label.IsDomestic)
                    {
                        property.Subproperties.Add("DOM");
                    }

                    if (label.IsInternational)
                    {
                        property.Subproperties.Add("INTL");
                    }

                    if (label.IsParcel)
                    {
                        property.Subproperties.Add("PARCEL");
                    }

                    if (label.IsPostal)
                    {
                        property.Subproperties.Add("POSTAL");
                    }

                    if (label.IsHome)
                    {
                        property.Subproperties.Add("HOME");
                    }

                    if (label.IsWork)
                    {
                        property.Subproperties.Add("WORK");
                    }

                    // Give a hint to use QUOTED-PRINTABLE.

                    property.Subproperties.Add("ENCODING", "QUOTED-PRINTABLE");
                    properties.Add(property);
                }
            }
        }
Exemple #6
0
        /// <summary>
        ///     Builds KEY properties.
        /// </summary>
        private void BuildProperties_KEY(
            vCardPropertyCollection properties,
            vCard card)
        {
            // A KEY field contains an embedded security certificate.

            foreach (vCardCertificate certificate in card.Certificates)
            {
                vCardProperty property = new vCardProperty();

                property.Name  = "KEY";
                property.Value = certificate.Data;
                property.Subproperties.Add(TYPE, certificate.KeyType);

                properties.Add(property);
            }
        }
        /// <summary>
        ///     Builds the ROLE property.
        /// </summary>
        private void BuildProperties_ROLE(
            vCardPropertyCollection properties,
            vCard card)
        {
            // The ROLE property identifies the role of
            // the person at his/her organization.

            if (!string.IsNullOrEmpty(card.Role))
            {

                vCardProperty property =
                    new vCardProperty("ROLE", card.Role);

                properties.Add(property);

            }
        }
        /// <summary>
        ///     Builds the ORG property.
        /// </summary>
        private void BuildProperties_ORG(
            vCardPropertyCollection properties,
            vCard card)
        {
            // The ORG property specifies the name of the
            // person's company or organization. Example:
            //
            // ORG:FairMetric LLC

            if (!string.IsNullOrEmpty(card.Organization))
            {
                vCardProperty property =
                    new vCardProperty("ORG", card.Organization);

                properties.Add(property);
            }
        }
Exemple #9
0
        /// <summary>
        ///     Builds the GEO property.
        /// </summary>
        private void BuildProperties_GEO(
            vCardPropertyCollection properties,
            vCard card)
        {
            // The GEO properties contains the latitude and
            // longitude of the person or company of the vCard.

            if (card.Latitude.HasValue && card.Longitude.HasValue)
            {
                vCardProperty property = new vCardProperty();

                property.Name  = "GEO";
                property.Value =
                    card.Latitude.ToString() + ";" + card.Longitude.ToString();

                properties.Add(property);
            }
        }
        public void Constructor()
        {

            vCardProperty property = new vCardProperty();

            Assert.IsNotNull(
                property.Subproperties,
                "The subproperties collection was not created.");

            Assert.IsEmpty(
                property.Subproperties,
                "The subproperties collection should be empty.");

            Assert.IsNull(
                property.Value,
                "The value should be null.");

        }
        private void BuildProperties_TITLE(
            vCardPropertyCollection properties,
            vCard card)
        {
            // The TITLE property specifies the job title of
            // the person.  Example:
            //
            // TITLE:Systems Analyst
            // TITLE:President

            if (!string.IsNullOrEmpty(card.Title))
            {
                vCardProperty property =
                    new vCardProperty("TITLE", card.Title);

                properties.Add(property);
            }
        }
Exemple #12
0
        private void BuildProperties_LABEL(
            vCardPropertyCollection properties,
            vCard card)
        {
            foreach (vCardDeliveryLabel label in card.DeliveryLabels)
            {
                if (label.Text.Length > 0)
                {
                    vCardProperty property = new vCardProperty("LABEL", label.Text);

                    if (label.IsDomestic)
                    {
                        property.Subproperties.Add(TYPE, "DOM");
                    }

                    if (label.IsInternational)
                    {
                        property.Subproperties.Add(TYPE, "INTL");
                    }

                    if (label.IsParcel)
                    {
                        property.Subproperties.Add(TYPE, "PARCEL");
                    }

                    if (label.IsPostal)
                    {
                        property.Subproperties.Add(TYPE, "POSTAL");
                    }

                    if (label.IsHome)
                    {
                        property.Subproperties.Add(TYPE, "HOME");
                    }

                    if (label.IsWork)
                    {
                        property.Subproperties.Add(TYPE, "WORK");
                    }

                    properties.Add(property);
                }
            }
        }
        /// <summary>
        ///     Builds SOURCE properties.
        /// </summary>
        private void BuildProperties_SOURCE(
            vCardPropertyCollection properties,
            vCard card)
        {
            foreach (vCardSource source in card.Sources)
            {

                vCardProperty property = new vCardProperty();

                property.Name = "SOURCE";
                property.Value = source.Uri.ToString();

                if (!string.IsNullOrEmpty(source.Context))
                    property.Subproperties.Add("CONTEXT", source.Context);

                properties.Add(property);

            }
        }
Exemple #14
0
        private void BuildProperties_XSOCIALPROFILE(vCardPropertyCollection properties, vCard card)
        {
            // adding support for X-SOCIALPROFILE) in the vCard


            foreach (var sp in card.SocialProfiles)
            {
                vCardProperty property = new vCardProperty();
                property.Name = "X-SOCIALPROFILE";

                string propertyType = SocialProfileTypeUtils.GetSocialProfileServicePropertyType(sp.ServiceType);

                property.Subproperties.Add("TYPE", propertyType);
                property.Subproperties.Add("X-USER", sp.Username);
                property.Value = sp.ProfileUrl;

                properties.Add(property);
            }
        }
        private void BuildProperties_URL(
            vCardPropertyCollection properties,
            vCard card)
        {
            foreach (vCardWebsite webSite in card.Websites)
            {

                if (!string.IsNullOrEmpty(webSite.Url))
                {
                    vCardProperty property =
                        new vCardProperty("URL", webSite.Url.ToString());

                    if (webSite.IsWorkSite)
                        property.Subproperties.Add("WORK");

                    properties.Add(property);
                }

            }
        }
Exemple #16
0
        /// <summary>
        ///     Builds the NOTE property.
        /// </summary>
        private void BuildProperties_NOTE(
            vCardPropertyCollection properties,
            vCard card)
        {
            foreach (vCardNote note in card.Notes)
            {
                if (!string.IsNullOrEmpty(note.Text))
                {
                    vCardProperty property = new vCardProperty();

                    property.Name  = "NOTE";
                    property.Value = note.Text.Replace("\r\n", "\n");

                    if (!string.IsNullOrEmpty(note.Language))
                    {
                        property.Subproperties.Add("language", note.Language);
                    }

                    properties.Add(property);
                }
            }
        }
        public void Constructor_Name()
        {

            vCardProperty property = new vCardProperty("NAME");

            Assert.AreEqual(
                "NAME",
                property.Name,
                "The name is incorrect.");

            Assert.IsNull(
                property.Value,
                "The value should be null.");

            Assert.IsNotNull(
                property.Subproperties,
                "The subproperties collection was not created.");

            Assert.IsEmpty(
                property.Subproperties,
                "The subproperties collection should be empty.");

        }
        private void BuildProperties_N(
            vCardPropertyCollection properties,
            vCard card)
        {
            // The property has the following components: Family Name,
            // Given Name, Additional Names, Name Prefix, and Name
            // Suffix.  Example:
            //
            //   N:Pinch;David
            //   N:Pinch;David;John
            //
            // The N property is required (see section 3.1.2 of RFC 2426).

            vCardValueCollection values = new vCardValueCollection(';');
            values.Add(card.FamilyName);
            values.Add(card.GivenName);
            values.Add(card.AdditionalNames);
            values.Add(card.NamePrefix);
            values.Add(card.NameSuffix);

            vCardProperty property = new vCardProperty("N", values);

            properties.Add(property);
        }
      private void BuildProperties_NAME(
          vCardPropertyCollection properties,
          vCard card)
      {

        if (!string.IsNullOrEmpty(card.DisplayName))
        {

          vCardProperty property =
              new vCardProperty("NAME", card.DisplayName);

          properties.Add(property);
        }

      }
      private void BuildProperties_N(
          vCardPropertyCollection properties,
          vCard card)
      {

        // The property has the following components: Family Name,
        // Given Name, Additional Names, Name Prefix, and Name
        // Suffix.  Example:
        //
        //   N:Pinch;David
        //   N:Pinch;David;John
        //
        // The N property is required (see section 3.1.2 of RFC 2426).

        vCardValueCollection values = new vCardValueCollection(';');
        values.Add(card.FamilyName);
        values.Add(card.GivenName);
        values.Add(card.AdditionalNames);
        values.Add(card.NamePrefix);
        values.Add(card.NameSuffix);

        vCardProperty property = new vCardProperty("N", values);

        properties.Add(property);

      }
      /// <summary>
      ///     Builds the MAILER property.
      /// </summary>
      private void BuildProperties_MAILER(
          vCardPropertyCollection properties,
          vCard card)
      {

        // The MAILER property indicates the software that
        // generated the vCard.  See section 2.4.3 of the
        // vCard 2.1 specification.  Support is not widespread.

        if (!string.IsNullOrEmpty(card.Mailer))
        {

          vCardProperty property =
              new vCardProperty("MAILER", card.Mailer);

          properties.Add(property);

        }

      }
      private void BuildProperties_URL(
          vCardPropertyCollection properties,
          vCard card)
      {

        foreach (vCardWebsite webSite in card.Websites)
        {

          if (!string.IsNullOrEmpty(webSite.Url))
          {
            vCardProperty property =
                new vCardProperty("URL", webSite.Url.ToString());

            if (webSite.IsWorkSite)
              property.Subproperties.Add("TYPE", "WORK");

            // Add Subproperty for HOME aswell
            if (webSite.IsPersonalSite)
              property.Subproperties.Add("TYPE", "HOME");

            properties.Add(property);
          }

        }

      }
      /// <summary>
      ///     Builds SOURCE properties.
      /// </summary>
      private void BuildProperties_SOURCE(
          vCardPropertyCollection properties,
          vCard card)
      {

        foreach (vCardSource source in card.Sources)
        {

          vCardProperty property = new vCardProperty();

          property.Name = "SOURCE";
          property.Value = source.Uri.ToString();

          if (!string.IsNullOrEmpty(source.Context))
            property.Subproperties.Add("CONTEXT", source.Context);

          properties.Add(property);

        }

      }
      /// <summary>
      ///     Builds PRODID properties.
      /// </summary>
      private void BuildProperties_PRODID(
          vCardPropertyCollection properties,
          vCard card)
      {

        if (!string.IsNullOrEmpty(card.ProductId))
        {
          vCardProperty property = new vCardProperty();
          property.Name = "PRODID";
          property.Value = card.ProductId;
          properties.Add(property);
        }

      }
      /// <summary>
      ///     Builds the ORG property.
      /// </summary>
      private void BuildProperties_ORG(
          vCardPropertyCollection properties,
          vCard card)
      {

        // The ORG property specifies the name of the
        // person's company or organization. Example:
        //
        // ORG:FairMetric LLC

        if (!string.IsNullOrEmpty(card.Organization))
        {

          vCardProperty property;

          // Add department also
          if (!string.IsNullOrEmpty(card.Department))
          {
            vCardValueCollection values = new vCardValueCollection(';');
            values.Add(card.Organization);
            values.Add(card.Department);
            property = new vCardProperty("ORG", values);
          }
          else
          {
            property = new vCardProperty("ORG", card.Organization);
          }

          properties.Add(property);

        }

      }
        public void EncodeProperty_Name_Subproperty_Subvalue_Subproperty_Value()
        {

            vCardStandardWriter writer =
                new vCardStandardWriter();

            vCardProperty property =
                new vCardProperty("NAME", "VALUE");

            property.Subproperties.Add("SUB1", "SUBVALUE");
            property.Subproperties.Add("SUB2");

            Assert.AreEqual(
                "NAME;SUB1=SUBVALUE;SUB2:VALUE",
                writer.EncodeProperty(property));

        }
        /// <summary>
        ///     Builds ADR properties.
        /// </summary>
        private void BuildProperties_ADR(
            vCardPropertyCollection properties,
            vCard card)
        {
            foreach (vCardDeliveryAddress address in card.DeliveryAddresses)
            {

                // Do not generate a postal address (ADR) property
                // if the entire address is blank.

                if (
                    (!string.IsNullOrEmpty(address.City)) ||
                    (!string.IsNullOrEmpty(address.Country)) ||
                    (!string.IsNullOrEmpty(address.PostalCode)) ||
                    (!string.IsNullOrEmpty(address.Region)) ||
                    (!string.IsNullOrEmpty(address.Street)))
                {

                    // The ADR property contains the following
                    // subvalues in order.  All are required:
                    //
                    //   - Post office box
                    //   - Extended address
                    //   - Street address
                    //   - Locality (e.g. city)
                    //   - Region (e.g. province or state)
                    //   - Postal code (e.g. ZIP code)
                    //   - Country name

                    vCardValueCollection values = new vCardValueCollection(';');

                    values.Add(string.Empty);
                    values.Add(string.Empty);
                    values.Add(address.Street);
                    values.Add(address.City);
                    values.Add(address.Region);
                    values.Add(address.PostalCode);
                    values.Add(address.Country);

                    vCardProperty property =
                        new vCardProperty("ADR", values);

                    if (address.IsDomestic)
                        property.Subproperties.Add("DOM");

                    if (address.IsInternational)
                        property.Subproperties.Add("INTL");

                    if (address.IsParcel)
                        property.Subproperties.Add("PARCEL");

                    if (address.IsPostal)
                        property.Subproperties.Add("POSTAL");

                    if (address.IsHome)
                        property.Subproperties.Add("HOME");

                    if (address.IsWork)
                        property.Subproperties.Add("WORK");

                    properties.Add(property);

                }

            }
        }
      /// <summary>
      ///     Builds TEL properties.
      /// </summary>
      private void BuildProperties_TEL(
          vCardPropertyCollection properties,
          vCard card)
      {

        // The TEL property indicates a telephone number of
        // the person (including non-voice numbers like fax
        // and BBS numbers).
        //
        // TEL;VOICE;WORK:1-800-929-5805

        foreach (vCardPhone phone in card.Phones)
        {

          // A telephone entry has the property name TEL and
          // can have zero or more subproperties like FAX
          // or HOME.  Examples:
          //
          //   TEL;HOME:+1-612-555-1212
          //   TEL;FAX;HOME:+1-612-555-1212

          vCardProperty property = new vCardProperty();

          property.Name = "TEL";

          if (phone.IsBBS)
            property.Subproperties.Add("TYPE", "BBS");

          if (phone.IsCar)
            property.Subproperties.Add("TYPE", "CAR");

          if (phone.IsCellular)
            property.Subproperties.Add("TYPE", "CELL");

          if (phone.IsFax)
          {
            if (!phone.IsHome && !phone.IsWork)
            {
              property.Subproperties.Add("TYPE", "OTHER");
            }
            property.Subproperties.Add("TYPE", "FAX");
          }

          if (phone.IsHome)
            property.Subproperties.Add("TYPE", "HOME");

          if (phone.IsISDN)
            property.Subproperties.Add("TYPE", "ISDN");

          if (phone.IsMessagingService)
            property.Subproperties.Add("TYPE", "MSG");

          if (phone.IsModem)
            property.Subproperties.Add("TYPE", "MODEM");

          if (phone.IsPager)
            property.Subproperties.Add("TYPE", "PAGER");

          if (phone.IsPreferred)
            property.Subproperties.Add("TYPE", "PREF");

          if (phone.IsVideo)
            property.Subproperties.Add("TYPE", "VIDEO");

          if (phone.IsVoice)
          {
            if (!phone.IsHome && !phone.IsWork)
            {
              property.Subproperties.Add("TYPE", "OTHER");
            }
            property.Subproperties.Add("TYPE", "VOICE");

          }

          if (phone.IsWork)
            property.Subproperties.Add("TYPE", "WORK");

          if (phone.IsMain)
            property.Subproperties.Add("TYPE", "MAIN");

          property.Value = phone.FullNumber;
          properties.Add(property);

        }

      }
      /// <summary>
      ///     Returns property encoded into a standard vCard NAME:VALUE format.
      /// </summary>
      public string EncodeProperty(vCardProperty property)
      {

        if (property == null)
          throw new ArgumentNullException("property");

        if (string.IsNullOrEmpty(property.Name))
          throw new ArgumentException();

        StringBuilder builder = new StringBuilder();

        builder.Append(property.Name);

        foreach (vCardSubproperty subproperty in property.Subproperties)
        {
          builder.Append(';');
          builder.Append(subproperty.Name);

          if (!string.IsNullOrEmpty(subproperty.Value))
          {
            builder.Append('=');
            builder.Append(subproperty.Value);
          }
        }

        // The property name and all subproperties have been
        // written to the string builder (the colon separator
        // has not been written).  The next step is to write
        // the value.  Depending on the type of value and any
        // characters in the value, it may be necessary to
        // use an non-default encoding.  For example, byte arrays
        // are written encoded in BASE64.

        if (property.Value == null)
        {
          builder.Append(':');
        }
        else
        {

          Type valueType = property.Value.GetType();

          if (valueType == typeof(byte[]))
          {

            // A byte array should be encoded in BASE64 format.

            builder.Append(";ENCODING=b:");
            builder.Append(EncodeBase64((byte[])property.Value));

          }
          else if (valueType == typeof(vCardValueCollection))
          {

            vCardValueCollection values = (vCardValueCollection)property.Value;

            builder.Append(':');
            for (int index = 0; index < values.Count; index++)
            {

              builder.Append(EncodeEscaped(values[index]));
              if (index < values.Count - 1)
              {
                builder.Append(values.Separator);
              }
            }

          }
          else
          {

            // The object will be converted to a string (if it is
            // not a string already) and encoded if necessary.
            // The first step is to get the string value.

            string stringValue = null;

            if (valueType == typeof(char[]))
            {
              stringValue = new string(((char[])property.Value));
            }
            else
            {
              stringValue = property.Value.ToString();
            }

            builder.Append(':');

            switch (property.Subproperties.GetValue("ENCODING"))
            {

              case "QUOTED-PRINTABLE":
                builder.Append(EncodeQuotedPrintable(stringValue));
                break;

              default:
                builder.Append(EncodeEscaped(stringValue));
                break;

            }

          }

        }

        return builder.ToString();

      }
      private void BuildProperties_IMPP (
          vCardPropertyCollection properties,
          vCard card)
      {
        // Build IMPP and X-AIM properties

        foreach (vCardIMPP impp in card.IMs)
        {

          if (!string.IsNullOrEmpty(impp.Handle))
          {
            vCardProperty propertyIMPP;
            vCardProperty propertyXAIM;
            
            if (impp.ServiceType == IMServiceType.AIM)
            {
              propertyIMPP = new vCardProperty("IMPP", "aim:"+impp.Handle);
              propertyIMPP.Subproperties.Add("X-SERVICE-TYPE", "AIM");

              if (impp.ItemType == ItemType.HOME)
                propertyIMPP.Subproperties.Add("TYPE", "HOME");
              if (impp.ItemType == ItemType.WORK)
                propertyIMPP.Subproperties.Add("TYPE", "WORK");
              if (impp.IsPreferred)
                propertyIMPP.Subproperties.Add("TYPE", "PREF");

              properties.Add(propertyIMPP);

              propertyXAIM = new vCardProperty("X-AIM", impp.Handle);
              properties.Add(propertyXAIM);
            }
          }

        }

      }
      /// <summary>
      ///     Builds the NICKNAME property.
      /// </summary>
      private void BuildProperties_NICKNAME(
          vCardPropertyCollection properties,
          vCard card)
      {

        // The NICKNAME property specifies the familiar name
        // of the person, such as Jim.  This is defined in
        // section 3.1.3 of RFC 2426.  Multiple names can
        // be listed, separated by commas.

        if (card.Nicknames.Count > 0)
        {

          // A NICKNAME property is a comma-separated
          // list of values.  Create a value list and
          // add the nicknames collection to it.

          vCardValueCollection values = new vCardValueCollection(',');
          values.Add(card.Nicknames);

          // Create the new properties with each name separated
          // by a comma.

          vCardProperty property =
              new vCardProperty("NICKNAME", values);

          properties.Add(property);

        }

      }
        /// <summary>
        ///     Builds TEL properties.
        /// </summary>
        private void BuildProperties_TEL(
            vCardPropertyCollection properties,
            vCard card)
        {
            // The TEL property indicates a telephone number of
            // the person (including non-voice numbers like fax
            // and BBS numbers).
            //
            // TEL;VOICE;WORK:1-800-929-5805

            foreach (vCardPhone phone in card.Phones)
            {

                // A telephone entry has the property name TEL and
                // can have zero or more subproperties like FAX
                // or HOME.  Examples:
                //
                //   TEL;HOME:+1-612-555-1212
                //   TEL;FAX;HOME:+1-612-555-1212

                vCardProperty property = new vCardProperty();

                property.Name = "TEL";

                if (phone.IsBBS)
                    property.Subproperties.Add("BBS");

                if (phone.IsCar)
                    property.Subproperties.Add("CAR");

                if (phone.IsCellular)
                    property.Subproperties.Add("CELL");

                if (phone.IsFax)
                    property.Subproperties.Add("FAX");

                if (phone.IsHome)
                    property.Subproperties.Add("HOME");

                if (phone.IsISDN)
                    property.Subproperties.Add("ISDN");

                if (phone.IsMessagingService)
                    property.Subproperties.Add("MSG");

                if (phone.IsModem)
                    property.Subproperties.Add("MODEM");

                if (phone.IsPager)
                    property.Subproperties.Add("PAGER");

                if (phone.IsPreferred)
                    property.Subproperties.Add("PREF");

                if (phone.IsVideo)
                    property.Subproperties.Add("VIDEO");

                if (phone.IsVoice)
                    property.Subproperties.Add("VOICE");

                if (phone.IsWork)
                    property.Subproperties.Add("WORK");

                property.Value = phone.FullNumber;
                properties.Add(property);

            }
        }
      /// <summary>
      ///     Builds the NOTE property.
      /// </summary>
      private void BuildProperties_NOTE(
          vCardPropertyCollection properties,
          vCard card)
      {

        foreach (vCardNote note in card.Notes)
        {

          if (!string.IsNullOrEmpty(note.Text))
          {

            vCardProperty property = new vCardProperty();

            property.Name = "NOTE";
            property.Value = note.Text.Replace("\r\n","\n");

            if (!string.IsNullOrEmpty(note.Language))
            {
              property.Subproperties.Add("language", note.Language);
            }

            // Don't use QUOTED-PRINTABLE since it is deprecated
            //property.Subproperties.Add("ENCODING", "QUOTED-PRINTABLE");
            properties.Add(property);

          }

        }

      }
      /// <summary>
      ///     Builds the ROLE property.
      /// </summary>
      private void BuildProperties_ROLE(
          vCardPropertyCollection properties,
          vCard card)
      {

        // The ROLE property identifies the role of
        // the person at his/her organization.

        if (!string.IsNullOrEmpty(card.Role))
        {

          vCardProperty property =
              new vCardProperty("ROLE", card.Role);

          properties.Add(property);

        }

      }
      private void BuildProperties_PHOTO(
          vCardPropertyCollection properties,
          vCard card)
      {

        foreach (vCardPhoto photo in card.Photos)
        {

          if (photo.Url == null)
          {

            // This photo does not have a URL associated
            // with it.  Therefore a property can be
            // generated only if the image data is loaded.
            // Otherwise there is not enough information.

            if (photo.IsLoaded)
            {
              var property = new vCardProperty ("PHOTO", photo.GetBytes());
              property.Subproperties.Add ("TYPE", "JPEG");
              properties.Add (property);
            }
          }
          else
          {

            // This photo has a URL associated with it.  The
            // PHOTO property can either be linked as an image
            // or embedded, if desired.

            bool doEmbedded =
                photo.Url.IsFile ? this.embedLocalImages : this.embedInternetImages;

            if (doEmbedded)
            {

              // According to the settings of the card writer,
              // this linked image should be embedded into the
              // vCard data.  Attempt to fetch the data.

              try
              {
                photo.Fetch();
              }
              catch
              {

                // An error was encountered.  The image can
                // still be written as a link, however.

                doEmbedded = false;
              }

            }

            // At this point, doEmbedded is true only if (a) the
            // writer was configured to embed the image, and (b)
            // the image was successfully downloaded.

            if (doEmbedded)
            {
              properties.Add(
                  new vCardProperty("PHOTO", photo.GetBytes()));
            }
            else
            {

              vCardProperty uriPhotoProperty =
                  new vCardProperty("PHOTO");

              // Set the VALUE property to indicate that
              // the data for the photo is a URI.

              uriPhotoProperty.Subproperties.Add("VALUE", "URI");
              uriPhotoProperty.Value = photo.Url.ToString();

              properties.Add(uriPhotoProperty);
            }

          }
        }
      }
      /// <summary>
      ///     Builds KEY properties.
      /// </summary>
      private void BuildProperties_KEY(
          vCardPropertyCollection properties,
          vCard card)
      {

        // A KEY field contains an embedded security certificate.

        foreach (vCardCertificate certificate in card.Certificates)
        {

          vCardProperty property = new vCardProperty();

          property.Name = "KEY";
          property.Value = certificate.Data;
          property.Subproperties.Add("TYPE", certificate.KeyType);

          properties.Add(property);

        }

      }
        private void BuildProperties_PHOTO(
            vCardPropertyCollection properties,
            vCard card)
        {
            foreach (vCardPhoto photo in card.Photos)
            {

                if (photo.Url == null)
                {

                    // This photo does not have a URL associated
                    // with it.  Therefore a property can be
                    // generated only if the image data is loaded.
                    // Otherwise there is not enough information.

                    if (photo.IsLoaded)
                    {

                        properties.Add(
                            new vCardProperty("PHOTO", photo.GetBytes()));

                    }

                }
                else
                {

                    // This photo has a URL associated with it.  The
                    // PHOTO property can either be linked as an image
                    // or embedded, if desired.

                    bool doEmbedded =
                        photo.Url.IsFile ? this.embedLocalImages : this.embedInternetImages;

                    if (doEmbedded)
                    {

                        // According to the settings of the card writer,
                        // this linked image should be embedded into the
                        // vCard data.  Attempt to fetch the data.

                        try
                        {
                            photo.Fetch();
                        }
                        catch
                        {

                            // An error was encountered.  The image can
                            // still be written as a link, however.

                            doEmbedded = false;
                        }

                    }

                    // At this point, doEmbedded is true only if (a) the
                    // writer was configured to embed the image, and (b)
                    // the image was successfully downloaded.

                    if (doEmbedded)
                    {
                        properties.Add(
                            new vCardProperty("PHOTO", photo.GetBytes()));
                    }
                    else
                    {

                        vCardProperty uriPhotoProperty =
                            new vCardProperty("PHOTO");

                        // Set the VALUE property to indicate that
                        // the data for the photo is a URI.

                        uriPhotoProperty.Subproperties.Add("VALUE", "URI");
                        uriPhotoProperty.Value = photo.Url.ToString();

                        properties.Add(uriPhotoProperty);
                    }

                }
            }
        }
      private void BuildProperties_LABEL(
          vCardPropertyCollection properties,
          vCard card)
      {

        foreach (vCardDeliveryLabel label in card.DeliveryLabels)
        {

          if (label.Text.Length > 0)
          {

            vCardProperty property = new vCardProperty("LABEL", label.Text);

            if (label.IsDomestic)
              property.Subproperties.Add("TYPE", "DOM");

            if (label.IsInternational)
              property.Subproperties.Add("TYPE", "INTL");

            if (label.IsParcel)
              property.Subproperties.Add("TYPE", "PARCEL");

            if (label.IsPostal)
              property.Subproperties.Add("TYPE", "POSTAL");

            if (label.IsHome)
              property.Subproperties.Add("TYPE", "HOME");

            if (label.IsWork)
              property.Subproperties.Add("TYPE", "WORK");

            // Don't use QUOTED-PRINTABLE.
            //property.Subproperties.Add("ENCODING", "QUOTED-PRINTABLE");
            properties.Add(property);


          }

        }

      }
      /// <summary>
      ///     Builds the REV property.
      /// </summary>
      private void BuildProperties_REV(
          vCardPropertyCollection properties,
          vCard card)
      {

        if (card.RevisionDate.HasValue)
        {

          vCardProperty property =
              new vCardProperty("REV", card.RevisionDate.Value.ToString());

          properties.Add(property);

        }

      }
      private void BuildProperties_TITLE(
          vCardPropertyCollection properties,
          vCard card)
      {

        // The TITLE property specifies the job title of 
        // the person.  Example:
        //
        // TITLE:Systems Analyst
        // TITLE:President

        if (!string.IsNullOrEmpty(card.Title))
        {
          vCardProperty property =
              new vCardProperty("TITLE", card.Title);

          properties.Add(property);
        }

      }
      /// <summary>
      ///     Builds ADR properties.
      /// </summary>
      private void BuildProperties_ADR(
          vCardPropertyCollection properties,
          vCard card)
      {

        foreach (vCardDeliveryAddress address in card.DeliveryAddresses)
        {

          // Do not generate a postal address (ADR) property
          // if the entire address is blank.

          if (
              (!string.IsNullOrEmpty(address.City)) ||
              (!string.IsNullOrEmpty(address.Country)) ||
              (!string.IsNullOrEmpty(address.PostalCode)) ||
              (!string.IsNullOrEmpty(address.Region)) ||
              (!string.IsNullOrEmpty(address.Street)))
          {

            // The ADR property contains the following
            // subvalues in order.  All are required:
            //
            //   - Post office box
            //   - Extended address
            //   - Street address
            //   - Locality (e.g. city)
            //   - Region (e.g. province or state)
            //   - Postal code (e.g. ZIP code)
            //   - Country name

            vCardValueCollection values = new vCardValueCollection(';');

            values.Add(string.Empty);
            values.Add(string.Empty);
            values.Add(!string.IsNullOrEmpty(address.Street) ? address.Street.Replace("\r\n", "\n") : string.Empty);
            values.Add(address.City);
            values.Add(address.Region);
            values.Add(address.PostalCode);
            values.Add(address.Country);

            vCardProperty property =
                new vCardProperty("ADR", values);

            if (address.IsDomestic)
              property.Subproperties.Add("TYPE", "DOM");

            if (address.IsInternational)
              property.Subproperties.Add("TYPE", "INTL");

            if (address.IsParcel)
              property.Subproperties.Add("TYPE", "PARCEL");

            if (address.IsPostal)
              property.Subproperties.Add("TYPE", "POSTAL");

            if (address.IsHome)
              property.Subproperties.Add("TYPE", "HOME");

            if (address.IsWork)
              property.Subproperties.Add("TYPE", "WORK");

            properties.Add(property);

          }

        }

      }
      /// <summary>
      ///     Builds the GEO property.
      /// </summary>
      private void BuildProperties_GEO(
          vCardPropertyCollection properties,
          vCard card)
      {

        // The GEO properties contains the latitude and
        // longitude of the person or company of the vCard.

        if (card.Latitude.HasValue && card.Longitude.HasValue)
        {

          vCardProperty property = new vCardProperty();

          property.Name = "GEO";
          property.Value =
              card.Latitude.ToString() + ";" + card.Longitude.ToString();

          properties.Add(property);

        }

      }
        /// <summary>
        ///     Returns property encoded into a standard vCard NAME:VALUE format.
        /// </summary>
        public string EncodeProperty(vCardProperty property)
        {
            if (property == null)
                throw new ArgumentNullException("property");

            if (string.IsNullOrEmpty(property.Name))
                throw new ArgumentException();

            StringBuilder builder = new StringBuilder();

            builder.Append(property.Name);

            foreach (vCardSubproperty subproperty in property.Subproperties)
            {
                builder.Append(';');
                builder.Append(subproperty.Name);

                if (!string.IsNullOrEmpty(subproperty.Value))
                {
                    builder.Append('=');
                    builder.Append(subproperty.Value);
                }
            }

            // The property name and all subproperties have been
            // written to the string builder (the colon separator
            // has not been written).  The next step is to write
            // the value.  Depending on the type of value and any
            // characters in the value, it may be necessary to
            // use an non-default encoding.  For example, byte arrays
            // are written encoded in BASE64.

            if (property.Value == null)
            {
                builder.Append(':');
            }
            else
            {

                Type valueType = property.Value.GetType();

                if (valueType == typeof(byte[]))
                {

                    // A byte array should be encoded in BASE64 format.

                    builder.Append(";ENCODING=BASE64:");
                    builder.Append(EncodeBase64((byte[])property.Value));

                }
                else if (valueType == typeof(vCardValueCollection))
                {

                    vCardValueCollection values = (vCardValueCollection)property.Value;

                    builder.Append(':');
                    for (int index = 0; index < values.Count; index++)
                    {

                        builder.Append(EncodeEscaped(values[index]));
                        if (index < values.Count - 1)
                        {
                            builder.Append(values.Separator);
                        }
                    }

                }
                else
                {

                    // The object will be converted to a string (if it is
                    // not a string already) and encoded if necessary.
                    // The first step is to get the string value.

                    string stringValue = null;

                    if (valueType == typeof(char[]))
                    {
                        stringValue = new string(((char[])property.Value));
                    }
                    else
                    {
                        stringValue = property.Value.ToString();
                    }

                    builder.Append(':');

                    switch (property.Subproperties.GetValue("ENCODING"))
                    {

                        case "QUOTED-PRINTABLE":
                            builder.Append(EncodeQuotedPrintable(stringValue));
                            break;

                        default:
                            builder.Append(EncodeEscaped(stringValue));
                            break;

                    }

                }

            }

            return builder.ToString();
        }
      /// <summary>
      ///     Builds the BDAY property.
      /// </summary>
      private void BuildProperties_BDAY(
          vCardPropertyCollection properties,
          vCard card)
      {

        // The BDAY property indicates the birthdate
        // of the person.  The output format here is based on
        // Microsoft Outlook, which writes the date as YYYMMDD.
        // FIXES DateFormat with ToString

        if (card.BirthDate.HasValue)
        {

          vCardProperty property =
              new vCardProperty("BDAY", card.BirthDate.Value.ToString ("yyyy-MM-dd"));

          properties.Add(property);
        }

      }
        /// <summary>
        ///     Builds EMAIL properties.
        /// </summary>
        private void BuildProperties_EMAIL(
            vCardPropertyCollection properties,
            vCard card)
        {
            // The EMAIL property contains an electronic
            // mail address for the purpose.  A vCard may contain
            // as many email addresses as needed.  The format also
            // supports various vendors, such as CompuServe addresses
            // and Internet SMTP addresses.
            //
            // EMAIL;INTERNET:[email protected]

            foreach (vCardEmailAddress emailAddress in card.EmailAddresses)
            {

                vCardProperty property = new vCardProperty();
                property.Name = "EMAIL";
                property.Value = emailAddress.Address;

                if (emailAddress.IsPreferred)
                {
                    property.Subproperties.Add("PREF");
                }

                switch (emailAddress.EmailType)
                {

                    case vCardEmailAddressType.Internet:
                        property.Subproperties.Add("INTERNET");
                        break;

                    case vCardEmailAddressType.AOL:
                        property.Subproperties.Add("AOL");
                        break;

                    case vCardEmailAddressType.AppleLink:
                        property.Subproperties.Add("AppleLink");
                        break;

                    case vCardEmailAddressType.AttMail:
                        property.Subproperties.Add("ATTMail");
                        break;

                    case vCardEmailAddressType.CompuServe:
                        property.Subproperties.Add("CIS");
                        break;

                    case vCardEmailAddressType.eWorld:
                        property.Subproperties.Add("eWorld");
                        break;

                    case vCardEmailAddressType.IBMMail:
                        property.Subproperties.Add("IBMMail");
                        break;

                    case vCardEmailAddressType.MCIMail:
                        property.Subproperties.Add("MCIMail");
                        break;

                    case vCardEmailAddressType.PowerShare:
                        property.Subproperties.Add("POWERSHARE");
                        break;

                    case vCardEmailAddressType.Prodigy:
                        property.Subproperties.Add("PRODIGY");
                        break;

                    case vCardEmailAddressType.Telex:
                        property.Subproperties.Add("TLX");
                        break;

                    case vCardEmailAddressType.X400:
                        property.Subproperties.Add("X400");
                        break;

                    default:
                        property.Subproperties.Add("INTERNET");
                        break;

                }

                properties.Add(property);

            }
        }
      private void BuildProperties_CLASS(
          vCardPropertyCollection properties,
          vCard card)
      {

        vCardProperty property = new vCardProperty("CLASS");

        switch (card.AccessClassification)
        {

          case vCardAccessClassification.Unknown:
            // No value is written.
            return;

          case vCardAccessClassification.Confidential:
            property.Value = "CONFIDENTIAL";
            break;

          case vCardAccessClassification.Private:
            property.Value = "PRIVATE";
            break;

          case vCardAccessClassification.Public:
            property.Value = "PUBLIC";
            break;

          default:
            throw new NotSupportedException();

        }

        properties.Add(property);

      }
        public void EncodeProperty_Name_Subproperty()
        {

            vCardStandardWriter writer =
                new vCardStandardWriter();

            vCardProperty property =
                new vCardProperty("NAME");

            property.Subproperties.Add("SUB");

            Assert.AreEqual(
                "NAME;SUB:",
                writer.EncodeProperty(property));

        }
      /// <summary>
      ///     Builds EMAIL properties.
      /// </summary>
      private void BuildProperties_EMAIL(
          vCardPropertyCollection properties,
          vCard card)
      {

        // The EMAIL property contains an electronic
        // mail address for the purpose.  A vCard may contain
        // as many email addresses as needed.  The format also
        // supports various vendors, such as CompuServe addresses
        // and Internet SMTP addresses.
        //
        // EMAIL;INTERNET:[email protected]

        foreach (vCardEmailAddress emailAddress in card.EmailAddresses)
        {

          vCardProperty property = new vCardProperty();
          property.Name = "EMAIL";
          property.Value = emailAddress.Address;

          if (emailAddress.IsPreferred)
          {
            property.Subproperties.Add("TYPE","PREF");
          }

          switch (emailAddress.EmailType)
          {

            case vCardEmailAddressType.Internet:
              property.Subproperties.Add("TYPE", "INTERNET");
              break;

            case vCardEmailAddressType.AOL:
              property.Subproperties.Add("TYPE", "AOL");
              break;

            case vCardEmailAddressType.AppleLink:
              property.Subproperties.Add("TYPE", "AppleLink");
              break;

            case vCardEmailAddressType.AttMail:
              property.Subproperties.Add("TYPE", "ATTMail");
              break;

            case vCardEmailAddressType.CompuServe:
              property.Subproperties.Add("TYPE", "CIS");
              break;

            case vCardEmailAddressType.eWorld:
              property.Subproperties.Add("TYPE", "eWorld");
              break;

            case vCardEmailAddressType.IBMMail:
              property.Subproperties.Add("TYPE", "IBMMail");
              break;

            case vCardEmailAddressType.MCIMail:
              property.Subproperties.Add("TYPE", "MCIMail");
              break;

            case vCardEmailAddressType.PowerShare:
              property.Subproperties.Add("TYPE", "POWERSHARE");
              break;

            case vCardEmailAddressType.Prodigy:
              property.Subproperties.Add("TYPE", "PRODIGY");
              break;

            case vCardEmailAddressType.Telex:
              property.Subproperties.Add("TYPE", "TLX");
              break;

            case vCardEmailAddressType.X400:
              property.Subproperties.Add("TYPE", "X400");
              break;

            default:
              property.Subproperties.Add("TYPE", "INTERNET");
              break;

          }
          switch (emailAddress.ItemType)
          {
            case ItemType.HOME:
              property.Subproperties.Add("TYPE", "HOME");
              break;
            case ItemType.WORK:
              property.Subproperties.Add("TYPE", "WORK");
              break;
          }

          properties.Add(property);

        }

      }
        public void EncodeProperty_Name_Value()
        {

            vCardStandardWriter writer =
                new vCardStandardWriter();

            vCardProperty property =
                new vCardProperty("NAME", "VALUE");

            Assert.AreEqual(
                "NAME:VALUE",
                writer.EncodeProperty(property));

        }
      private void BuildProperties_FN(
          vCardPropertyCollection properties,
          vCard card)
      {

        // The FN property indicates the formatted 
        // name of the person.  This can be something
        // like "John Smith".

        if (!string.IsNullOrEmpty(card.FormattedName))
        {

          vCardProperty property =
              new vCardProperty("FN", card.FormattedName);

          properties.Add(property);

        }

      }