Add files via upload

This commit is contained in:
nmset
2018-04-14 21:39:55 +02:00
committed by GitHub
parent 3618a09c27
commit df97397fc4
32 changed files with 2136 additions and 2 deletions

59
DBusSafWorkers.cpp Normal file
View File

@@ -0,0 +1,59 @@
/*
* File: DBusSafWorkers.cpp
* Author: SET - nmset@netcourrier.com
* License : GPL v2
* Copyright SET - © 2017
*
* Created on 7 mai 2017, 15:18
*/
#include "gcc_version.h"
#include "DBusSafWorkers.h"
#include <gloox/message.h>
#include <signal.h>
using namespace std;
extern bool g_verbose;
DBusSafAdaptor::DBusSafAdaptor(DBus::Connection &connection, Connector * connector, SAFConnListener * saf)
: DBus::ObjectAdaptor(connection, "/xmpp/saf")
{
m_connector = connector;
m_saf = saf;
thread t(Entry);
t.detach();
}
DBusSafAdaptor::~DBusSafAdaptor()
{
DBus::default_dispatcher->leave();
}
int DBusSafAdaptor::Entry()
{
DBus::default_dispatcher->enter(); // IS BLOCKING
return 0;
}
void DBusSafAdaptor::Quit()
{
// Handled in main.cpp
raise(SIGTERM);
}
void DBusSafAdaptor::SendMsg(const std::string& recipient, const std::string& msg)
{
const Message m(Message::MessageType::Chat, recipient, msg);
m_saf->GetClient()->send(m);
}
DBusSafProxy::DBusSafProxy(DBus::Connection& connection, const char* service)
: DBus::ObjectProxy(connection, "/xmpp/saf", service)
{
}
DBusSafProxy::~DBusSafProxy()
{
}

72
DBusSafWorkers.h Normal file
View File

@@ -0,0 +1,72 @@
/*
* File: DBusSafWorkers.h
* Author: SET - nmset@netcourrier.com
* License : GPL v2
* Copyright SET - © 2017
*
* Created on 7 mai 2017, 15:18
*/
#ifndef DBUSSAFWORKERS_H
#define DBUSSAFWORKERS_H
#include "dbus_saf_adaptor.hpp"
#include "dbus_saf_proxy.hpp"
#include "SAF.h"
#include <gloox/client.h>
#include <thread>
using namespace gloox;
/**
* The DBus application instance to which clients may talk.
* It is run in a thread and waits for messages to send.
*/
class DBusSafAdaptor : public xmpp::saf_adaptor,
public DBus::IntrospectableAdaptor,
public DBus::ObjectAdaptor
{
public:
DBusSafAdaptor(DBus::Connection &connection, Connector * connector, SAFConnListener * saf);
virtual ~DBusSafAdaptor();
/**
* Sends a message to a recipient.
* @param recipient : a valid jid
* @param msg
*/
void SendMsg(const std::string& recipient, const std::string& msg) override;
/**
* Sends SIGUSR1 signal, leading to disconnection from server
* and application exit.
*/
void Quit() override;
/**
* Enters the DBus loop.
* @return
*/
static int Entry();
private:
/**
* gloox::Client object
*/
Connector * m_connector;
SAFConnListener * m_saf;
};
/**
* Unused proxy class. We don't need to talk to other application instances.
*/
class DBusSafProxy : public xmpp::saf_proxy,
public DBus::IntrospectableProxy,
public DBus::ObjectProxy
{
DBusSafProxy(DBus::Connection &connection, const char * service); // Unused
virtual ~DBusSafProxy();
};
#endif /* DBUSSAFWORKERS_H */

128
Makefile Normal file
View File

@@ -0,0 +1,128 @@
#
# There exist several targets which are by default empty and which can be
# used for execution of your targets. These targets are usually executed
# before and after some main targets. They are:
#
# .build-pre: called before 'build' target
# .build-post: called after 'build' target
# .clean-pre: called before 'clean' target
# .clean-post: called after 'clean' target
# .clobber-pre: called before 'clobber' target
# .clobber-post: called after 'clobber' target
# .all-pre: called before 'all' target
# .all-post: called after 'all' target
# .help-pre: called before 'help' target
# .help-post: called after 'help' target
#
# Targets beginning with '.' are not intended to be called on their own.
#
# Main targets can be executed directly, and they are:
#
# build build a specific configuration
# clean remove built files from a configuration
# clobber remove all built files
# all build all configurations
# help print help mesage
#
# Targets .build-impl, .clean-impl, .clobber-impl, .all-impl, and
# .help-impl are implemented in nbproject/makefile-impl.mk.
#
# Available make variables:
#
# CND_BASEDIR base directory for relative paths
# CND_DISTDIR default top distribution directory (build artifacts)
# CND_BUILDDIR default top build directory (object files, ...)
# CONF name of current configuration
# CND_PLATFORM_${CONF} platform name (current configuration)
# CND_ARTIFACT_DIR_${CONF} directory of build artifact (current configuration)
# CND_ARTIFACT_NAME_${CONF} name of build artifact (current configuration)
# CND_ARTIFACT_PATH_${CONF} path to build artifact (current configuration)
# CND_PACKAGE_DIR_${CONF} directory of package (current configuration)
# CND_PACKAGE_NAME_${CONF} name of package (current configuration)
# CND_PACKAGE_PATH_${CONF} path to package (current configuration)
#
# NOCDDL
# Environment
MKDIR=mkdir
CP=cp
CCADMIN=CCadmin
# build
build: .build-post
.build-pre:
# Add your pre 'build' code here...
.build-post: .build-impl
# Add your post 'build' code here...
# clean
clean: .clean-post
.clean-pre:
# Add your pre 'clean' code here...
.clean-post: .clean-impl
# Add your post 'clean' code here...
# clobber
clobber: .clobber-post
.clobber-pre:
# Add your pre 'clobber' code here...
.clobber-post: .clobber-impl
# Add your post 'clobber' code here...
# all
all: .all-post
.all-pre:
# Add your pre 'all' code here...
.all-post: .all-impl
# Add your post 'all' code here...
# build tests
build-tests: .build-tests-post
.build-tests-pre:
# Add your pre 'build-tests' code here...
.build-tests-post: .build-tests-impl
# Add your post 'build-tests' code here...
# run tests
test: .test-post
.test-pre: build-tests
# Add your pre 'test' code here...
.test-post: .test-impl
# Add your post 'test' code here...
# help
help: .help-post
.help-pre:
# Add your pre 'help' code here...
.help-post: .help-impl
# Add your post 'help' code here...
# include project implementation makefile
include nbproject/Makefile-impl.mk
# include project make variables
include nbproject/Makefile-variables.mk

View File

@@ -1,2 +1,75 @@
# saf7 SAF7 - Send And Forget an XMPP message.
Send and Forget an XMPP message License : GPL v2
This application is designed to send XMPP messages to arbitrary recipients
without expecting a reply. It is intended to run on servers to forward messages
to admins. Repeated problems with similar tools after system upgrade on Arch
Linux motivated writing this application.
It uses gloox as XMPP library, and messages are sent to the application via
DBus. It runs on the system bus, and hence, must be run as root.
USAGE
It must be started with two mandatory parameters :
--jid (-j) : a valid XMPP jid, the sender : ex. srv-admin@srv.domain.tld
--password (-w) : the sender's authotization token to connect to the server
Optional parameters may be used :
--resource (-r) : XMPP ressource label, default : SAF
--server (-s) : overrides the server part of the sender's jid
--port (-p) : overrides default XMPP 5222 port, default : 5222 nevertheless
--retry (-y) : Number of times to try to connect to server, default = 0
(for ever)
--delay (-d) : Number of seconds between each connection attempt,default =
30
--wsping (-g) : Number of seconds between each whitespace ping to the server
, default = 0 (never), at least 55
--bustag (-t) : a suffix to the 'xmpp.saf-' bus name, default : default
--config (-c) : a simple key=value file, where above parameters can be
saved for simplicty
--verbose (-v) : Show messages. Command line only.
DBUS CONSIDERATIONS
A policy file must be created in /etc/dbus-1/system.d/ , because the
application requests the system bus. A sample file is in the release package.
If --bustag is used, another policy file must be created to reflect this
parameter's significance.
The default instance creates a DBus destination 'xmpp.saf-default', with path
/xmpp/saf. Two methods are available : Quit, and SendMsg. They can simply be
called as such :
dbus-send --system --print-reply=literal --type=method_call
--dest=xmpp.saf-default /xmpp/saf xmpp.saf.SendMsg
string:recipient@srv.domain.tld string:"Server is about to crash!"
dbus-send --system --print-reply=literal --type=method_call
--dest=xmpp.saf-default /xmpp/saf xmpp.saf.Quit
If a bustag parameter is used, the created DBus destination is
'xmpp.saf-$(bustag)'. It is therefore possible to run multiple instances of the
application simultaneously, each instance having a different configuration file.
XMPP NOTE
If the same sender's XMPP account is used in multiple instances, or on multiple
hosts, a different resource parameter MUST be used for each instance.
FILES IN THE RELEASE ARCHIVE
-All project files as a NetBeans project.
-Convenience files :
saf7_SendMsg.sh : a bash script to send a message. It accepts the
recipient's address, the message, and optionally the bustag parameter if
relevant.
saf7_Quit.sh : a bash script to stop the application. Only root can do that,
as per applied DBus policy. It optionally accepts the bustag parameter.
saf7-default.rc.template : can simplify creating a configuration file.
saf7-default.conf : a DBus policy file for the default instance. Create
another one if bustag is used.
saf7-default.service : a systemd service file for the default instance.
Create another service file if bustag is used.
PKGBUILD : to create an Arch's package. After installation, create a
default /usr/local/etc/saf7/saf7-default.rc file with valid parameters.
DISCLAIMER
I don't claim the application is fit for any purpose.Programming is just my hobby.
Cheers !

