X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Fjvcard%2Flauncher%2FMain.java;h=61287b3df8c486b10b1c36a0556ba115399fdb7f;hb=24e66f8322565f83abd73cfddb6838cbd0f52f58;hp=d893e101e710ede1013025beb47f424eb879becd;hpb=f06c81000632cfb5f525ca458f719338f55f9f66;p=jvcard.git diff --git a/src/be/nikiroo/jvcard/launcher/Main.java b/src/be/nikiroo/jvcard/launcher/Main.java index d893e10..61287b3 100644 --- a/src/be/nikiroo/jvcard/launcher/Main.java +++ b/src/be/nikiroo/jvcard/launcher/Main.java @@ -1,17 +1,13 @@ package be.nikiroo.jvcard.launcher; import java.io.File; -import java.io.FileInputStream; import java.io.IOException; -import java.io.InputStream; import java.lang.reflect.Field; import java.net.Socket; import java.nio.charset.Charset; import java.util.LinkedList; import java.util.List; -import javax.imageio.ImageIO; - import be.nikiroo.jvcard.Card; import be.nikiroo.jvcard.Contact; import be.nikiroo.jvcard.Data; @@ -26,6 +22,8 @@ import be.nikiroo.jvcard.resources.DisplayOption; import be.nikiroo.jvcard.resources.RemoteBundle; import be.nikiroo.jvcard.resources.StringId; import be.nikiroo.jvcard.resources.TransBundle; +import be.nikiroo.utils.IOUtils; +import be.nikiroo.utils.Image; import be.nikiroo.utils.ImageUtils; import be.nikiroo.utils.StringUtils; import be.nikiroo.utils.Version; @@ -40,6 +38,7 @@ import be.nikiroo.utils.resources.Bundles; * */ public class Main { + /** The name of the program */ static public final String APPLICATION_TITLE = "jVcard"; static private final int ERR_NO_FILE = 1; @@ -51,13 +50,13 @@ public class Main { static private boolean forceComputedFn; enum Mode { - CONTACT_MANAGER, I18N, SERVER, LOAD_PHOTO, SAVE_PHOTO, SAVE_CONFIG, HELP + CONTACT_MANAGER, I18N, SERVER, LOAD_PHOTO, SAVE_PHOTO, SAVE_CONFIG, HELP, SAVE_TO, } /** * Translate the given {@link StringId} into user text. * - * @param stringId + * @param id * the ID to translate * @param values * the values to insert instead of the place holders in the @@ -110,6 +109,7 @@ public class Main { int port = -1; Mode mode = Mode.CONTACT_MANAGER; String format = null; + String output = null; for (int index = 0; index < args.length; index++) { String arg = args[index]; if (!noMoreParams && arg.equals("--")) { @@ -223,6 +223,20 @@ public class Main { } format = args[index]; + } else if (!noMoreParams && (arg.equals("--save-to"))) { + if (mode != Mode.CONTACT_MANAGER) { + SERR(StringId.CLI_SERR_MODES); + return; + } + mode = Mode.SAVE_TO; + + index++; + if (index >= args.length) { + SERR(StringId.CLI_ERR_NOFILES); + return; + } + + output = args[index]; } else { filesTried = true; files.addAll(open(arg)); @@ -301,11 +315,10 @@ public class Main { ERR(StringId.CLI_ERR, StringId.CLI_ERR_NO_REMOTING, ERR_INTERNAL); return; - } else { - e.printStackTrace(); - ERR(StringId.CLI_ERR, StringId.CLI_ERR, ERR_INTERNAL); - return; } + e.printStackTrace(); + ERR(StringId.CLI_ERR, StringId.CLI_ERR, ERR_INTERNAL); + return; } break; } @@ -339,14 +352,11 @@ public class Main { } String b64; - InputStream in = null; + Image img = new Image(IOUtils.toByteArray(f)); try { - in = new FileInputStream(f); - b64 = ImageUtils.toBase64(in); + b64 = img.toBase64(); } finally { - if (in != null) { - in.close(); - } + img.close(); } // remove previous photos: @@ -386,10 +396,10 @@ public class Main { String filename = contact.toString(format, ""); File f = new File(dir, filename + ".png"); System.out.println("Saving " + f); + Image img = new Image(photo.getValue()); try { - ImageIO.write( - ImageUtils.fromBase64(photo.getValue()), - "png", f); + ImageUtils.getInstance().saveAsImage(img, f, + "png"); } catch (IOException e) { System.err.println(trans( StringId.CLI_ERR_CANNOT_SAVE_PHOTO, @@ -415,14 +425,37 @@ public class Main { if (!e.isCompiledIn()) { ERR(StringId.CLI_ERR, StringId.CLI_ERR_NO_TUI, ERR_INTERNAL); return; - } else { - e.printStackTrace(); - ERR(StringId.CLI_ERR, StringId.CLI_ERR, ERR_INTERNAL); - return; } + e.printStackTrace(); + ERR(StringId.CLI_ERR, StringId.CLI_ERR, ERR_INTERNAL); + return; } break; } + case SAVE_TO: { + try { + Card total = new Card(null, getCardFormat(output)); + + for (String file : files) { + try { + Card card = getCard(file, null).getCard(); + card.unlink(); + while (card.size() > 0) { + total.add(card.remove(0)); + } + } catch (IOException e) { + System.err.println(trans(StringId.CLI_ERR_CANNOT_OPEN, + file)); + } + } + + total.saveAs(new File(output), getCardFormat(output)); + } catch (IOException e) { + System.err.println(trans(StringId.CLI_ERR_CANNOT_OPEN, output)); + } + + break; + } case HELP: { System.out.println(APPLICATION_TITLE + " " + Version.getCurrentVersion()); @@ -446,6 +479,8 @@ public class Main { + trans(StringId.CLI_HELP_MODE_LOAD_PHOTO)); System.out.println("\t--save-photo DIR FORMAT ... : " + trans(StringId.CLI_HELP_MODE_SAVE_PHOTO)); + System.out.println("\t--save-to output(.vcf) ... : " + + trans(StringId.CLI_HELP_MODE_SAVE_TO)); System.out.println(); System.out.println(trans(StringId.CLI_HELP_OPTIONS)); @@ -463,6 +498,7 @@ public class Main { System.out.println(trans(StringId.CLI_HELP_FOOTER)); System.out.println(); + break; } } } @@ -490,20 +526,8 @@ public class Main { */ static public CardResult getCard(String input, MergeCallback callback) throws IOException { - boolean remote = false; - Format format = Format.Abook; - String ext = input; - if (ext.contains(".")) { - String tab[] = ext.split("\\."); - if (tab.length > 1 && tab[tab.length - 1].equalsIgnoreCase("vcf")) { - format = Format.VCard21; - } - } - - if (input.contains("://")) { - format = Format.VCard21; - remote = true; - } + boolean remote = isFileRemote(input); + Format format = getCardFormat(input); CardResult card = null; try { @@ -524,8 +548,10 @@ public class Main { try { for (Contact contact : card.getCard()) { Data name = contact.getPreferredData("FN"); + Data n = contact.getPreferredData("N"); + boolean hasN = n != null && n.getValue().length() > 0; if (name == null || name.getValue().length() == 0 - || forceComputedFn) { + || (forceComputedFn && hasN)) { name.setValue(contact.toString(defaultFn, "").trim()); } } @@ -538,6 +564,27 @@ public class Main { return card; } + static private boolean isFileRemote(String input) { + return input.contains("://"); + } + + static Format getCardFormat(String input) { + if (isFileRemote(input)) { + return Format.VCard21; + } + + Format format = Format.Abook; + String ext = input; + if (ext.contains(".")) { + String tab[] = ext.split("\\."); + if (tab.length > 1 && tab[tab.length - 1].equalsIgnoreCase("vcf")) { + format = Format.VCard21; + } + } + + return format; + } + /** * Open the given path and add all its files if it is a directory or just * this one if not to the returned list.