/*
 * defines used for messaging
 *
 * Copyright (c) 2001,2002    Nico Schottelius <nico@schottelius.org>
 *
 *   This program 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 2 of the License, or
 *   (at your option) any later version.
 *
 *   This program 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 this program; if not, write to the Free Software
 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
 */

#ifndef _MESSAGE_H
#define _MESSAGE_H

/* printing / reporting */
#define FL  __LINE__,__FILE__
#define FLS "[%s(%d)]: "
#define FLP FLS,file,line

/* for switch (intern) */
#define GPM_STAT_DEBUG  2
#define GPM_STAT_INFO   3
#define GPM_STAT_ERR    4
#define GPM_STAT_WARN   5
#define GPM_STAT_OOPS   6

/* for print (extern) */
#define GPM_PR_DEBUG  FL,GPM_STAT_DEBUG
#define GPM_PR_INFO   FL,GPM_STAT_INFO
#define GPM_PR_ERR    FL,GPM_STAT_ERR
#define GPM_PR_WARN   FL,GPM_STAT_WARN
#define GPM_PR_OOPS   FL,GPM_STAT_OOPS

/* messages */
#define GPM_TEXT_INFO   "*** info "
#define GPM_TEXT_WARN   "*** warning "
#define GPM_TEXT_DEBUG  "*** debug "
#define GPM_TEXT_ERR    "*** err "
#define GPM_TEXT_OOPS   "O0o.oops(): "

/* strings */
#define GPM_STRING_INFO   GPM_TEXT_INFO FLP
#define GPM_STRING_WARN   GPM_TEXT_WARN FLP
#define GPM_STRING_DEBUG  GPM_TEXT_DEBUG FLP
#define GPM_STRING_ERR    GPM_TEXT_ERR FLP
#define GPM_STRING_OOPS   GPM_TEXT_OOPS FLP

/* running situations */
#define GPM_RUN_STARTUP 0
#define GPM_RUN_DAEMON  1
#define GPM_RUN_DEBUG   2

/* messages */

/* info */
#define GPM_MESS_VERSION            "gpm " PACKAGE_VERSION
#define GPM_MESS_STARTED            "Started gpm successfully. Entered daemon mode."
#define GPM_MESS_KILLED             "Killed gpm(%d)."
#define GPM_MESS_SKIP_DATA          "Skipping a data packet (?)"
#define GPM_MESS_DATA_4             "Data %02x %02x %02x (%02x)"
#define GPM_MESS_NO_MAGIC           "No magic"
#define GPM_MESS_CONECT_AT          "Connecting at fd %i"
#define GPM_MESS_USAGE              "Usage: %s [options]\n" \
         "  Valid options are (not all of them are implemented)\n" \
         "    -a accel         sets the acceleration (default %d)\n" \
         "    -A [limit]       start with selection disabled (`aged')\n" \
         "    -b baud-rate     sets the baud rate (default %d)\n" \
         "    -B sequence      allows changing the buttons (default '%s')\n" \
         "    -d delta         sets the delta value (default %d) (must be 2 or more)\n" \
         "    -D	             debug mode: don't auto-background\n" \
         "    -g tap-button    sets the button (1-3) that is emulated by tapping on\n" \
         "                     a glidepoint mouse, none by default. (mman/ps2 only)\n" \
         "    -i interval      max time interval for multiple clicks (default %i)\n" \
         "    -k               kill a running gpm, to start X with a busmouse\n" \
         "    -l charset       loads the inword() LUT (default '%s')\n" \
         "    -m mouse-device  sets mouse device\n" \
         "    -M               enable multiple mice. Following options refer to\n" \
         "                     the second device. Forces \"-R\"\n" \
         "    -o options       decoder-specific options (e.g.: \"dtr\", \"rts\")\n" \
         "    -p               draw the pointer while striking a selection\n" \
         "    -q               quit after changing mouse behaviour\n" \
         "    -r number        sets the responsiveness (default %i)\n" \
         "    -R mouse-type    enter repeater mode. X should read /dev/gpmdata\n" \
         "                     like it was a mouse-type device.  Default is MouseSystems.\n" \
         "                     You can also specify \"raw\" to relay the raw device data.\n" \
         "    -s sample-rate   sets the sample rate (default %d)\n" \
         "    -S [commands]    enable special commands (see man page)\n" \
         "    -t mouse-type    sets mouse type (default '%s')\n" \
         "                     Use a non-existent type (e.g. \"help\") to get a list\n" \
         "    -T               test: read mouse, no clients\n" \
         "    -v               print version and exit\n" \
         "    -V verbosity     increase number of logged messages\n\n\n" \
         "    Examples:\n\n" \
         "    gpm -m /dev/misc/psaux -t ps2    to start with a ps2 mouse\n" \
         "    gpm -m /dev/tts/0 -t mman        to use mouse man on COM1\n\n"

