summaryrefslogtreecommitdiffstats
blob: 64c608c2fd73761261c4f84686679bfe49e55967 (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
/*
 * Copyright (c) 2010-2013 Isode Limited.
 * All rights reserved.
 * See the COPYING file for more information.
 */
/*
 * Copyright (c) 2015 Tarun Gupta.
 * Licensed under the simplified BSD license.
 * See Documentation/Licenses/BSD-simplified.txt for more information.
 */

package com.isode.stroke.serializer.payloadserializers;

import com.isode.stroke.serializer.GenericPayloadSerializer;
import com.isode.stroke.serializer.xml.XMLTextNode;
import com.isode.stroke.serializer.xml.XMLRawTextNode;
import com.isode.stroke.serializer.xml.XMLElement;
import com.isode.stroke.elements.StreamInitiation;
import com.isode.stroke.elements.StreamInitiationFileInfo;
import com.isode.stroke.elements.Form;
import com.isode.stroke.elements.FormField;
import com.isode.stroke.base.NotNull;

public class StreamInitiationSerializer extends GenericPayloadSerializer<StreamInitiation> {

	private static final String FILE_TRANSFER_NS  = "http://jabber.org/protocol/si/profile/file-transfer";
	private static final String FEATURE_NEG_NS = "http://jabber.org/protocol/feature-neg";

	public StreamInitiationSerializer() {
		super(StreamInitiation.class);
	}

	public String serializePayload(StreamInitiation streamInitiation) {
		assert(streamInitiation.getIsFileTransfer() == true);

		XMLElement siElement = new XMLElement("si", "http://jabber.org/protocol/si");
		if (streamInitiation.getID().length() != 0) {
			siElement.setAttribute("id", streamInitiation.getID());
		}
		siElement.setAttribute("profile", FILE_TRANSFER_NS);

		if (streamInitiation.getFileInfo() != null) {
			StreamInitiationFileInfo file = streamInitiation.getFileInfo();
			XMLElement fileElement = new XMLElement("file", "http://jabber.org/protocol/si/profile/file-transfer");
			fileElement.setAttribute("name", file.getName());
			if (file.getSize() != 0) {
				fileElement.setAttribute("size", Long.toString(file.getSize()));
			}
			if (file.getDescription().length() != 0) {
				XMLElement descElement = new XMLElement("desc");
				descElement.addNode(new XMLTextNode(file.getDescription()));
				fileElement.addNode(descElement);
			}
			siElement.addNode(fileElement);
		}

		XMLElement featureElement = new XMLElement("feature", FEATURE_NEG_NS);
		if (streamInitiation.getProvidedMethods().size() > 0) {
			Form form = new Form(Form.Type.FORM_TYPE);
			FormField field = new FormField(FormField.Type.LIST_SINGLE_TYPE);
			field.setName("stream-method");
			for(String method : streamInitiation.getProvidedMethods()) {
				field.addOption(new FormField.Option("", method));
			}
			form.addField(field);
			featureElement.addNode(new XMLRawTextNode(new FormSerializer().serialize(form)));
		}
		else if (streamInitiation.getRequestedMethod().length() != 0) {
			Form form = new Form(Form.Type.SUBMIT_TYPE);
			FormField field = new FormField(FormField.Type.LIST_SINGLE_TYPE);
			field.addValue(streamInitiation.getRequestedMethod());
			field.setName("stream-method");
			form.addField(field);
			featureElement.addNode(new XMLRawTextNode(new FormSerializer().serialize(form)));
		}
		siElement.addNode(featureElement);
		return siElement.serialize();
	}
}