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 be.nikiroo.jvcard.Data;
import be.nikiroo.jvcard.TypeInfo;
import be.nikiroo.jvcard.launcher.CardResult.MergeCallback;
+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.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
* a MainWindow.
*
* @author niki
- *
+ *
*/
public class Main {
static public final String APPLICATION_TITLE = "jVcard";
- static public final String APPLICATION_VERSION = "1.0-dev";
static private final int ERR_NO_FILE = 1;
static private final int ERR_SYNTAX = 2;
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
* @return the translated text with the given value where required
*/
static public String trans(StringId id, Object... values) {
- return transService.getString(id, (Object[]) values);
+ return transService.getString(id, values);
}
/**
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("--")) {
}
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));
}
}
- transService.updateFile(dir); // current lang TransBundle
- new TransBundle().updateFile(dir);
- new ColorBundle().updateFile(dir);
+ new TransBundle().updateFile(dir); // default locale
+ for (String lang : new TransBundle().getKnownLanguages()) {
+ new TransBundle(lang).updateFile(dir);
+ }
+
+ // new UIColors().updateFile(dir);
new DisplayBundle().updateFile(dir);
new RemoteBundle().updateFile(dir);
} catch (IOException e) {
e.printStackTrace();
+ System.err.flush();
System.exit(ERR_INTERNAL);
}
break;
case SERVER: {
try {
Optional.runServer(port);
- } catch (Exception e) {
- if (e instanceof IOException) {
- System.err
- .println("I/O Exception: Cannot start the server");
- } else {
+ } catch (IOException e) {
+ ERR(StringId.CLI_ERR, StringId.CLI_ERR_CANNOT_START,
+ ERR_INTERNAL);
+ return;
+ } catch (NotSupportedException e) {
+ if (!e.isCompiledIn()) {
ERR(StringId.CLI_ERR, StringId.CLI_ERR_NO_REMOTING,
ERR_INTERNAL);
return;
}
+ e.printStackTrace();
+ ERR(StringId.CLI_ERR, StringId.CLI_ERR, ERR_INTERNAL);
+ return;
}
break;
}
try {
transService.updateFile(dir);
} catch (IOException e) {
- System.err.println(trans(StringId.CLI_ERR_CANNOT_CREATE_LANG,
- dir));
- e.printStackTrace();
+ ERR(StringId.CLI_ERR, StringId.CLI_ERR_CANNOT_CREATE_LANG,
+ ERR_INTERNAL);
+ return;
}
break;
}
if (f.exists()) {
System.out.println("Loading " + f);
try {
- String b64 = StringUtils.fromImage(ImageIO
- .read(f));
+ String type = "jpeg";
+ int dotIndex = filename.indexOf('.');
+ if (dotIndex >= 0
+ && (dotIndex + 1) < filename.length()) {
+ type = filename.substring(dotIndex + 1)
+ .toLowerCase();
+ }
+
+ String b64;
+ InputStream in = null;
+ try {
+ in = new FileInputStream(f);
+ b64 = ImageUtils.toBase64(in);
+ } finally {
+ if (in != null) {
+ in.close();
+ }
+ }
// remove previous photos:
for (Data photo = contact
List<TypeInfo> types = new LinkedList<TypeInfo>();
types.add(new TypeInfo("ENCODING", "b"));
- types.add(new TypeInfo("TYPE", "png"));
+ types.add(new TypeInfo("TYPE", type));
Data photo = new Data(types, "PHOTO", b64, null);
contact.add(photo);
} catch (IOException e) {
System.out.println("Saving " + f);
try {
ImageIO.write(
- StringUtils.toImage(photo.getValue()),
+ ImageUtils.fromBase64(photo.getValue()),
"png", f);
} catch (IOException e) {
System.err.println(trans(
case CONTACT_MANAGER: {
try {
Optional.startTui(textMode, files);
- } catch (Exception e) {
- if (e instanceof IOException) {
- ERR(StringId.CLI_ERR, StringId.CLI_ERR_CANNOT_START,
- ERR_NO_FILE);
- return;
- } else {
+ } catch (IOException e) {
+ ERR(StringId.CLI_ERR, StringId.CLI_ERR_CANNOT_START,
+ ERR_NO_FILE);
+ return;
+ } catch (NotSupportedException e) {
+ if (!e.isCompiledIn()) {
ERR(StringId.CLI_ERR, StringId.CLI_ERR_NO_TUI, 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));
+ 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));
+ trans(StringId.CLI_HELP_LANG));
System.out.println("\t--tui : " + trans(StringId.CLI_HELP_TUI));
System.out.println("\t--gui : " + trans(StringId.CLI_HELP_GUI));
- System.out.println("\t--noutf : " + trans(StringId.CLI_HELP_NOUTF));
+ System.out.println("\t--noutf : "
+ + trans(StringId.CLI_HELP_NOUTF_OPTION));
System.out.println("\t--config : "
+ trans(StringId.CLI_HELP_CONFIG));
System.out.println();
System.out.println(trans(StringId.CLI_HELP_FOOTER));
System.out.println();
+ break;
}
}
}
*/
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 {
}
} catch (IOException ioe) {
throw ioe;
- } catch (Exception e) {
+ } catch (NotSupportedException e) {
throw new IOException("Remoting support not available", e);
}
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) {
- name.setValue(contact.toString(defaultFn, ""));
+ || (forceComputedFn && hasN)) {
+ name.setValue(contact.toString(defaultFn, "").trim());
}
}
} catch (Exception e) {
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.
else
System.err.println(trans(err, trans(suberr, subvalues)));
+ System.err.flush();
System.exit(CODE);
}
}