+ if (contact == null) {
+ s.sendBlock();
+ } else {
+ s.sendLine(contact.getContentState(true));
+ }
+ break;
+ }
+ case LIST_CONTACT: {
+ for (Contact contact : card) {
+ if (cmd.getParam() == null
+ || cmd.getParam().length() == 0
+ || (contact.getPreferredDataValue("FN") + contact
+ .getPreferredDataValue("N")).toLowerCase()
+ .contains(cmd.getParam().toLowerCase())) {
+ s.send(contact.getContentState(true) + " "
+ + contact.getId());
+ }
+ }
+ s.sendBlock();
+ break;
+ }
+ case PUT_CARD: {
+ clientContinue = false;
+ break;
+ }
+ default: {
+ throw new InvalidParameterException("command invalid here: "
+ + command);
+ }
+ }
+
+ return clientContinue;
+ }
+
+ /**
+ * Process a *_DATA subcommand.
+ *
+ * @param s
+ * the {@link SimpleSocket} to process
+ * @param card
+ * the target {@link Contact}
+ *
+ * @return TRUE if the client is ready for another command, FALSE when the
+ * client is done
+ *
+ * @throws IOException
+ * in case of IO error
+ *
+ * @throw InvalidParameterException in case of invalid subcommand
+ */
+ private boolean processDataCmd(SimpleSocket s, Contact contact)
+ throws IOException {
+ CommandInstance cmd = s.receiveCommand();
+ Command command = cmd.getCommand();
+
+ if (command == null)
+ return false;
+
+ boolean clientContinue = true;
+
+ System.out.println(s + " -> " + command);
+
+ switch (command) {
+ case GET_DATA: {
+ for (Data data : contact) {
+ if (data.getName().equals(cmd.getParam())) {
+ BlockAppendable app = s.createBlockAppendable();
+ Vcard21Parser.write(app, data);
+ // note: we do NOT close 'app', since it would send an EOB
+ }
+ }
+ s.sendBlock();
+ break;
+ }
+ case POST_DATA: {
+ String cstate = cmd.getParam();
+ Data data = null;
+ for (Data d : contact) {
+ if (cstate.equals(d.getContentState(true)))
+ data = d;
+ }
+
+ if (data != null)
+ data.delete();
+ List<Data> list = Vcard21Parser.parseData(s.receiveBlock());
+ if (list.size() > 0) {
+ contact.add(list.get(0));
+ }
+ break;
+ }
+ case DELETE_DATA: {
+ String cstate = cmd.getParam();
+ Data data = null;
+ for (Data d : contact) {
+ if (cstate.equals(d.getContentState(true)))
+ data = d;
+ }
+
+ if (data == null) {
+ throw new InvalidParameterException(
+ "Cannot find data to delete for content state: "
+ + cstate);
+ }
+
+ contact.delete();
+ break;
+ }
+ case HASH_DATA: {
+ for (Data data : contact) {
+ if (data.getId().equals(cmd.getParam())) {
+ s.send(data.getContentState(true));
+ }
+ }
+ s.sendBlock();
+ break;
+ }
+ case LIST_DATA: {
+ for (Data data : contact) {
+ if (cmd.getParam() == null
+ || cmd.getParam().length() == 0
+ || data.getName().toLowerCase()
+ .contains(cmd.getParam().toLowerCase())) {
+ s.send(data.getContentState(true) + " " + data.getName());
+ }
+ }
+ s.sendBlock();
+ break;
+ }
+ case PUT_CONTACT: {
+ clientContinue = false;
+ break;
+ }
+ default: {
+ throw new InvalidParameterException("command invalid here: "
+ + command);
+ }
+ }
+
+ return clientContinue;