132
SAF.cpp Normal file
View File

@@ -0,0 +1,132 @@
/*
* File: SAF.cpp
* Author: SET - nmset@netcourrier.com
* License : GPL v2
* Copyright SET - © 2017
*
* Created on 6 mai 2017, 21:50
*/
#include "SAF.h"
#include "globals.h"
#include <unistd.h>
#include <thread>
extern bool g_verbose;
extern uint g_wsping;
extern Client * g_client;
SAFConnListener::SAFConnListener(Client * client)
{
m_client = client;
m_lastError = ConnectionError::ConnNotConnected;
ConnErrorMap[ConnectionError::ConnNoError] = "Not really an error. Everything went just fine. ";
ConnErrorMap[ConnectionError::ConnStreamError] = "A stream error occured. The stream has been closed.";
ConnErrorMap[ConnectionError::ConnStreamVersionError] = "The incoming stream's version is not supported.";
ConnErrorMap[ConnectionError::ConnStreamClosed] = "The stream has been closed (by the server).";
ConnErrorMap[ConnectionError::ConnProxyAuthRequired] = "The HTTP/SOCKS5 proxy requires authentication.";
ConnErrorMap[ConnectionError::ConnProxyAuthFailed] = "HTTP/SOCKS5 proxy authentication failed.";
ConnErrorMap[ConnectionError::ConnProxyNoSupportedAuth] = "The HTTP/SOCKS5 proxy requires an unsupported auth mechanism.";
ConnErrorMap[ConnectionError::ConnIoError] = "An I/O error occured. ";
ConnErrorMap[ConnectionError::ConnParseError] = "An XML parse error occurred. ";
ConnErrorMap[ConnectionError::ConnConnectionRefused] = "The connection was refused by the server (on the socket level).";
ConnErrorMap[ConnectionError::ConnDnsError] = "Resolving the server's hostname failed.";
ConnErrorMap[ConnectionError::ConnOutOfMemory] = "Out of memory. Uhoh.";
ConnErrorMap[ConnectionError::ConnNoSupportedAuth] = "The auth mechanisms the server offers are not supported.";
ConnErrorMap[ConnectionError::ConnTlsFailed] = "The server's certificate could not be verified or the TLS handshake did not complete successfully.";
ConnErrorMap[ConnectionError::ConnTlsNotAvailable] = "The server didn't offer TLS while it was set to be required, or TLS was not compiled in.";
ConnErrorMap[ConnectionError::ConnCompressionFailed] = "Negotiating/initializing compression failed.";
ConnErrorMap[ConnectionError::ConnAuthenticationFailed] = "Authentication failed. Username/password wrong or account does not exist. Use ClientBase::authError() to find the reason.";
ConnErrorMap[ConnectionError::ConnUserDisconnected] = "The user (or higher-level protocol) requested a disconnect.";
ConnErrorMap[ConnectionError::ConnNotConnected] = "There is no active connection.";
m_client->registerConnectionListener(this);
thread t(WhiteSpacePing, g_client, this);
t.detach();
}
SAFConnListener::~SAFConnListener()
{
}
void SAFConnListener::onConnect()
{
m_lastError = ConnectionError::ConnNoError;
m_connector->ResetCounter();
if (g_verbose)
cout << "Connected (" << m_client->jid().bare() << ")." << endl;
}
void SAFConnListener::onDisconnect(ConnectionError e)
{
m_lastError = e;
if (g_verbose)
cout << "Disconnected (" << m_client->jid().bare() << ")." << endl;
if (e == ConnNoError || e == ConnUserDisconnected) return;
cout << ConnErrorMap[e] << endl;
}
bool SAFConnListener::onTLSConnect(const CertInfo& info)
{
return true;
}
void SAFConnListener::WhiteSpacePing(Client* client, SAFConnListener * saf)
{
if (g_wsping == 0) return;
while (true)
{
sleep(g_wsping);
if (saf->GetLastError() == ConnectionError::ConnNoError)
client->whitespacePing();
//cout << "Pinging the server." << endl;
}
}
Connector::Connector(SAFConnListener * saf, const uint& retry, const uint& delay)
{
m_saf = saf;
m_retry = retry;
m_delay = delay;
m_count = 0;
m_saf->SetConnector(this);
}
Connector::~Connector()
{
m_saf->GetClient()->disconnect();
}
void Connector::DoConnect()
{
// At start, SAFConnListener has ConnNotConnected as last error
while (m_saf->GetLastError() != ConnectionError::ConnNoError)
{
bool res = m_saf->GetClient()->connect(); // Blocks on successful connect()
//If no connection is established, res can still be true !
if (!res
/* If the server has been shutdown, we want to reconnect.
* Same thing if the server is not yet up.
*/
&& m_saf->GetLastError() != ConnectionError::ConnConnectionRefused)
{
cout << "Cannot initiate a connection."
" Check network, server, or parameters." << endl;
break;
}
if (g_verbose)
cout << "Try " << m_count
<< " : Waiting " << m_delay << " seconds"
<< " before connecting..." << endl;
sleep(m_delay);
m_count++;
if (m_retry > 0 && m_count == m_retry)
{
if (g_verbose)
cout << "Giving up." << endl;
break;
}
}
}

107
SAF.h Normal file
View File

@@ -0,0 +1,107 @@
/*
* File: SAF.h
* Author: SET - nmset@netcourrier.com
* License : GPL v2
* Copyright SET - © 2017
*
* Created on 6 mai 2017, 21:50
*/
#ifndef SAF_H
#define SAF_H
#include <iostream>
using namespace std;
#include <gloox/client.h>
#include <gloox/connectionlistener.h>
using namespace gloox;
class Connector;
class SAFConnListener;
/**
* gloox's connection listener.
*/
class SAFConnListener : public ConnectionListener
{
public:
SAFConnListener(Client * client);
virtual ~SAFConnListener();
virtual void onConnect() override;
/**
* Shows significant error messages.
* @param e
*/
virtual void onDisconnect(ConnectionError e) override;
/**
* Mandatory. Always returns true.
* @param info
* @return
*/
virtual bool onTLSConnect(const CertInfo& info) override;
ConnectionError GetLastError()
{
return m_lastError;
}
Client * GetClient() const
{
return m_client;
}
void SetConnector(Connector * connector)
{
m_connector = connector;
}
/**
* A server may disconnect an idle client.
* Prevents the application from being seen as idle.
* @param client
* @param saf
*/
static void WhiteSpacePing(Client * client, SAFConnListener * saf);
private:
typedef map<int, string> mapErrors;
mapErrors ConnErrorMap;
Client * m_client;
Connector * m_connector;
ConnectionError m_lastError;
};
/**
* Tries to connect to the server.
* Tries to reconnect if the server goes down,
* of if the server is not yet up.
* In all other cases where Client::connect fails,
* the application is allowed to exit.
*/
class Connector
{
public:
Connector(SAFConnListener * saf, const uint& retry, const uint& delay);
/**
* Disconnects from server.
*/
virtual ~Connector();
void DoConnect();
/**
* Resets the number of times we have tried to (re)connect.
*/
void ResetCounter()
{
m_count = 0;
}
private:
SAFConnListener * m_saf;
uint m_retry;
uint m_delay;
uint m_count;
};
#endif /* SAF_H */

25
change.log Normal file
View File

@@ -0,0 +1,25 @@
2018-04-14
Move to github.com
2017-06-02
Version 4
- Added a check for gcc version. Compile will succeed with gcc7.1 if
DBUS_HAS_RECURSIVE_MUTEX is defined.
- Added a DEVTIME preprocessor definition in the Debug config. This allows
contextual automatic selection of the bus to use when compiling.
2017-05-16
Version 3
- Added an optional possibility to ping the server regularly.
- Tries to reconnect to the server if it goes down, or not yet up. Exits in all
other cases a connection cannot be completed.
2017-05-12
Version 2
- Tries to connect many times on start.
- Tries to reconnect many times if server is shut down.
- Can exit immediately any time through signaling.
TODO : Detect and react to vanishing network link.
2017-05-08
Initial release, version 1.

107
dbus_saf_adaptor.hpp Normal file
View File

