String group = "";
if (line.contains(":")) {
- String rest = line.split(":")[0];
- value = line.substring(rest.length() + 1);
+ int colIndex = line.indexOf(':');
+ String rest = line.substring(0, colIndex);
+ value = line.substring(colIndex + 1);
if (rest.contains(";")) {
String tab[] = rest.split(";");
for (int i = 1; i < tab.length; i++) {
if (tab[i].contains("=")) {
- String tname = tab[i].split("=")[0];
- String tvalue = tab[i].substring(tname
- .length() + 1);
+ int equIndex = tab[i].indexOf('=');
+ String tname = tab[i]
+ .substring(0, equIndex);
+ String tvalue = tab[i]
+ .substring(equIndex + 1);
types.add(new TypeInfo(tname, tvalue));
} else {
types.add(new TypeInfo(tab[i], ""));
}
if (name.contains(".")) {
- group = name.split("\\.")[0];
- name = name.substring(group.length() + 1);
+ int dotIndex = name.indexOf('.');
+ group = name.substring(0, dotIndex);
+ name = name.substring(dotIndex + 1);
}
datas.add(new Data(types, name, value, group));
return contacts;
}
- // -1 = no bkeys
- public static String toString(Contact contact, int startingBKey) {
- StringBuilder builder = new StringBuilder();
+ /**
+ * Return a {@link String} representation of the given {@link Card}, line by
+ * line.
+ *
+ * @param card
+ * the card to convert
+ *
+ * @param startingBKey
+ * the starting BKey number (all the other will follow) or -1 for
+ * no BKey
+ *
+ * @return the {@link String} representation
+ */
+ public static List<String> toStrings(Contact contact, int startingBKey) {
+ List<String> lines = new LinkedList<String>();
- builder.append("BEGIN:VCARD");
- builder.append("\r\n");
- builder.append("VERSION:2.1");
- builder.append("\r\n");
- for (Data data : contact.getContent()) {
+ lines.add("BEGIN:VCARD");
+ lines.add("VERSION:2.1");
+ for (Data data : contact) {
+ StringBuilder dataBuilder = new StringBuilder();
if (data.getGroup() != null && !data.getGroup().trim().equals("")) {
- builder.append(data.getGroup().trim());
- builder.append('.');
+ dataBuilder.append(data.getGroup().trim());
+ dataBuilder.append('.');
}
- builder.append(data.getName());
- for (TypeInfo type : data.getTypes()) {
- builder.append(';');
- builder.append(type.getName());
+ dataBuilder.append(data.getName());
+ for (TypeInfo type : data) {
+ dataBuilder.append(';');
+ dataBuilder.append(type.getName());
if (type.getValue() != null
&& !type.getValue().trim().equals("")) {
- builder.append('=');
- builder.append(type.getValue());
+ dataBuilder.append('=');
+ dataBuilder.append(type.getValue());
}
}
- builder.append(':');
+ dataBuilder.append(':');
// TODO: bkey!
- builder.append(data.getValue());
- builder.append("\r\n");
+ dataBuilder.append(data.getValue());
+
+ // RFC says: Content lines SHOULD be folded to a maximum width of 75
+ // octets -> since it is SHOULD, we will just cut it as 74/75 chars
+ // depending if the last one fits in one char (note: chars != octet)
+ boolean continuation = false;
+ while (dataBuilder.length() > 0) {
+ int stop = 74;
+ if (continuation)
+ stop--; // the space takes 1
+ if (dataBuilder.length() > stop) {
+ char car = dataBuilder.charAt(stop - 1);
+ // RFC forbids cutting a character in 2
+ if (Character.isHighSurrogate(car)) {
+ stop++;
+ }
+ }
+
+ stop = Math.min(stop, dataBuilder.length());
+ if (continuation) {
+ lines.add(' ' + dataBuilder.substring(0, stop));
+ } else {
+ lines.add(dataBuilder.substring(0, stop));
+ }
+ dataBuilder.delete(0, stop);
+
+ continuation = true;
+ }
}
- builder.append("END:VCARD");
- builder.append("\r\n");
+ lines.add("END:VCARD");
- return builder.toString();
+ return lines;
}
- public static String toString(Card card) {
- StringBuilder builder = new StringBuilder();
+ /**
+ * Return a {@link String} representation of the given {@link Card}, line by
+ * line.
+ *
+ * @param card
+ * the card to convert
+ *
+ * @return the {@link String} representation
+ */
+ public static List<String> toStrings(Card card) {
+ List<String> lines = new LinkedList<String>();
- for (Contact contact : card.getContactsList()) {
- builder.append(toString(contact, -1));
+ for (Contact contact : card) {
+ lines.addAll(toStrings(contact, -1));
}
-
- builder.append("\r\n");
- return builder.toString();
+ return lines;
}
/**