6.0.23.27

This commit is contained in:
g8bpq 2022-11-18 17:03:39 +00:00
parent f4bc43f75d
commit 6c6848bdcb
18 changed files with 425 additions and 30 deletions

View File

@ -99,12 +99,16 @@ BOOL ProcessConfig();
int ProcessAISMessage(char * msg, int len);
int read_png(unsigned char *bytes);
VOID sendandcheck(SOCKET sock, const char * Buffer, int Len);
void SaveAPRSMessage(struct APRSMESSAGE * ptr);
void ClearSavedMessages();
void GetSavedAPRSMessages();
extern int SemHeldByAPI;
extern int APRSMONDECODE();
extern struct ConsoleInfo MonWindow;
extern char VersionString[];
BOOL SaveAPRSMsgs = 0;
BOOL LogAPRSIS = FALSE;
@ -958,6 +962,11 @@ Dll BOOL APIENTRY Init_APRS()
read_png((unsigned char *)IconData);
// Reload saved messages
if (SaveAPRSMsgs)
GetSavedAPRSMessages();
// If a Run parameter was supplied, run the program
if (RunProgram[0] == 0)
@ -970,7 +979,7 @@ Dll BOOL APIENTRY Init_APRS()
signal(SIGCHLD, SIG_IGN); // Silently (and portably) reap children.
// Fork and Exec ARDOP
// Fork and Exec program
printf("Trying to start %s\n", RunProgram);
@ -1095,6 +1104,8 @@ Dll VOID APIENTRY Poll_APRS()
SMEM->Messages = NULL;
SMEM->ClearRX = 0;
SMEM->NeedRefresh = TRUE;
ClearSavedMessages();
}
if (SMEM->ClearTX)
@ -7674,6 +7685,9 @@ int ProcessMessage(char * Payload, struct STATIONRECORD * Station)
}
}
if (SaveAPRSMsgs)
SaveAPRSMessage(Message);
ptr = SMEM->Messages;
if (ptr == NULL)
@ -7690,6 +7704,7 @@ int ProcessMessage(char * Payload, struct STATIONRECORD * Station)
}
ptr->Next = Message;
}
return ourMessage;
}
@ -8763,3 +8778,132 @@ unsigned char * PngEncode (png_byte *pDiData, int iWidth, int iHeight, struct ic
return Icon->pngimage;
}
void SaveAPRSMessage(struct APRSMESSAGE * ptr)
{
// Save messages in case of a restart
char FN[250];
FILE *file;
// Set up filename
if (BPQDirectory[0] == 0)
{
strcpy(FN,"APRSMsgs.dat");
}
else
{
strcpy(FN,BPQDirectory);
strcat(FN,"/");
strcat(FN,"APRSMsgs.dat");
}
if ((file = fopen(FN, "a")) == NULL)
return ;
fprintf(file, "%d %s,%s,%s,%s,%s\n", time(NULL), ptr->FromCall, ptr->ToCall, ptr->Seq, ptr->Time, ptr->Text);
fclose(file);
}
void ClearSavedMessages()
{
char FN[250];
FILE *file;
// Set up filename
if (BPQDirectory[0] == 0)
{
strcpy(FN,"APRSMsgs.dat");
}
else
{
strcpy(FN,BPQDirectory);
strcat(FN,"/");
strcat(FN,"APRSMsgs.dat");
}
if ((file = fopen(FN, "w")) == NULL)
return ;
fclose(file);
}
void GetSavedAPRSMessages()
{
// Get Saved messages
// 1668768157 SERVER ,GM8BPQ-2 ,D7Yx,10:42,filter m/200 active
char FN[250];
FILE *file;
struct APRSMESSAGE * Message;
struct APRSMESSAGE * ptr;
char Line[256];
char * Stamp = 0;
char * From = 0;
char * To = 0;
char * Seq = 0;
char * Time = 0;
char * Text = 0;
// Set up filename
if (BPQDirectory[0] == 0)
{
strcpy(FN,"APRSMsgs.dat");
}
else
{
strcpy(FN,BPQDirectory);
strcat(FN,"/");
strcat(FN,"APRSMsgs.dat");
}
if ((file = fopen(FN, "r")) == NULL)
return ;
while (fgets(Line, 512, file))
{
Stamp = Line;
From = strlop(Stamp, ' ');
To = strlop(From, ',');
Seq = strlop(To, ',');
Time = strlop(Seq, ',');
Text = strlop(Time, ',');
if (Stamp && From && To && Seq && Time && Text)
{
Message = APRSGetMessageBuffer();
if (Message == NULL)
break;
memset(Message, 0, sizeof(struct APRSMESSAGE));
strcpy(Message->FromCall, From);
strcpy(Message->ToCall, To);
strcpy(Message->Seq, Seq);
strcpy(Message->Time, Time);
strcpy(Message->Text, Text);
ptr = SMEM->Messages;
if (ptr == NULL)
{
SMEM->Messages = Message;
}
else
{
while(ptr->Next)
{
ptr = ptr->Next;
}
ptr->Next = Message;
}
}
}
fclose(file);
}