@@ -0,0 +1,107 @@
/*
* This file was automatically generated by dbusxx-xml2cpp; DO NOT EDIT!
*/
#ifndef __dbusxx__dbus_saf_adaptor_hpp__ADAPTOR_MARSHAL_H
#define __dbusxx__dbus_saf_adaptor_hpp__ADAPTOR_MARSHAL_H
#include <dbus-c++/dbus.h>
#include <cassert>
namespace xmpp {
class saf_adaptor
: public ::DBus::InterfaceAdaptor
{
public:
saf_adaptor()
: ::DBus::InterfaceAdaptor("xmpp.saf")
{
register_method(saf_adaptor, Quit, _Quit_stub);
register_method(saf_adaptor, SendMsg, _SendMsg_stub);
}
::DBus::IntrospectedInterface *introspect() const
{
static ::DBus::IntrospectedArgument Quit_args[] =
{
{ 0, "", false },
{ 0, 0, 0 }
};
static ::DBus::IntrospectedArgument SendMsg_args[] =
{
{ "recipient", "s", true },
{ "msg", "s", true },
{ 0, 0, 0 }
};
static ::DBus::IntrospectedMethod saf_adaptor_methods[] =
{
{ "Quit", Quit_args },
{ "SendMsg", SendMsg_args },
{ 0, 0 }
};
static ::DBus::IntrospectedMethod saf_adaptor_signals[] =
{
{ 0, 0 }
};
static ::DBus::IntrospectedProperty saf_adaptor_properties[] =
{
{ 0, 0, 0, 0 }
};
static ::DBus::IntrospectedInterface saf_adaptor_interface =
{
"xmpp.saf",
saf_adaptor_methods,
saf_adaptor_signals,
saf_adaptor_properties
};
return &saf_adaptor_interface;
}
public:
/* properties exposed by this interface, use
* property() and property(value) to get and set a particular property
*/
public:
/* methods exported by this interface,
* you will have to implement them in your ObjectAdaptor
*/
virtual void Quit() = 0;
virtual void SendMsg(const std::string& recipient, const std::string& msg) = 0;
public:
/* signal emitters for this interface
*/
private:
/* unmarshalers (to unpack the DBus message before calling the actual interface method)
*/
::DBus::Message _Quit_stub(const ::DBus::CallMessage &call)
{
::DBus::MessageIter ri = call.reader();
Quit();
::DBus::ReturnMessage reply(call);
return reply;
}
::DBus::Message _SendMsg_stub(const ::DBus::CallMessage &call)
{
::DBus::MessageIter ri = call.reader();
std::string argin1; ri >> argin1;
std::string argin2; ri >> argin2;
SendMsg(argin1, argin2);
::DBus::ReturnMessage reply(call);
return reply;
}
};
}
#endif //__dbusxx__dbus_saf_adaptor_hpp__ADAPTOR_MARSHAL_H

63
dbus_saf_proxy.hpp Normal file
View File

@@ -0,0 +1,63 @@
/*
* This file was automatically generated by dbusxx-xml2cpp; DO NOT EDIT!
*/
#ifndef __dbusxx__dbus_saf_proxy_hpp__PROXY_MARSHAL_H
#define __dbusxx__dbus_saf_proxy_hpp__PROXY_MARSHAL_H
#include <dbus-c++/dbus.h>
#include <cassert>
namespace xmpp {
class saf_proxy
: public ::DBus::InterfaceProxy
{
public:
saf_proxy()
: ::DBus::InterfaceProxy("xmpp.saf")
{
}
public:
/* properties exported by this interface */
public:
/* methods exported by this interface,
* this functions will invoke the corresponding methods on the remote objects
*/
void Quit()
{
::DBus::CallMessage call;
call.member("Quit");
::DBus::Message ret = invoke_method (call);
}
void SendMsg(const std::string& recipient, const std::string& msg)
{
::DBus::CallMessage call;
::DBus::MessageIter wi = call.writer();
wi << recipient;
wi << msg;
call.member("SendMsg");
::DBus::Message ret = invoke_method (call);
}
public:
/* signal handlers for this interface
*/
private:
/* unmarshalers (to unpack the DBus message before calling the actual signal handler)
*/
};
}
#endif //__dbusxx__dbus_saf_proxy_hpp__PROXY_MARSHAL_H

19
gcc_version.h Normal file
View File

@@ -0,0 +1,19 @@
/*
* Author: SET - nmset@netcourrier.com
* License : GPL v2
* Copyright SET - © 2017
*
* Created on 2 juin 2017, 17:35
*/
#ifndef GCC_VERSION_H
#define GCC_VERSION_H
// Include at top of every file dealing with DBus
#if __GNUC__ == 7
#define DBUS_HAS_RECURSIVE_MUTEX
#endif
#endif /* GCC_VERSION_H */

26
globals.h Normal file
View File

@@ -0,0 +1,26 @@
/*
* File: globals.h
* Author: SET - nmset@netcourrier.com
* License : GPL v2
* Copyright SET - © 2017
*
* Created on 6 mai 2017, 18:23
*/
#ifndef GLOBALS_H
#define GLOBALS_H
#include <string>
using namespace std;
#define _APPNAME_ "saf7" // Send and forget
#define _APP_DESCRIPTION_ "Send and forget an XMPP message"
#define _VERSION_ "4"
#define _AUTHOR_ "SET, M.D., nmset@netcourrier.com"
#define _ABOUT_ string(_APPNAME_) + string(" - version ") + string(_VERSION_) \
+ string(" - ") + string(_APP_DESCRIPTION_) \
+ string("\nAuthor : ") + string(_AUTHOR_) \
+ string("\nLicense : GPL v2")
#endif /* GLOBALS_H */

200
main.cpp Normal file
View File

@@ -0,0 +1,200 @@
/*
* File: main.cpp
* Author: SET - nmset@netcourrier.com
* License : GPL v2
* Copyright SET - © 2017
*
* Created on 6 mai 2017, 18:21
*/
#include "gcc_version.h"
#include <cstdlib>
#include <iostream>
#include "SAF.h"
#include "globals.h"
#include <string>
#include <fstream>
#include <signal.h>
#include <boost/program_options.hpp>
#include <gloox/client.h>
#include <gloox/disco.h>
#include "DBusSafWorkers.h"
using namespace std;
namespace po = boost::program_options;
string g_config = ""; // A configuration file.
string g_jid = "";
string g_password = "";
string g_resource = "SAF";
string g_server = "";
string g_tag = "default";
uint g_port = 5222;
uint g_retry = 0;
uint g_delay = 30;
uint g_wsping = 0;
bool g_verbose = false;
gloox::Client * g_client = NULL;
DBus::BusDispatcher g_dispatcher;
SAFConnListener * g_saf = NULL;
Connector * g_connector = NULL;
DBusSafAdaptor * g_adaptor_worker = NULL;
/**
* TODO : Detect and react to vanishing network link.
*/
/*
* http://www.radmangames.com/programming/how-to-use-boost-program_options
* https://blog.knatten.org/2012/03/23/basic-gloox-tutorial/
* https://camaya.net/api/gloox-1.0.20/
*/
/**
* Cleaup and exit. Return code is 0 because we want to exit this way.
* @param sn
*/
void signalhandler(int sn)
{
delete g_connector;
/* Cant delete adaptor_worker without a seg fault, this function is called from there.
* Anyway, we are exiting.
*/
//delete adaptor_worker;
delete g_client;
delete g_saf;
if (g_verbose)
cout << "Signaled to exit." << endl;
exit(0);
}
bool GetAndValidateParams(int argc, char** argv)
{
try
{
po::options_description desc(_ABOUT_);
desc.add_options()
("help,h", "Print help messages")
("jid,j", po::value<string>(&g_jid), "Full JID without resource")
("password,w", po::value<string>(&g_password), "Password")
("resource,r", po::value<string>(&g_resource), "Resource (optional)")
("server,s", po::value<string>(&g_server), "Server (optional)")
("port,p", po::value<uint>(&g_port), "Port (optional), default = 5222")
("retry,y", po::value<uint>(&g_retry), "Number of times to try to connect to server (optional), default = 0 (for ever)")
("delay,d", po::value<uint>(&g_delay), "Number of seconds between each connection attempt (optional), default = 30")
("wsping,g", po::value<uint>(&g_wsping), "Number of seconds between each whitespace ping to the server (optional), default = 0 (never), at least 55")
("bustag,t", po::value<string>(&g_tag), "Bus name tag (optional), default=default")
("config,c", po::value<string>(&g_config), "Use specified configuration file (optional), else, pass all parameters on the command line")
("verbose,v", "Show messages (optional). Command line only.");
po::variables_map vm;
po::variables_map vmc;
try
{
po::store(po::parse_command_line(argc, argv, desc), vm);
if (vm.count("help"))
{
cout << desc << endl;
return 0;
}
po::notify(vm);
if (vm.count("verbose"))
{
g_verbose = true;
}
/*
* If a config file is in the command line,
* its content overrides all other parameters.
*/
if (vm.count("config"))
{
ifstream f(g_config);
if (f.fail())
{
cerr << "Failure with file : " << g_config << endl;
return 0;
}
po::store(po::parse_config_file(f, desc), vmc);
po::notify(vmc);
}
}
catch (po::error& eb)
{
cerr << "Error : " << eb.what() << endl;
return 0;
}
}
catch (exception& e)
{
cerr << "Error : " << e.what() << endl;
return 0;
}
if (g_jid.empty())
{
cout << "jid missing." << endl;
return 0;
}
if (g_password.empty())
{
cout << "password missing." << endl;
return 0;
}
if (g_wsping > 0 && g_wsping < 55 )
{
cout << "wsping must be at least 55 seconds." << endl;
return 0;
}
return true;
}
DBusSafAdaptor* StartDBusAdaptor(Connector * connector, SAFConnListener * saf)
{
DBus::_init_threading();
DBus::default_dispatcher = &g_dispatcher;
#ifdef DEVTIME // Defined in Debug NetBeans configuration
DBus::Connection bus = DBus::Connection::SessionBus();
#else
DBus::Connection bus = DBus::Connection::SystemBus();
#endif
const string busName = string("xmpp.saf-") + g_tag;
bus.request_name(busName.data());
DBusSafAdaptor * adaptor_worker = new DBusSafAdaptor(bus, connector, saf);
return adaptor_worker;
}
int main(int argc, char** argv)
{
if (!GetAndValidateParams(argc, argv))
return 0;
signal(SIGINT, signalhandler);
signal(SIGTERM, signalhandler);
JID ajid(g_jid + "/" + g_resource);
g_client = new Client(ajid, g_password, g_port);
if (!g_server.empty())
g_client->setServer(g_server);
g_client->setPort(g_port);
g_client->disco()->setIdentity("client", "7", "saf");
g_saf = new SAFConnListener(g_client);
g_connector = new Connector(g_saf, g_retry, g_delay);
// Listen on DBus
g_adaptor_worker = StartDBusAdaptor(g_connector, g_saf);
// Connect to server
g_connector->DoConnect(); // Blocks
//cout << g_client->getStatistics().encryption << endl;
delete g_adaptor_worker;
delete g_connector;
delete g_client;
delete g_saf;
return 0;
}

