diff options
Diffstat (limited to 'Nim/main.cpp')
-rw-r--r-- | Nim/main.cpp | 166 |
1 files changed, 96 insertions, 70 deletions
diff --git a/Nim/main.cpp b/Nim/main.cpp index 52755ae..2709bb1 100644 --- a/Nim/main.cpp +++ b/Nim/main.cpp @@ -1,85 +1,111 @@ -#include <dns_sd.h> -#include <iostream> -#include <sys/socket.h> +#include <string> +#include <boost/bind.hpp> +#include <boost/shared_ptr.hpp> -#include "Swiften/Network/HostAddress.h" +#include "Swiften/Elements/IQ.h" +#include "Swiften/Elements/RosterPayload.h" +#include "Swiften/Elements/VCard.h" +#include "Swiften/Server/UserRegistry.h" +#include "Swiften/JID/JID.h" +#include "Swiften/Base/String.h" +#include "Swiften/Server/UserRegistry.h" +#include "Swiften/Base/IDGenerator.h" +#include "Swiften/EventLoop/MainEventLoop.h" +#include "Swiften/EventLoop/SimpleEventLoop.h" +#include "Swiften/EventLoop/EventOwner.h" +#include "Swiften/Elements/Stanza.h" +#include "Swiften/LinkLocal/LinkLocalRoster.h" +#include "Swiften/LinkLocal/DNSSDService.h" +#include "Swiften/LinkLocal/AppleDNSSDService.h" +#include "Swiften/Network/ConnectionServer.h" +#include "Swiften/Network/BoostConnection.h" +#include "Swiften/Network/BoostIOServiceThread.h" +#include "Swiften/Network/BoostConnectionServer.h" +#include "Swiften/Server/ServerFromClientSession.h" +#include "Swiften/Parser/PayloadParsers/FullPayloadParserFactoryCollection.h" +#include "Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.h" using namespace Swift; -void handleServiceRegistered(DNSServiceRef sdRef, DNSServiceFlags flags, DNSServiceErrorType errorCode, const char *name, const char *regtype, const char *domain, void *context ) { - std::cerr << "Service registered " << name << " " << regtype << " " << domain << std::endl; -} - -void handleServiceDiscovered(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, const char *serviceName, const char *regtype, const char *replyDomain, void *context ) { - std::cerr << "Service discovered " << interfaceIndex << " " << serviceName << " " << regtype << " " << replyDomain << " " << flags << std::endl; -} - -void handleServiceResolved( DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, const char *fullname, const char *hosttarget, uint16_t port, uint16_t txtLen, const unsigned char *txtRecord, void *context ) { - std::cerr << "Service resolved " << fullname << " " << hosttarget << " " << port << " " << txtLen << " " << /*std::string((const char*) txtRecord, txtLen) <<*/ std::endl; -} -void handleAddressInfoReceived ( DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, const char *hostname, const struct sockaddr *address, uint32_t ttl, void *context ) { - std::cerr << "Address received " << HostAddress((const unsigned char*) address->sa_data, 4).toString() << std::endl; -} +class DummyUserRegistry : public UserRegistry { + public: + DummyUserRegistry() { + } -int main(int argc, char* argv[]) { - fd_set fdSet; - DNSServiceErrorType result; + virtual bool isValidUserPassword(const JID&, const String&) const { + return true; + } +}; - DNSServiceRef registerSDRef; - result = DNSServiceRegister(®isterSDRef, 0, 0, "eemi", "_presence._tcp", NULL, NULL, 5269, 0, NULL, handleServiceRegistered, NULL); - if (result != kDNSServiceErr_NoError) { - std::cerr << "Error 1" << std::endl; - } - int registerSocket = DNSServiceRefSockFD(registerSDRef); - FD_ZERO(&fdSet); - FD_SET(registerSocket, &fdSet); - select(registerSocket+1, &fdSet, &fdSet, &fdSet, 0); - DNSServiceProcessResult(registerSDRef); +class Server { + public: + Server() { + serverFromClientConnectionServer_ = boost::shared_ptr<BoostConnectionServer>(new BoostConnectionServer(5224, &boostIOServiceThread_.getIOService())); + serverFromClientConnectionServer_->onNewConnection.connect(boost::bind(&Server::handleNewConnection, this, _1)); + serverFromClientConnectionServer_->start(); - DNSServiceRef browseSDRef; - result = DNSServiceBrowse(&browseSDRef, 0, 0, "_presence._tcp", 0, handleServiceDiscovered , 0); - if (result != kDNSServiceErr_NoError) { - std::cerr << "Error 2" << std::endl; - } - int browseSocket = DNSServiceRefSockFD(browseSDRef); - //while(true) { - FD_ZERO(&fdSet); - FD_SET(browseSocket, &fdSet); - select(browseSocket+1, &fdSet, &fdSet, &fdSet, 0); - DNSServiceProcessResult(browseSDRef); - //} + dnsSDService_ = boost::shared_ptr<AppleDNSSDService>(new AppleDNSSDService()); + linkLocalRoster_ = boost::shared_ptr<LinkLocalRoster>(new LinkLocalRoster(dnsSDService_)); + dnsSDService_->start(); + // dnsSDService_->publish + } + private: + void handleNewConnection(boost::shared_ptr<Connection> c) { + ServerFromClientSession* session = new ServerFromClientSession(idGenerator_.generateID(), c, &payloadParserFactories_, &payloadSerializers_, &userRegistry_); + serverFromClientSessions_.push_back(session); + session->onStanzaReceived.connect(boost::bind(&Server::handleStanzaReceived, this, _1, session)); + session->onSessionFinished.connect(boost::bind(&Server::handleSessionFinished, this, session)); + } - DNSServiceRef resolveSDRef; - result = DNSServiceResolve(&resolveSDRef, 0, 6, "Remko@Micro", "_presence._tcp.", "local.", handleServiceResolved , 0); - if (result != kDNSServiceErr_NoError) { - std::cerr << "Error 3" << std::endl; - } - int resolveSocket = DNSServiceRefSockFD(resolveSDRef); - //while(true) { - FD_ZERO(&fdSet); - FD_SET(resolveSocket, &fdSet); - select(resolveSocket+1, &fdSet, &fdSet, &fdSet, 0); - DNSServiceProcessResult(resolveSDRef); - //} + void handleSessionFinished(ServerFromClientSession* session) { + serverFromClientSessions_.erase(std::remove(serverFromClientSessions_.begin(), serverFromClientSessions_.end(), session), serverFromClientSessions_.end()); + delete session; + } + void handleStanzaReceived(boost::shared_ptr<Stanza> stanza, ServerFromClientSession* session) { + stanza->setFrom(session->getJID()); + if (!stanza->getTo().isValid()) { + stanza->setTo(JID(session->getDomain())); + } + if (!stanza->getTo().isValid() || stanza->getTo() == session->getDomain() || stanza->getTo() == session->getJID().toBare()) { + if (boost::shared_ptr<IQ> iq = boost::dynamic_pointer_cast<IQ>(stanza)) { + if (iq->getPayload<RosterPayload>()) { + session->sendStanza(IQ::createResult(iq->getFrom(), iq->getID(), boost::shared_ptr<RosterPayload>(new RosterPayload()))); + } + if (iq->getPayload<VCard>()) { + if (iq->getType() == IQ::Get) { + boost::shared_ptr<VCard> vcard(new VCard()); + vcard->setNickname(iq->getFrom().getNode()); + session->sendStanza(IQ::createResult(iq->getFrom(), iq->getID(), vcard)); + } + else { + session->sendStanza(IQ::createError(iq->getFrom(), iq->getID(), Error::Forbidden, Error::Cancel)); + } + } + else { + session->sendStanza(IQ::createError(iq->getFrom(), iq->getID(), Error::FeatureNotImplemented, Error::Cancel)); + } + } + } + } - DNSServiceRef addressSDRef; - result = DNSServiceGetAddrInfo(&addressSDRef, 0, 6, kDNSServiceProtocol_IPv4, "Micro.local.", handleAddressInfoReceived, 0); - if (result != kDNSServiceErr_NoError) { - std::cerr << "Error 4" << std::endl; - } - int addressSocket = DNSServiceRefSockFD(addressSDRef); - //while(true) { - std::cout << "GetAddrInfo2" << std::endl; - FD_ZERO(&fdSet); - FD_SET(addressSocket, &fdSet); - select(addressSocket+1, &fdSet, &fdSet, &fdSet, 0); - DNSServiceProcessResult(addressSDRef); - //} + private: + IDGenerator idGenerator_; + BoostIOServiceThread boostIOServiceThread_; + DummyUserRegistry userRegistry_; + boost::shared_ptr<AppleDNSSDService> dnsSDService_; + boost::shared_ptr<LinkLocalRoster> linkLocalRoster_; + boost::shared_ptr<BoostConnectionServer> serverFromClientConnectionServer_; + std::vector<ServerFromClientSession*> serverFromClientSessions_; + FullPayloadParserFactoryCollection payloadParserFactories_; + FullPayloadSerializerCollection payloadSerializers_; +}; - // DNSServiceRefDeallocate - +int main() { + SimpleEventLoop eventLoop; + Server server; + eventLoop.run(); return 0; } |