//  This may look like C code, but it is really -*- C++ -*-

//  ------------------------------------------------------------------
//  The Goldware Library
//  Copyright (C) 1990-1999 Odinn Sorensen
//  Copyright (C) 1999-2000 Alexander S. Aganichev
//  ------------------------------------------------------------------
//  This library is free software; you can redistribute it and/or
//  modify it under the terms of the GNU Library General Public
//  License as published by the Free Software Foundation; either
//  version 2 of the License, or (at your option) any later version.
//
//  This library 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
//  Library General Public License for more details.
//
//  You should have received a copy of the GNU Library 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
//  ------------------------------------------------------------------
//  $Id$
//  ------------------------------------------------------------------
//  WildCat! 4.0 Structures.
//  ------------------------------------------------------------------


//  ------------------------------------------------------------------
//  Only include once!

#ifndef __GMWCAT_H
#define __GMWCAT_H


//  ------------------------------------------------------------------

#include <gmoarea.h>
#include <gusrwcat.h>


//  ------------------------------------------------------------------

#if defined(GOLD_CANPACK)
    #pragma pack(1)
#endif


//  ------------------------------------------------------------------
//  WildCat! 4.0 Magic Numbers

const uint32_t MagicHeaderActive   = 0x001A1A1Bu;
const uint32_t MagicHeaderInactive = 0x011A1A1Bu;


//  ------------------------------------------------------------------
//  WildCat! 4.0 Message Attributes (mflags)

const word mfPrivate     = 0x0001;
const word mfReceiveable = 0x0002;
const word mfReceived    = 0x0004;
const word mfReceipt     = 0x0008;
const word mfCarboned    = 0x0010;
const word mfForwarded   = 0x0020;
const word mfEchoFlag    = 0x0040;
const word mfHasReplies  = 0x0100;
const word mfDeleted     = 0x0200;
const word mfTagged      = 0x0400;
const word mfSent        = 0x0800;


//  ------------------------------------------------------------------
//  Fido message attributes

#define FIDO_PVT        0x0001
#define FIDO_CRASH      0x0002
#define FIDO_RECEIVED   0x0004
#define FIDO_SENT       0x0008
#define FIDO_ATTACH     0x0010
#define FIDO_TRANSIT    0x0020
#define FIDO_ORPHAN     0x0040
#define FIDO_KILLSENT   0x0080
#define FIDO_LOCAL      0x0100
#define FIDO_HOLD       0x0200
#define FIDO_RESERVED   0x0400
#define FIDO_FREQ       0x0800
#define FIDO_RETRECREQ  0x1000
#define FIDO_RETREC     0x2000
#define FIDO_AUDITREQ   0x4000
#define FIDO_UPDREQ     0x8000


//  ------------------------------------------------------------------
//  WildCat! 4.0 Message Header

struct WCatHdr
{
    WCatHdr();

    uint32_t  magicnumber;
    word  msgno;
    char  from[71];
    char  fromtitle[11];
    int32_t  fromuserid;
    char  to[71];
    char  totitle[11];
    int32_t  touserid;
    char  subject[71];
    char  network[9];
    word  msgdate;
    int32_t  msgtime;
    word  readdate;
    int32_t  readtime;
    word  mflags;
    word  reference;
    Addr  origaddr;
    Addr  destaddr;
    word  msgbytes;
    char  internalattach[13];
    char  externalattach[13];
    word  prevunread;
    word  nextunread;
    word  fidoflags;
    int32_t  cost;
    byte  reserved[20];
};


//  ------------------------------------------------------------------
//  WildCat! 4.0 Message Index Base Record

struct WCatBase
{
    word recsize;
    word active;
    word nextmsgno;
};


//  ------------------------------------------------------------------
//  WildCat! 4.0 Message Index Record

struct WCatIdx
{
    word msgno;
    int32_t offset;
};


//  ------------------------------------------------------------------

#if defined(GOLD_CANPACK)
    #pragma pack()
#endif


//  ------------------------------------------------------------------

struct WCatData
{
    int      fhix;
    int      fhdat;
    WCatBase base;
    WCatIdx* idx;
    int      islocked;
};


//  ------------------------------------------------------------------

struct WCatWide
{
    int          userno;
//  WildCatUser*  user;
};


//  ------------------------------------------------------------------

class WCatArea : public gmo_area
{

protected:

    WCatWide* wide;
    WCatData* data;

    void data_open();
    void data_close();

    int test_open(const char* __file);
    void raw_open();
    void save_lastread();
    void raw_scan(int __keep_index, int __scanpm=false);
    void save_message(int __mode, gmsg* __msg, WCatHdr& __hdr);

    void raw_close();
    void refresh();
    int load_message(int __mode, gmsg* __msg, WCatHdr& __hdr);

public:

    WCatArea()
    {
        wide = NULL;
        data = NULL;
    }
    virtual ~WCatArea() {}

    virtual bool issoftdelete() const
    {
        return true;
    }
    virtual bool requirehardterm() const
    {
        return true;
    }

    //  ----------------------------------------------------------------
    //  Messagebase member functions

    void open();
    void close();

    void suspend();
    void resume();

    void lock();
    void unlock();

    void scan();
    void scan_area();
    void scan_area_pm();

    int load_hdr(gmsg* msg);
    int load_msg(gmsg* msg);

    void save_hdr(int mode, gmsg* msg);
    void save_msg(int mode, gmsg* msg);

    void del_msg(gmsg* msg);

    void new_msgno(gmsg* msg);
    char* user_lookup(char* lookfor);
    int renumber();

    void update_timesread(gmsg* msg);

    Line* make_dump_msg(Line*& lin, gmsg* msg, char* lng_head);
};


//  ------------------------------------------------------------------

extern WCatWide* wcatwide;
extern WCatData* wcatdata;
extern int       wcatdatano;


//  ------------------------------------------------------------------

#endif

//  ------------------------------------------------------------------

