/*****************************************************************************
 *
 * $Id$
 * Purpose ...............: Dump Bluewave packets
 *
 *****************************************************************************
 * Copyright (C) 1997-2006
 *   
 * Michiel Broek		FIDO:	2:280/2802
 * Beekmansbos 10
 * 1971 BV IJmuiden
 * the Netherlands
 *
 * This file is part of MBSE BBS.
 *
 * This BBS 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, or (at your option) any
 * later version.
 *
 * MBSE BBS 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 MBSE BBS; see the file COPYING.  If not, write to the Free
 * Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
 *****************************************************************************/

#include "../config.h"
#include "../lib/mbselib.h"
#include "../lib/bluewave.h"



int main(int argc, char **argv)
{
    char	    *bwname, *temp;
    FILE	    *fp;
    INF_HEADER	    Inf;
    INF_AREA_INFO   AreaInf;
    MIX_REC	    Mix;
    FTI_REC	    Fti;
    int		    i, pos;

    printf("\nMBBW: MBSE BBS %s Bluewave Dump\n", VERSION);
    printf("      %s\n\n", COPYRIGHT);

    if (argc != 2) {
	printf("Usage:    mbbw [packetname]\n\n");
	return 0;
    }

    bwname = xstrcpy(argv[1]);
    temp = calloc(PATH_MAX, sizeof(char));
    sprintf(temp, "%s.INF", bwname);

    if ((fp = fopen(temp, "r"))) {
	printf("---- %s.INF -------------------------------------------------------\n", bwname);
	if (fread(&Inf, sizeof(INF_HEADER), 1, fp) == 1) {
	    printf("\n");
	    printf("Packet version           %d\n", Inf.ver);
	    for (i = 0; i < 5; i++)
		if (strlen(Inf.readerfiles[i]))
		    printf("Display file %d           %s\n", i+1, Inf.readerfiles[i]);
	    printf("Registration number      %s\n", Inf.regnum);
	    printf("Login name               %s\n", Inf.loginname);
	    printf("Aliasname                %s\n", Inf.aliasname);
	    printf("Password type            %d\n", Inf.passtype);
	    printf("Network address          %d:%d/%d.%d\n", Inf.zone, Inf.net, Inf.node, Inf.point);
	    printf("Sysop                    %s\n", Inf.sysop);
	    printf("Control                  %sConfig %sFreq\n", (Inf.ctrl_flags & INF_NO_CONFIG) ? "No":"",
						       (Inf.ctrl_flags & INF_NO_FREQ) ? "No":"");
	    printf("System name              %s\n", Inf.systemname);
	    printf("Max freqs                %d\n", Inf.maxfreqs);
	    printf("Is QWK                   %s\n", Inf.is_QWK ? "Yes":"No");
	    printf("User flags               %s%s%s%s%s%s\n", (Inf.uflags & INF_HOTKEYS)     ? "Hotkeys ":"",
						    (Inf.uflags & INF_XPERT)       ? "Expert ":"",
						    (Inf.uflags & INF_GRAPHICS)    ? "ANSI ":"",
						    (Inf.uflags & INF_NOT_MY_MAIL) ? "Not-my-mail ":"",
						    (Inf.uflags & INF_EXT_INFO)    ? "Ext-info ":"",
						    (Inf.uflags & INF_NUMERIC_EXT) ? "Numeric-ext":"");
	    for (i = 0; i < 10; i++)
		if (strlen(Inf.keywords[i]))
		    printf("Keywords %2d              %s\n", i+1, Inf.keywords[i]);
	    for (i = 0; i < 10; i++)
		if (strlen(Inf.filters[i]))
		    printf("Filters %2d               %s\n", i+1, Inf.filters[i]);
	    for (i = 0; i < 3; i++)
		if (strlen(Inf.macros[i]))
		    printf("Macro %d                  %s\n", i+1, Inf.macros[i]);
	    printf("Netmail flags                     %s%s%s%s%s%s%s\n", (Inf.netmail_flags & INF_CAN_CRASH)  ? "Crash ":"",
							     (Inf.netmail_flags & INF_CAN_ATTACH) ? "Attach ":"",
							     (Inf.netmail_flags & INF_CAN_KSENT)  ? "KSent ":"",
							     (Inf.netmail_flags & INF_CAN_HOLD)   ? "Hold ":"",
							     (Inf.netmail_flags & INF_CAN_IMM)    ? "Immediate ":"",
							     (Inf.netmail_flags & INF_CAN_FREQ)   ? "Freq ":"",
							     (Inf.netmail_flags & INF_CAN_DIRECT) ? "Direct ":"");
	    printf("Credits                  %d\n", Inf.credits);
	    printf("Debits                   %d\n", Inf.debits);
	    printf("Can forward              %s\n", Inf.can_forward ? "Yes":"No");
	    printf("INF header length (1230) %d\n", Inf.inf_header_len);
	    printf("INF areainfo len (80)    %d\n", Inf.inf_areainfo_len);
	    printf("MIX structlen (14)       %d\n", Inf.mix_structlen);
	    printf("FTI structlen (186)      %d\n", Inf.fti_structlen);
	    printf("Uses UPL file            %s\n", Inf.uses_upl_file ? "Yes":"No");
	    printf("From/To length           %d\n", Inf.from_to_len);
	    printf("Subject length           %d\n", Inf.subject_len);
	    printf("Packet ID                %s\n", Inf.packet_id);
	    printf("File list type           %d\n", Inf.file_list_type);
	    printf("Max packet size          %d\n", Inf.max_packet_size);

	    fseek(fp, (long)Inf.inf_header_len, SEEK_SET);
	    while (fread(&AreaInf, sizeof(INF_AREA_INFO), 1, fp)) {
		printf("\n");
		printf("Area number              %s\n", AreaInf.areanum);
		printf("Area tag                 %s\n", AreaInf.echotag);
		printf("Area title               %s\n", AreaInf.title);
		printf("Area flags               %s%s%s%s%s%s%s%s%s%s%s%s%s%s\n", 
							(AreaInf.area_flags & INF_SCANNING)      ? "Active ":"",
							(AreaInf.area_flags & INF_ALIAS_NAME)    ? "Aliases ":"",
							(AreaInf.area_flags & INF_ANY_NAME)      ? "Any-name ":"",
							(AreaInf.area_flags & INF_ECHO)          ? "Echo ":"",
							(AreaInf.area_flags & INF_NETMAIL)       ? "Netmail ":"",
							(AreaInf.area_flags & INF_POST)          ? "Post ":"",
							(AreaInf.area_flags & INF_NO_PRIVATE)    ? "No-private ":"",
							(AreaInf.area_flags & INF_NO_PUBLIC)     ? "No-public ":"",
							(AreaInf.area_flags & INF_NO_TAGLINE)    ? "No-tagline ":"",
							(AreaInf.area_flags & INF_NO_HIGHBIT)    ? "No-highbit ":"",
							(AreaInf.area_flags & INF_NOECHO)        ? "No-echo ":"",
							(AreaInf.area_flags & INF_HASFILE)       ? "Hasfile ":"",
							(AreaInf.area_flags & INF_PERSONAL)      ? "Personal ":"",
							(AreaInf.area_flags & INF_TO_ALL)        ? "To-all ":"");
		printf("Network type             %s\n", AreaInf.network_type ? "Internet":"Fidonet");
	    }
	    printf("\n");
	} else {
	    printf("Cannot read info header\n");
	}
	fclose(fp);
    }
    
    sprintf(temp, "%s.MIX", bwname);
    if ((fp = fopen(temp, "r"))) {
	printf("---- %s.MIX -------------------------------------------------------\n\n", bwname);
	printf("  Area  Total  Pers.   FTI ptr\n");
	printf("------ ------ ------ ---------\n");
	while (fread(&Mix, ORIGINAL_MIX_STRUCT_LEN, 1, fp)) {
	    printf("%6s %6d %6d %9d\n", Mix.areanum, Mix.totmsgs, Mix.numpers, Mix.msghptr);
	}
	printf("\n");
	fclose(fp);
    }

    sprintf(temp, "%s.FTI", bwname);
    pos = 0;
    if ((fp = fopen(temp, "r"))) {
	printf("---- %s.FTI -------------------------------------------------------\n\n", bwname);
	printf("   Pos From                                  Date                Msgnum Replto Replat    Ptr Length\n");
	printf("------ ------------------------------------- ------------------- ------ ------ ------ ------ ------\n");
	while (fread(&Fti, ORIGINAL_FTI_STRUCT_LEN, 1, fp)) {
	    printf("%6d %-36s %20s %6d %6d %6d %6d %6d\n", pos, Fti.from, Fti.date, Fti.msgnum, Fti.replyto, Fti.replyat,
		    Fti.msgptr, Fti.msglength);

	    pos += ORIGINAL_FTI_STRUCT_LEN;
	}
	fclose(fp);
    }

    free(bwname);
    free(temp);
    return 0;
}