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);
}
}
|