private void saveAsVCard(Contact contact, String fileName) throws IOException {
    String charSet = "CHARSET=" + Charset.defaultCharset().name();
    String vCard =
        "BEGIN:VCARD"
            + "\nVERSION:2.1"
            + "\n"
            + getName(contact, charSet)
            + "FN;"
            + charSet
            + ":"
            + contact.getFirstName()
            + " "
            + contact.getLastName()
            + "\nORG;"
            + charSet
            + ":"
            + contact.getCompany()
            + "\nTITLE:"
            + contact.getJobTitle()
            + "\nNOTE:"
            + contact.getNote()
            + "\nTEL;WORK;VOICE:"
            + contact.getPhone()
            + "\nTEL;CELL;VOICE:"
            + contact.getMobile()
            + "\nADR;WORK;"
            + charSet
            + ":"
            + ";;"
            + contact.getStreet()
            + ";"
            + contact.getCity()
            + ";"
            + contact.getState()
            + ";"
            + contact.getZip()
            + ";"
            + contact.getCountry()
            + "\nURL;WORK:"
            + contact.getWebPage()
            + "\nEMAIL;PREF;INTERNET:"
            + contact.getEmail()
            + "\n";

    if (!contact.getJpegString().equals("")) {
      vCard += "PHOTO;TYPE=JPEG;ENCODING=BASE64:\n " + contact.getJpegString() + "\n";
    }

    vCard += "END:VCARD\n";

    PrintWriter out = new PrintWriter(fileName, "Cp1252");
    out.println(vCard);
    out.close();
  }
  @Persist
  public void doSave(@Optional IProgressMonitor monitor) throws IOException, InterruptedException {
    if (monitor == null) {
      monitor = new NullProgressMonitor();
    }
    monitor.beginTask("Saving contact details to vCard...", 16);

    Contact originalContact = detailComposite.getOriginalContact();
    Contact modifiedContact = detailComposite.getModifiedContact();
    saveAsVCard(modifiedContact, modifiedContact.getSourceFile());

    originalContact.setCity(modifiedContact.getCity());
    Thread.sleep(50);
    monitor.worked(1);

    originalContact.setCompany(modifiedContact.getCompany());
    Thread.sleep(50);
    monitor.worked(1);

    originalContact.setCountry(modifiedContact.getCountry());
    Thread.sleep(50);
    monitor.worked(1);

    originalContact.setEmail(modifiedContact.getEmail());
    Thread.sleep(50);
    monitor.worked(1);

    originalContact.setFirstName(modifiedContact.getFirstName());
    Thread.sleep(50);
    monitor.worked(1);

    originalContact.setJobTitle(modifiedContact.getJobTitle());
    Thread.sleep(50);
    monitor.worked(1);

    originalContact.setLastName(modifiedContact.getLastName());
    Thread.sleep(50);
    monitor.worked(1);

    originalContact.setMiddleName(modifiedContact.getMiddleName());
    Thread.sleep(50);
    monitor.worked(1);

    originalContact.setMobile(modifiedContact.getMobile());
    Thread.sleep(50);
    monitor.worked(1);

    originalContact.setNote(modifiedContact.getNote());
    Thread.sleep(50);
    monitor.worked(1);

    originalContact.setPhone(modifiedContact.getPhone());
    Thread.sleep(50);
    monitor.worked(1);

    originalContact.setState(modifiedContact.getState());
    Thread.sleep(50);
    monitor.worked(1);

    originalContact.setStreet(modifiedContact.getStreet());
    Thread.sleep(50);
    monitor.worked(1);

    originalContact.setTitle(modifiedContact.getTitle());
    Thread.sleep(50);
    monitor.worked(1);

    originalContact.setWebPage(modifiedContact.getWebPage());
    Thread.sleep(50);
    monitor.worked(1);

    originalContact.setZip(modifiedContact.getZip());
    Thread.sleep(50);
    monitor.worked(1);

    updatePartTitle(originalContact);
    monitor.done();

    dirtyable.setDirty(false);
  }