Liza 0.9, works on new network stack.

git-svn-id: svn://kolibrios.org@4139 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
hidnplayr 2013-10-31 18:40:41 +00:00
parent a6ab7fa13e
commit 4fe0afac2f
5 changed files with 211 additions and 134 deletions

View File

@ -0,0 +1,96 @@
#define SOCK_STREAM 1
#define SOCK_DGRAM 2
#define AF_INET4 2
#define MSG_PEEK 0x02
#define MSG_DONTWAIT 0x40
dword errorcode;
struct sockaddr_in{
word sin_family;
word sin_port;
dword sin_addr;
char padding[8];
};
inline fastcall dword Socket(ECX, EDX, ESI)
{
$push ebx
$mov eax, 75
$mov ebx, 0
$int 0x40
errorcode = EBX;
$pop ebx
}
inline fastcall dword Close(ECX)
{
$push ebx
$mov eax, 75
$mov ebx, 1
$int 0x40
errorcode = EBX;
$pop ebx
}
inline fastcall dword Bind(ECX, EDX, ESI)
{
$push ebx
$mov eax, 75
$mov ebx, 2
$int 0x40
errorcode = EBX;
$pop ebx
}
inline fastcall dword Listen(ECX, EDX)
{
$push ebx
$mov eax, 75
$mov ebx, 3
$int 0x40
errorcode = EBX;
$pop ebx
}
inline fastcall dword Connect(ECX, EDX, ESI)
{
$push ebx
$mov eax, 75
$mov ebx, 4
$int 0x40
errorcode = EBX;
$pop ebx
}
inline fastcall dword Accept(ECX, EDX, ESI)
{
$push ebx
$mov eax, 75
$mov ebx, 5
$int 0x40
errorcode = EBX;
$pop ebx
}
inline fastcall dword Send(ECX, EDX, ESI, EDI)
{
$push ebx
$mov eax, 75
$mov ebx, 6
$int 0x40
errorcode = EBX;
$pop ebx
}
inline fastcall dword Receive(ECX, EDX, ESI, EDI)
{
$push ebx
$mov eax, 75
$mov ebx, 7
$int 0x40
errorcode = EBX;
$pop ebx
}

View File