View File

@@ -0,0 +1,95 @@
#
# Generated Makefile - do not edit!
#
# Edit the Makefile in the project folder instead (../Makefile). Each target
# has a -pre and a -post target defined where you can add customized code.
#
# This makefile implements configuration specific macros and targets.
# Environment
MKDIR=mkdir
CP=cp
GREP=grep
NM=nm
CCADMIN=CCadmin
RANLIB=ranlib
CC=gcc
CCC=g++
CXX=g++
FC=gfortran
AS=as
# Macros
CND_PLATFORM=GNU-Linux
CND_DLIB_EXT=so
CND_CONF=Debug
CND_DISTDIR=dist
CND_BUILDDIR=build
# Include project Makefile
include Makefile
# Object Directory
OBJECTDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM}
# Object Files
OBJECTFILES= \
${OBJECTDIR}/DBusSafWorkers.o \
${OBJECTDIR}/SAF.o \
${OBJECTDIR}/main.o
# C Compiler Flags
CFLAGS=
# CC Compiler Flags
CCFLAGS=-pthread
CXXFLAGS=-pthread
# Fortran Compiler Flags
FFLAGS=
# Assembler Flags
ASFLAGS=
# Link Libraries and Options
LDLIBSOPTIONS=-lboost_program_options -lgloox -ldbus-c++-1
# Build Targets
.build-conf: ${BUILD_SUBPROJECTS}
"${MAKE}" -f nbproject/Makefile-${CND_CONF}.mk ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/saf7
${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/saf7: ${OBJECTFILES}
${MKDIR} -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}
${LINK.cc} -o ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/saf7 ${OBJECTFILES} ${LDLIBSOPTIONS}
${OBJECTDIR}/DBusSafWorkers.o: DBusSafWorkers.cpp
${MKDIR} -p ${OBJECTDIR}
${RM} "$@.d"
$(COMPILE.cc) -g -DDBUS_API_SUBJECT_TO_CHANGE -DDEVTIME -I/usr/include/dbus-1.0 -I/usr/include/dbus-c++-1 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/DBusSafWorkers.o DBusSafWorkers.cpp
${OBJECTDIR}/SAF.o: SAF.cpp
${MKDIR} -p ${OBJECTDIR}
${RM} "$@.d"
$(COMPILE.cc) -g -DDBUS_API_SUBJECT_TO_CHANGE -DDEVTIME -I/usr/include/dbus-1.0 -I/usr/include/dbus-c++-1 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/SAF.o SAF.cpp
${OBJECTDIR}/main.o: main.cpp
${MKDIR} -p ${OBJECTDIR}
${RM} "$@.d"
$(COMPILE.cc) -g -DDBUS_API_SUBJECT_TO_CHANGE -DDEVTIME -I/usr/include/dbus-1.0 -I/usr/include/dbus-c++-1 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/main.o main.cpp
# Subprojects
.build-subprojects:
# Clean Targets
.clean-conf: ${CLEAN_SUBPROJECTS}
${RM} -r ${CND_BUILDDIR}/${CND_CONF}
# Subprojects
.clean-subprojects:
# Enable dependency checking
.dep.inc: .depcheck-impl
include .dep.inc

View File

@@ -0,0 +1,95 @@
#
# Generated Makefile - do not edit!
#
# Edit the Makefile in the project folder instead (../Makefile). Each target
# has a -pre and a -post target defined where you can add customized code.
#
# This makefile implements configuration specific macros and targets.
# Environment
MKDIR=mkdir
CP=cp
GREP=grep
NM=nm
CCADMIN=CCadmin
RANLIB=ranlib
CC=gcc
CCC=g++
CXX=g++
FC=gfortran
AS=as
# Macros
CND_PLATFORM=GNU-Linux
CND_DLIB_EXT=so
CND_CONF=Release
CND_DISTDIR=dist
CND_BUILDDIR=build
# Include project Makefile
include Makefile
# Object Directory
OBJECTDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM}
# Object Files
OBJECTFILES= \
${OBJECTDIR}/DBusSafWorkers.o \
${OBJECTDIR}/SAF.o \
${OBJECTDIR}/main.o
# C Compiler Flags
CFLAGS=
# CC Compiler Flags
CCFLAGS=-pthread
CXXFLAGS=-pthread
# Fortran Compiler Flags
FFLAGS=
# Assembler Flags
ASFLAGS=
# Link Libraries and Options
LDLIBSOPTIONS=-lboost_program_options -lgloox -ldbus-c++-1
# Build Targets
.build-conf: ${BUILD_SUBPROJECTS}
"${MAKE}" -f nbproject/Makefile-${CND_CONF}.mk ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/saf7
${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/saf7: ${OBJECTFILES}
${MKDIR} -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}
${LINK.cc} -o ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/saf7 ${OBJECTFILES} ${LDLIBSOPTIONS} -s
${OBJECTDIR}/DBusSafWorkers.o: DBusSafWorkers.cpp
${MKDIR} -p ${OBJECTDIR}
${RM} "$@.d"
$(COMPILE.cc) -O2 -s -DDBUS_API_SUBJECT_TO_CHANGE -I/usr/include/dbus-1.0 -I/usr/include/dbus-c++-1 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/DBusSafWorkers.o DBusSafWorkers.cpp
${OBJECTDIR}/SAF.o: SAF.cpp
${MKDIR} -p ${OBJECTDIR}
${RM} "$@.d"
$(COMPILE.cc) -O2 -s -DDBUS_API_SUBJECT_TO_CHANGE -I/usr/include/dbus-1.0 -I/usr/include/dbus-c++-1 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/SAF.o SAF.cpp
${OBJECTDIR}/main.o: main.cpp
${MKDIR} -p ${OBJECTDIR}
${RM} "$@.d"
$(COMPILE.cc) -O2 -s -DDBUS_API_SUBJECT_TO_CHANGE -I/usr/include/dbus-1.0 -I/usr/include/dbus-c++-1 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/main.o main.cpp
# Subprojects
.build-subprojects:
# Clean Targets
.clean-conf: ${CLEAN_SUBPROJECTS}
${RM} -r ${CND_BUILDDIR}/${CND_CONF}
# Subprojects
.clean-subprojects:
# Enable dependency checking
.dep.inc: .depcheck-impl
include .dep.inc

133
nbproject/Makefile-impl.mk Normal file
View File

