summaryrefslogtreecommitdiffstats
blob: 52ab489d1458f15dc46c82045b67a6684b50d63f (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
/*
 * Copyright (c) 2010-2016 Isode Limited.
 * All rights reserved.
 * See the COPYING file for more information.
 */

#include <Swiften/Serializer/PayloadSerializers/MUCUserPayloadSerializer.h>

#include <memory>
#include <sstream>

#include <Swiften/Base/foreach.h>
#include <Swiften/Serializer/PayloadSerializerCollection.h>
#include <Swiften/Serializer/PayloadSerializers/MUCItemSerializer.h>
#include <Swiften/Serializer/XML/XMLElement.h>
#include <Swiften/Serializer/XML/XMLRawTextNode.h>
#include <Swiften/Serializer/XML/XMLTextNode.h>

namespace Swift {

MUCUserPayloadSerializer::MUCUserPayloadSerializer(PayloadSerializerCollection* serializers) : GenericPayloadSerializer<MUCUserPayload>(), serializers(serializers) {
}

std::string MUCUserPayloadSerializer::serializePayload(std::shared_ptr<MUCUserPayload> payload)  const {
    XMLElement mucElement("x", "http://jabber.org/protocol/muc#user");
    foreach (const MUCUserPayload::StatusCode statusCode, payload->getStatusCodes()) {
        std::shared_ptr<XMLElement> statusElement(new XMLElement("status"));
        std::ostringstream code;
        code << statusCode.code;
        statusElement->setAttribute("code", code.str());
        mucElement.addNode(statusElement);
    }
    foreach (const MUCItem& item, payload->getItems()) {
        mucElement.addNode(MUCItemSerializer::itemToElement(item));
    }

    if (payload->getPassword()) {
        std::shared_ptr<XMLElement> passwordElement = std::make_shared<XMLElement>("password");
        passwordElement->addNode(std::make_shared<XMLTextNode>(*payload->getPassword()));
    }

    if (payload->getInvite()) {
        MUCUserPayload::Invite invite = *payload->getInvite();
        std::shared_ptr<XMLElement> inviteElement = std::make_shared<XMLElement>("invite");
        if (invite.to.isValid()) {
            inviteElement->setAttribute("to", invite.to.toString());
        }
        if (invite.from.isValid()) {
            inviteElement->setAttribute("from", invite.from.toString());
        }
        if (!invite.reason.empty()) {
            std::shared_ptr<XMLElement> reasonElement = std::make_shared<XMLElement>("reason");
            reasonElement->addNode(std::make_shared<XMLTextNode>(invite.reason));
        }
        mucElement.addNode(inviteElement);
    }

    std::shared_ptr<Payload> childPayload = payload->getPayload();
    if (childPayload) {
        PayloadSerializer* serializer = serializers->getPayloadSerializer(childPayload);
        if (serializer) {
            mucElement.addNode(std::make_shared<XMLRawTextNode>(serializer->serialize(childPayload)));
        }
    }
    return mucElement.serialize();
}




}