/*

MAgen.dll: Miranda plugin for mail.ru message exchange.

Copyright 2005-2010 Lenik.
Project home at http://www.lenik.ru/win32/magent
Author contact: lenik@lenik.ru

This program is free software.

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.

*/

#include <io.h>
#include <fcntl.h>
#include <stdarg.h>
#include <time.h>

unsigned char DebugFileName[1024] = "";

void DumpMemToBuffer(unsigned char *buffer,void *ptr,unsigned long len)
{
unsigned char *cptr = (unsigned char *)ptr;
unsigned long t;

buffer[0] = 0;
while(buffer[0] != 0)buffer++;
sprintf(buffer,"00  02  04  06  08  0A  0C  0E  10  12  14  16  18  1A  1C  1E\n");
while(buffer[0] != 0)buffer++;
sprintf(buffer,"==  ==  ==  ==  ==  ==  ==  ==  ==  ==  ==  ==  ==  ==  ==  ==\n");
cptr = (unsigned char *)ptr;
t = 0;
while(1)
    {
    if(t >= len)break;
    while(buffer[0] != 0)buffer++;
    sprintf(buffer,"%2.02X",*cptr);
    cptr++; t++;
    if(t%32 == 0)
        {
        while(buffer[0] != 0)buffer++;
        sprintf(buffer,"\r\n");
        }
    }
while(buffer[0] != 0)buffer++;
sprintf(buffer,"\n------------------------------\n");
cptr = (unsigned char *)ptr;
t = 0;
while(1)
    {
    if(t >= len)break;
    while(buffer[0] != 0)buffer++;
    sprintf(buffer,"%c",(*cptr)>=32?*cptr:'.');
    cptr++; t++;
    if(t%32 == 0)
        {
        while(buffer[0] != 0)buffer++;
        sprintf(buffer,"\r\n");
        }
    }
while(buffer[0] != 0)buffer++;
sprintf(buffer,"\n==============================\n");
}

void DumpMemory(void *cptr,unsigned long len)
{
static unsigned char buffer[2048];

DumpMemToBuffer(buffer,cptr,len);
MessageBox(NULL,buffer,"===== Debug Memory Dump =====",MB_OK|MB_ICONEXCLAMATION);
}

void OpenDebugLog(unsigned char *name)
{
unsigned char tbuf[1024];

sprintf(tbuf,
        "Внимание! Отладочная версия. Будет создан Log-файл в каталоге, где находится файл miranda32.exe\n"
        "Имя файла - \"%s.dbg\"\n",
        name);
MessageBox(NULL,tbuf,"Отладка плагина Mail.ru agent",MB_OK|MB_ICONINFORMATION);
strcpy(DebugFileName,name);
strcat(DebugFileName,".gbg");
}

void CloseDebugLog(void)
{
}

unsigned long GetCurrentTimeString(unsigned char *buffer)
{
static struct tm tmbuf;
unsigned long t;

time((time_t*)&t);
_localtime((time_t*)&t,&tmbuf);
t = _bprintf(buffer,99,"%2.02lu.%2.02lu.%4.04lu %2.02lu:%2.02lu:%2.02lu ",
             tmbuf.tm_mday,tmbuf.tm_mon+1,tmbuf.tm_year+1900,
             tmbuf.tm_hour,tmbuf.tm_min,tmbuf.tm_sec);
buffer[t] = 0;
return(t);
}

void PrintDebug(unsigned char *format,...)
{
unsigned char *buffer;
va_list arglist;
long dlen,len;
int fh;

//int _vbprintf(char *buf,long bufsize,const char *format,va_list arg);

va_start(arglist,format);
//MessageBox(NULL,"started","PrintDebug",MB_OK);
if((fh=open(DebugFileName,O_RDWR|O_CREAT,0xFF)) != -1)
    {
    //MessageBox(NULL,"log opened","PrintDebug",MB_OK);
    lseek(fh,0,SEEK_END);
    if((buffer=malloc(65536)) != NULL)
        {
        //MessageBox(NULL,"malloc() ok","PrintDebug",MB_OK);
        dlen = GetCurrentTimeString(buffer);
        if((len=_vbprintf(&(buffer[dlen]),65536-dlen,format,arglist)) > 0)
            {
            len += dlen;
            buffer[len] = 0;
            write(fh,buffer,len);
            }
        free(buffer);
        }
    close(fh);
    }
va_end(arglist);
}
