/* Chrysalide - Outil d'analyse de fichiers binaires
* logs.c - diffusion de messages d'alerte ou informatifs
*
* Copyright (C) 2017 Cyrille Bagard
*
* This file is part of Chrysalide.
*
* Chrysalide is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* Chrysalide is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Foobar. If not, see .
*/
#include "logs.h"
#include
#include "../gui/core/panels.h"
#include "../gui/panels/log.h"
/* Conserve le niveau de filtre des messages */
static LogMessageType _verbosity = LMT_COUNT;
/* Affiche un message dans le terminal courant. */
static void print_message_without_gui(LogMessageType, const char *);
/******************************************************************************
* *
* Paramètres : - *
* *
* Description : Fournit la verbosité des messages système. *
* *
* Retour : Plus faible niveau des types de message affichés. *
* *
* Remarques : - *
* *
******************************************************************************/
LogMessageType get_log_verbosity(void)
{
return _verbosity;
}
/******************************************************************************
* *
* Paramètres : level = plus faible niveau des types de message affichés. *
* *
* Description : Définit la verbosité des messages système. *
* *
* Retour : - *
* *
* Remarques : - *
* *
******************************************************************************/
void set_log_verbosity(LogMessageType level)
{
_verbosity = level;
}
/******************************************************************************
* *
* Paramètres : type = espèce du message à ajouter. *
* msg = message à faire apparaître à l'écran. *
* *
* Description : Affiche un message dans le journal des messages système. *
* *
* Retour : - *
* *
* Remarques : - *
* *
******************************************************************************/
void log_simple_message(LogMessageType type, const char *msg)
{
GPanelItem *item; /* Eventuel affichage présent */
if (type >= _verbosity)
{
item = get_panel_item_by_name(PANEL_LOG_ID);
if (item != NULL)
g_log_panel_add_message(G_LOG_PANEL(item), type, msg);
else
print_message_without_gui(type, msg);
}
}
/******************************************************************************
* *
* Paramètres : type = espèce du message à ajouter. *
* fmt = format du message à faire apparaître à l'écran. *
* ... = éventuels arguments venant compléter le message. *
* *
* Description : Affiche un message dans le journal des messages système. *
* *
* Retour : - *
* *
* Remarques : - *
* *
******************************************************************************/
void log_variadic_message(LogMessageType type, const char *fmt, ...)
{
size_t len; /* Taille tampon disponible */
char *buffer; /* Tampon du msg reconstitué */
int ret; /* Bilan d'une impression */
char *ptr; /* Nouvelle allocation */
va_list ap; /* Liste d'arguments variable */
len = VARIADIC_LOG_BUFSIZE;
buffer = calloc(len, sizeof(char));
while (buffer != NULL)
{
va_start(ap, fmt);
ret = vsnprintf(buffer, len, fmt, ap);
va_end(ap);
if (ret >= 0 && ret < len) break;
else
{
if (ret > -1) len += 1; /* glibc 2.1 */
else len *= 2; /* glibc 2.0 */
if ((ptr = realloc(buffer, len)) == NULL)
{
free(buffer);
buffer = NULL;
}
else buffer = ptr;
}
}
if (buffer != NULL)
{
log_simple_message(type, buffer);
free(buffer);
}
}
/******************************************************************************
* *
* Paramètres : type = espèce du message à ajouter. *
* msg = message à faire apparaître à l'écran. *
* *
* Description : Affiche un message dans le terminal courant. *
* *
* Retour : - *
* *
* Remarques : - *
* *
******************************************************************************/
static void print_message_without_gui(LogMessageType type, const char *msg)
{
printf("!! MSG :: %s\n", msg);
}