/**
* Copyright (c) 2010-2016 by the respective copyright holders.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.openhab.binding.fritzboxtr064.internal;
import java.util.ArrayList;
import java.util.Iterator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/***
* Class managing all Phonebook related work
*
* @author gitbock
* @since 1.8.0
*
*/
public class PhonebookManager {
// object for accessing fbox tr064
private Tr064Comm _tr064comm = null;
// default logger
private static final Logger logger = LoggerFactory.getLogger(PhonebookManager.class);
// all PhonebooksEntries
private ArrayList<PhoneBookEntry> _alEntries = null;
public PhonebookManager(Tr064Comm tr064comm) {
this._tr064comm = tr064comm;
this._alEntries = new ArrayList<PhoneBookEntry>();
}
/***
* Looks up name in phone book entries and returns name and type if found
*
* @param number number to look up name for
* @param compareCount how many characters must match to accept a match
* @return found name or null
*/
public String getNameFromNumber(String number, int compareCount) {
logger.info("Trying to resolve number {} to name comparing {} characters", number, compareCount);
String name = null;
Iterator<PhoneBookEntry> it = _alEntries.iterator();
while (it.hasNext()) {
PhoneBookEntry pbe = it.next();
StringBuilder sbAskNumber = new StringBuilder(number);
sbAskNumber.reverse(); // to be able to compare numbers from the end
String numberToCompare = "";
// WORK number
StringBuilder sbPhonebookNumber = new StringBuilder(pbe.getBusinessTel());
sbPhonebookNumber.reverse();
// check if comparing numbers are within entire string range
if (compareCount <= sbAskNumber.length()) {
numberToCompare = sbAskNumber.substring(0, compareCount);
} else {
numberToCompare = sbAskNumber.substring(0, sbAskNumber.length());
}
if (sbPhonebookNumber.toString().startsWith(numberToCompare)) {
logger.info("found name match {} in phonebook by comparing {} with {} ", pbe.getName(),
sbPhonebookNumber.toString(), numberToCompare);
name = pbe.getName() + " (Work)";
break; // no need to cycle through rest of phonebook
}
// HOME number
sbPhonebookNumber = new StringBuilder(pbe.getPrivateTel());
sbPhonebookNumber.reverse();
// check if comparing numbers are within entire string range
if (compareCount <= sbAskNumber.length()) {
numberToCompare = sbAskNumber.substring(0, compareCount);
} else {
numberToCompare = sbAskNumber.substring(0, sbAskNumber.length());
}
if (sbPhonebookNumber.toString().startsWith(numberToCompare)) {
logger.info("found name match {} in phonebook by comparing {} with {} ", pbe.getName(),
sbPhonebookNumber.toString(), numberToCompare);
name = pbe.getName() + " (Home)";
break; // no need to cycle through rest of phonebook
}
// MOBILE number
sbPhonebookNumber = new StringBuilder(pbe.getMobileTel());
sbPhonebookNumber.reverse();
// check if comparing numbers are within entire string range
if (compareCount <= sbAskNumber.length()) {
numberToCompare = sbAskNumber.substring(0, compareCount);
} else {
numberToCompare = sbAskNumber.substring(0, sbAskNumber.length());
}
if (sbPhonebookNumber.toString().startsWith(numberToCompare)) {
logger.info("found name match {} in phonebook by comparing {} with {} ", pbe.getName(),
sbPhonebookNumber.toString(), numberToCompare);
name = pbe.getName() + " (Mobile)";
break; // no need to cycle through rest of phonebook
}
}
return name;
}
/***
*
* @param Phonebook ID to download, can be determined using TR064 GetPhonebookList
* @return XML Document downloaded
*/
public Document downloadPhonebook(int id) {
logger.info("Downloading phonebook ID {}", id);
String phoneBookUrl = _tr064comm.getTr064Value("phonebook:" + id);
Document phoneBook = _tr064comm.getFboxXmlResponse(phoneBookUrl);
logger.debug("Downloaded Phonebook:");
logger.trace(Helper.documentToString(phoneBook));
return phoneBook;
}
/***
* Downloads and parses phonebooks from fbox
*/
public void downloadPhonebooks() {
Document pb = downloadPhonebook(0);
if (pb != null) {
NodeList nlContacts = pb.getElementsByTagName("contact");
for (int i = 0; i < nlContacts.getLength(); i++) {
PhoneBookEntry pbe = new PhoneBookEntry();
Node nContact = nlContacts.item(i);
if (pbe.parseFromNode(nContact)) {
_alEntries.add(pbe);
} else {
logger.warn("could not parse phonebook entry: {}", nContact.toString());
}
}
} else {
logger.error("Could not download phonebook");
}
}
}