1
0
Fork 0
mirror of https://codeberg.org/Mercury-IM/Smack synced 2025-09-10 10:49:41 +02:00

1 - Small fix in Roster to return unavailable presence with from.

2 - Throw exception if parsing of vCard fails.

git-svn-id: http://svn.igniterealtime.org/svn/repos/smack/trunk@7217 b35dd754-fafc-0310-a699-88a17e54d16e
This commit is contained in:
Derek DeMoro 2007-02-20 17:02:39 +00:00 committed by derek
parent 0bd96e5156
commit 1f8cb4452b
3 changed files with 115 additions and 97 deletions

View file

@ -39,62 +39,69 @@ import java.util.List;
* vCard provider.
*
* @author Gaston Dombiak
* @author Derek DeMoro
*/
public class VCardProvider implements IQProvider {
private final static String PREFERRED_ENCODING = "UTF-8";
private static final String PREFERRED_ENCODING = "UTF-8";
public IQ parseIQ(XmlPullParser parser) throws Exception {
StringBuilder sb = new StringBuilder();
try {
int event = parser.getEventType();
// get the content
while (true) {
switch (event) {
case XmlPullParser.TEXT:
// We must re-escape the xml so that the DOM won't throw an exception
sb.append(StringUtils.escapeForXML(parser.getText()));
break;
case XmlPullParser.START_TAG:
sb.append('<').append(parser.getName()).append('>');
break;
case XmlPullParser.END_TAG:
sb.append("</").append(parser.getName()).append('>');
break;
default:
}
public IQ parseIQ(XmlPullParser parser) throws Exception {
final StringBuilder sb = new StringBuilder();
try {
int event = parser.getEventType();
// get the content
while (true) {
switch (event) {
case XmlPullParser.TEXT:
// We must re-escape the xml so that the DOM won't throw an exception
sb.append(StringUtils.escapeForXML(parser.getText()));
break;
case XmlPullParser.START_TAG:
sb.append('<').append(parser.getName()).append('>');
break;
case XmlPullParser.END_TAG:
sb.append("</").append(parser.getName()).append('>');
break;
default:
}
if (event == XmlPullParser.END_TAG && "vCard".equals(parser.getName())) break;
if (event == XmlPullParser.END_TAG && "vCard".equals(parser.getName())) break;
event = parser.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
event = parser.next();
}
}
catch (XmlPullParserException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
String xmlText = sb.toString();
return _createVCardFromXml(xmlText);
}
String xmlText = sb.toString();
return createVCardFromXML(xmlText);
}
public static VCard _createVCardFromXml(String xmlText) {
VCard vCard = new VCard();
try {
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = documentBuilder.parse(
new ByteArrayInputStream(xmlText.getBytes(PREFERRED_ENCODING)));
/**
* Builds a users vCard from xml file.
*
* @param xml the xml representing a users vCard.
* @return the VCard.
* @throws
*/
public static VCard createVCardFromXML(String xml) throws Exception {
VCard vCard = new VCard();
new VCardReader(vCard, document).initializeFields();
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = documentBuilder.parse(
new ByteArrayInputStream(xml.getBytes(PREFERRED_ENCODING)));
} catch (Exception e) {
e.printStackTrace(System.err);
}
return vCard;
}
new VCardReader(vCard, document).initializeFields();
return vCard;
}
private static class VCardReader {
private final VCard vCard;
private final Document document;
@ -158,8 +165,8 @@ public class VCardProvider implements IQProvider {
}
if (code == null || value == null) continue;
if ("HOME".equals(type)) {
vCard.setPhoneHome(code, value);
}
vCard.setPhoneHome(code, value);
}
else { // By default, setup work phone
vCard.setPhoneWork(code, value);
}
@ -180,18 +187,18 @@ public class VCardProvider implements IQProvider {
List code = new ArrayList();
List value = new ArrayList();
NodeList childNodes = addressNode.getChildNodes();
for(int j = 0; j < childNodes.getLength(); j++) {
for (int j = 0; j < childNodes.getLength(); j++) {
Node node = childNodes.item(j);
if (node.getNodeType() != Node.ELEMENT_NODE) continue;
String nodeName = node.getNodeName();
if (isWorkHome(nodeName)) {
type = nodeName;
}
else {
}
else {
code.add(nodeName);
value.add(getTextContent(node));
}
}
}
}
for (int j = 0; j < value.size(); j++) {
if ("HOME".equals(type)) {
vCard.setAddressFieldHome((String) code.get(j), (String) value.get(j));
@ -221,7 +228,8 @@ public class VCardProvider implements IQProvider {
String field = element.getNodeName();
if (element.getChildNodes().getLength() == 0) {
vCard.setField(field, "");
} else if (element.getChildNodes().getLength() == 1 &&
}
else if (element.getChildNodes().getLength() == 1 &&
element.getChildNodes().item(0) instanceof Text) {
vCard.setField(field, getTextContent(element));
}