summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'Swiften')
-rw-r--r--Swiften/Client/DummyStanzaChannel.h10
-rw-r--r--Swiften/Client/StanzaChannel.h5
-rw-r--r--Swiften/Elements/Presence.h5
-rw-r--r--Swiften/MUC/MUC.cpp67
-rw-r--r--Swiften/MUC/MUC.h29
-rw-r--r--Swiften/Presence/PresenceSender.cpp49
-rw-r--r--Swiften/Presence/PresenceSender.h24
-rw-r--r--Swiften/SConscript2
8 files changed, 135 insertions, 56 deletions
diff --git a/Swiften/Client/DummyStanzaChannel.h b/Swiften/Client/DummyStanzaChannel.h
index 052c470..d618167 100644
--- a/Swiften/Client/DummyStanzaChannel.h
+++ b/Swiften/Client/DummyStanzaChannel.h
@@ -1,38 +1,38 @@
#pragma once
#include <vector>
#include "Swiften/Client/StanzaChannel.h"
namespace Swift {
class DummyStanzaChannel : public StanzaChannel {
public:
DummyStanzaChannel() {}
virtual void sendStanza(boost::shared_ptr<Stanza> stanza) {
- sentStanzas_.push_back(stanza);
+ sentStanzas.push_back(stanza);
}
virtual void sendIQ(boost::shared_ptr<IQ> iq) {
- sentStanzas_.push_back(iq);
+ sentStanzas.push_back(iq);
}
virtual void sendMessage(boost::shared_ptr<Message> message) {
- sentStanzas_.push_back(message);
+ sentStanzas.push_back(message);
}
virtual void sendPresence(boost::shared_ptr<Presence> presence) {
- sentStanzas_.push_back(presence);
+ sentStanzas.push_back(presence);
}
virtual String getNewIQID() {
return "test-id";
}
virtual bool isAvailable() {
return true;
}
- std::vector<boost::shared_ptr<Stanza> > sentStanzas_;
+ std::vector<boost::shared_ptr<Stanza> > sentStanzas;
};
}
diff --git a/Swiften/Client/StanzaChannel.h b/Swiften/Client/StanzaChannel.h
index 37c58c7..a0e291d 100644
--- a/Swiften/Client/StanzaChannel.h
+++ b/Swiften/Client/StanzaChannel.h
@@ -1,23 +1,20 @@
-#ifndef SWIFTEN_MessageChannel_H
-#define SWIFTEN_MessageChannel_H
+#pragma once
#include <boost/signal.hpp>
#include <boost/shared_ptr.hpp>
#include "Swiften/Queries/IQChannel.h"
#include "Swiften/Elements/Message.h"
#include "Swiften/Elements/Presence.h"
namespace Swift {
class StanzaChannel : public IQChannel {
public:
virtual void sendMessage(boost::shared_ptr<Message>) = 0;
virtual void sendPresence(boost::shared_ptr<Presence>) = 0;
virtual bool isAvailable() = 0;
boost::signal<void (boost::shared_ptr<Message>)> onMessageReceived;
boost::signal<void (boost::shared_ptr<Presence>) > onPresenceReceived;
};
}
-
-#endif
diff --git a/Swiften/Elements/Presence.h b/Swiften/Elements/Presence.h
index 002ed0e..a1f15fa 100644
--- a/Swiften/Elements/Presence.h
+++ b/Swiften/Elements/Presence.h
@@ -1,61 +1,58 @@
-#ifndef SWIFTEN_Presence
-#define SWIFTEN_Presence
+#pragma once
#include "Swiften/Elements/Stanza.h"
#include "Swiften/Elements/Status.h"
#include "Swiften/Elements/StatusShow.h"
#include "Swiften/Elements/Priority.h"
namespace Swift {
class Presence : public Stanza
{
public:
enum Type { Available, Error, Probe, Subscribe, Subscribed, Unavailable, Unsubscribe, Unsubscribed };
Presence() : type_(Available) /*, showType_(Online)*/ {}
Presence(const String& status) : type_(Available) {
setStatus(status);
}
Type getType() const { return type_; }
void setType(Type type) { type_ = type; }
StatusShow::Type getShow() const {
boost::shared_ptr<StatusShow> show(getPayload<StatusShow>());
if (show) {
return show->getType();
}
return type_ == Available ? StatusShow::Online : StatusShow::None;
}
void setShow(const StatusShow::Type &show) {
updatePayload(boost::shared_ptr<StatusShow>(new StatusShow(show)));
}
String getStatus() const {
boost::shared_ptr<Status> status(getPayload<Status>());
if (status) {
return status->getText();
}
return "";
}
void setStatus(const String& status) {
updatePayload(boost::shared_ptr<Status>(new Status(status)));
}
int getPriority() const {
boost::shared_ptr<Priority> priority(getPayload<Priority>());
return (priority ? priority->getPriority() : 0);
}
void setPriority(int priority) {
updatePayload(boost::shared_ptr<Priority>(new Priority(priority)));
}
private:
Presence::Type type_;
};
}
-
-#endif
diff --git a/Swiften/MUC/MUC.cpp b/Swiften/MUC/MUC.cpp
index 2b8054f..a6fbcbd 100644
--- a/Swiften/MUC/MUC.cpp
+++ b/Swiften/MUC/MUC.cpp
@@ -1,69 +1,70 @@
#include "Swiften/MUC/MUC.h"
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
+#include "Swiften/Presence/PresenceSender.h"
#include "Swiften/Client/StanzaChannel.h"
#include "Swiften/Elements/IQ.h"
-#include "Swiften/Elements/Message.h"
#include "Swiften/Elements/MUCPayload.h"
-#include "Swiften/Elements/Presence.h"
namespace Swift {
typedef std::pair<String, MUCOccupant> StringMUCOccupantPair;
-MUC::MUC(StanzaChannel* stanzaChannel, const JID &muc) : muc_(muc), stanzaChannel_(stanzaChannel) {
- stanzaChannel_->onPresenceReceived.connect(boost::bind(&MUC::handleIncomingPresence, this, _1));
-}
-
-MUC::~MUC() {
+MUC::MUC(StanzaChannel* stanzaChannel, PresenceSender* presenceSender, const JID &muc) : ownMUCJID(muc), stanzaChannel(stanzaChannel), presenceSender(presenceSender) {
+ stanzaChannel->onPresenceReceived.connect(boost::bind(&MUC::handleIncomingPresence, this, _1));
}
void MUC::joinAs(const String &nick) {
+ firstPresenceSeen = false;
+
+ ownMUCJID = JID(ownMUCJID.getNode(), ownMUCJID.getDomain(), nick);
+
boost::shared_ptr<Presence> joinPresence(new Presence());
- joinPresence->setTo(JID(muc_.getNode(), muc_.getDomain(), nick));
+ joinPresence->setTo(ownMUCJID);
joinPresence->addPayload(boost::shared_ptr<Payload>(new MUCPayload()));
- stanzaChannel_->sendPresence(joinPresence);
- myNick_ = nick;
+ presenceSender->sendPresence(joinPresence);
}
void MUC::part() {
- boost::shared_ptr<Presence> partPresence(new Presence());
- partPresence->setType(Presence::Unavailable);
- partPresence->setTo(JID(muc_.getNode(), muc_.getDomain(), myNick_));
- stanzaChannel_->sendPresence(partPresence);
+ presenceSender->removeDirectedPresenceReceiver(ownMUCJID);
}
void MUC::handleIncomingPresence(boost::shared_ptr<Presence> presence) {
- if (presence->getFrom().toBare() != muc_ || presence->getFrom().getResource() == "") {
+ if (!isFromMUC(presence->getFrom())) {
return;
}
+
+ if (!firstPresenceSeen) {
+ if (presence->getType() == Presence::Error) {
+ onJoinComplete(JoinFailed);
+ return;
+ }
+ firstPresenceSeen = true;
+ onJoinComplete(JoinSucceeded);
+ presenceSender->addDirectedPresenceReceiver(ownMUCJID);
+ }
+
String nick = presence->getFrom().getResource();
+ if (nick.isEmpty()) {
+ return;
+ }
if (presence->getType() == Presence::Unavailable) {
- foreach (StringMUCOccupantPair occupantPair, occupants_) {
- if (occupantPair.first == nick) {
- occupants_.erase(nick);
- onOccupantLeft(occupantPair.second, Part, "");
- break;
- }
- }
- } else if (presence->getType() == Presence::Available) {
- bool found = false;
- foreach (StringMUCOccupantPair occupantPair, occupants_) {
- if (occupantPair.first == nick) {
- found = true;
- break;
- }
+ std::map<String,MUCOccupant>::iterator i = occupants.find(nick);
+ if (i != occupants.end()) {
+ onOccupantLeft(i->second, Part, "");
+ occupants.erase(i);
}
- if (!found) {
- MUCOccupant occupant(nick);
- occupants_.insert(occupants_.end(), std::pair<String, MUCOccupant>(nick, occupant));
- onOccupantJoined(occupant);
+ }
+ else if (presence->getType() == Presence::Available) {
+ std::pair<std::map<String,MUCOccupant>::iterator, bool> result = occupants.insert(std::make_pair(nick, MUCOccupant(nick)));
+ if (result.second) {
+ onOccupantJoined(result.first->second);
}
onOccupantPresenceChange(presence);
}
}
}
diff --git a/Swiften/MUC/MUC.h b/Swiften/MUC/MUC.h
index 45bcbd3..2a327f4 100644
--- a/Swiften/MUC/MUC.h
+++ b/Swiften/MUC/MUC.h
@@ -1,49 +1,58 @@
-#ifndef SWIFTEN_MUC_H
-#define SWIFTEN_MUC_H
+#pragma once
#include "Swiften/JID/JID.h"
#include "Swiften/Base/String.h"
#include "Swiften/Elements/Message.h"
#include "Swiften/Elements/Presence.h"
#include "Swiften/MUC/MUCOccupant.h"
#include <boost/signals.hpp>
#include <boost/shared_ptr.hpp>
#include <map>
namespace Swift {
class StanzaChannel;
+ class PresenceSender;
class MUC {
public:
enum JoinResult { JoinSucceeded, JoinFailed };
enum LeavingType { Part };
public:
- MUC(StanzaChannel* stanzaChannel, const JID &muc);
- ~MUC();
+ MUC(StanzaChannel* stanzaChannel, PresenceSender* presenceSender, const JID &muc);
void joinAs(const String &nick);
String getCurrentNick();
void part();
void handleIncomingMessage(boost::shared_ptr<Message> message);
public:
boost::signal<void (JoinResult)> onJoinComplete;
boost::signal<void (boost::shared_ptr<Message>)> onMessageReceived;
boost::signal<void (boost::shared_ptr<Presence>)> onOccupantPresenceChange;
boost::signal<void (const MUCOccupant&)> onOccupantJoined;
/**Occupant, type, and reason. */
boost::signal<void (const MUCOccupant&, LeavingType, const String&)> onOccupantLeft;
private:
+ bool isFromMUC(const JID& j) const {
+ return ownMUCJID.equals(j, JID::WithoutResource);
+ }
+
+ const String& getOwnNick() const {
+ return ownMUCJID.getResource();
+ }
+
+ private:
void handleIncomingPresence(boost::shared_ptr<Presence> presence);
- JID muc_;
- StanzaChannel *stanzaChannel_;
- String myNick_;
- std::map<String, MUCOccupant> occupants_;
+
+ private:
+ JID ownMUCJID;
+ StanzaChannel* stanzaChannel;
+ PresenceSender* presenceSender;
+ std::map<String, MUCOccupant> occupants;
+ bool firstPresenceSeen;
};
}
-
-#endif
diff --git a/Swiften/Presence/PresenceSender.cpp b/Swiften/Presence/PresenceSender.cpp
new file mode 100644
index 0000000..8e7ef68
--- /dev/null
+++ b/Swiften/Presence/PresenceSender.cpp
@@ -0,0 +1,49 @@
+#include "Swiften/Presence/PresenceSender.h"
+#include "Swiften/Base/foreach.h"
+#include "Swiften/Client/StanzaChannel.h"
+
+namespace Swift {
+
+PresenceSender::PresenceSender(StanzaChannel* channel) : channel(channel) {
+}
+
+void PresenceSender::sendPresence(boost::shared_ptr<Presence> presence) {
+ if (!channel->isAvailable()) {
+ return;
+ }
+
+ channel->sendPresence(presence);
+
+ if (!presence->getTo().isValid()) {
+ boost::shared_ptr<Presence> presenceCopy(new Presence(*presence));
+ foreach(const JID& jid, directedPresenceReceivers) {
+ presenceCopy->setTo(jid);
+ channel->sendPresence(presenceCopy);
+ }
+
+ lastSentUndirectedPresence = presence;
+ }
+}
+
+void PresenceSender::addDirectedPresenceReceiver(const JID& jid) {
+ directedPresenceReceivers.insert(jid);
+ if (channel->isAvailable()) {
+ if (lastSentUndirectedPresence && lastSentUndirectedPresence->getType() == Presence::Available) {
+ boost::shared_ptr<Presence> presenceCopy(new Presence(*lastSentUndirectedPresence));
+ presenceCopy->setTo(jid);
+ channel->sendPresence(presenceCopy);
+ }
+ }
+}
+
+void PresenceSender::removeDirectedPresenceReceiver(const JID& jid) {
+ directedPresenceReceivers.erase(jid);
+ if (channel->isAvailable()) {
+ boost::shared_ptr<Presence> presence(new Presence());
+ presence->setType(Presence::Unavailable);
+ presence->setTo(jid);
+ channel->sendPresence(presence);
+ }
+}
+
+}
diff --git a/Swiften/Presence/PresenceSender.h b/Swiften/Presence/PresenceSender.h
new file mode 100644
index 0000000..ef69447
--- /dev/null
+++ b/Swiften/Presence/PresenceSender.h
@@ -0,0 +1,24 @@
+#pragma once
+
+#include <set>
+
+#include "Swiften/Elements/Presence.h"
+
+namespace Swift {
+ class StanzaChannel;
+
+ class PresenceSender {
+ public:
+ PresenceSender(StanzaChannel*);
+
+ void addDirectedPresenceReceiver(const JID&);
+ void removeDirectedPresenceReceiver(const JID&);
+
+ void sendPresence(boost::shared_ptr<Presence>);
+
+ private:
+ boost::shared_ptr<Presence> lastSentUndirectedPresence;
+ StanzaChannel* channel;
+ std::set<JID> directedPresenceReceivers;
+ };
+}
diff --git a/Swiften/SConscript b/Swiften/SConscript
index 9742768..e7e1582 100644
--- a/Swiften/SConscript
+++ b/Swiften/SConscript
@@ -1,83 +1,84 @@
Import("env")
env["SWIFTEN_FLAGS"] = {
"LIBPATH": [Dir(".")],
"LIBS": ["Swiften"]
}
swiften_env = env.Clone()
swiften_env.MergeFlags(swiften_env["BOOST_FLAGS"])
Export("swiften_env")
# TODO: Move all this to a submodule SConscript
myenv = swiften_env.Clone()
myenv.MergeFlags(myenv["ZLIB_FLAGS"])
myenv.MergeFlags(myenv["OPENSSL_FLAGS"])
sources = [
"Avatars/AvatarFileStorage.cpp",
"Avatars/AvatarManager.cpp",
"Avatars/AvatarStorage.cpp",
"Client/Client.cpp",
"Client/ClientSession.cpp",
"Compress/ZLibCodecompressor.cpp",
"Disco/CapsInfoGenerator.cpp",
"Elements/DiscoInfo.cpp",
"Elements/Element.cpp",
"Elements/IQ.cpp",
"Elements/MUCPayload.cpp",
"Elements/Payload.cpp",
"Elements/RosterPayload.cpp",
"Elements/Stanza.cpp",
"MUC/MUC.cpp",
"MUC/MUCOccupant.cpp",
"MUC/MUCRegistry.cpp",
"Notifier/Notifier.cpp",
"Presence/PresenceOracle.cpp",
+ "Presence/PresenceSender.cpp",
"Queries/IQChannel.cpp",
"Queries/IQHandler.cpp",
"Queries/IQRouter.cpp",
"Queries/Request.cpp",
"Queries/Responders/DiscoInfoResponder.cpp",
"Queries/Responders/SoftwareVersionResponder.cpp",
"Roster/ContactRosterItem.cpp",
"Roster/Roster.cpp",
"Roster/XMPPRoster.cpp",
"Serializer/AuthRequestSerializer.cpp",
"Serializer/AuthSuccessSerializer.cpp",
"Serializer/AuthChallengeSerializer.cpp",
"Serializer/AuthResponseSerializer.cpp",
"Serializer/CompressRequestSerializer.cpp",
"Serializer/ElementSerializer.cpp",
"Serializer/MessageSerializer.cpp",
"Serializer/PayloadSerializer.cpp",
"Serializer/PayloadSerializerCollection.cpp",
"Serializer/PayloadSerializers/CapsInfoSerializer.cpp",
"Serializer/PayloadSerializers/DiscoInfoSerializer.cpp",
"Serializer/PayloadSerializers/ErrorSerializer.cpp",
"Serializer/PayloadSerializers/FullPayloadSerializerCollection.cpp",
"Serializer/PayloadSerializers/MUCPayloadSerializer.cpp",
"Serializer/PayloadSerializers/ResourceBindSerializer.cpp",
"Serializer/PayloadSerializers/RosterSerializer.cpp",
"Serializer/PayloadSerializers/SecurityLabelSerializer.cpp",
"Serializer/PayloadSerializers/SecurityLabelsCatalogSerializer.cpp",
"Serializer/PayloadSerializers/SoftwareVersionSerializer.cpp",
"Serializer/PayloadSerializers/VCardSerializer.cpp",
"Serializer/PayloadSerializers/VCardUpdateSerializer.cpp",
"Serializer/PayloadSerializers/StorageSerializer.cpp",
"Serializer/PayloadSerializers/PrivateStorageSerializer.cpp",
"Serializer/PresenceSerializer.cpp",
"Serializer/StanzaSerializer.cpp",
"Serializer/StreamFeaturesSerializer.cpp",
"Serializer/XML/XMLElement.cpp",
"Serializer/XML/XMLNode.cpp",
"Serializer/XMPPSerializer.cpp",
"Server/ServerFromClientSession.cpp",
"Server/ServerSession.cpp",
"Server/ServerStanzaRouter.cpp",
"Server/SimpleUserRegistry.cpp",
"Server/UserRegistry.cpp",
"Session/Session.cpp",
"Session/SessionStream.cpp",
"Session/BasicSessionStream.cpp",
"StringCodecs/Base64.cpp",
"StringCodecs/SHA1.cpp",
@@ -110,84 +111,85 @@ env.Append(UNITTEST_SOURCES = [
File("Application/UnitTest/ApplicationTest.cpp"),
File("Base/UnitTest/IDGeneratorTest.cpp"),
File("Base/UnitTest/StringTest.cpp"),
File("Base/UnitTest/ByteArrayTest.cpp"),
File("Client/UnitTest/ClientSessionTest.cpp"),
File("Compress/UnitTest/ZLibCompressorTest.cpp"),
File("Compress/UnitTest/ZLibDecompressorTest.cpp"),
File("Disco/UnitTest/CapsInfoGeneratorTest.cpp"),
File("Elements/UnitTest/IQTest.cpp"),
File("Elements/UnitTest/StanzaTest.cpp"),
File("Elements/UnitTest/StanzasTest.cpp"),
File("EventLoop/UnitTest/EventLoopTest.cpp"),
File("EventLoop/UnitTest/SimpleEventLoopTest.cpp"),
File("History/UnitTest/SQLiteHistoryManagerTest.cpp"),
File("JID/UnitTest/JIDTest.cpp"),
File("LinkLocal/UnitTest/LinkLocalConnectorTest.cpp"),
File("LinkLocal/UnitTest/LinkLocalServiceBrowserTest.cpp"),
File("LinkLocal/UnitTest/LinkLocalServiceInfoTest.cpp"),
File("LinkLocal/UnitTest/LinkLocalServiceTest.cpp"),
File("Network/UnitTest/HostAddressTest.cpp"),
File("Network/UnitTest/ConnectorTest.cpp"),
File("Parser/PayloadParsers/UnitTest/BodyParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/DiscoInfoParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/ErrorParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/PriorityParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/RawXMLPayloadParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/ResourceBindParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/RosterParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/SecurityLabelParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/SecurityLabelsCatalogParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/SoftwareVersionParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/StatusParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/StatusShowParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/VCardParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/StorageParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/PrivateStorageParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/VCardUpdateParserTest.cpp"),
File("Parser/UnitTest/AttributeMapTest.cpp"),
File("Parser/UnitTest/IQParserTest.cpp"),
File("Parser/UnitTest/MessageParserTest.cpp"),
File("Parser/UnitTest/PayloadParserFactoryCollectionTest.cpp"),
File("Parser/UnitTest/PresenceParserTest.cpp"),
File("Parser/UnitTest/SerializingParserTest.cpp"),
File("Parser/UnitTest/StanzaParserTest.cpp"),
File("Parser/UnitTest/StreamFeaturesParserTest.cpp"),
File("Parser/UnitTest/XMLParserTest.cpp"),
File("Parser/UnitTest/XMPPParserTest.cpp"),
File("Presence/UnitTest/PresenceOracleTest.cpp"),
+ File("Presence/UnitTest/PresenceSenderTest.cpp"),
File("Queries/Requests/UnitTest/GetPrivateStorageRequestTest.cpp"),
File("Queries/Responders/UnitTest/DiscoInfoResponderTest.cpp"),
File("Queries/UnitTest/IQRouterTest.cpp"),
File("Queries/UnitTest/RequestTest.cpp"),
File("Queries/UnitTest/ResponderTest.cpp"),
File("Roster/UnitTest/OfflineRosterFilterTest.cpp"),
File("Roster/UnitTest/RosterTest.cpp"),
File("Roster/UnitTest/XMPPRosterTest.cpp"),
File("SASL/UnitTest/PLAINMessageTest.cpp"),
File("SASL/UnitTest/PLAINClientAuthenticatorTest.cpp"),
File("SASL/UnitTest/SCRAMSHA1ClientAuthenticatorTest.cpp"),
File("Serializer/PayloadSerializers/UnitTest/PayloadsSerializer.cpp"),
File("Serializer/PayloadSerializers/UnitTest/CapsInfoSerializerTest.cpp"),
File("Serializer/PayloadSerializers/UnitTest/DiscoInfoSerializerTest.cpp"),
File("Serializer/PayloadSerializers/UnitTest/ErrorSerializerTest.cpp"),
File("Serializer/PayloadSerializers/UnitTest/PrioritySerializerTest.cpp"),
File("Serializer/PayloadSerializers/UnitTest/ResourceBindSerializerTest.cpp"),
File("Serializer/PayloadSerializers/UnitTest/RosterSerializerTest.cpp"),
File("Serializer/PayloadSerializers/UnitTest/SecurityLabelSerializerTest.cpp"),
File("Serializer/PayloadSerializers/UnitTest/SecurityLabelsCatalogSerializerTest.cpp"),
File("Serializer/PayloadSerializers/UnitTest/SoftwareVersionSerializerTest.cpp"),
File("Serializer/PayloadSerializers/UnitTest/StatusSerializerTest.cpp"),
File("Serializer/PayloadSerializers/UnitTest/StatusShowSerializerTest.cpp"),
File("Serializer/PayloadSerializers/UnitTest/VCardUpdateSerializerTest.cpp"),
File("Serializer/PayloadSerializers/UnitTest/StorageSerializerTest.cpp"),
File("Serializer/PayloadSerializers/UnitTest/PrivateStorageSerializerTest.cpp"),
File("Serializer/UnitTest/StreamFeaturesSerializerTest.cpp"),
File("Serializer/XML/UnitTest/XMLElementTest.cpp"),
File("Server/UnitTest/ServerStanzaRouterTest.cpp"),
File("StreamStack/UnitTest/StreamStackTest.cpp"),
File("StreamStack/UnitTest/XMPPLayerTest.cpp"),
File("StringCodecs/UnitTest/Base64Test.cpp"),
File("StringCodecs/UnitTest/SHA1Test.cpp"),
File("StringCodecs/UnitTest/HMACSHA1Test.cpp"),
File("StringCodecs/UnitTest/PBKDF2Test.cpp"),
])