package com.bluevia.android.messagery.mo.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.mo.data.AbstractReceivedMessage; import com.bluevia.android.messagery.mo.data.ReceivedMessageList; import com.bluevia.android.messagery.mo.mms.data.MmsMessageInfo; import com.bluevia.android.messagery.mo.mms.data.MmsMessageInfo.AttachmentInfo; import com.bluevia.android.messagery.mo.sms.data.SmsMessage; /** * * */ public class XmlReceivedMessagesParser { private static final String TAG = "XmlSmsReceivedSmsParser"; private String mMessageType; public XmlReceivedMessagesParser(String api){ mMessageType = api; } /** * @see com.bluevia.android.commons.parser.IParser */ public ReceivedMessageList parseEntry(XmlPullParser parser) throws ParseException, IOException { ReceivedMessageList list = new ReceivedMessageList(); int eventType; try { eventType = parser.getEventType(); } catch (XmlPullParserException e) { throw new ParseException("Could not parse Receved Message entity.", e); } if (eventType == XmlPullParser.START_TAG && mMessageType.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 { AbstractReceivedMessage single = parseSingleReceivedMessageEntry(parser, eventType, mMessageType); if (!single.isValid()) { throw new ParseException("Recived Message is not valid"); } list.add(single); } catch (XmlPullParserException xppe) { throw new ParseException("Unable to parse Received Message.", xppe); } catch (IOException ioe) { throw new ParseException("I/O exception while parsing Received SMS.", ioe); } } } } else { throw new ParseException("", new XmlPullParserException( "Start document root has not been found or its tag name is wrong")); } return list; } protected AbstractReceivedMessage parseSingleReceivedMessageEntry(XmlPullParser parser, int eventType, String messageType) throws XmlPullParserException, IOException, ParseException { AbstractReceivedMessage single; if (messageType.equals(XmlConstants.XSD_RECEIVEDSMS)) single = new SmsMessage(); else if (messageType.equals(XmlConstants.XSD_RECEIVEDMMS)) single = new MmsMessageInfo(); else throw new ParseException("Incorrect message type"); 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, "parseSingleReceivedMessageEntry end tag name is " + name); if (messageType.equals(name)) { Log.d(TAG, "parseSingleReceivedMessageEntry return : " + single); // stop parsing here. return single; } break; case XmlPullParser.START_TAG: name = parser.getName(); Log.d(TAG, "parseSingleReceivedMessageEntry start tag name is " + name); if (XmlConstants.XSD_MESSAGE_TYPE_ORIGINADDRESS.equals(name)) { UserId originAddress = XmlParserSerializerUtils.parseUserId(parser, eventType, XmlConstants.XSD_MESSAGE_TYPE_ORIGINADDRESS); if (originAddress == null){ throw new ParseException("Origin Address UserId is null"); } else if (!originAddress.isValid()){ throw new ParseException("Origin Address UserId is not valid"); } single.setUserIdOriginAddress(originAddress); } else if (XmlConstants.XSD_MESSAGE_TYPE_DESTINATIONADDRESS.equals(name) || XmlConstants.XSD_MESSAGE_TYPE_ADDRESS.equals(name)) { UserId destinationAddress = XmlParserSerializerUtils.parseUserId(parser, eventType, name); if (destinationAddress == null){ throw new ParseException("Origin Address UserId is null"); } else if (!destinationAddress.isValid()){ throw new ParseException("Origin Address UserId is not valid"); } single.addAddress(destinationAddress); } else if (XmlConstants.XSD_SMSTEXTTYPE_MESSAGE.equals(name) && XmlConstants.XSD_RECEIVEDSMS.equals(messageType)) { //Same tag for SMS & MMS but differente meaning int[] textEventType = new int[1]; String message = XmlParserSerializerUtils.getChildText(parser, textEventType); if ((message == null) && (textEventType[0] == XmlPullParser.END_TAG)){ eventType = textEventType[0]; continue; } //Only for SMS by now... if (single instanceof SmsMessage) ((SmsMessage) single).setMessage(message); } else if (XmlConstants.XSD_MESSAGE_TYPE_DATETIME.equals(name)) { int[] textEventType = new int[1]; String dateTime = XmlParserSerializerUtils.getChildText(parser, textEventType); if ((dateTime == null) && (textEventType[0] == XmlPullParser.END_TAG)){ eventType = textEventType[0]; continue; } single.setDate(dateTime); } else if (XmlConstants.XSD_RECEIVEDMMS_IDENTIFIER.equals(name)){ // Only MMS int[] textEventType = new int[1]; String identifier = XmlParserSerializerUtils.getChildText(parser); if ((identifier == null) && (textEventType[0] == XmlPullParser.END_TAG)){ eventType = textEventType[0]; continue; } ((MmsMessageInfo)single).setMessageIdentifier(identifier); } else if (XmlConstants.XSD_MMSTEXTTYPE_SUBJECT.equals(name)){ // Only MMS int[] textEventType = new int[1]; String subject = XmlParserSerializerUtils.getChildText(parser); if ((subject == null) && (textEventType[0] == XmlPullParser.END_TAG)){ eventType = textEventType[0]; continue; } ((MmsMessageInfo)single).setSubject(subject); } else if (XmlConstants.XSD_RECEIVEDMMS_ATTACHMENT_URL.equals(name)){ // Only MMS AttachmentInfo attachmentUrl = parseAttachmentURL(parser, eventType, (MmsMessageInfo) single); ((MmsMessageInfo)single).addAttachmentInfo(attachmentUrl); } break; default: break; } eventType = parser.next(); } if (!single.isValid()) throw new ParseException("Received message is not valid"); return single; } protected AttachmentInfo parseAttachmentURL(XmlPullParser parser, int eventType, MmsMessageInfo mms) throws XmlPullParserException, IOException, ParseException { AttachmentInfo attach = mms.new AttachmentInfo(); while (eventType != XmlPullParser.END_DOCUMENT) { switch (eventType) { case XmlPullParser.END_TAG: String name = parser.getName(); if (XmlConstants.XSD_RECEIVEDMMS_ATTACHMENT_URL.equals(name)) { // stop parsing here. return attach; } break; case XmlPullParser.START_TAG: name = parser.getName(); if (XmlConstants.XSD_RECEIVEDMMS_HREF.equals(name)) { int[] textEventType = new int[1]; String value = XmlParserSerializerUtils.getChildText(parser, textEventType); if ((value == null) && (textEventType[0] == XmlPullParser.END_TAG)) { eventType = textEventType[0]; continue; } attach.setUrl(value); } else if (XmlConstants.XSD_RECEIVEDMMS_CONTENT_TYPE.equals(name)) { int[] textEventType = new int[1]; String value = XmlParserSerializerUtils.getChildText(parser, textEventType); if ((value == null) && (textEventType[0] == XmlPullParser.END_TAG)) { eventType = textEventType[0]; continue; } attach.setContentType(value); } break; default: break; } eventType = parser.next(); } if (!attach.isValid()) throw new ParseException("Received message is not valid"); return attach; } }