summaryrefslogtreecommitdiffstats
path: root/src/de/thedevstack/smackx/filetransferhttp/provider/FileListProvider.java
blob: d6738b6ebada5b7c5e4048d08a246e258474861c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package de.thedevstack.smackx.filetransferhttp.provider;

import java.io.IOException;

import org.jivesoftware.smack.SmackException;
import org.jivesoftware.smack.provider.IQProvider;
import org.jivesoftware.smack.util.ParserUtils;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import de.thedevstack.smackx.filetransferhttp.element.FileList;
import de.thedevstack.smackx.filetransferhttp.element.RemoteFile;
import de.thedevstack.smackx.filetransferhttp.element.RemoteFileInfo;

public class FileListProvider extends IQProvider<FileList> {

	@Override
	public FileList parse(XmlPullParser parser, int initialDepth) throws Exception {
		String namespace = parser.getNamespace();
		FileList fileList = new FileList();
		
		int event = -1;
		int currentDepth = -1;
		do {
			event = parser.next();
			currentDepth = parser.getDepth();
			
			if (XmlPullParser.START_TAG == event) {
				String name = parser.getName();
				switch (name) {
				case "file":
					RemoteFile remoteFile = this.parseRemoteFile(parser, currentDepth);
					if (null != remoteFile) {
						fileList.addRemoteFile(remoteFile);
					}
					break;
				}
			}
			
		} while (event != XmlPullParser.END_TAG && currentDepth != initialDepth);
		
		return fileList;
	}
	
	protected RemoteFile parseRemoteFile(XmlPullParser parser, int initialDepth) throws IOException, XmlPullParserException {
		long timestamp = ParserUtils.getLongAttribute(parser, "timestamp");
		String to = parser.getAttributeValue("", "to");
		String from = parser.getAttributeValue("", "from");
		String url = null;
		RemoteFileInfo remoteFileInfo = null;
		
		int event = -1;
		int currentDepth = -1;
		do {
			event = parser.next();
			currentDepth = parser.getDepth();
			
			if (XmlPullParser.START_TAG == event) {
				String name = parser.getName();
				switch (name) {
				case "url":
					url = parser.nextText();
					break;
				case "file-info":
					remoteFileInfo = parseRemoteFileInfo(parser, currentDepth);
					break;
				}
			}
			
		} while (event != XmlPullParser.END_TAG && currentDepth != initialDepth);
		
		RemoteFile remoteFile = new RemoteFile(url, timestamp);
		remoteFile.setFileInfo(remoteFileInfo);
		remoteFile.setTo(to);
		remoteFile.setFrom(from);
		
		return remoteFile;
	}
	
	protected RemoteFileInfo parseRemoteFileInfo(XmlPullParser parser, int initialDepth) throws XmlPullParserException, IOException {
		long size = -1;
		String contentType = null;
		String filename = null;
		
		int event = -1;
		int currentDepth = -1;
		do {
			event = parser.next();
			currentDepth = parser.getDepth();
			
			if (XmlPullParser.START_TAG == event) {
				String name = parser.getName();
				switch (name) {
				case "filename":
					filename = parser.nextText();
					break;
				case "size":
					String sizeString = parser.nextText();
					if (null != sizeString) {
						size = Long.valueOf(sizeString);
					}
					break;
				case "content-type":
					contentType = parser.nextText();
					break;
				}
			}
			
		} while (event != XmlPullParser.END_TAG && currentDepth != initialDepth);
		
		if (0 >= size || null == filename || filename.isEmpty()) {
			return null;
		}
		
		return new RemoteFileInfo(filename, size, contentType);
	}

}