Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 4138 → Rev 4139

/programs/cmm/lib/socket_new.h
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
}
/programs/cmm/liza/liza.c
10,7 → 10,7
#include "..\lib\figures.h"
#include "..\lib\file_system.h"
#include "..\lib\list_box.h"
#include "..\lib\socket.h"
#include "..\lib\socket_new.h"
//*.obj libraries
#include "..\lib\lib.obj\box_lib.h"
#include "..\lib\lib.obj\network.h"
24,10 → 24,8
//connection algorithm
enum {
STOP,
GET_PORT,
GET_SERVER_IP,
GET_SOCKET,
CONNECT,
RESOLVE,
OPEN_CONNECTION,
GET_ANSWER_CONNECT,
SEND_USER,
GET_ANSWER_USER,
38,7 → 36,8
SEND_NSTAT,
GET_ANSWER_NSTAT,
SEND_RETR,
GET_ANSWER_RETR
GET_ANSWER_RETR,
FAILED
};
 
//WindowDefinitions
46,9 → 45,10
#define WIN_H 440
#define WIN_MIN_W 500
#define WIN_MIN_H 380
#define LOGIN_HEADER "Login - Email client Liza 0.8a"
#define OPTIONS_HEADER "Options - Email client Liza 0.8a"
#define MAILBOX_HEADER "Mail Box - Email client Liza 0.8a"
#define LOGIN_HEADER "Login - Email client Liza 0.9"
#define OPTIONS_HEADER "Options - Email client Liza 0.9"
#define MAILBOX_HEADER "Mail Box - Email client Liza 0.9"
#define BUFFERSIZE 512
proc_info Form;
system_colors sc;
#define LBUMP 0xFFFfff
59,35 → 59,21
 
//connection data
#define DEFAULT_POP_PORT 110;
dword local_port=1000;
char POP_server_path[128];
dword POP_server_IP;
dword POP_server_port;
char login[128];
char request[256+22];
int request_len;
char connection_status;
dword socket;
dword socketnum;
 
sockaddr_in sockaddr;
 
int aim;
int ticks;
 