/* Later ... but first when it's running */
/*         "    -u               autodetect mice [not implemented yet]\n" \ */

#define GPM_MESS_IMPS2_AUTO         "imps2: Auto-detected intellimouse PS/2"
#define GPM_MESS_IMPS2_PS2          "imps2: Auto-detected standard PS/2"
#define GPM_MESS_AVAIL_MYT          "Available mouse types are:\n\n" \
                                    "r name   synonym         description\n\n"
#define GPM_MESS_SYNONYM            "%c %-8s %s\n            Synonyms: %s\n"

/* generic messages */
#define GPM_MESS_DOUBLE_S           "%s: %s"
#define GPM_MESS_DOUBLE_I           "%i - %i:"
#define GPM_MESS_X_Y_VAL            "x %i, y %i"


/* mem */
#define GPM_MESS_NO_MEM             "I couln't get any memory! I die! :("
#define GPM_MESS_ALLOC_FAILED       "allocation failed!"

/* files */
#define GPM_MESS_SOCKET             "socket(): %s"
#define GPM_MESS_TEMPNAM            "tempnam(): %s"
#define GPM_MESS_OPEN               "Could not open %s."
#define GPM_MESS_CREATE_FIFO        "Creating FIFO %s failed."
#define GPM_MESS_STALE_PID          "Removing stale pid file %s"
#define GPM_MESS_MKSTEMP_FAILED     "mkstemp failed with file %s!"
#define GPM_MESS_NOTWRITE           "Can you write to %s?"
#define GPM_MESS_WRITE_ERR          "write(): %s"
#define GPM_MESS_OPEN_CON           "Opening console failed."
#define GPM_MESS_OPEN_SERIALCON     "We seem to be on a serial console."
#define GPM_MESS_READ_FIRST         "Error in read()ing first: %s"
#define GPM_MESS_READ_REST          "Error in read()ing rest: %s"
#define GPM_MESS_REMOVE_FILES       "Removing files %s and %s"
#define GPM_MESS_READ_PROB          "Problem reading from %s"
#define GPM_MESS_CLOSE              "Closing"

/* error */
#define GPM_MESS_CANT_KILL          "Couldn't kill gpm(%d)!"
#define GPM_MESS_FSTAT              "fstat()"
#define GPM_MESS_SETSID_FAILED      "Setsid failed"
#define GPM_MESS_CHDIR_FAILED       "change directory failed"
#define GPM_MESS_FORK_FAILED        "Fork failed."
#define GPM_MESS_VCCHECK            "Failed on virtual console check."
#define GPM_MESS_PROT_ERR           "Error in protocol"
#define GPM_MESS_ROOT               "You should be root to run gpm!"
#define GPM_MESS_SPEC_ERR           "Error in the %s specification. Try \"%s -h\".\n"
#define GPM_MESS_ALREADY_RUN        "gpm is already running as pid %d"
#define GPM_MESS_NO_REPEAT          "Repeating into %s protocol not yet implemented :-("
#define GPM_MESS_GET_SHIFT_STATE    "get_shift_state"
#define GPM_MESS_GET_CONSOLE_STAT   "get_console_status"
#define GPM_MESS_DISABLE_PASTE      "disabling pasting per request from virtual console (%d)"
#define GPM_MESS_UNKNOWN_FD         "Unknown fd selected"
#define GPM_MESS_ACCEPT_FAILED      "accept() failed: %s"
#define GPM_MESS_ADDRES_NSOCKET     "Address %s not a socket in processConn"
#define GPM_MESS_SOCKET_OLD         "Socket too old in processConn"
#define GPM_MESS_GETSOCKOPT         "getsockopt(SO_PEERCRED): %s"
#define GPM_MESS_STAT_FAILS         "stat on %s fails in processConn"
#define GPM_MESS_NEED_MDEV          "Please use -m /dev/mouse -t protocol"
#define GPM_MESS_MOUSE_INIT         "mouse initialization failed"
#define GPM_MESS_SOCKET_PROB        "socket()"
#define GPM_MESS_BIND_PROB          "Problem binding %s"
#define GPM_MESS_SELECT_PROB        "Problem with select"
#define GPM_MESS_SELECT_STRING      "select(): %s"
#define GPM_MESS_SELECT_TIMES       "selected %i times"

#define GPM_MESS_OPTION_NO_ARG      "%s: Option \"%s\" takes no argument: ignoring \"%s\""
#define GPM_MESS_INVALID_ARG        "%s: Invalid arg. \"%s\" to \"%s\""
#define GPM_MESS_CONT_WITH_ERR      "%s: Continuing despite errors in option parsing"
#define GPM_MESS_TOO_MANY_OPTS      "%s: Too many options for \"-t %s\""

