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;
*/
public class Main {
static public final String APPLICATION_TITLE = "jVcard";
- static public final String APPLICATION_VERSION = "1.0-beta3-dev";
+ static public final String APPLICATION_VERSION = "1.1";
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, ONLY_PHOTO, SAVE_CONFIG
+ CONTACT_MANAGER, I18N, SERVER, LOAD_PHOTO, SAVE_PHOTO, SAVE_CONFIG, HELP
}
/**
* @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);
}
/**
if (!noMoreParams && arg.equals("--")) {
noMoreParams = true;
} else if (!noMoreParams && arg.equals("--help")) {
- System.out
- .println("TODO: implement some help text.\n"
- + "Usable switches:\n"
- + "\t--: stop looking for switches\n"
- + "\t--help: this here thingy\n"
- + "\t--lang LANGUAGE: choose the language, for instance en_GB\n"
- + "\t--tui: force pure text mode even if swing treminal is available\n"
- + "\t--gui: force swing terminal mode\n"
- + "\t--noutf: force non-utf8 mode if you need it\n"
- + "\t--config DIRECTORY: use the given directory as a CONFIG_DIR\n"
- + "\t--save-config DIRECTORY: save the current config to DIRECTORY (lang: only current)\n"
- + "\t--server PORT: start a remoting server instead of a client\n"
- + "\t--i18n DIR: generate the translation file for the given language (can be \"\") to/from the .properties given dir\n"
- + "\t--save-photo DIR FORMAT: save the contacts' photos to DIR, named after FORMAT\n"
- + "\t--load-photo DIR FORMAT: load the contacts' photos from DIR, named after FORMAT\n"
- + "\t--only-photo DIR FORMAT: load the contacts' photos from DIR, named after FORMAT, overwrite all other photos of selected contacts\n"
- + "everyhing else is either a file to open or a directory to open\n"
- + "(we will only open 1st level files in given directories)\n"
- + "('jvcard://hostname:8888/file' links -- or without 'file' -- are also ok)\n");
- return;
+ if (mode != Mode.CONTACT_MANAGER) {
+ SERR(StringId.CLI_SERR_MODES);
+ return;
+ }
+ mode = Mode.HELP;
} else if (!noMoreParams && arg.equals("--tui")) {
textMode = true;
} else if (!noMoreParams && arg.equals("--gui")) {
} else if (!noMoreParams && arg.equals("--lang")) {
index++;
if (index >= args.length) {
- System.err.println("Syntax error: no language given");
- System.exit(ERR_SYNTAX);
+ SERR(StringId.CLI_SERR_NOLANG);
return;
}
} else if (!noMoreParams && arg.equals("--config")) {
index++;
if (index >= args.length) {
- System.err
- .println("Syntax error: no config directory given");
- System.exit(ERR_SYNTAX);
+ SERR(StringId.CLI_SERR_NODIR);
return;
}
} else if (!noMoreParams && arg.equals("--save-config")) {
index++;
if (index >= args.length) {
- System.err
- .println("Syntax error: no config directory given");
- System.exit(ERR_SYNTAX);
+ SERR(StringId.CLI_SERR_NODIR);
return;
}
dir = args[index];
if (mode != Mode.CONTACT_MANAGER) {
- System.err
- .println("Syntax error: you can only use one of: \n"
- + "--server\n"
- + "--save-config\n"
- + "--i18n\n"
- + "--load-photo\n"
- + "--save-photo\n" + "--only-photo\n");
- System.exit(ERR_SYNTAX);
+ SERR(StringId.CLI_SERR_MODES);
return;
}
mode = Mode.SAVE_CONFIG;
} else if (!noMoreParams && arg.equals("--server")) {
if (mode != Mode.CONTACT_MANAGER) {
- System.err
- .println("Syntax error: you can only use one of: \n"
- + "--server\n"
- + "--save-config\n"
- + "--i18n\n"
- + "--load-photo\n"
- + "--save-photo\n" + "--only-photo\n");
- System.exit(ERR_SYNTAX);
+ SERR(StringId.CLI_SERR_MODES);
return;
}
mode = Mode.SERVER;
index++;
if (index >= args.length) {
- System.err.println("Syntax error: no port given");
- System.exit(ERR_SYNTAX);
+ SERR(StringId.CLI_SERR_NOPORT);
return;
}
try {
port = Integer.parseInt(args[index]);
} catch (NumberFormatException e) {
- System.err.println("Invalid port number: " + args[index]);
- System.exit(ERR_SYNTAX);
+ SERR(StringId.CLI_SERR_BADPORT, "" + args[index]);
return;
}
} else if (!noMoreParams && arg.equals("--i18n")) {
if (mode != Mode.CONTACT_MANAGER) {
- System.err
- .println("Syntax error: you can only use one of: \n"
- + "--server\n"
- + "--save-config\n"
- + "--i18n\n"
- + "--load-photo\n"
- + "--save-photo\n" + "--only-photo\n");
- System.exit(ERR_SYNTAX);
+ SERR(StringId.CLI_SERR_MODES);
return;
}
mode = Mode.I18N;
index++;
if (index >= args.length) {
- System.err
- .println("Syntax error: no .properties directory given");
- System.exit(ERR_SYNTAX);
+ SERR(StringId.CLI_SERR_NODIR);
return;
}
|| arg.equals("--save-photo") || arg
.equals("--only-photo"))) {
if (mode != Mode.CONTACT_MANAGER) {
- System.err
- .println("Syntax error: you can only use one of: \n"
- + "--server\n"
- + "--save-config\n"
- + "--i18n\n"
- + "--load-photo\n"
- + "--save-photo\n" + "--only-photo\n");
- System.exit(ERR_SYNTAX);
+ SERR(StringId.CLI_SERR_MODES);
return;
}
mode = Mode.LOAD_PHOTO;
} else if (arg.equals("--save-photo")) {
mode = Mode.SAVE_PHOTO;
- } else {
- mode = Mode.ONLY_PHOTO;
}
index++;
if (index >= args.length) {
- System.err.println("Syntax error: photo directory given");
- System.exit(ERR_SYNTAX);
+ SERR(StringId.CLI_SERR_NODIR);
return;
}
index++;
if (index >= args.length) {
- System.err.println("Syntax error: photo format given");
- System.exit(ERR_SYNTAX);
+ SERR(StringId.CLI_SERR_NOFORMAT);
return;
}
// Error management:
if (mode == Mode.SERVER && files.size() > 0) {
- System.err
- .println("Invalid syntax: you cannot both use --server and provide card files");
- System.exit(ERR_SYNTAX);
+ SERR(StringId.CLI_SERR_NOLANG, "--server");
+ return;
} else if (mode == Mode.I18N && files.size() > 0) {
- System.err
- .println("Invalid syntax: you cannot both use --i18n and provide card files");
- System.exit(ERR_SYNTAX);
+ SERR(StringId.CLI_SERR_NOLANG, "--i18n");
+ return;
} else if (mode == Mode.I18N && language == null) {
- System.err
- .println("Invalid syntax: you cannot use --i18n without --lang");
- System.exit(ERR_SYNTAX);
+ SERR(StringId.CLI_SERR_NOLANG);
} else if ((mode == Mode.CONTACT_MANAGER || mode == Mode.SAVE_PHOTO || mode == Mode.LOAD_PHOTO)
&& files.size() == 0) {
if (files.size() == 0 && !filesTried) {
}
if (files.size() == 0) {
- System.err.println("No files to open");
- System.exit(ERR_NO_FILE);
+ ERR(StringId.CLI_ERR, StringId.CLI_ERR_NOFILES, ERR_NO_FILE);
return;
}
}
try {
if (!new File(dir).isDirectory()) {
if (!new File(dir).mkdir()) {
- System.err
- .println("Cannot create configuration directory: "
- + dir);
+ System.err.println(trans(
+ StringId.CLI_ERR_CANNOT_CREATE_CONFDIR, 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");
+ } 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;
} else {
- System.err.println("Remoting support not available");
- System.exit(ERR_INTERNAL);
+ e.printStackTrace();
+ ERR(StringId.CLI_ERR, StringId.CLI_ERR, ERR_INTERNAL);
+ return;
}
}
break;
try {
transService.updateFile(dir);
} catch (IOException e) {
- System.err
- .println("I/O Exception: Cannot create/update a language in directory: "
- + dir);
- e.printStackTrace();
+ ERR(StringId.CLI_ERR, StringId.CLI_ERR_CANNOT_CREATE_LANG,
+ ERR_INTERNAL);
+ return;
}
break;
}
- case ONLY_PHOTO:
case LOAD_PHOTO: {
for (String file : files) {
try {
File f = new File(dir, filename);
if (f.exists()) {
+ System.out.println("Loading " + f);
try {
- String b64 = StringUtils.fromImage(ImageIO
- .read(f));
-
- if (mode == Mode.ONLY_PHOTO) {
- for (Data photo = contact
- .getPreferredData("PHOTO"); photo != null; photo = contact
- .getPreferredData("PHOTO")) {
- photo.delete();
- }
+ String type = "jpeg";
+ int dotIndex = filename.indexOf('.');
+ if (dotIndex >= 0
+ && (dotIndex + 1) < filename.length()) {
+ type = filename.substring(dotIndex + 1)
+ .toLowerCase();
+ }
+
+ String b64 = StringUtils.fromImage(f);
+
+ // remove previous photos:
+ for (Data photo = contact
+ .getPreferredData("PHOTO"); photo != null; photo = contact
+ .getPreferredData("PHOTO")) {
+ photo.delete();
}
+ //
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) {
}
card.save();
} catch (IOException e) {
- System.err.println("Card cannot be opened: " + file);
+ System.err
+ .println(trans(StringId.CLI_ERR_CANNOT_OPEN, file));
}
}
break;
if (photo != null) {
String filename = contact.toString(format, "");
File f = new File(dir, filename + ".png");
+ System.out.println("Saving " + f);
try {
ImageIO.write(
StringUtils.toImage(photo.getValue()),
"png", f);
} catch (IOException e) {
- System.err
- .println("Cannot save photo of contact: "
- + contact
- .getPreferredDataValue("FN"));
+ System.err.println(trans(
+ StringId.CLI_ERR_CANNOT_SAVE_PHOTO,
+ contact.getPreferredDataValue("FN")));
}
}
}
} catch (IOException e) {
- System.err.println("Card cannot be opened: " + file);
+ System.err
+ .println(trans(StringId.CLI_ERR_CANNOT_OPEN, file));
}
}
break;
case CONTACT_MANAGER: {
try {
Optional.startTui(textMode, files);
- } catch (Exception e) {
- if (e instanceof IOException) {
- System.err
- .println("I/O Exception: Cannot start the program with the given cards");
+ } 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;
} else {
- System.err.println("TUI support not available");
- System.exit(ERR_INTERNAL);
+ e.printStackTrace();
+ ERR(StringId.CLI_ERR, StringId.CLI_ERR, ERR_INTERNAL);
+ return;
}
}
break;
}
+ case HELP: {
+ System.out.println(APPLICATION_TITLE + " " + APPLICATION_VERSION);
+ System.out.println();
+
+ System.out.println(trans(StringId.CLI_HELP));
+ System.out.println();
+
+ System.out.println(trans(StringId.CLI_HELP_MODES));
+ System.out.println("\t--help : "
+ + trans(StringId.CLI_HELP_MODE_HELP));
+ System.out.println("\t(--tui|--gui) (--noutf) ... : "
+ + trans(StringId.CLI_HELP_MODE_CONTACT_MANAGER));
+ System.out.println("\t--server PORT ... : "
+ + trans(StringId.CLI_HELP_MODE_SERVER));
+ System.out.println("\t--save-config DIR : "
+ + trans(StringId.CLI_HELP_MODE_SAVE_CONFIG));
+ System.out.println("\t--i18n DIR ---lang LANG : "
+ + trans(StringId.CLI_HELP_MODE_I18N));
+ System.out.println("\t--load-photo DIR FORMAT ... : "
+ + 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();
+
+ System.out.println(trans(StringId.CLI_HELP_OPTIONS));
+ System.out.println("\t-- : " + trans(StringId.CLI_HELP_DD));
+ System.out.println("\t--lang LANG : "
+ + 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_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();
+
+ }
}
}
}
} catch (IOException ioe) {
throw ioe;
- } catch (Exception e) {
+ } catch (NotSupportedException e) {
throw new IOException("Remoting support not available", e);
}
Data name = contact.getPreferredData("FN");
if (name == null || name.getValue().length() == 0
|| forceComputedFn) {
- name.setValue(contact.toString(defaultFn, ""));
+ name.setValue(contact.toString(defaultFn, "").trim());
}
}
} catch (Exception e) {
forceComputedFn = map.getBoolean(
DisplayOption.CONTACT_DETAILS_SHOW_COMPUTED_FN, false);
}
+
+ /**
+ * Syntax error detected, closing the application with an error message.
+ *
+ * @param err
+ * the syntax error case
+ */
+ static private void SERR(StringId err, Object... values) {
+ ERR(StringId.CLI_SERR, err, ERR_SYNTAX, values);
+ }
+
+ /**
+ * Error detected, closing the application with an error message.
+ *
+ * @param err
+ * the error case
+ * @param suberr
+ * the suberror or NULL if none
+ * @param CODE
+ * the error code as declared above
+ */
+ static private void ERR(StringId err, StringId suberr, int CODE,
+ Object... subvalues) {
+ if (suberr == null)
+ System.err.println(trans(err));
+ else
+ System.err.println(trans(err, trans(suberr, subvalues)));
+
+ System.err.flush();
+ System.exit(CODE);
+ }
}