//global data for server response
char immbuffer[512];
int immpointer;
char immbuffer[BUFFERSIZE];
 
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 "login.c"
#include "mail_box.c"
127,9 → 113,7
ReadFile(0, 512, #read_data, "/sys/network/mail.dat");
if (!read_data)
{
//strcpy(#email_text, "eiroglif@yandex.ru"); //temporarily, for testing
strcpy(#email_text, "example@mail.com");
//strcpy(#pass_text, "rostov");
}
else
{
147,7 → 131,7
void SaveAndExit()
{
char write_data[512], pass_b64[256];
CloseSocket(socket);
Close(socketnum);
strcpy(#write_data, #email_text);
strcat(#write_data, "\n");
base64_encode stdcall (#pass_text, #pass_b64, strlen(#pass_text));
/programs/cmm/liza/login.c
38,7 → 38,7
if (id==11) OptionsLoop();
if (id==12)
{
if (!aim) aim=GET_PORT; else aim=NULL;
if (!aim) aim=RESOLVE; else aim=NULL;
GetSettings();
SetLoginStatus(NULL, NULL);
DrawLoginScreen();
60,7 → 60,7
if (key==13)
{
if (aim) break;
aim=GET_PORT;
aim=RESOLVE;
GetSettings();
SetLoginStatus(NULL, NULL);
DrawLoginScreen();
81,49 → 81,39
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 (aim == GET_PORT)
if (aim == RESOLVE)
{
SetLoginStatus(5, "Search for free local port...");
local_port = GetFreePort(1000);
if (!local_port) { notify("Error: There is no free local ports"); aim=NULL; break;}
SetLoginStatus(12, "Obtain server IP...");
aim = GET_SERVER_IP;
}
SetLoginStatus(1, "Resolving server address...");
 
if (aim == GET_SERVER_IP)
{
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;
sockaddr.sin_family = AF_INET4;
AX = POP_server_port;
$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;}
 
aim = OPEN_CONNECTION;
}
 
if (aim == GET_SOCKET)
if (aim == OPEN_CONNECTION)
{
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;
}
SetLoginStatus(1, "Connecting to server...");
 
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();
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 (!PollSocket(socket)) break;
socket_char=ReadSocket(socket);
immputc(socket_char);
ticks = Receive(socketnum, #immbuffer, BUFFERSIZE, 0);
if ((ticks == 0xffffff) || (ticks < 2)) { SetLoginStatus(61, "Connection failed"); aim = FAILED; break;}
immbuffer[ticks]='\0';
if (socket_char=='\n')
if (immbuffer[ticks-2]=='\n')
{
debug(#immbuffer);
if (strstr(#immbuffer,"+OK"))
130,21 → 120,23
{
SetLoginStatus(60, "Verifying username...");
aim = SEND_USER;
immfree();
}
else
{
immfree();
//aim=NULL; //may don't need retry?
SetLoginStatus(55, "Failed to connect to server. Retry...");
}
}
else
{
SetLoginStatus(103, "Connection failed");
}
}
 
if (aim == SEND_USER)
{
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;}
SetLoginStatus(70, "Login verifying...");
debug("Send USER, awaiting answer...");
153,26 → 145,30
 
if (aim == GET_ANSWER_USER)
{
if (!PollSocket(socket)) break;
socket_char=ReadSocket(socket);
immputc(socket_char);
ticks = Receive(socketnum, #immbuffer, BUFFERSIZE, 0);
if ((ticks == 0xffffffff) || (ticks < 2)) { SetLoginStatus(81, "Connection failed"); break;}
immbuffer[ticks]='\0';
if (socket_char=='\n')
if (immbuffer[ticks-2]=='\n')
{
debug("GOT::");
debug(#immbuffer);
if (strstr(#immbuffer,"+OK"))
{ aim = SEND_PASS; SetLoginStatus(80, "Verifying password..."); immfree(); }
{ aim = SEND_PASS; SetLoginStatus(80, "Verifying password...");}
else
{ notify("Wrong username"); immfree(); aim=NULL;}
{ notify("Wrong username"); aim=NULL;}
}
else
{
SetLoginStatus(103, "Connection failed");
}
}
 
if (aim == SEND_PASS)
{
debug("\n Send PASS, awaiting answer...");
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;}
aim = GET_ANSWER_PASS;
}
179,11 → 175,11
 
if (aim == GET_ANSWER_PASS)
{
if (!PollSocket(socket)) break;
socket_char=ReadSocket(socket);
immputc(socket_char);
ticks = Receive(socketnum, #immbuffer, BUFFERSIZE, 0);
if ((ticks == 0xffffff) || (ticks < 2)) { SetLoginStatus(101, "Server disconnected"); break;}
immbuffer[ticks]='\0';
if (socket_char=='\n')
if (immbuffer[ticks-2]=='\n')
{
debug("GOT::");
debug(#immbuffer);
191,7 → 187,6
{
SetLoginStatus(100, "Entering mailbox...");
aim=SEND_NSTAT;
immfree();
MailBoxLoop();
}
else
198,9 → 193,12
{
notify("Wrong password");
aim=NULL;
immfree();
}
}
else
{
SetLoginStatus(103, "Connection failed");
}
}
/programs/cmm/liza/mail_box.c
132,7 → 132,7
if (id==EXIT_MAIL)
{
StopLoading();
CloseSocket(socket);
Close(socketnum);
LoginBoxLoop();
}
if (id==CHANGE_CHARSET)
208,7 → 208,7
{
debug("Counting mail, awaiting answer...");
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;}
aim = GET_ANSWER_NSTAT;
}
215,11 → 215,10
if (aim == GET_ANSWER_NSTAT)
{
if (!PollSocket(socket)) break;
socket_char=ReadSocket(socket);
immputc(socket_char);
ticks = Receive(socketnum, #immbuffer, BUFFERSIZE, 0);
if ((ticks == 0xffffff) || (ticks < 2)) break;
if (socket_char=='\n')
if (immbuffer[ticks-2]=='\n')
{
debug("GOT::");
debug(#immbuffer);
232,13 → 231,11
listbuffer = mem_Alloc(30*mail_list.count); //24* original
listpointer = listbuffer;
aim = SEND_NLIST;
debug("Recieving mail list...");
immfree();
debug("Receiving mail list...");
}
else
{
notify("Sorry, can't recieve your mail");
immfree();
aim=NULL; //aim = SEND_NLIST;
}
}
248,7 → 245,7
{
WriteText(5, Form.cheight-11, 0x80, sc.work_text, "Send LIST, awaiting answer...");
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;}
aim = GET_ANSWER_NLIST;
}
255,14 → 252,12
 
if (aim == GET_ANSWER_NLIST)
{
ticks = PollSocket(socket);
if (!ticks) break;
for (;ticks>0;ticks--)
{
socket_char=ReadSocket(socket);
listputc(socket_char);
ticks = Receive(socketnum, #immbuffer, BUFFERSIZE, 0);
if ((ticks == 0xffffffff) || (ticks < 3)) break;
if (socket_char=='.') //this way of checking end of message IS BAD
//for (;ticks>0;ticks--)
//{
if (immbuffer[ticks-3]=='.') //this way of checking end of message IS BAD
{
aim = SEND_RETR;
debug("Got mail list");
271,8 → 266,9
atr.CreateArray();
atr.SetSizes();
}
//}
}
}
if (aim == SEND_RETR)
{
from = to = date = subj = cur_charset = NULL;
280,35 → 276,36
DrawMailBox();
debug("Send RETR, awaiting answer...");
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;}
 
mailbuffer = free(mailbuffer);
letter_size = atr.GetSize(mail_list.current+1) + 1024;
mailbuffer = malloc(letter_size);
if (!mailbuffer) {debug("alloc error!"); aim=NULL; break;}
mailpointer = mailbuffer;
aim = GET_ANSWER_RETR;
}
if (aim == GET_ANSWER_RETR)
{
ticks=PollSocket(socket);
if (!ticks) break;
ticks = Receive(socketnum, mailpointer, letter_size + mailbuffer - mailpointer , MSG_DONTWAIT);
if (ticks == 0xffffffff) break;
if (ticks == 0) break;
//debugi(EAX);
 
for (;ticks>0;ticks--)
{
socket_char=ReadSocket(socket);
//debugch(socket_char);
*mailpointer=socket_char;
mailpointer++;
*mailpointer='\0';
mailpointer = mailpointer + ticks;
//*mailpointer='\0';
//debug(mailbuffer);
 
if (!aim) continue;
 
if (letter_size + mailbuffer - mailpointer - 2 < 0)
{
debug("Buffer overflow!!1 Realloc..."w);
debug("Resizing buffer");
letter_size += 4096;
mailbuffer = realloc(mailbuffer, letter_size);
if (!mailbuffer) {debug("Relloc error!"); aim=NULL; break;}
if (!mailbuffer) {debug("Realloc error!"); aim=NULL; break;}
}
 
if (letter_size>9000)
318,9 → 315,8
if (id!=cur_st_percent) SetMailBoxStatus( id , NULL);
}
 
ParceMail();
ParseMail();
}
}
 
}
}
491,7 → 487,6
aim = NULL;
mailbuffer = free(mailbuffer);
to = from = date = subj = cur_charset = NULL;
while (PollSocket(socket)) ReadSocket(socket);
}
 
int GetMailCount(){
/programs/cmm/liza/parselist.c
1,12 → 1,16
//Leency & SoUrcerer, LGPL
 
void ParceMail()
void ParseMail()
{
dword line_off, new_buf;
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)
{
aim = GET_ANSWER_RETR;