#define GPM_MESS_NETM_NO_ACK        "netmouse: No acknowledge (got %d)"
#define GPM_MESS_NETM_INV_MAGIC     "netmouse: Invalid reply magic (got %d,%d,%d)"
#define GPM_MESS_WACOM_MACRO        "WACOM Macro: %d"
#define GPM_MESS_GUNZE_INV_PACK     "gunze: invalid packet \"%s\""
#define GPM_MESS_MMAN_DETECTED      "MouseMan detected"
#define GPM_MESS_INIT_GENI          "initializing genitizer"
#define GPM_MESS_WACOM_MOD          "WACOM Mode: %c Modell: %s (Answer: %s)"
#define GPM_MESS_IMPS2_INIT         "imps2: PS/2 mouse failed init"
#define GPM_MESS_IMPS2_FAILED       "imps2: PS/2 mouse failed (3 button) init"
#define GPM_MESS_IMPS2_MID_FAIL     "imps2: PS/2 mouse failed to read id, assuming standard PS/2"
#define GPM_MESS_IMPS2_SETUP_FAIL   "imps2: PS/2 mouse failed setup, continuing..."
#define GPM_MESS_IMPS2_BAD_ID       "imps2: Auto-detected unknown mouse type %d, assuming standard PS/2"
#define GPM_MESS_GUNZE_WRONG_BAUD   "%s: %s: wrong baud rate, using 19200"
#define GPM_MESS_GUNZE_CALIBRATE    "%s: gunze: calibration data absent or invalid,using defaults"
#define GPM_MESS_TOO_MANY_SPECIAL   "%s: too many special functions (max is %i)"
#define GPM_MESS_SYNTAX_1           "%s: %s :%i: Syntax error"
#define GPM_MESS_UNKNOWN_MOD_1      "%s: %s :%i: Unknown modifier \"%s\""
#define GPM_MESS_INCORRECT_COORDS   "%s: %s :%i: Incorrect chord \"%s\""
#define GPM_MESS_INCORRECT_LINE     "%s: %s :%i: Incorrect line:\"%s\""
#define GPM_MESS_FIRST_DEV          "Use -m device -t protocol [-o options]!"
#define GPM_MESS_ELO_CALIBRATE      "%s: etouch: calibration file %s absent or invalid, using defaults"

/* warnings */
#define GPM_MESS_REQUEST_ON         "Request on vc %i > %i"
#define GPM_MESS_FAILED_CONNECT     "Failed gpm connect attempt by uid %d for vc %s"
#define GPM_MESS_ZERO_SCREEN_DIM    "zero screen dimension, assuming 80x25"
#define GPM_MESS_STRANGE_DATA       "Data on strange file descriptor %d"
#define GPM_MESS_RESIZING           "%s pid %i is resizing :-)"
#define GPM_MESS_KILLED_BY          "%s pid %i killed by a new %s"
#define GPM_MESS_REDEF_COORDS       "%s: %s :%i: Warning: Chord \"%s%s%s\" redefined"

/* IOCTL */
#define GPM_MESS_IOCTL_KDGETMODE    "ioctl(KDGETMODE)"
#define GPM_MESS_IOCTL_TIOCLINUX    "ioctl(TIOCLINUX)"
#define GPM_MESS_IOCTL_TIOCSTI      "%s: ioctl(TIOCSTI): %s"

/* debug */
#define GPM_MESS_PEER_SCK_UID       "peer socket uid = %d"
#define GPM_MESS_LONG_STATUS        "Pid %i, vc %i, ev %02X, def %02X, minm %02X, maxm %02X"
#define GPM_MESS_SKIP_DATAP         "Skipping a data packet: Data %02x %02x %02x %02x"
#define GPM_MESS_KILLING            "Trying to kill gpm running at pid %d"

/* other */
#define GPM_MESS_SKIP_PASTE         "Skipping paste; selection has aged"
#define GPM_EXTRA_DATA              "Extra %02x"
#define GPM_MESS_SIGNED             "Signed."
#define GPM_MESS_CSELECT            "is your kernel compiled with CONFIG_SELECTION on?"
#define GPM_MESS_NOTHING_MORE       "Nothing more"
#define GPM_MESS_CON_REQUEST        "Request on %i (console %i)"
#define GPM_MESS_SCREEN_SIZE        "Screen size: %d - %d"
/* #define GPM_MESS_                   "" */

/* functions */
void gpm_report(int line, char *file, int stat, char *text, ... );

/* rest of wd.h */
#ifdef HAVE_SYSLOG_H
#include <syslog.h>
#else
#define LOG_EMERG 0
#define LOG_ALERT 1
#define LOG_CRIT 2
#define LOG_ERR 3
#define LOG_WARNING 4
#define LOG_NOTICE 5
#define LOG_INFO 6
#define LOG_DEBUG 7
#endif

#endif /* _MESSAGE_H */
