/* Simple BBC News ticker client
 * (c) Darren Salt
 * GPL applies
 * $Id: globals.h,v 1.16 2007/04/25 14:11:15 ds Exp $
 */

#ifndef Ticker_GLOBALS_H
#define Ticker_GLOBALS_H

#ifdef FORTIFY
# include "fortify.h"
#endif

typedef unsigned long ulong;
#ifndef _SYS_TYPES_H_
typedef unsigned short ushort;
#endif

struct coords
{
  int x, y;
};

extern const char version[];
extern const char date[];
extern char *osversion;

extern const char taskname[];

extern int wimp_version;
extern int task_handle;
extern int testmode;


#define MAX_PROXY_LENGTH (72)
#define MAX_CONNECT_VAR_LENGTH (40)
#define MAX_SERVER_LABEL_LENGTH (32)
#define MAX_CHARSET_LENGTH (32)

enum data_format_t
{
  format_BBC,
  format_RDF
};

/* Fetcher struct */

struct server
{
  enum data_format_t format;
  int num_headings, first_section;
  char group[MAX_SERVER_LABEL_LENGTH];
  char label[MAX_SERVER_LABEL_LENGTH];
  char server[256];
  int port;
  int (*fetch_headings)(void);
  char headings_path[256];
  int (*fetch_stories)(void);
  char stories_path[256];
  int (*fetch_resources)(void);		/* optional */
  int (*find_last_update)(char *);
  char *(*find_next_item)(char *);
  char *(*find_story)(char **);
  char *(*find_resource)(char **);	/* optional */
  char *(*find_description)(char **);	/* optional */
  char *(*find_publish_date)(char **);	/* optional */
  char *(*find_url)(char **);
  void (*free_old_data)(void);
  int modified;
};
#define MODIFIED_BY_USER (1)
#define MODIFIED_AUTOMATICALLY (2)

extern struct server fetcher;


enum state
{
  state_UNAVAILABLE, state_LOADING, state_ACTIVE, state_NOT_CONNECTED,
  state_UNKNOWN
};

struct story
{
  const char *headline;
  const char *description;
  const char *publish_date;
  const char *url;
  int icon;
};

struct server_data
{
  enum state state;
  char **headings;
  int num_headings;
  struct story title, **stories;
  char charset[MAX_CHARSET_LENGTH];
  long last_update, update_time;
};

extern struct server_data ticker_data;


struct options
{
  /* Connection */
  char use_proxy;
  char proxy[MAX_PROXY_LENGTH];
  ushort proxyport;
  char iconised_update;
  char update;
  ushort update_every;
  char use_doc_update;
  char connect_var[MAX_CONNECT_VAR_LENGTH];

  /* Ticker window */
  char scroll_rate, fast_scroll_rate;
  enum
  { pause_NEVER = 0, pause_POINTER, pause_HIGHLIGHT }
  pause_when;
  char highlight;
  char auto_desc;
  char update_to_front;

  /* Startup */
  char delay_init_fetch;
  enum
  { start_OPEN, start_MINIMISED, start_CLOSED }
  initial_state;

  /* Ticker window */
  ushort width;
  char width_is_percentage;
  char less_than_display;
  enum
  { open_ABOVE_ICONBAR = 0, open_AT_TOP }
  open_at;
  enum
  { open_ALIGN_LEFT = 0, open_ALIGN_CENTRE, open_ALIGN_RIGHT }
  open_align;
  struct coords offset;
  char at_top;

  /* Icon bar */
  char no_ibar_icon;

  /* BBC news ticker */
  char low_graphics;

  /* RDF tickers */
  char selected_server[MAX_SERVER_LABEL_LENGTH];
};

extern struct options opt;
extern struct server *servers;
extern int num_servers;


/* Window handles */
#define NUM_CONFIG_PANES (5)
enum config_handles
{
  CONFIG_CONN, CONFIG_TICK, CONFIG_INIT, CONFIG_SHOW, CONFIG_BBC
};
struct window_handles
{
  int info;
  int config, config_pane[NUM_CONFIG_PANES];
  int servers;
  int ticker, ticker_tbar, ticker_desc;
  int save_link, save_text;
  int proxy_auth;
};

extern struct window_handles wind;

#define CONFIG_PANE(PANE) (wind.config_pane[CONFIG_##PANE])

#define STRNCPY(DST,SRC)\
  {\
    (DST)[sizeof ((DST)) - 1] = 0;\
    strncpy ((DST), (SRC), sizeof ((DST)) - 1);\
  }

#define read_mode_variable(v) \
  (_swi (OS_ReadModeVariable, _INR(0,1) | _RETURN(2), -1, (v)))

#ifdef __GNUC__
#  define __swi(x)
#else
#  include <swis.h>
#endif
#include <kernel.h>

__swi (OS_ReadMonotonicTime) long read_monotonic_time (void);


#endif
