package com.bluevia.android.messagery.mt.parser; import java.io.IOException; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import android.util.Log; import com.bluevia.android.commons.data.UserId; import com.bluevia.android.commons.parser.ParseException; import com.bluevia.android.commons.parser.xml.XmlConstants; import com.bluevia.android.commons.parser.xml.XmlParserSerializerUtils; import com.bluevia.android.messagery.mt.data.DeliveryInfo; import com.bluevia.android.messagery.mt.data.DeliveryInfo.Status; import com.bluevia.android.messagery.mt.data.DeliveryInfoList; /** * Common functions for Sms and Mms DeliveryStatusParser. * * @author Telefonica I+D * */ public final class XmlDeliveryStatusParserHelper { private static final String TAG = "DeliveryStatusParserHelper"; /** * @see com.bluevia.android.commons.parser.IParser#parse(java.io.InputStream) */ public static DeliveryInfoList parseEntry(XmlPullParser parser, String messageType) throws ParseException, IOException { DeliveryInfoList deliveryStatus = new DeliveryInfoList(); int eventType; try { eventType = parser.getEventType(); } catch (XmlPullParserException e) { throw new ParseException("Could not parse DeliveryStatus entity.", e); } if (eventType == XmlPullParser.START_TAG && messageType.equals(parser.getName())) { while (eventType != XmlPullParser.END_DOCUMENT) { // Look for a new event try { eventType = parser.next(); } catch (XmlPullParserException xppe) { throw new ParseException("Could not read next event.", xppe); } Log.d(TAG, "Siguiente evento: " + XmlPullParser.TYPES[eventType]); if (eventType == XmlPullParser.START_TAG) { try { DeliveryInfo singleStatus = parseDeliveryStatusSingle(parser, eventType, messageType); if (!singleStatus.isValid()) { throw new ParseException("StatusRecived is not valid"); } deliveryStatus.add(singleStatus); } catch (XmlPullParserException xppe) { throw new ParseException("Unable to parse Single DeliveryStatus.", xppe); } catch (IOException ioe) { throw new ParseException("Unable to parse Single DeliveryStatus.", ioe); } } } } else { throw new ParseException("", new XmlPullParserException( "Start document root has not been found or its tag name is wrong")); } return deliveryStatus; } /** * This method parsers the * <tns:messageDeliveryStatus>" + * + <tns:address> (delegates this part to handleAddress) * <tns:deliveryStatus>DeliveredToTerminal</tns:deliveryStatus>" * </tns:messageDeliveryStatus>" * * @throws XmlPullParserException * @throws IOException */ public static DeliveryInfo parseDeliveryStatusSingle(XmlPullParser parser, int eventType, String messageType) throws XmlPullParserException, IOException, ParseException { DeliveryInfo statusSingle=new DeliveryInfo(); if (eventType != XmlPullParser.START_TAG) { throw new ParseException("Expected event START_TAG: Actual event: " + XmlPullParser.TYPES[eventType]); } while (eventType != XmlPullParser.END_DOCUMENT) { switch (eventType) { case XmlPullParser.END_TAG: String name = parser.getName(); Log.d(TAG, "parseDeliveryStatusSingle end tag name is " + name); if (messageType.equals(name)) { Log.d(TAG, "parseDeliveryStatusSingle return statusSingle " + statusSingle); // stop parsing here. return statusSingle; } break; case XmlPullParser.START_TAG: name = parser.getName(); Log.d(TAG, "parseDeliveryStatusSingle start tag name is " + name); if (XmlConstants.XSD_MESSAGE_TYPE_ADDRESS.equals(name)) { UserId address=XmlParserSerializerUtils.parseUserId(parser, eventType, XmlConstants.XSD_MESSAGE_TYPE_ADDRESS); if (address == null){ throw new ParseException("Address UserId is null"); } else if (!address.isValid()){ throw new ParseException("Address UserId is not valid"); } statusSingle.setUserIdAddress(address); } else if (XmlConstants.XSD_DELIVERYSTATUS_STATUS.equals(name)) { int[] textEventType = new int[1]; String status = XmlParserSerializerUtils.getChildText(parser, textEventType); if ((status == null) && (textEventType[0] == XmlPullParser.END_TAG)){ eventType = textEventType[0]; continue; } statusSingle.setStatus(translateStatus(status)); }else if(XmlConstants.XSD_MESSAGE_TYPE_DESCRIPTION.equals(name)){ String description=handleDescription(parser, eventType); statusSingle.setDescription(description); } break; default: break; } eventType = parser.next(); } return null; } public static String handleDescription(XmlPullParser parser, int eventType) throws XmlPullParserException, IOException, ParseException { String description=null; if (eventType != XmlPullParser.START_TAG) { throw new ParseException("Expected event START_TAG: Actual event: " + XmlPullParser.TYPES[eventType]); } while (eventType != XmlPullParser.END_DOCUMENT) { switch (eventType) { case XmlPullParser.END_TAG: String name = parser.getName(); Log.d(TAG, "handleDecription end tag name is " + name); if (XmlConstants.XSD_MESSAGE_TYPE_DESCRIPTION.equals(name)) { Log.d(TAG, "The description is " + description); // stop parsing here. return description; } break; case XmlPullParser.START_TAG: name = parser.getName(); if (XmlConstants.XSD_MESSAGE_TYPE_DESCRIPTION.equals(name)) { int[] textEventType = new int[1]; description = XmlParserSerializerUtils.getChildText(parser, textEventType); if ((description == null) && (textEventType[0] == XmlPullParser.END_TAG)){ eventType = textEventType[0]; continue; } } break; default: break; } eventType = parser.next(); } return null; } public static DeliveryInfo.Status translateStatus(String status) { DeliveryInfo.Status ret = null; if (status.equals(XmlConstants.XSD_DELIVERYSTATUSTYPE_VALUE_DELIVERED_TO_NETWORK)){ ret=Status.DELIVERED_TO_NETWORK; } else if (status.equals(XmlConstants.XSD_DELIVERYSTATUSTYPE_VALUE_DELIVERED_UNCERTAIN)){ ret=Status.DELIVERY_UNCERTAIN; } else if (status.equals(XmlConstants.XSD_DELIVERYSTATUSTYPE_VALUE_DELIVERED_IMPOSSIBLE)){ ret=Status.DELIVERY_IMPOSSIBLE; } else if (status.equals(XmlConstants.XSD_DELIVERYSTATUSTYPE_VALUE_DELIVERED_MESSAGE_WAITING)){ ret=Status.MESSAGE_WAITING; } else if (status.equals(XmlConstants.XSD_DELIVERYSTATUSTYPE_VALUE_DELIVERED_TO_TERMINAL)){ ret=Status.DELIVERED_TO_TERMINAL; } else if (status.equals(XmlConstants.XSD_DELIVERYSTATUSTYPE_VALUE_DELIVERED_DELIVERY_NOTIF_NOTSUPP)){ ret=Status.DELIVERY_NOTIFICATION_NOT_SUPPORTED; } return ret; } }