summaryrefslogtreecommitdiffstats
blob: cd7a4cd46ea6f53d408da37202026609f5a5e647 (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
/*
 * Copyright (c) 2010-2011, Isode Limited, London, England.
 * All rights reserved.
 */
/*
 * Copyright (c) 2010, Remko Tronçon.
 * All rights reserved.
 */
package com.isode.stroke.serializer;

import com.isode.stroke.elements.Element;
import com.isode.stroke.elements.ProtocolHeader;
import com.isode.stroke.elements.StreamType;
import java.util.Vector;
import com.isode.stroke.base.SafeByteArray;

public class XMPPSerializer {

    private final Vector<ElementSerializer> serializers_ = new Vector<ElementSerializer>();
    private final StreamType type_;

    public XMPPSerializer(PayloadSerializerCollection payloadSerializers, StreamType type, boolean setExplictNSonTopLevelElements) {
        type_ = type;
        serializers_.add(new PresenceSerializer(payloadSerializers, setExplictNSonTopLevelElements ? getDefaultNamespace() : null));
	serializers_.add(new IQSerializer(payloadSerializers, setExplictNSonTopLevelElements ? getDefaultNamespace() : null));
	serializers_.add(new MessageSerializer(payloadSerializers, setExplictNSonTopLevelElements ? getDefaultNamespace() : null));
	serializers_.add(new CompressRequestSerializer());
	serializers_.add(new CompressFailureSerializer());
	serializers_.add(new AuthRequestSerializer());
	serializers_.add(new AuthFailureSerializer());
	serializers_.add(new AuthSuccessSerializer());
	serializers_.add(new AuthChallengeSerializer());
	serializers_.add(new AuthResponseSerializer());
	serializers_.add(new StartTLSRequestSerializer());
	serializers_.add(new StartTLSFailureSerializer());
	serializers_.add(new TLSProceedSerializer());
	serializers_.add(new StreamFeaturesSerializer());
    serializers_.add(new StreamErrorSerializer());
	serializers_.add(new EnableStreamManagementSerializer());
	serializers_.add(new StreamManagementEnabledSerializer());
	serializers_.add(new StreamManagementFailedSerializer());
	serializers_.add(new StreamResumeSerializer());
	serializers_.add(new StreamResumedSerializer());
	serializers_.add(new StanzaAckSerializer());
	serializers_.add(new StanzaAckRequestSerializer());
	serializers_.add(new ComponentHandshakeSerializer());
    }

    public String serializeHeader(ProtocolHeader header) {
        String result = "<?xml version=\"1.0\"?><stream:stream xmlns=\"" + getDefaultNamespace() + "\" xmlns:stream=\"http://etherx.jabber.org/streams\"";
        if (header.getFrom().length() != 0) {
            result += " from=\"" + header.getFrom() + "\"";
        }
        if (header.getTo().length() != 0) {
            result += " to=\"" + header.getTo() + "\"";
        }
        if (header.getID().length() != 0) {
            result += " id=\"" + header.getID() + "\"";
        }
        if (header.getVersion().length() != 0) {
            result += " version=\"" + header.getVersion() + "\"";
        }
        result += ">";
        return result;
    }

    public String serializeFooter() {
        return "</stream:stream>";
    }

    public String getDefaultNamespace() {
        switch (type_) {
            case ClientStreamType:
                return "jabber:client";
            case ServerStreamType:
                return "jabber:server";
            case ComponentStreamType:
                return "jabber:component:accept";
        }
        assert false;
        return "";
    }

    public SafeByteArray serializeElement(Element element) {
        for (ElementSerializer serializer : serializers_) {
            if (serializer.canSerialize(element)) {
                return serializer.serialize(element);
            }
        }
        throw new IllegalStateException("Trying to send an unknown element");
        //assert false; /* UNKNOWN ELEMENT */
        //return "";
    }
}