/******************************************************************************!
* \file mpclient.cpp
* \author Sebastien Beaugrand
* \sa http://beaugrand.chez.com/
* \copyright CeCILL 2.1 Free Software license
******************************************************************************/
#include <filesystem>
#include <iostream>
#include <csignal>
#include <argp.h>
#include "Input.h"
#include "Output.h"
#include "Client.h"
#include "log.h"
std::unique_ptr<Client> gClient;
/******************************************************************************!
* \fn signalHandler
******************************************************************************/
void
signalHandler(int signal)
{
if (signal == SIGINT && gClient) {
gClient->close();
}
}
/******************************************************************************!
* argp
******************************************************************************/
const char *argp_program_version =
"mpclient 1.0.0";
const char *argp_program_bug_address =
"<sbeaugrand@toto.fr>";
static char doc[] =
"mpclient -- "
"C++ music player client with weighted random album selection";
static struct argp_option options[] = {
{ "dir", 'd', "DIR", 0, "music_directory", 0 },
{ 0, 0, 0, 0, 0, 0 }
};
struct arguments
{
const char* server_url;
const char* music_directory;
};
static error_t
parse_opt(int key, char* arg, struct argp_state* state)
{
struct arguments* arguments = static_cast<struct arguments*>(state->input);
switch (key) {
case 'd':
arguments->music_directory = arg;
DEBUG("music_directory: " << arguments->music_directory);
break;
case ARGP_KEY_ARG:
arguments->server_url = arg;
break;
case ARGP_KEY_END:
if (! arguments->server_url) {
argp_usage(state);
}
break;
default:
return ARGP_ERR_UNKNOWN;
}
return 0;
}
static struct argp argp = { options, parse_opt, "SERVER", doc, 0, 0, 0 };
/******************************************************************************!
* \fn main
******************************************************************************/
int
main(int argc, char** argv)
{
struct arguments arguments = { 0, 0 };
argp_parse(&argp, argc, argv, 0, 0, &arguments);
std::string url(arguments.server_url);
Input input;
Output output;
if (arguments.music_directory &&
std::filesystem::exists(arguments.music_directory)) {
output.musicDirectory = arguments.music_directory;
}
gClient = std::unique_ptr<Client>(new Client(input, output, url));
std::signal(SIGINT, ::signalHandler);
return gClient->run();
}