View File

@ -0,0 +1,65 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioUserFile
ProjectType="Visual C++"
Version="8.00"
ShowAllFiles="false"
>
<Configurations>
<Configuration
Name="Debug|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="SKIGACER"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
<Configuration
Name="Release|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="SKIGACER"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
</Configurations>
</VisualStudioUserFile>

View File

@ -1117,6 +1117,7 @@ typedef int (WINAPI FAR *FARPROCZ)();
FARPROCX pDllBPQTRACE;
FARPROCZ pGetLOC;
FARPROCX pRefreshWebMailIndex;
FARPROCX pRunEventProgram;
BOOL WINE = FALSE;
@ -1881,6 +1882,7 @@ BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
pDllBPQTRACE = GetProcAddress(ExtDriver,"_DllBPQTRACE@8");
pGetLOC = GetProcAddress(ExtDriver,"_GetLOC@0");
pRefreshWebMailIndex = GetProcAddress(ExtDriver,"_RefreshWebMailIndex@0");
pRunEventProgram = GetProcAddress(ExtDriver,"_RunEventProgram@8");
if (pGetLOC)
{

View File

@ -1120,6 +1120,8 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
// Add Web Sockets auto-refresh option for Webmail index page (25)
// Fix FREEDATA driver for compatibility with FreeData TNC version 0.6.4-alpha.3 (25)
// Add SmartID for bridged frames - Send ID only if packets sent recently (26)
// Add option to save and restore received APRS messages (27)
// Add mechanism to run a user program on certain events (27)
#define CKernel
@ -1500,6 +1502,8 @@ int PerlReinit = 0;
UINT_PTR TimerHandle = 0;
UINT_PTR SessHandle = 0;
BOOL EventsEnabled = 0;
unsigned int TimerInst = 0xffffffff;
HANDLE hInstance = 0;

View File

@ -350,6 +350,10 @@
RelativePath=".\DRATS.c"
>
</File>
<File
RelativePath=".\Events.c"
>
</File>
<File
RelativePath="..\CommonSource\FLDigi.c"
>

View File

@ -41,6 +41,7 @@ extern int RunningConnectScript;
INT_PTR CALLBACK InfoDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
int GetMultiLineDialog(HWND hDialog, int DLGItem);
BOOL ProcessChatConnectScript(ChatCIRCUIT * conn, char * Buffer, int len);
VOID WriteMiniDump();
int Connected(int Stream)
{

109
Events.c Normal file
View File

@ -0,0 +1,109 @@
/*
Copyright 2001-2022 John Wiseman G8BPQ
This file is part of LinBPQ/BPQ32.
LinBPQ/BPQ32 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 3 of the License, or
(at your option) any later version.
LinBPQ/BPQ32 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 LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
*/
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#define _CRT_SECURE_NO_DEPRECATE
#include "compatbits.h"
#include <string.h>
VOID __cdecl Debugprintf(const char * format, ...);
#ifndef WIN32
#define APIENTRY
#define DllExport
#define VOID void
#else
#include <windows.h>
#endif
extern BOOL EventsEnabled;
// Runs use specified routine on certain event
#ifndef WIN32
void RunEventProgram(char * Program, char * Param)
{
char * arg_list[] = {Program, NULL, NULL};
pid_t child_pid;
if (EventsEnabled == 0)
return;
signal(SIGCHLD, SIG_IGN); // Silently (and portably) reap children.
if (Param && Param[0])
arg_list[1] = Param;
// Fork and Exec Specified program
// Duplicate this process.
child_pid = fork ();
if (child_pid == -1)
{
printf ("Event fork() Failed\n");
return;
}
if (child_pid == 0)
{
execvp (arg_list[0], arg_list);
// The execvp function returns only if an error occurs.
printf ("Failed to run %s\n", arg_list[0]);
exit(0); // Kill the new process
}
#else
DllExport int APIENTRY RunEventProgram(char * Program, char * Param)
{
int n = 0;
char cmdLine[256];
STARTUPINFO SInfo; // pointer to STARTUPINFO
PROCESS_INFORMATION PInfo; // pointer to PROCESS_INFORMATION
if (EventsEnabled == 0)
return 0;
SInfo.cb=sizeof(SInfo);
SInfo.lpReserved=NULL;
SInfo.lpDesktop=NULL;
SInfo.lpTitle=NULL;
SInfo.dwFlags=0;
SInfo.cbReserved2=0;
SInfo.lpReserved2=NULL;
sprintf(cmdLine, "%s %s", Program, Param);
if (!CreateProcess(NULL, cmdLine, NULL, NULL, FALSE,0 ,NULL ,NULL, &SInfo, &PInfo))
Debugprintf("Failed to Start %s Error %d ", Program, GetLastError());
#endif
return 0;
}

View File

@ -38,6 +38,8 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define SD_BOTH 0x02
#define FREEDATABUFLEN 16384 // TCP buffer size
int KillTNC(struct TNCINFO * TNC);
int RestartTNC(struct TNCINFO * TNC);
@ -254,7 +256,7 @@ static int ProcessLine(char * buf, int Port)
TNC->FreeDataInfo->TuningRange = atoi(&buf[12]);
else if (_memicmp(buf, "LimitBandWidth", 14) == 0)
TNC->FreeDataInfo->LimitBandWidth = atoi(&buf[14]);
TNC->FreeDataInfo->LimitBandWidth = atoi(&buf[15]);
else if (_memicmp(buf, "HAMLIBPORT", 10) == 0)
TNC->FreeDataInfo->hamlibPort = atoi(&buf[11]);
@ -928,14 +930,28 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
return ((TNC->TNCCONNECTED != 0) << 8 | TNC->Streams[Stream].Disconnecting << 15); // OK
case 4: // reinit7
return 0;
case 5: // Close
StopTNC(TNC);
// Drop through
case 4: // reinit7
if (TNC->TCPDataSock)
{
shutdown(TNC->TCPDataSock, SD_BOTH);
Sleep(100);
closesocket(TNC->TCPDataSock);
}
if (TNC->TCPSock)
{
shutdown(TNC->TCPSock, SD_BOTH);
Sleep(100);
closesocket(TNC->TCPSock);
}
return 0;
case 6: // Scan Stop Interface
@ -1320,7 +1336,7 @@ VOID * FreeDataExtInit(EXTPORTDATA * PortEntry)
TNC->Hardware = H_FREEDATA;
TNC->ARDOPDataBuffer = malloc(MAXRXSIZE);
TNC->ARDOPBuffer = malloc(8192);
TNC->ARDOPBuffer = malloc(FREEDATABUFLEN);
TNC->PortRecord = PortEntry;
@ -3566,9 +3582,9 @@ void FreeDataProcessDaemonMsg(struct TNCINFO * TNC)
if (TNC->InputLen > 8000) // Shouldnt have packets longer than this
TNC->InputLen=0;
InputLen=recv(TNC->TCPSock, &TNC->ARDOPBuffer[TNC->InputLen], 8191 - TNC->InputLen, 0);
InputLen=recv(TNC->TCPSock, &TNC->ARDOPBuffer[TNC->InputLen], FREEDATABUFLEN - 1 - TNC->InputLen, 0);
if (InputLen == 8191)
if (InputLen == FREEDATABUFLEN - 1)
c = 0;
@ -3970,14 +3986,11 @@ TNCRunning:
if (TNC->TNCCONNECTED)
FD_SET(TNC->TCPDataSock,&readfs);
// FD_ZERO(&writefs);
// if (TNC->BPQtoWINMOR_Q) FD_SET(TNC->TCPSock,&writefs); // Need notification of busy clearing
if (TNC->TNCCONNECTING || TNC->TNCCONNECTED) FD_SET(TNC->TCPDataSock,&errorfs);
timeout.tv_sec = 90;
timeout.tv_usec = 0; // We should get messages more frequently that this
timeout.tv_sec = 300;
timeout.tv_usec = 0;
ret = select((int)TNC->TCPSock + 1, &readfs, NULL, &errorfs, &timeout);
@ -3986,7 +3999,20 @@ TNCRunning:
Debugprintf("FreeData Select failed %d ", WSAGetLastError());
goto Lost;
}
if (ret > 0)
// If nothing doing send get rx_buffer as link validation poll
if (ret == 0)
{
char GetData[] = "{\"type\" : \"get\", \"command\": \"rx_buffer\"}\n";
int Len;
Len = send(TNC->TCPDataSock, GetData, strlen(GetData), 0);
if (Len != strlen(GetData))
goto closeThread;
}
else
{
// See what happened
@ -4007,7 +4033,7 @@ TNCRunning:
if (FD_ISSET(TNC->TCPDataSock, &errorfs))
{
Lost:
sprintf(Msg, "FreeData Daemon Connection lost for Port %d\r\n", TNC->Port);
sprintf(Msg, "FreeData TNC Connection lost for Port %d\r\n", TNC->Port);
WritetoConsole(Msg);
sprintf(TNC->WEB_COMMSSTATE, "Connection to Daemon lost");
@ -4048,11 +4074,10 @@ Lost:
}
continue;
}
else
{
}
}
closeThread:
if (TNC->TCPDataSock)
{
shutdown(TNC->TCPDataSock, SD_BOTH);

View File

@ -36,6 +36,9 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
iconv_t link_toUTF8 = NULL;
BOOL RunEventProgram(char * Program, char * Param);
#endif
BOOL ProcessChatConnectScript(ChatCIRCUIT * conn, char * Buffer, int len);
@ -48,6 +51,7 @@ void ChatWriteLogLine(ChatCIRCUIT * conn, int Flag, char * Msg, int MsgLen, int
extern struct SEM ChatSemaphore;
UCHAR * APIENTRY GetLogDirectory();
char * APIENTRY GetBPQDirectory();
VOID WriteMiniDump();
extern SOCKADDR_IN Chatreportdest;
@ -114,6 +118,9 @@ time_t RunningConnectScript = 0;
//#define free(p)
typedef int (WINAPI FAR *FARPROCX)();
extern FARPROCX pRunEventProgram;
int ChatIsUTF8(unsigned char *ptr, int len)
{
int n;
@ -1935,6 +1942,7 @@ void text_tellu_Joined(USER * user)
struct tm * tm;
char Stamp[20];
time_t T;
char prog[256] = "";
T = time(NULL);
tm = gmtime(&T);
@ -1973,6 +1981,14 @@ void text_tellu_Joined(USER * user)
nputc(circuit, 7);
nputc(circuit, 13);
#ifdef WIN32
if (pRunEventProgram)
pRunEventProgram("ChatNewUser.exe", user->call);
#else
sprintf(prog, "%s/%s", BPQDirectory, "ChatNewUser");
RunEventProgram(prog, user->call);
#endif
}
}
// Tell one link circuit about a local user change of topic.

View File

@ -506,6 +506,8 @@ extern int ISPort;
extern char ChatConfigName[250];
BOOL EventsEnabled = 0;
UCHAR * GetBPQDirectory()
{
return BPQDirectory;

View File

@ -320,6 +320,10 @@
RelativePath=".\DRATS.c"
>
</File>
<File
RelativePath=".\Events.c"
>
</File>
<File
RelativePath="..\CommonSource\FBBRoutines.c"
>

View File

@ -10,8 +10,8 @@
#endif
#define KVers 6,0,23,26
#define KVerstring "6.0.23.26\0"
#define KVers 6,0,23,27
#define KVerstring "6.0.23.27\0"
#ifdef CKernel

View File

@ -61,7 +61,8 @@
// Version 6.0.24.1 ??
// Restore CMD_TO_APPL flag to Applflags (13)
// Check for and remove names set to *RTL (
// Check for and remove names set to *RTL
// Add option to run user program when chat user connects (27)
#include "BPQChat.h"
@ -214,6 +215,7 @@ VOID SaveStringValue(config_setting_t * group, char * name, char * value);
VOID SaveIntValue(config_setting_t * group, char * name, int value);
VOID SaveChatConfig(HWND hDlg);
BOOL CreateChatPipeThread();
VOID WriteMiniDump();
struct _EXCEPTION_POINTERS exinfox;
@ -224,6 +226,9 @@ DWORD Stack[16];
BOOL Restarting = FALSE;
typedef int (WINAPI FAR *FARPROCX)();
FARPROCX pRunEventProgram;
int Dump_Process_State(struct _EXCEPTION_POINTERS * exinfo, char * Msg)
{
unsigned int SPPtr;
@ -1282,6 +1287,7 @@ BOOL Initialise()
{
int i;
ChatCIRCUIT * conn;
HMODULE ExtDriver = LoadLibrary("bpq32.dll");
// Register message for posting by BPQDLL
@ -1388,6 +1394,11 @@ Retry:
CreateChatPipeThread();
if (ExtDriver)
pRunEventProgram = GetProcAddress(ExtDriver,"_RunEventProgram@8");
return TRUE;
}

View File

@ -137,6 +137,8 @@ BOOL LogAllConnects = FALSE;
BOOL AUTOSAVEMH = TRUE;
extern BOOL ADIFLogEnabled;
extern UCHAR LogDirectory[260];
extern BOOL EventsEnabled;
extern BOOL SaveAPRSMsgs;
//TNCTABLE DD 0
//NUMBEROFSTREAMS DD 0
@ -759,6 +761,8 @@ BOOL Start()
LogAllConnects = cfg->C_LogAllConnects;
AUTOSAVEMH = cfg->C_SaveMH;
ADIFLogEnabled = cfg->C_ADIF;
EventsEnabled = cfg->C_EVENTS;
SaveAPRSMsgs = cfg->C_SaveAPRSMsgs;
// Get pointers to PASSWORD and APPL1 commands

View File

@ -299,7 +299,7 @@ static char *keywords[] =
"APPL1QUAL", "APPL2QUAL", "APPL3QUAL", "APPL4QUAL",
"APPL5QUAL", "APPL6QUAL", "APPL7QUAL", "APPL8QUAL",
"BTEXT:", "NETROMCALL", "C_IS_CHAT", "MAXRTT", "MAXHOPS", // IPGATEWAY= no longer allowed
"LogL4Connects", "LogAllConnects", "SAVEMH", "ENABLEADIFLOG"
"LogL4Connects", "LogAllConnects", "SAVEMH", "ENABLEADIFLOG", "ENABLEEVENTS", "SAVEAPRSMSGS"
}; /* parameter keywords */
static void * offset[] =
@ -319,7 +319,7 @@ static void * offset[] =
&xxcfg.C_APPL[0].ApplQual, &xxcfg.C_APPL[1].ApplQual, &xxcfg.C_APPL[2].ApplQual, &xxcfg.C_APPL[3].ApplQual,
&xxcfg.C_APPL[4].ApplQual, &xxcfg.C_APPL[5].ApplQual, &xxcfg.C_APPL[6].ApplQual, &xxcfg.C_APPL[7].ApplQual,
&xxcfg.C_BTEXT, &xxcfg.C_NETROMCALL, &xxcfg.C_C, &xxcfg.C_MAXRTT, &xxcfg.C_MAXHOPS, // IPGATEWAY= no longer allowed
&xxcfg.C_LogL4Connects, &xxcfg.C_LogAllConnects, &xxcfg.C_SaveMH, &xxcfg.C_ADIF}; /* offset for corresponding data in config file */
&xxcfg.C_LogL4Connects, &xxcfg.C_LogAllConnects, &xxcfg.C_SaveMH, &xxcfg.C_ADIF, &xxcfg.C_EVENTS, &xxcfg.C_SaveAPRSMsgs}; /* offset for corresponding data in config file */
static int routine[] =
{
@ -338,7 +338,7 @@ static int routine[] =
14, 14, 14, 14,
14, 14 ,14, 14,
15, 0, 2, 9, 9,
2, 2, 2, 2} ; // Routine to process param
2, 2, 2, 2, 2, 2} ; // Routine to process param
int PARAMLIM = sizeof(routine)/sizeof(int);
//int NUMBEROFKEYWORDS = sizeof(routine)/sizeof(int);
@ -407,7 +407,7 @@ static int routeindex = 0;
/* Global variables */
/************************************************************************/
int paramok[100]; /* PARAMETER OK FLAG */
int paramok[100] = {0}; /* PARAMETER OK FLAG */
FILE *fp1; /* TEXT INPUT FILE */
@ -587,6 +587,8 @@ BOOL ProcessConfig()
paramok[75]=1; // LogAllConnects optional
paramok[76]=1; // SAVEMH optional
paramok[77]=1; // ENABLEADIFLOG optional
paramok[78]=1; // EnableEvents optional
paramok[79]=1; // SaveAPRSMsgs optional
for (i=0; i < PARAMLIM; i++)
{

View File

@ -142,8 +142,9 @@ struct CONFIGTABLE
UCHAR C_BTEXT[120]; // 121
char C_VERSTRING[10]; // 241 Version String from Config File
UCHAR C_ADIF;
UCHAR C_LogAllConnects;
UCHAR Spare3[2]; // 252 - 4
UCHAR C_EVENTS;
UCHAR C_LogAllConnects;
UCHAR C_SaveAPRSMsgs;
UCHAR C_VERSION; // CONFIG PROG VERSION
// Reuse C_APPLICATIONS - no longer used
char C_NETROMCALL[10];

View File

@ -13,7 +13,7 @@ OBJS = pngwtran.o pngrtran.o pngset.o pngrio.o pngwio.o pngtrans.o pngrutil.o pn
MailCommands.o MailDataDefs.o LinBPQ.o MailRouting.o MailTCP.o MBLRoutines.o md5.o Moncode.o \
NNTPRoutines.o RigControl.o TelnetV6.o WINMOR.o TNCCode.o UZ7HODrv.o WPRoutines.o \
SCSTrackeMulti.o SCSPactor.o SCSTracker.o HanksRT.o UIRoutines.o AGWAPI.o AGWMoncode.o \
DRATS.o FreeDATA.o base64.o
DRATS.o FreeDATA.o base64.o Events.o
# Configuration:

View File

@ -377,6 +377,7 @@ char * WebMailPagetxt()
"<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\"> \r\n"
"<head> \r\n"
"<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\"/> \r\n"
"<meta http-equiv=refresh content=300>"
"<style type=\"text/css\">\r\n"
"pre {margin-left: 4px;white-space: pre} \r\n"
"#main{width:700px;position:absolute;left:0px;border:2px solid;background-color: #ffffff;}\r\n"