@ -10,7 +10,7 @@
#include "..\lib\figures.h" #include "..\lib\figures.h"
#include "..\lib\file_system.h" #include "..\lib\file_system.h"
#include "..\lib\list_box.h" #include "..\lib\list_box.h"
#include "..\lib\socket.h" #include "..\lib\socket_new.h"
//*.obj libraries //*.obj libraries
#include "..\lib\lib.obj\box_lib.h" #include "..\lib\lib.obj\box_lib.h"
#include "..\lib\lib.obj\network.h" #include "..\lib\lib.obj\network.h"
@ -24,10 +24,8 @@ byte in_out_mail[18*36] = FROM "in_out_mail.raw";
//connection algorithm //connection algorithm
enum { enum {
STOP, STOP,
GET_PORT, RESOLVE,
GET_SERVER_IP, OPEN_CONNECTION,
GET_SOCKET,
CONNECT,
GET_ANSWER_CONNECT, GET_ANSWER_CONNECT,
SEND_USER, SEND_USER,
GET_ANSWER_USER, GET_ANSWER_USER,
@ -38,7 +36,8 @@ enum {
SEND_NSTAT, SEND_NSTAT,
GET_ANSWER_NSTAT, GET_ANSWER_NSTAT,
SEND_RETR, SEND_RETR,
GET_ANSWER_RETR GET_ANSWER_RETR,
FAILED
}; };
//WindowDefinitions //WindowDefinitions
@ -46,9 +45,10 @@ enum {
#define WIN_H 440 #define WIN_H 440
#define WIN_MIN_W 500 #define WIN_MIN_W 500
#define WIN_MIN_H 380 #define WIN_MIN_H 380
#define LOGIN_HEADER "Login - Email client Liza 0.8a" #define LOGIN_HEADER "Login - Email client Liza 0.9"
#define OPTIONS_HEADER "Options - Email client Liza 0.8a" #define OPTIONS_HEADER "Options - Email client Liza 0.9"
#define MAILBOX_HEADER "Mail Box - Email client Liza 0.8a" #define MAILBOX_HEADER "Mail Box - Email client Liza 0.9"
#define BUFFERSIZE 512
proc_info Form; proc_info Form;
system_colors sc; system_colors sc;
#define LBUMP 0xFFFfff #define LBUMP 0xFFFfff
@ -59,34 +59,20 @@ dword cur_st_text;
//connection data //connection data
#define DEFAULT_POP_PORT 110; #define DEFAULT_POP_PORT 110;
dword local_port=1000;
char POP_server_path[128]; char POP_server_path[128];
dword POP_server_IP;
dword POP_server_port; dword POP_server_port;
char login[128]; char login[128];
char request[256+22]; char request[256+22];
int request_len; int request_len;
char connection_status; char connection_status;
dword socket; dword socketnum;
sockaddr_in sockaddr;
int aim; int aim;
int ticks; int ticks;
//global data for server response char immbuffer[BUFFERSIZE];
char immbuffer[512];
int immpointer;
void immfree(){
immpointer=0;
immbuffer[immpointer]='\0';
}
void immputc(char agot_char){
immbuffer[immpointer]=agot_char;
immpointer++;
immbuffer[immpointer]='\0';
if (immpointer>511) {immpointer=0; debug ("IMM BUFFER OVERFLOW ERROR"); aim=NULL;}
}
#include "settings.c" #include "settings.c"
#include "login.c" #include "login.c"
@ -127,9 +113,7 @@ void OpenMailDat()
ReadFile(0, 512, #read_data, "/sys/network/mail.dat"); ReadFile(0, 512, #read_data, "/sys/network/mail.dat");
if (!read_data) if (!read_data)
{ {
//strcpy(#email_text, "eiroglif@yandex.ru"); //temporarily, for testing
strcpy(#email_text, "example@mail.com"); strcpy(#email_text, "example@mail.com");
//strcpy(#pass_text, "rostov");
} }
else else
{ {
@ -147,7 +131,7 @@ void OpenMailDat()
void SaveAndExit() void SaveAndExit()
{ {
char write_data[512], pass_b64[256]; char write_data[512], pass_b64[256];
CloseSocket(socket); Close(socketnum);
strcpy(#write_data, #email_text); strcpy(#write_data, #email_text);
strcat(#write_data, "\n"); strcat(#write_data, "\n");
base64_encode stdcall (#pass_text, #pass_b64, strlen(#pass_text)); base64_encode stdcall (#pass_text, #pass_b64, strlen(#pass_text));

View File

@ -38,7 +38,7 @@ void LoginBoxLoop()
if (id==11) OptionsLoop(); if (id==11) OptionsLoop();
if (id==12) if (id==12)
{ {
if (!aim) aim=GET_PORT; else aim=NULL; if (!aim) aim=RESOLVE; else aim=NULL;
GetSettings(); GetSettings();
SetLoginStatus(NULL, NULL); SetLoginStatus(NULL, NULL);
DrawLoginScreen(); DrawLoginScreen();
@ -60,7 +60,7 @@ void LoginBoxLoop()
if (key==13) if (key==13)
{ {
if (aim) break; if (aim) break;
aim=GET_PORT; aim=RESOLVE;
GetSettings(); GetSettings();
SetLoginStatus(NULL, NULL); SetLoginStatus(NULL, NULL);
DrawLoginScreen(); DrawLoginScreen();
@ -81,70 +81,62 @@ void LoginBoxLoop()
if (!pass_text) { notify("Enter password!"); aim=NULL; } if (!pass_text) { notify("Enter password!"); aim=NULL; }
if ((!login) || (!POP_server_path)) { notify("Email should be such as username@somesite.com"); aim=NULL; } if ((!login) || (!POP_server_path)) { notify("Email should be such as username@somesite.com"); aim=NULL; }
if (aim == GET_PORT) if (aim == RESOLVE)
{ {
SetLoginStatus(5, "Search for free local port..."); SetLoginStatus(1, "Resolving server address...");
local_port = GetFreePort(1000);
if (!local_port) { notify("Error: There is no free local ports"); aim=NULL; break;} sockaddr.sin_family = AF_INET4;
SetLoginStatus(12, "Obtain server IP..."); AX = POP_server_port;
aim = GET_SERVER_IP; $xchg al, ah
} sockaddr.sin_port = AX;
sockaddr.sin_addr = GetIPfromAdress(#POP_server_path);
if (!sockaddr.sin_addr) { SetLoginStatus(12, "Can't obtain server IP."); aim = FAILED; break;}
if (aim == GET_SERVER_IP) aim = OPEN_CONNECTION;
{
POP_server_IP = GetIPfromAdress(#POP_server_path);
if (!POP_server_IP) { SetLoginStatus(12, "Can't obtain server IP. Retry..."); break; }
SetLoginStatus(25, "Obtain to open socket..."w);
aim = GET_SOCKET;
}
if (aim == GET_SOCKET)
{
socket = OpenSocket(local_port, POP_server_port, POP_server_IP, SOCKET_ACTIVE);
if (socket == 0xffffffff) { SetLoginStatus(25, "Error obtaining socket. Retry..."); break;}
SetLoginStatus(40, "Establish a connection...");
aim = CONNECT;
}
if (aim == CONNECT)
{
connection_status=StatusSocket(socket);
if (connection_status==0) {notify("Connection to server isn't possible"); aim=NULL; break; };
if (connection_status==7) {SetLoginStatus(40, "Server disconnected. Retry..."); break; };
if (connection_status!=4) break; //0-connection isn't possible, 2-connecting, 4-connected, 7-server disconnected
SetLoginStatus(55, "Connection established. Reading answer...");
immfree();
aim = GET_ANSWER_CONNECT;
} }
if (aim == OPEN_CONNECTION)
{
SetLoginStatus(1, "Connecting to server...");
socketnum = Socket(AF_INET4, SOCK_STREAM, 0);
if (socketnum == 0xffffffff) { SetLoginStatus(13, "Cannot open socket."); aim = FAILED; break;}
Connect(socketnum, #sockaddr, 16);
SetLoginStatus(55, "Connection established. Waiting for answer...");
aim = GET_ANSWER_CONNECT;
}
if (aim == GET_ANSWER_CONNECT) if (aim == GET_ANSWER_CONNECT)
{ {
if (!PollSocket(socket)) break; ticks = Receive(socketnum, #immbuffer, BUFFERSIZE, 0);
socket_char=ReadSocket(socket); if ((ticks == 0xffffff) || (ticks < 2)) { SetLoginStatus(61, "Connection failed"); aim = FAILED; break;}
immputc(socket_char); immbuffer[ticks]='\0';
if (socket_char=='\n') if (immbuffer[ticks-2]=='\n')
{ {
debug(#immbuffer); debug(#immbuffer);
if (strstr(#immbuffer,"+OK")) if (strstr(#immbuffer,"+OK"))
{ {
SetLoginStatus(60, "Verifying username..."); SetLoginStatus(60, "Verifying username...");
aim = SEND_USER; aim = SEND_USER;
immfree();
} }
else else
{ {
immfree();
//aim=NULL; //may don't need retry? //aim=NULL; //may don't need retry?
SetLoginStatus(55, "Failed to connect to server. Retry..."); SetLoginStatus(55, "Failed to connect to server. Retry...");
} }
} }
else
{
SetLoginStatus(103, "Connection failed");
}
} }
if (aim == SEND_USER) if (aim == SEND_USER)
{ {
request_len = GetRequest("USER", #login); request_len = GetRequest("USER", #login);
WriteSocket(socket,request_len,#request); Send(socketnum, #request, request_len, 0);
if (EAX == 0xffffffff) { SetLoginStatus(60, "Failed to send USER. Retry..."); break;} if (EAX == 0xffffffff) { SetLoginStatus(60, "Failed to send USER. Retry..."); break;}
SetLoginStatus(70, "Login verifying..."); SetLoginStatus(70, "Login verifying...");
debug("Send USER, awaiting answer..."); debug("Send USER, awaiting answer...");
@ -153,18 +145,22 @@ void LoginBoxLoop()
if (aim == GET_ANSWER_USER) if (aim == GET_ANSWER_USER)
{ {
if (!PollSocket(socket)) break; ticks = Receive(socketnum, #immbuffer, BUFFERSIZE, 0);
socket_char=ReadSocket(socket); if ((ticks == 0xffffffff) || (ticks < 2)) { SetLoginStatus(81, "Connection failed"); break;}
immputc(socket_char); immbuffer[ticks]='\0';
if (socket_char=='\n') if (immbuffer[ticks-2]=='\n')
{ {
debug("GOT::"); debug("GOT::");
debug(#immbuffer); debug(#immbuffer);
if (strstr(#immbuffer,"+OK")) if (strstr(#immbuffer,"+OK"))
{ aim = SEND_PASS; SetLoginStatus(80, "Verifying password..."); immfree(); } { aim = SEND_PASS; SetLoginStatus(80, "Verifying password...");}
else else
{ notify("Wrong username"); immfree(); aim=NULL;} { notify("Wrong username"); aim=NULL;}
}
else
{
SetLoginStatus(103, "Connection failed");
} }
} }
@ -172,18 +168,18 @@ void LoginBoxLoop()
{ {
debug("\n Send PASS, awaiting answer..."); debug("\n Send PASS, awaiting answer...");
request_len = GetRequest("PASS", #pass_text); request_len = GetRequest("PASS", #pass_text);
WriteSocket(socket,request_len,#request); Send(socketnum, #request, request_len, 0);
if (EAX == 0xffffffff) { SetLoginStatus(80, "Failed to send PASS. Retry..."); break;} if (EAX == 0xffffffff) { SetLoginStatus(80, "Failed to send PASS. Retry..."); break;}
aim = GET_ANSWER_PASS; aim = GET_ANSWER_PASS;
} }
if (aim == GET_ANSWER_PASS) if (aim == GET_ANSWER_PASS)
{ {
if (!PollSocket(socket)) break; ticks = Receive(socketnum, #immbuffer, BUFFERSIZE, 0);
socket_char=ReadSocket(socket); if ((ticks == 0xffffff) || (ticks < 2)) { SetLoginStatus(101, "Server disconnected"); break;}
immputc(socket_char); immbuffer[ticks]='\0';
if (socket_char=='\n') if (immbuffer[ticks-2]=='\n')
{ {
debug("GOT::"); debug("GOT::");
debug(#immbuffer); debug(#immbuffer);
@ -191,16 +187,18 @@ void LoginBoxLoop()
{ {
SetLoginStatus(100, "Entering mailbox..."); SetLoginStatus(100, "Entering mailbox...");
aim=SEND_NSTAT; aim=SEND_NSTAT;
immfree();
MailBoxLoop(); MailBoxLoop();
} }
else else
{ {
notify("Wrong password"); notify("Wrong password");
aim=NULL; aim=NULL;
immfree();
} }
} }
else
{
SetLoginStatus(103, "Connection failed");
}
} }

View File

@ -132,7 +132,7 @@ void MailBoxLoop()
if (id==EXIT_MAIL) if (id==EXIT_MAIL)
{ {
StopLoading(); StopLoading();
CloseSocket(socket); Close(socketnum);
LoginBoxLoop(); LoginBoxLoop();
} }
if (id==CHANGE_CHARSET) if (id==CHANGE_CHARSET)
@ -208,18 +208,17 @@ void MailBoxLoop()
{ {
debug("Counting mail, awaiting answer..."); debug("Counting mail, awaiting answer...");
request_len = GetRequest("STAT", NULL); request_len = GetRequest("STAT", NULL);
WriteSocket(socket,request_len,#request); Send(socketnum, #request, request_len, 0);
if (EAX == 0xffffffff) { debug("Error sending STAT. Retry..."w); break;} if (EAX == 0xffffffff) { debug("Error sending STAT. Retry..."w); break;}
aim = GET_ANSWER_NSTAT; aim = GET_ANSWER_NSTAT;
} }
if (aim == GET_ANSWER_NSTAT) if (aim == GET_ANSWER_NSTAT)
{ {
if (!PollSocket(socket)) break; ticks = Receive(socketnum, #immbuffer, BUFFERSIZE, 0);
socket_char=ReadSocket(socket); if ((ticks == 0xffffff) || (ticks < 2)) break;
immputc(socket_char);
if (immbuffer[ticks-2]=='\n')
if (socket_char=='\n')
{ {
debug("GOT::"); debug("GOT::");
debug(#immbuffer); debug(#immbuffer);
@ -232,13 +231,11 @@ void MailBoxLoop()
listbuffer = mem_Alloc(30*mail_list.count); //24* original listbuffer = mem_Alloc(30*mail_list.count); //24* original
listpointer = listbuffer; listpointer = listbuffer;
aim = SEND_NLIST; aim = SEND_NLIST;
debug("Recieving mail list..."); debug("Receiving mail list...");
immfree();
} }
else else
{ {
notify("Sorry, can't recieve your mail"); notify("Sorry, can't recieve your mail");
immfree();
aim=NULL; //aim = SEND_NLIST; aim=NULL; //aim = SEND_NLIST;
} }
} }
@ -248,21 +245,19 @@ void MailBoxLoop()
{ {
WriteText(5, Form.cheight-11, 0x80, sc.work_text, "Send LIST, awaiting answer..."); WriteText(5, Form.cheight-11, 0x80, sc.work_text, "Send LIST, awaiting answer...");
request_len = GetRequest("LIST", NULL); request_len = GetRequest("LIST", NULL);
WriteSocket(socket,request_len,#request); Send(socketnum, #request, request_len, 0);
if (EAX == 0xffffffff) {debug("Error while sending LIST. Retry..."); break;} if (EAX == 0xffffffff) {debug("Error while sending LIST. Retry..."); break;}
aim = GET_ANSWER_NLIST; aim = GET_ANSWER_NLIST;
} }
if (aim == GET_ANSWER_NLIST) if (aim == GET_ANSWER_NLIST)
{ {
ticks = PollSocket(socket); ticks = Receive(socketnum, #immbuffer, BUFFERSIZE, 0);
if (!ticks) break; if ((ticks == 0xffffffff) || (ticks < 3)) break;
for (;ticks>0;ticks--)
{ //for (;ticks>0;ticks--)
socket_char=ReadSocket(socket); //{
listputc(socket_char); if (immbuffer[ticks-3]=='.') //this way of checking end of message IS BAD
if (socket_char=='.') //this way of checking end of message IS BAD
{ {
aim = SEND_RETR; aim = SEND_RETR;
debug("Got mail list"); debug("Got mail list");
@ -271,8 +266,9 @@ void MailBoxLoop()
atr.CreateArray(); atr.CreateArray();
atr.SetSizes(); atr.SetSizes();
} }
} //}
} }
if (aim == SEND_RETR) if (aim == SEND_RETR)
{ {
from = to = date = subj = cur_charset = NULL; from = to = date = subj = cur_charset = NULL;
@ -280,46 +276,46 @@ void MailBoxLoop()
DrawMailBox(); DrawMailBox();
debug("Send RETR, awaiting answer..."); debug("Send RETR, awaiting answer...");
request_len = GetRequest("RETR", itoa(mail_list.current+1)); request_len = GetRequest("RETR", itoa(mail_list.current+1));
WriteSocket(socket,request_len,#request); Send(socketnum, #request, request_len, 0);
if (EAX == 0xffffffff) { notify("Error while trying to get letter from server"); aim=NULL; break;} if (EAX == 0xffffffff) { notify("Error while trying to get letter from server"); aim=NULL; break;}
mailbuffer = free(mailbuffer); mailbuffer = free(mailbuffer);
letter_size = atr.GetSize(mail_list.current+1) + 1024; letter_size = atr.GetSize(mail_list.current+1) + 1024;
mailbuffer = malloc(letter_size); mailbuffer = malloc(letter_size);
if (!mailbuffer) {debug("alloc error!"); aim=NULL; break;}
mailpointer = mailbuffer; mailpointer = mailbuffer;
aim = GET_ANSWER_RETR; aim = GET_ANSWER_RETR;
} }
if (aim == GET_ANSWER_RETR) if (aim == GET_ANSWER_RETR)
{ {
ticks=PollSocket(socket); ticks = Receive(socketnum, mailpointer, letter_size + mailbuffer - mailpointer , MSG_DONTWAIT);
if (!ticks) break; if (ticks == 0xffffffff) break;
if (ticks == 0) break;
//debugi(EAX);
mailpointer = mailpointer + ticks;
//*mailpointer='\0';
//debug(mailbuffer);
for (;ticks>0;ticks--) if (!aim) continue;
if (letter_size + mailbuffer - mailpointer - 2 < 0)
{ {
socket_char=ReadSocket(socket); debug("Resizing buffer");
//debugch(socket_char); letter_size += 4096;
*mailpointer=socket_char; mailbuffer = realloc(mailbuffer, letter_size);
mailpointer++; if (!mailbuffer) {debug("Realloc error!"); aim=NULL; break;}
*mailpointer='\0'; }
if (!aim) continue;
if (letter_size + mailbuffer - mailpointer - 2 < 0) if (letter_size>9000)
{ {
debug("Buffer overflow!!1 Realloc..."w); id = mailpointer - mailbuffer * 100 ;
letter_size += 4096; id /= letter_size - 1024;
mailbuffer = realloc(mailbuffer, letter_size); if (id!=cur_st_percent) SetMailBoxStatus( id , NULL);
if (!mailbuffer) {debug("Relloc error!"); aim=NULL; break;} }
}
if (letter_size>9000) ParseMail();
{
id = mailpointer - mailbuffer * 100 ;
id /= letter_size - 1024;
if (id!=cur_st_percent) SetMailBoxStatus( id , NULL);
}
ParceMail();
}
} }
} }
@ -491,7 +487,6 @@ void StopLoading()
aim = NULL; aim = NULL;
mailbuffer = free(mailbuffer); mailbuffer = free(mailbuffer);
to = from = date = subj = cur_charset = NULL; to = from = date = subj = cur_charset = NULL;
while (PollSocket(socket)) ReadSocket(socket);
} }
int GetMailCount(){ int GetMailCount(){

View File

@ -1,12 +1,16 @@
//Leency & SoUrcerer, LGPL //Leency & SoUrcerer, LGPL
void ParceMail() void ParseMail()
{ {
dword line_off, new_buf; dword line_off, new_buf;
char tline[256]; char tline[256];
if ( mailpointer-mailbuffer>9 ) if ( (strncmp(mailpointer-5,"\r\n.\r\n",5)==0) || (strncmp(mailpointer-3,"\n.\n",3)==0) ) if ( mailpointer-mailbuffer>9 ) if (strncmp(mailpointer-5,"\n.\n",5)==0) // note that c-- assembles "\n.\n" to 0x0d, 0x0a, 0x2e, 0x0d, 0x0a
{ {
debug("End of mail detected");
mailpointer = mailpointer - 5;
*mailpointer='\0';
if (strstr(mailbuffer, "+OK")!=mailbuffer) if (strstr(mailbuffer, "+OK")!=mailbuffer)
{ {
aim = GET_ANSWER_RETR; aim = GET_ANSWER_RETR;