@@ -0,0 +1,133 @@
#
# Generated Makefile - do not edit!
#
# Edit the Makefile in the project folder instead (../Makefile). Each target
# has a pre- and a post- target defined where you can add customization code.
#
# This makefile implements macros and targets common to all configurations.
#
# NOCDDL
# Building and Cleaning subprojects are done by default, but can be controlled with the SUB
# macro. If SUB=no, subprojects will not be built or cleaned. The following macro
# statements set BUILD_SUB-CONF and CLEAN_SUB-CONF to .build-reqprojects-conf
# and .clean-reqprojects-conf unless SUB has the value 'no'
SUB_no=NO
SUBPROJECTS=${SUB_${SUB}}
BUILD_SUBPROJECTS_=.build-subprojects
BUILD_SUBPROJECTS_NO=
BUILD_SUBPROJECTS=${BUILD_SUBPROJECTS_${SUBPROJECTS}}
CLEAN_SUBPROJECTS_=.clean-subprojects
CLEAN_SUBPROJECTS_NO=
CLEAN_SUBPROJECTS=${CLEAN_SUBPROJECTS_${SUBPROJECTS}}
# Project Name
PROJECTNAME=saf7
# Active Configuration
DEFAULTCONF=Debug
CONF=${DEFAULTCONF}
# All Configurations
ALLCONFS=Debug Release
# build
.build-impl: .build-pre .validate-impl .depcheck-impl
@#echo "=> Running $@... Configuration=$(CONF)"
"${MAKE}" -f nbproject/Makefile-${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .build-conf
# clean
.clean-impl: .clean-pre .validate-impl .depcheck-impl
@#echo "=> Running $@... Configuration=$(CONF)"
"${MAKE}" -f nbproject/Makefile-${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .clean-conf
# clobber
.clobber-impl: .clobber-pre .depcheck-impl
@#echo "=> Running $@..."
for CONF in ${ALLCONFS}; \
do \
"${MAKE}" -f nbproject/Makefile-$${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .clean-conf; \
done
# all
.all-impl: .all-pre .depcheck-impl
@#echo "=> Running $@..."
for CONF in ${ALLCONFS}; \
do \
"${MAKE}" -f nbproject/Makefile-$${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .build-conf; \
done
# build tests
.build-tests-impl: .build-impl .build-tests-pre
@#echo "=> Running $@... Configuration=$(CONF)"
"${MAKE}" -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .build-tests-conf
# run tests
.test-impl: .build-tests-impl .test-pre
@#echo "=> Running $@... Configuration=$(CONF)"
"${MAKE}" -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .test-conf
# dependency checking support
.depcheck-impl:
@echo "# This code depends on make tool being used" >.dep.inc
@if [ -n "${MAKE_VERSION}" ]; then \
echo "DEPFILES=\$$(wildcard \$$(addsuffix .d, \$${OBJECTFILES} \$${TESTOBJECTFILES}))" >>.dep.inc; \
echo "ifneq (\$${DEPFILES},)" >>.dep.inc; \
echo "include \$${DEPFILES}" >>.dep.inc; \
echo "endif" >>.dep.inc; \
else \
echo ".KEEP_STATE:" >>.dep.inc; \
echo ".KEEP_STATE_FILE:.make.state.\$${CONF}" >>.dep.inc; \
fi
# configuration validation
.validate-impl:
@if [ ! -f nbproject/Makefile-${CONF}.mk ]; \
then \
echo ""; \
echo "Error: can not find the makefile for configuration '${CONF}' in project ${PROJECTNAME}"; \
echo "See 'make help' for details."; \
echo "Current directory: " `pwd`; \
echo ""; \
fi
@if [ ! -f nbproject/Makefile-${CONF}.mk ]; \
then \
exit 1; \
fi
# help
.help-impl: .help-pre
@echo "This makefile supports the following configurations:"
@echo " ${ALLCONFS}"
@echo ""
@echo "and the following targets:"
@echo " build (default target)"
@echo " clean"
@echo " clobber"
@echo " all"
@echo " help"
@echo ""
@echo "Makefile Usage:"
@echo " make [CONF=<CONFIGURATION>] [SUB=no] build"
@echo " make [CONF=<CONFIGURATION>] [SUB=no] clean"
@echo " make [SUB=no] clobber"
@echo " make [SUB=no] all"
@echo " make help"
@echo ""
@echo "Target 'build' will build a specific configuration and, unless 'SUB=no',"
@echo " also build subprojects."
@echo "Target 'clean' will clean a specific configuration and, unless 'SUB=no',"
@echo " also clean subprojects."
@echo "Target 'clobber' will remove all built files from all configurations and,"
@echo " unless 'SUB=no', also from subprojects."
@echo "Target 'all' will will build all configurations and, unless 'SUB=no',"
@echo " also build subprojects."
@echo "Target 'help' prints this message."
@echo ""

View File

@@ -0,0 +1,35 @@
#
# Generated - do not edit!
#
# NOCDDL
#
CND_BASEDIR=`pwd`
CND_BUILDDIR=build
CND_DISTDIR=dist
# Debug configuration
CND_PLATFORM_Debug=GNU-Linux
CND_ARTIFACT_DIR_Debug=dist/Debug/GNU-Linux
CND_ARTIFACT_NAME_Debug=saf7
CND_ARTIFACT_PATH_Debug=dist/Debug/GNU-Linux/saf7
CND_PACKAGE_DIR_Debug=dist/Debug/GNU-Linux/package
CND_PACKAGE_NAME_Debug=saf7.tar
CND_PACKAGE_PATH_Debug=dist/Debug/GNU-Linux/package/saf7.tar
# Release configuration
CND_PLATFORM_Release=GNU-Linux
CND_ARTIFACT_DIR_Release=dist/Release/GNU-Linux
CND_ARTIFACT_NAME_Release=saf7
CND_ARTIFACT_PATH_Release=dist/Release/GNU-Linux/saf7
CND_PACKAGE_DIR_Release=dist/Release/GNU-Linux/package
CND_PACKAGE_NAME_Release=saf7.tar
CND_PACKAGE_PATH_Release=dist/Release/GNU-Linux/package/saf7.tar
#
# include compiler specific variables
#
# dmake command
ROOT:sh = test -f nbproject/private/Makefile-variables.mk || \
(mkdir -p nbproject/private && touch nbproject/private/Makefile-variables.mk)
#
# gmake command
.PHONY: $(shell test -f nbproject/private/Makefile-variables.mk || (mkdir -p nbproject/private && touch nbproject/private/Makefile-variables.mk))
#
include nbproject/private/Makefile-variables.mk

View File

@@ -0,0 +1,76 @@
#!/bin/bash -x
#
# Generated - do not edit!
#
# Macros
TOP=`pwd`
CND_PLATFORM=GNU-Linux
CND_CONF=Debug
CND_DISTDIR=dist
CND_BUILDDIR=build
CND_DLIB_EXT=so
NBTMPDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM}/tmp-packaging
TMPDIRNAME=tmp-packaging
OUTPUT_PATH=${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/saf7
OUTPUT_BASENAME=saf7
PACKAGE_TOP_DIR=saf7/
# Functions
function checkReturnCode
{
rc=$?
if [ $rc != 0 ]
then
exit $rc
fi
}
function makeDirectory
# $1 directory path
# $2 permission (optional)
{
mkdir -p "$1"
checkReturnCode
if [ "$2" != "" ]
then
chmod $2 "$1"
checkReturnCode
fi
}
function copyFileToTmpDir
# $1 from-file path
# $2 to-file path
# $3 permission
{
cp "$1" "$2"
checkReturnCode
if [ "$3" != "" ]
then
chmod $3 "$2"
checkReturnCode
fi
}
# Setup
cd "${TOP}"
mkdir -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package
rm -rf ${NBTMPDIR}
mkdir -p ${NBTMPDIR}
# Copy files and create directories and links
cd "${TOP}"
makeDirectory "${NBTMPDIR}/saf7/bin"
copyFileToTmpDir "${OUTPUT_PATH}" "${NBTMPDIR}/${PACKAGE_TOP_DIR}bin/${OUTPUT_BASENAME}" 0755
# Generate tar file
cd "${TOP}"
rm -f ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/saf7.tar
cd ${NBTMPDIR}
tar -vcf ../../../../${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/saf7.tar *
checkReturnCode
# Cleanup
cd "${TOP}"
rm -rf ${NBTMPDIR}

View File

@@ -0,0 +1,76 @@
#!/bin/bash -x
#
# Generated - do not edit!
#
# Macros
TOP=`pwd`
CND_PLATFORM=GNU-Linux
CND_CONF=Release
CND_DISTDIR=dist
CND_BUILDDIR=build
CND_DLIB_EXT=so
NBTMPDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM}/tmp-packaging
TMPDIRNAME=tmp-packaging
OUTPUT_PATH=${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/saf7
OUTPUT_BASENAME=saf7
PACKAGE_TOP_DIR=saf7/
# Functions
function checkReturnCode
{
rc=$?
if [ $rc != 0 ]
then
exit $rc
fi
}
function makeDirectory
# $1 directory path
# $2 permission (optional)
{
mkdir -p "$1"
checkReturnCode
if [ "$2" != "" ]
then
chmod $2 "$1"
checkReturnCode
fi
}
function copyFileToTmpDir
# $1 from-file path
# $2 to-file path
# $3 permission
{
cp "$1" "$2"
checkReturnCode
if [ "$3" != "" ]
then
chmod $3 "$2"
checkReturnCode
fi
}
# Setup
cd "${TOP}"
mkdir -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package
rm -rf ${NBTMPDIR}
mkdir -p ${NBTMPDIR}
# Copy files and create directories and links
cd "${TOP}"
makeDirectory "${NBTMPDIR}/saf7/bin"
copyFileToTmpDir "${OUTPUT_PATH}" "${NBTMPDIR}/${PACKAGE_TOP_DIR}bin/${OUTPUT_BASENAME}" 0755
# Generate tar file
cd "${TOP}"
rm -f ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/saf7.tar
cd ${NBTMPDIR}
tar -vcf ../../../../${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/saf7.tar *
checkReturnCode
# Cleanup
cd "${TOP}"
rm -rf ${NBTMPDIR}

View File

@@ -0,0 +1,140 @@
<?xml version="1.0" encoding="UTF-8"?>
<configurationDescriptor version="100">
<logicalFolder name="root" displayName="root" projectFiles="true" kind="ROOT">
<logicalFolder name="HeaderFiles"
displayName="Header Files"
projectFiles="true">
<itemPath>DBusSafWorkers.h</itemPath>
<itemPath>SAF.h</itemPath>
<itemPath>gcc_version.h</itemPath>
<itemPath>globals.h</itemPath>
</logicalFolder>
<logicalFolder name="ResourceFiles"
displayName="Resource Files"
projectFiles="true">
</logicalFolder>
<logicalFolder name="SourceFiles"
displayName="Source Files"
projectFiles="true">
<itemPath>DBusSafWorkers.cpp</itemPath>
<itemPath>SAF.cpp</itemPath>
<itemPath>dbus_saf_adaptor.hpp</itemPath>
<itemPath>dbus_saf_proxy.hpp</itemPath>
<itemPath>main.cpp</itemPath>
</logicalFolder>
<logicalFolder name="TestFiles"
displayName="Test Files"
projectFiles="false"
kind="TEST_LOGICAL_FOLDER">
</logicalFolder>
<logicalFolder name="ExternalFiles"
displayName="Important Files"
projectFiles="false"
kind="IMPORTANT_FILES_FOLDER">
<itemPath>Makefile</itemPath>
<itemPath>PKGBUILD</itemPath>
<itemPath>change.log</itemPath>
<itemPath>saf.xml</itemPath>
<itemPath>saf7-default.conf</itemPath>
<itemPath>saf7-default.rc.template</itemPath>
<itemPath>saf7-default.service</itemPath>
<itemPath>saf7_Quit.sh</itemPath>
<itemPath>saf7_SendMsg.sh</itemPath>
</logicalFolder>
</logicalFolder>
<projectmakefile>Makefile</projectmakefile>
<confs>
<conf name="Debug" type="1">
<toolsSet>
<compilerSet>default</compilerSet>
<dependencyChecking>true</dependencyChecking>
<rebuildPropChanged>false</rebuildPropChanged>
</toolsSet>
<compileType>
<ccTool>
<incDir>
<pElem>/usr/include/dbus-1.0</pElem>
<pElem>/usr/include/dbus-c++-1</pElem>
</incDir>
<commandLine>-pthread</commandLine>
<preprocessorList>
<Elem>DBUS_API_SUBJECT_TO_CHANGE</Elem>
<Elem>DEVTIME</Elem>
</preprocessorList>
</ccTool>
<linkerTool>
<linkerLibItems>
<linkerLibLibItem>boost_program_options</linkerLibLibItem>
<linkerLibLibItem>gloox</linkerLibLibItem>
<linkerLibLibItem>dbus-c++-1</linkerLibLibItem>
</linkerLibItems>
</linkerTool>
</compileType>
<item path="DBusSafWorkers.cpp" ex="false" tool="1" flavor2="0">
</item>
<item path="DBusSafWorkers.h" ex="false" tool="3" flavor2="0">
</item>
<item path="SAF.cpp" ex="false" tool="1" flavor2="0">
</item>
<item path="SAF.h" ex="false" tool="3" flavor2="0">
</item>
<item path="dbus_saf_adaptor.hpp" ex="false" tool="3" flavor2="0">
</item>
<item path="dbus_saf_proxy.hpp" ex="false" tool="3" flavor2="0">
</item>
<item path="gcc_version.h" ex="false" tool="3" flavor2="0">
</item>
<item path="globals.h" ex="false" tool="3" flavor2="0">
</item>
<item path="main.cpp" ex="false" tool="1" flavor2="0">
</item>
</conf>
<conf name="Release" type="1">
<toolsSet>
<compilerSet>default</compilerSet>
<dependencyChecking>true</dependencyChecking>
<rebuildPropChanged>false</rebuildPropChanged>
</toolsSet>
<compileType>
<ccTool>
<developmentMode>5</developmentMode>
<stripSymbols>true</stripSymbols>
<incDir>
<pElem>/usr/include/dbus-1.0</pElem>
<pElem>/usr/include/dbus-c++-1</pElem>
</incDir>
<commandLine>-pthread</commandLine>
<preprocessorList>
<Elem>DBUS_API_SUBJECT_TO_CHANGE</Elem>
</preprocessorList>
</ccTool>
<linkerTool>
<stripSymbols>true</stripSymbols>
<linkerLibItems>
<linkerLibLibItem>boost_program_options</linkerLibLibItem>
<linkerLibLibItem>gloox</linkerLibLibItem>
<linkerLibLibItem>dbus-c++-1</linkerLibLibItem>
</linkerLibItems>
</linkerTool>
</compileType>
<item path="DBusSafWorkers.cpp" ex="false" tool="1" flavor2="0">
</item>
<item path="DBusSafWorkers.h" ex="false" tool="3" flavor2="0">
</item>
<item path="SAF.cpp" ex="false" tool="1" flavor2="0">
</item>
<item path="SAF.h" ex="false" tool="3" flavor2="0">
</item>
<item path="dbus_saf_adaptor.hpp" ex="false" tool="3" flavor2="0">
</item>
<item path="dbus_saf_proxy.hpp" ex="false" tool="3" flavor2="0">
</item>
<item path="gcc_version.h" ex="false" tool="3" flavor2="0">
</item>
<item path="globals.h" ex="false" tool="3" flavor2="0">
</item>
<item path="main.cpp" ex="false" tool="1" flavor2="0">
</item>
</conf>
</confs>
</configurationDescriptor>

View File

@@ -0,0 +1,7 @@
#
# Generated - do not edit!
#
# NOCDDL
#
# Debug configuration
# Release configuration

View File

@@ -0,0 +1,75 @@
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright (c) 2016 Oracle and/or its affiliates. All rights reserved.
*
* Oracle and Java are registered trademarks of Oracle and/or its affiliates.
* Other names may be trademarks of their respective owners.
*
* The contents of this file are subject to the terms of either the GNU
* General Public License Version 2 only ("GPL") or the Common
* Development and Distribution License("CDDL") (collectively, the
* "License"). You may not use this file except in compliance with the
* License. You can obtain a copy of the License at
* http://www.netbeans.org/cddl-gplv2.html
* or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
* specific language governing permissions and limitations under the
* License. When distributing the software, include this License Header
* Notice in each file and include the License file at
* nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the GPL Version 2 section of the License file that
* accompanied this code. If applicable, add the following below the
* License Header, with the fields enclosed by brackets [] replaced by
* your own identifying information:
* "Portions Copyrighted [year] [name of copyright owner]"
*
* If you wish your version of this file to be governed by only the CDDL
* or only the GPL Version 2, indicate your decision by adding
* "[Contributor] elects to include this software in this distribution
* under the [CDDL or GPL Version 2] license." If you do not indicate a
* single choice of license, a recipient has the option to distribute
* your version of this file under either the CDDL, the GPL Version 2 or
* to extend the choice of license to its licensees as provided above.
* However, if you add GPL Version 2 code and therefore, elected the GPL
* Version 2 license, then the option applies only if the new code is
* made subject to such option by the copyright holder.
*
* Contributor(s):
*/
// List of standard headers was taken in http://en.cppreference.com/w/c/header
#include <assert.h> // Conditionally compiled macro that compares its argument to zero
#include <ctype.h> // Functions to determine the type contained in character data
#include <errno.h> // Macros reporting error conditions
#include <float.h> // Limits of float types
#include <limits.h> // Sizes of basic types
#include <locale.h> // Localization utilities
#include <math.h> // Common mathematics functions
#include <setjmp.h> // Nonlocal jumps
#include <signal.h> // Signal handling
#include <stdarg.h> // Variable arguments
#include <stddef.h> // Common macro definitions
#include <stdio.h> // Input/output
#include <string.h> // String handling
#include <stdlib.h> // General utilities: memory management, program utilities, string conversions, random numbers
#include <time.h> // Time/date utilities
#include <iso646.h> // (since C95) Alternative operator spellings
#include <wchar.h> // (since C95) Extended multibyte and wide character utilities
#include <wctype.h> // (since C95) Wide character classification and mapping utilities
#ifdef _STDC_C99
#include <complex.h> // (since C99) Complex number arithmetic
#include <fenv.h> // (since C99) Floating-point environment
#include <inttypes.h> // (since C99) Format conversion of integer types
#include <stdbool.h> // (since C99) Boolean type
#include <stdint.h> // (since C99) Fixed-width integer types
#include <tgmath.h> // (since C99) Type-generic math (macros wrapping math.h and complex.h)
#endif
#ifdef _STDC_C11
#include <stdalign.h> // (since C11) alignas and alignof convenience macros
#include <stdatomic.h> // (since C11) Atomic types
#include <stdnoreturn.h> // (since C11) noreturn convenience macros
#include <threads.h> // (since C11) Thread library
#include <uchar.h> // (since C11) UTF-16 and UTF-32 character utilities
#endif

View File

@@ -0,0 +1,80 @@
<?xml version="1.0" encoding="UTF-8"?>
<configurationDescriptor version="100">
<projectmakefile>Makefile</projectmakefile>
<confs>
<conf name="Debug" type="1">
<toolsSet>
<developmentServer>localhost</developmentServer>
<platform>2</platform>
</toolsSet>
<dbx_gdbdebugger version="1">
<gdb_pathmaps>
</gdb_pathmaps>
<gdb_interceptlist>
<gdbinterceptoptions gdb_all="false" gdb_unhandled="true" gdb_unexpected="true"/>
</gdb_interceptlist>
<gdb_options>
<DebugOptions>
</DebugOptions>
</gdb_options>
<gdb_buildfirst gdb_buildfirst_overriden="false" gdb_buildfirst_old="false"/>
</dbx_gdbdebugger>
<nativedebugger version="1">
<engine>gdb</engine>
</nativedebugger>
<runprofile version="9">
<runcommandpicklist>
<runcommandpicklistitem>"${OUTPUT_PATH}"</runcommandpicklistitem>
<runcommandpicklistitem>"${OUTPUT_PATH}" -c /home/user/.xmpp-saf.rc</runcommandpicklistitem>
<runcommandpicklistitem>"${OUTPUT_PATH}" -c /home/user/saf7-default.rc</runcommandpicklistitem>
<runcommandpicklistitem>"${OUTPUT_PATH}" -c /home/user/.saf7-default.rc</runcommandpicklistitem>
<runcommandpicklistitem>"${OUTPUT_PATH}" -c /home/user/.saf7-pro.rc</runcommandpicklistitem>
<runcommandpicklistitem>"${OUTPUT_PATH}" -v -c /home/user/.saf7-pro.rc</runcommandpicklistitem>
</runcommandpicklist>
<runcommand>"${OUTPUT_PATH}" -v -c /home/user/.saf7-pro.rc</runcommand>
<rundir></rundir>
<buildfirst>true</buildfirst>
<terminal-type>0</terminal-type>
<remove-instrumentation>0</remove-instrumentation>
<environment>
</environment>
</runprofile>
</conf>
<conf name="Release" type="1">
<toolsSet>
<developmentServer>localhost</developmentServer>
<platform>2</platform>
</toolsSet>
<dbx_gdbdebugger version="1">
<gdb_pathmaps>
</gdb_pathmaps>
<gdb_interceptlist>
<gdbinterceptoptions gdb_all="false" gdb_unhandled="true" gdb_unexpected="true"/>
</gdb_interceptlist>
<gdb_options>
<DebugOptions>
</DebugOptions>
</gdb_options>
<gdb_buildfirst gdb_buildfirst_overriden="false" gdb_buildfirst_old="false"/>
</dbx_gdbdebugger>
<nativedebugger version="1">
<engine>gdb</engine>
</nativedebugger>
<runprofile version="9">
<runcommandpicklist>
<runcommandpicklistitem>"${OUTPUT_PATH}"</runcommandpicklistitem>
<runcommandpicklistitem>"${OUTPUT_PATH}" -c /home/user/.xmpp-saf.rc</runcommandpicklistitem>
<runcommandpicklistitem>"${OUTPUT_PATH}" -c /home/user/.saf7-defaultrc</runcommandpicklistitem>
<runcommandpicklistitem>"${OUTPUT_PATH}" -c /home/user/.saf7-default.rc</runcommandpicklistitem>
</runcommandpicklist>
<runcommand>"${OUTPUT_PATH}" -c /home/user/.saf7-default.rc</runcommand>
<rundir></rundir>
<buildfirst>true</buildfirst>
<terminal-type>0</terminal-type>
<remove-instrumentation>0</remove-instrumentation>
<environment>
</environment>
</runprofile>
</conf>
</confs>
</configurationDescriptor>

View File

@@ -0,0 +1,135 @@
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright (c) 2016 Oracle and/or its affiliates. All rights reserved.
*
* Oracle and Java are registered trademarks of Oracle and/or its affiliates.
* Other names may be trademarks of their respective owners.
*
* The contents of this file are subject to the terms of either the GNU
* General Public License Version 2 only ("GPL") or the Common
* Development and Distribution License("CDDL") (collectively, the
* "License"). You may not use this file except in compliance with the
* License. You can obtain a copy of the License at
* http://www.netbeans.org/cddl-gplv2.html
* or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
* specific language governing permissions and limitations under the
* License. When distributing the software, include this License Header
* Notice in each file and include the License file at
* nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the GPL Version 2 section of the License file that
* accompanied this code. If applicable, add the following below the
* License Header, with the fields enclosed by brackets [] replaced by
* your own identifying information:
* "Portions Copyrighted [year] [name of copyright owner]"
*
* If you wish your version of this file to be governed by only the CDDL
* or only the GPL Version 2, indicate your decision by adding
* "[Contributor] elects to include this software in this distribution
* under the [CDDL or GPL Version 2] license." If you do not indicate a
* single choice of license, a recipient has the option to distribute
* your version of this file under either the CDDL, the GPL Version 2 or
* to extend the choice of license to its licensees as provided above.
* However, if you add GPL Version 2 code and therefore, elected the GPL
* Version 2 license, then the option applies only if the new code is
* made subject to such option by the copyright holder.
*
* Contributor(s):
*/
// List of standard headers was taken in http://en.cppreference.com/w/cpp/header
#include <cstdlib> // General purpose utilities: program control, dynamic memory allocation, random numbers, sort and search
#include <csignal> // Functions and macro constants for signal management
#include <csetjmp> // Macro (and function) that saves (and jumps) to an execution context
#include <cstdarg> // Handling of variable length argument lists
#include <typeinfo> // Runtime type information utilities
#include <bitset> // std::bitset class template
#include <functional> // Function objects, designed for use with the standard algorithms
#include <utility> // Various utility components
#include <ctime> // C-style time/date utilites
#include <cstddef> // typedefs for types such as size_t, NULL and others
#include <new> // Low-level memory management utilities
#include <memory> // Higher level memory management utilities
#include <climits> // limits of integral types
#include <cfloat> // limits of float types
#include <limits> // standardized way to query properties of arithmetic types
#include <exception> // Exception handling utilities
#include <stdexcept> // Standard exception objects
#include <cassert> // Conditionally compiled macro that compares its argument to zero
#include <cerrno> // Macro containing the last error number
#include <cctype> // functions to determine the type contained in character data
#include <cwctype> // functions for determining the type of wide character data
#include <cstring> // various narrow character string handling functions
#include <cwchar> // various wide and multibyte string handling functions
#include <string> // std::basic_string class template
#include <vector> // std::vector container
#include <deque> // std::deque container
#include <list> // std::list container
#include <set> // std::set and std::multiset associative containers
#include <map> // std::map and std::multimap associative containers
#include <stack> // std::stack container adaptor
#include <queue> // std::queue and std::priority_queue container adaptors
#include <algorithm> // Algorithms that operate on containers
#include <iterator> // Container iterators
#include <cmath> // Common mathematics functions
#include <complex> // Complex number type
#include <valarray> // Class for representing and manipulating arrays of values
#include <numeric> // Numeric operations on values in containers
#include <iosfwd> // forward declarations of all classes in the input/output library
#include <ios> // std::ios_base class, std::basic_ios class template and several typedefs
#include <istream> // std::basic_istream class template and several typedefs
#include <ostream> // std::basic_ostream, std::basic_iostream class templates and several typedefs
#include <iostream> // several standard stream objects
#include <fstream> // std::basic_fstream, std::basic_ifstream, std::basic_ofstream class templates and several typedefs
#include <sstream> // std::basic_stringstream, std::basic_istringstream, std::basic_ostringstream class templates and several typedefs
#include <strstream> // std::strstream, std::istrstream, std::ostrstream(deprecated)
#include <iomanip> // Helper functions to control the format or input and output
#include <streambuf> // std::basic_streambuf class template
#include <cstdio> // C-style input-output functions
#include <locale> // Localization utilities
#include <clocale> // C localization utilities
#include <ciso646> // empty header. The macros that appear in iso646.h in C are keywords in C++
#if __cplusplus >= 201103L
#include <typeindex> // (since C++11) std::type_index
#include <type_traits> // (since C++11) Compile-time type information
#include <chrono> // (since C++11) C++ time utilites
#include <initializer_list> // (since C++11) std::initializer_list class template
#include <tuple> // (since C++11) std::tuple class template
#include <scoped_allocator> // (since C++11) Nested allocator class
#include <cstdint> // (since C++11) fixed-size types and limits of other types
#include <cinttypes> // (since C++11) formatting macros , intmax_t and uintmax_t math and conversions
#include <system_error> // (since C++11) defines std::error_code, a platform-dependent error code
#include <cuchar> // (since C++11) C-style Unicode character conversion functions
#include <array> // (since C++11) std::array container
#include <forward_list> // (since C++11) std::forward_list container
#include <unordered_set> // (since C++11) std::unordered_set and std::unordered_multiset unordered associative containers
#include <unordered_map> // (since C++11) std::unordered_map and std::unordered_multimap unordered associative containers
#include <random> // (since C++11) Random number generators and distributions
#include <ratio> // (since C++11) Compile-time rational arithmetic
#include <cfenv> // (since C++11) Floating-point environment access functions
#include <codecvt> // (since C++11) Unicode conversion facilities
#include <regex> // (since C++11) Classes, algorithms and iterators to support regular expression processing
#include <atomic> // (since C++11) Atomic operations library
#include <ccomplex> // (since C++11)(deprecated in C++17) simply includes the header <complex>
#include <ctgmath> // (since C++11)(deprecated in C++17) simply includes the headers <ccomplex> (until C++17)<complex> (since C++17) and <cmath>: the overloads equivalent to the contents of the C header tgmath.h are already provided by those headers
#include <cstdalign> // (since C++11)(deprecated in C++17) defines one compatibility macro constant
#include <cstdbool> // (since C++11)(deprecated in C++17) defines one compatibility macro constant
#include <thread> // (since C++11) std::thread class and supporting functions
#include <mutex> // (since C++11) mutual exclusion primitives
#include <future> // (since C++11) primitives for asynchronous computations
#include <condition_variable> // (since C++11) thread waiting conditions
#endif
#if __cplusplus >= 201300L
#include <shared_mutex> // (since C++14) shared mutual exclusion primitives
#endif
#if __cplusplus >= 201500L
#include <any> // (since C++17) std::any class template
#include <optional> // (since C++17) std::optional class template
#include <variant> // (since C++17) std::variant class template
#include <memory_resource> // (since C++17) Polymorphic allocators and memory resources
#include <string_view> // (since C++17) std::basic_string_view class template
#include <execution> // (since C++17) Predefined execution policies for parallel versions of the algorithms
#include <filesystem> // (since C++17) std::path class and supporting functions
#endif

View File

@@ -0,0 +1,42 @@
# Launchers File syntax:
#
# [Must-have property line]
# launcher1.runCommand=<Run Command>
# [Optional extra properties]
# launcher1.displayName=<Display Name, runCommand by default>
# launcher1.hide=<true if lancher is not visible in menu, false by default>
# launcher1.buildCommand=<Build Command, Build Command specified in project properties by default>
# launcher1.runDir=<Run Directory, ${PROJECT_DIR} by default>
# launcher1.runInOwnTab=<false if launcher reuse common "Run" output tab, true by default>
# launcher1.symbolFiles=<Symbol Files loaded by debugger, ${OUTPUT_PATH} by default>
# launcher1.env.<Environment variable KEY>=<Environment variable VALUE>
# (If this value is quoted with ` it is handled as a native command which execution result will become the value)
# [Common launcher properties]
# common.runDir=<Run Directory>
# (This value is overwritten by a launcher specific runDir value if the latter exists)
# common.env.<Environment variable KEY>=<Environment variable VALUE>
# (Environment variables from common launcher are merged with launcher specific variables)
# common.symbolFiles=<Symbol Files loaded by debugger>
# (This value is overwritten by a launcher specific symbolFiles value if the latter exists)
#
# In runDir, symbolFiles and env fields you can use these macroses:
# ${PROJECT_DIR} - project directory absolute path
# ${OUTPUT_PATH} - linker output path (relative to project directory path)
# ${OUTPUT_BASENAME}- linker output filename
# ${TESTDIR} - test files directory (relative to project directory path)
# ${OBJECTDIR} - object files directory (relative to project directory path)
# ${CND_DISTDIR} - distribution directory (relative to project directory path)
# ${CND_BUILDDIR} - build directory (relative to project directory path)
# ${CND_PLATFORM} - platform name
# ${CND_CONF} - configuration name
# ${CND_DLIB_EXT} - dynamic library extension
#
# All the project launchers must be listed in the file!
#
# launcher1.runCommand=...
# launcher2.runCommand=...
# ...
# common.runDir=...
# common.env.KEY=VALUE
# launcher1.runCommand=<type your run command here>

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<project-private xmlns="http://www.netbeans.org/ns/project-private/1">
<data xmlns="http://www.netbeans.org/ns/make-project-private/1">
<activeConfTypeElem>1</activeConfTypeElem>
<activeConfIndexElem>0</activeConfIndexElem>
</data>
<editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/2" lastBookmarkId="0"/>
<open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/2">
<group/>
</open-files>
</project-private>

31
nbproject/project.xml Normal file
View File

@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://www.netbeans.org/ns/project/1">
<type>org.netbeans.modules.cnd.makeproject</type>
<configuration>
<data xmlns="http://www.netbeans.org/ns/make-project/1">
<name>saf7</name>
<c-extensions/>
<cpp-extensions>cpp</cpp-extensions>
<header-extensions>h,hpp</header-extensions>
<sourceEncoding>UTF-8</sourceEncoding>
<make-dep-projects/>
<sourceRootList/>
<confList>
<confElem>
<name>Debug</name>
<type>1</type>
</confElem>
<confElem>
<name>Release</name>
<type>1</type>
</confElem>
</confList>
<formatting>
<project-formatting-style>true</project-formatting-style>
<c-style>Apache|Apache</c-style>
<cpp-style>Apache|Apache</cpp-style>
<header-style>Apache|Apache</header-style>
</formatting>
</data>
</configuration>
</project>

12
saf.xml Normal file
View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8" ?>
<node name="/xmpp/saf">
<interface name="xmpp.saf">
<method name="Quit">
<arg/>
</method>
<method name="SendMsg">
<arg type="s" name="recipient" direction="in"/>
<arg type="s" name="msg" direction="in"/>
</method>
</interface>
</node>

16
saf7-default.conf Normal file
View File

@@ -0,0 +1,16 @@
<!DOCTYPE busconfig PUBLIC
"-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
<policy user="root">
<allow own="xmpp.saf-default"/>
<allow send_destination="xmpp.saf-default" send_interface="xmpp.saf" send_member="Quit"/>
</policy>
<policy context="default">
<allow send_destination="xmpp.saf-default"/>
<allow receive_sender="xmpp.saf-default"/>
<deny send_destination="xmpp.saf-default" send_interface="xmpp.saf" send_member="Quit"/>
</policy>
</busconfig>

23
saf7-default.rc.template Normal file
View File

@@ -0,0 +1,23 @@
jid=user@host.domain.tld
password=your_password
#resource : Optional. Default : SAF
#resource=SAF
#server : Optional
#server=host.domain.tld
#port : Optional. Default : 5222
#port=5222
#bustag : Optional. Default : default
#bustag=default
#retry : Optional. Number of times to try a connection. Default = 0 (for ever)
#retry=0
#delay : Optional. Number of seconds between each connection attempt. Default = 30
#delay=30
#wsping : Optional. Number of seconds between each whitespace ping to the server, default = 0 (never), at least 55
#wsping=0

14
saf7-default.service Normal file
View File

@@ -0,0 +1,14 @@
[Unit]
Description=XMPP send and forget : saf7
Requires=network.target
After=network.target
[Service]
Type=dbus
BusName=xmpp.saf-default
ExecStart=/usr/local/bin/saf7 -c /usr/local/etc/saf7/saf7-default.rc
User=root
[Install]
WantedBy=multi-user.target

9
saf7_Quit.sh Normal file
View File

@@ -0,0 +1,9 @@
#/bin/sh
TAG="default"
[ -n "$1" ] && TAG="$1"
dbus-send --system --type=method_call --dest=xmpp.saf-"$TAG" /xmpp/saf xmpp.saf.Quit
exit 0

18
saf7_SendMsg.sh Normal file
View File

@@ -0,0 +1,18 @@
#/bin/sh
if [ $# -lt 2 ];then
echo "Arg 1 : full jid without resource."
echo "Arg 2 : message."
echo "Arg 3 : bus name tag. Optional. Default = default ."
exit 0
fi
RECIPIENT="$1"
MSG="$2"
TAG="default"
[ -n "$3" ] && TAG="$3"
dbus-send --system --print-reply=literal --type=method_call --dest=xmpp.saf-"$TAG" /xmpp/saf xmpp.saf.SendMsg string:"$RECIPIENT" string:"$MSG"
exit 0