X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Fjvcard%2Flauncher%2FMain.java;h=61287b3df8c486b10b1c36a0556ba115399fdb7f;hb=24e66f8322565f83abd73cfddb6838cbd0f52f58;hp=54238c8b86bf08e1fd872969e56d4f7aee6677ce;hpb=e27d1404e9222796fb6097ab41cff873148b65c7;p=jvcard.git diff --git a/src/be/nikiroo/jvcard/launcher/Main.java b/src/be/nikiroo/jvcard/launcher/Main.java index 54238c8..61287b3 100644 --- a/src/be/nikiroo/jvcard/launcher/Main.java +++ b/src/be/nikiroo/jvcard/launcher/Main.java @@ -8,8 +8,6 @@ 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; @@ -19,14 +17,17 @@ import be.nikiroo.jvcard.launcher.Optional.NotSupportedException; import be.nikiroo.jvcard.parsers.Format; import be.nikiroo.jvcard.remote.Command; import be.nikiroo.jvcard.remote.SimpleSocket; -import be.nikiroo.jvcard.resources.Bundles; -import be.nikiroo.jvcard.resources.StringUtils; -import be.nikiroo.jvcard.resources.bundles.ColorBundle; -import be.nikiroo.jvcard.resources.bundles.DisplayBundle; -import be.nikiroo.jvcard.resources.bundles.RemoteBundle; -import be.nikiroo.jvcard.resources.bundles.TransBundle; -import be.nikiroo.jvcard.resources.enums.DisplayOption; -import be.nikiroo.jvcard.resources.enums.StringId; +import be.nikiroo.jvcard.resources.DisplayBundle; +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; +import be.nikiroo.utils.resources.Bundles; /** * This class contains the runnable Main method. It will parse the user supplied @@ -34,11 +35,11 @@ import be.nikiroo.jvcard.resources.enums.StringId; * a MainWindow. * * @author niki - * + * */ public class Main { + /** The name of the program */ static public final String APPLICATION_TITLE = "jVcard"; - static public final String APPLICATION_VERSION = "1.1-dev"; static private final int ERR_NO_FILE = 1; static private final int ERR_SYNTAX = 2; @@ -49,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 @@ -108,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("--")) { @@ -221,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)); @@ -273,11 +289,11 @@ public class Main { } new TransBundle().updateFile(dir); // default locale - for (String lang : TransBundle.getKnownLanguages()) { + for (String lang : new TransBundle().getKnownLanguages()) { new TransBundle(lang).updateFile(dir); } - new ColorBundle().updateFile(dir); + // new UIColors().updateFile(dir); new DisplayBundle().updateFile(dir); new RemoteBundle().updateFile(dir); } catch (IOException e) { @@ -299,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; } @@ -336,7 +351,13 @@ public class Main { .toLowerCase(); } - String b64 = StringUtils.fromImage(f); + String b64; + Image img = new Image(IOUtils.toByteArray(f)); + try { + b64 = img.toBase64(); + } finally { + img.close(); + } // remove previous photos: for (Data photo = contact @@ -375,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( - StringUtils.toImage(photo.getValue()), - "png", f); + ImageUtils.getInstance().saveAsImage(img, f, + "png"); } catch (IOException e) { System.err.println(trans( StringId.CLI_ERR_CANNOT_SAVE_PHOTO, @@ -404,16 +425,40 @@ 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 + " " + APPLICATION_VERSION); + System.out.println(APPLICATION_TITLE + " " + + Version.getCurrentVersion()); System.out.println(); System.out.println(trans(StringId.CLI_HELP)); @@ -434,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)); @@ -451,6 +498,7 @@ public class Main { System.out.println(trans(StringId.CLI_HELP_FOOTER)); System.out.println(); + break; } } } @@ -478,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 { @@ -512,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()); } } @@ -526,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.