0

我目前正在开发一个基于 XMPP 的系统,该系统由一个 iOS 应用程序、一个 ejabberd 服务器和一个独立的客户端组成,该客户端充当一个控制器,可以接收来自用户的请求并采取相应的操作(我知道 IQ 节,但是用 Erlang 开发 ejabberd 模块对我来说太离谱了。)

对于 iOS 应用程序,我使用 XMPPFramework,而对于控制器,我选择了 Swiften,因为它是这里最推荐的 C++ 库。由于这不仅仅是一个简单的消息传递系统,我发现需要在消息中包含一些自定义属性,如下所示:

<message type="chat" 
         to="controller@example" 
         custom_attribute_1="Value 1"
         custom_attribute_2="Value 2"
    <subject>Subject</subject>
    <body>Body</body>
    <thread>Thread</thread>
</message>

使用 XMPPFramework 很容易做到这一点,但我在尝试使用 Swiften 读取自定义属性时失败了,更不用说生成自定义消息了。

我尝试了两种方法。第一个是从消息中获取原始 XML 并使用 boost XML Parser 获取属性,但我什至无法RawXMLPayload从消息中获取。

第二种方法,我认为最终会更直接,是分析 Swift/Swiften 代码以了解它们如何管理整个 XML 到对象的转换。我知道他们使用这个AttributeMap类,但我不知道这些对象是如何产生的,所以那里也没有运气。

我怎样才能做到这一点?可以使用 Swiften 完成吗?

4

1 回答 1

0

I would strongly recommend against adding additional attributes at the top level of the stanza (it is possible, but you have to namespace the elements and many implementations will not be happy with this - the example you gave is illegal XMPP, because the attributes are in the default namespace). The normal way to add additional information to a stanza is to add a (namespaced) payload, so something like:

<message type="chat" 
     to="controller@example">
    <subject>Subject</subject>
    <body>Body</body>
    <thread>Thread</thread>
    <chrispayload xmlns="...blah..." custom_attribute_1="Value 1" custom_attribute_2="Value 2"/>
</message>

To do this in Swiften you'd add a new Payload under Elements/ (copy paste any of the existing ones), create a new PayloadParser (see Parser/PayloadParsers/) and PayloadSerializer (see Serializer/PayloadSerializers), and then add each of these to their respective factories - see http://swift.im/swiften/guide/#Section-Extending .

If you really must add the attributes to the top level of the stanza (and please don't), you'd want to edit the Elements/Message class, and modify Parsers/MessageParser and Serializers/MessageSerializer.

于 2014-10-26T08:58:06.453 回答