/*************************************************************************
*
*    UMS_FidoFix v1.1
*    Corrige la date des messages créés par DLG
*    Modifie directement le paquet de messages.
*
*    Auteur: Jean-Marc Xiume' 1996
*
*    Historique:
*    06-Fev-96         Début du projet
*    10-Fev-96         Premiere version avec fichier de sortie
*    11-Fev-96  v 1.0  Correction de la date directement dans le paquet
*    18-Fev-96  v 1.1  Vérification de la longueur de la date et de la
*                      lecture des chaines du MessageHeader
*    04-Mar-96         Distribution
*
**************************************************************************/


#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <exec/types.h>


/* Paket header (58 bytes) */

struct PKT
{
    short   O_Node;
    short   D_Node;
    short   Year;
    short   Month;
    short   Day;
    short   Hour;
    short   Minut;
    short   Second;
    short   Baud;
    short   P_Type;
    short   O_Net;
    short   D_Net;
    short   Prodcode;
    short   Serial;
    char    Pswrd[9];
    short   O_Zone;
    short   D_Zone;
};

/* Paked Message Header */
        
struct PKD
{
    short   O_Node;
    short   D_Node;
    short   O_Net;
    short   D_Net;
    short   Attribut;
    short   Cost;
    char    Date[22];
    char    To[36];
    char    From[36];
    char    Subject[72];
};


UBYTE *ver ="\0$VER: UMS_FidoFix 1.1 - J.M.Xiume' 04-Mar-1996";



/**************** Entête du paquet, imprime un ligne d'info *****************/

void DoPaketHeader(FILE *fp)
{
    struct PKT Pkt; 
    UBYTE Pkth[58];

    fseek(fp,0,SEEK_SET);        
    
    if(fread(Pkth,58,1,fp))
    {
        Pkt.O_Node	=Pkth[0] +(Pkth[1]*256);
        Pkt.D_Node	=Pkth[2] +(Pkth[3]*256);
        Pkt.Year	=Pkth[4] +(Pkth[5]*256);
        Pkt.Month	=Pkth[6] +(Pkth[7]*256)+1;
        Pkt.Day		=Pkth[8] +(Pkth[9]*256);
        Pkt.Hour	=Pkth[10]+(Pkth[11]*256);
        Pkt.Minut	=Pkth[12]+(Pkth[13]*256);
        Pkt.Second	=Pkth[14]+(Pkth[15]*256);
      //Pkt.Baud	=Pkth[16]+(Pkth[17]*256);
      //Pkt.P_Type	=Pkth[18]+(Pkth[19]*256);
        Pkt.O_Net	=Pkth[20]+(Pkth[21]*256);
        Pkt.D_Net	=Pkth[22]+(Pkth[23]*256);
      //Pkt.Prodcode	=Pkth[24];
      //Pkt.Serial	=Pkth[25];

        Pkt.O_Zone	=Pkth[34]+(Pkth[35]*256);
        Pkt.D_Zone	=Pkth[36]+(Pkth[37]*256);

        printf("De %d:%d/%d  A %d:%d/%d - %d/%d/%d %d:%d:%d\n",
		Pkt.O_Zone,Pkt.O_Net,Pkt.O_Node,
		Pkt.D_Zone,Pkt.D_Net,Pkt.D_Node,
		Pkt.Day,Pkt.Month,Pkt.Year,
		Pkt.Hour,Pkt.Minut,Pkt.Second);

    }
}



/******** Entête du message, vérifie et corrige la date si nécessaire *******/

int DoMsgHeader(FILE *fp, int n)
{
    int i, d, m=0;
    long pos;
    struct PKD Pkd; 
    UBYTE Pkdh[12];
    char  Date[22];

    if(!fread(Pkdh,12,1,fp)) exit(103);

    pos=ftell(fp);

    for(d=0; fread(&Pkd.Date[d],1,1,fp) && Pkd.Date[d] && d<20; d++);

    /* Test et conversion de la date. Exemple :
       de   DLG    : Tue  6 Feb 96  1:04
       vers Normal : 06 Feb 96  01:04:00
    */

    if(d==19)
    {

        if(Pkd.Date[0] > '9')
        {
            for(i=0; fread(&Pkd.To[i],1,1,fp) && Pkd.To[i] && i<36; i++);
            for(i=0; fread(&Pkd.From[i],1,1,fp) && Pkd.From[i] && i<36; i++);
            for(i=0; fread(&Pkd.Subject[i],1,1,fp) && Pkd.Subject[i] && i<72; i++);

            printf("- Message n°%d  De:%s  A:%s  Sujet:%s\n", n, Pkd.From, Pkd.To, Pkd.Subject);
            m=1;

            if(Pkd.Date[4]==' ') Date[0]='0';
            else Date[0]=Pkd.Date[4];
            Date[ 1]=Pkd.Date[ 5];
            Date[ 2]=' ';
            Date[ 3]=Pkd.Date[ 7];
            Date[ 4]=Pkd.Date[ 8];
            Date[ 5]=Pkd.Date[ 9];
            Date[ 6]=' ';
            Date[ 7]=Pkd.Date[11];
            Date[ 8]=Pkd.Date[12];
            Date[ 9]=' ';
            Date[10]=' ';
            if(Pkd.Date[14]==' ') Date[11]='0';
            else Date[11]=Pkd.Date[14];
            Date[12]=Pkd.Date[15];
            Date[13]=':';
            Date[14]=Pkd.Date[17];
            Date[15]=Pkd.Date[18];
            Date[16]=':';
            Date[17]='0';
            Date[18]='0';
            Date[19]=0x00;

            printf("  Date: %s  ->  %s \n", Pkd.Date, Date);

            strcpy(Pkd.Date, Date);

            fseek(fp,pos,SEEK_SET);
            if(!fwrite(Pkd.Date,strlen(Pkd.Date),1,fp))
            {
                printf("Impossible d'écrire la nouvelle date dans le message %d\n", n);
                exit(20);
            }
            fseek(fp,0,SEEK_CUR); // sinon le prochain fread retourne EOF !?
        }
    }
    else
    {
        printf("- Message n°%d  ERREUR format de date inconnu : %s\n", n, Pkd.Date);
    }

    return(m);
}




/************************************* Main *********************************/

void main(int argc, char *argv[])
{
    FILE *fp;
    int n=0, m=0, r;
    UBYTE car=0xFF;
                 
    if(argc!=2)
    {
        printf("\nUMS_FidoFix 1.1 - J.M.Xiume'\nUsage: %s packetfile\n\n",argv[0]);
        exit(1);
    }

    if(!(fp=fopen(argv[1],"r+")))
    {
        printf("Impossible d'ouvrir le fichier %s\n",argv[1]);
        exit(5);
    }

    printf("Paquet %s ",argv[1]);

    DoPaketHeader(fp);


    while(TRUE)
    {
        while(car!=0x02)
        {
            if(!(r=fread(&car,1,1,fp))) break;
        }
        if(!r) break;

        if(!fread(&car,1,1,fp)) exit(100);

        if(car==0x00)
        {
            n++;
            m=m+ DoMsgHeader(fp, n);
        }
    }        

    printf("Nombre de messages corrigés/total: %d/%d\n",m,n);

    fclose(fp);

    exit(0);
}
