/programs/cmm/experimental/liza/mail_box.c |
---|
0,0 → 1,411 |
//Leency & SoUrcerer, LGPL |
//Hidnplayer |
#define LIST_INFO_H 59 |
int status_bar_h = 15; |
scroll_bar scroll1 = { 17,200,210, LIST_INFO_H-3,18,0,115,15,0,0xCCCccc,0xD2CED0,0x555555,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1}; |
scroll_bar scroll_wv; |
char *listbuffer; |
char *listpointer; |
char *mailstart; |
char *mailend; |
int mailsize; |
int cur_charset; |
llist list; |
enum { |
GET_MAIL = 20, |
SEND_MAIL, |
DELETE_LETTER, |
SAVE_LETTER, |
STOP_LOADING, |
EXIT_MAIL, |
CHANGE_CHARSET, |
CLOSE_CHANGE_CHARSET |
}; |
void MailBoxNetworkProcess() { |
int load_persent; |
if (aim) switch(aim) |
{ |
case SEND_NSTAT: |
SetMailBoxStatus(NULL, "Counting mail, awaiting answer..."); |
request_len = GetRequest("STAT", NULL); |
Send(socketnum, #request, request_len, 0); |
if (EAX == 0xffffffff) { debugln("Error sending STAT. Retry..."w); break;} |
aim = GET_ANSWER_NSTAT; |
break; |
case GET_ANSWER_NSTAT: |
ticks = Receive(socketnum, #immbuffer, BUFFERSIZE, 0); |
if ((ticks == 0xffffff) || (ticks < 2)) break; |
if (immbuffer[ticks-2]=='\n') |
{ |
debugln(#immbuffer); |
if (strstr(#immbuffer,"+OK")) |
{ |
strcpyb(#immbuffer, #param, "+OK ", " "); |
mail_list.count = atoi(#param); |
free(listbuffer); |
listbuffer = mem_Alloc(30*mail_list.count); //24* original |
listpointer = listbuffer; |
aim = SEND_NLIST; |
debugln("Receiving mail list..."); |
} |
else |
{ |
StopConnect("Sorry, can't recieve your mail"); |
} |
} |
break; |
case SEND_NLIST: |
WriteText(5, Form.cheight-11, 0x80, sc.work_text, "Send LIST, awaiting answer..."); |
request_len = GetRequest("LIST", NULL); |
Send(socketnum, #request, request_len, 0); |
if (EAX == 0xffffffff) {debugln("Error while sending LIST. Retry..."); break;} |
else aim = GET_ANSWER_NLIST; |
break; |
case GET_ANSWER_NLIST: |
ticks = Receive(socketnum, listpointer, listbuffer + 30*mail_list.count - listpointer, MSG_DONTWAIT); |
if (ticks == 0xffffffff) break; |
listpointer = listpointer + ticks; |
if (listpointer - listbuffer < 5) break; |
if (strncmp(listpointer-5,"\n.\n",5)==0) // note that c-- assembles "\n.\n" to 0x0d, 0x0a, 0x2e, 0x0d, 0x0a |
{ |
aim = SEND_RETR; |
debugln("goto SEND_RETR"); |
DrawMailBox(); |
*listpointer='\0'; |
atr.CreateArray(); |
atr.SetSizes(); |
} |
break; |
case SEND_RETR: |
from = to = date = subj = cur_charset = NULL; |
DrawMailBox(); |
request_len = GetRequest("RETR", itoa(mail_list.cur_y+1)); |
if (Send(socketnum, #request, request_len, 0) == 0xffffffff) |
{ |
StopConnect("Error while trying to get letter from server"); |
break; |
} |
mailsize = atr.GetSize(mail_list.cur_y+1) + 1024; |
free(mailstart); |
mailstart = malloc(mailsize); |
mailend = mailstart; |
if (!mailstart) |
{ |
debugln("alloc error!"); |
aim=NULL; |
break; |
} |
debugval("mailsize", mailsize); |
aim = GET_ANSWER_RETR; |
debugln("goto GET_ANSWER_RETR"); |
break; |
case GET_ANSWER_RETR: |
debugval("mailsize", mailsize); |
debugval("mailstart", mailstart); |
debugval("mailend", mailend); |
ticks = Receive(socketnum, mailend, mailsize + mailstart - mailend, MSG_DONTWAIT); |
if (ticks == 0xffffffff) break; |
mailend = mailend + ticks; |
if (mailsize + mailstart - mailend - 2 < 0) |
{ |
debugln("Resizing buffer"); |
mailsize += 4096; |
mailstart = realloc(mailstart, mailsize); |
if (!mailstart) { StopConnect("Realloc error!"); break;} |
} |
/* |
if (mailsize>9000) |
{ |
load_persent = mailend - mailstart * 100 ; |
load_persent /= mailsize - 1024; |
if (load_persent != cur_st_percent) SetMailBoxStatus( load_persent , NULL); |
} |
*/ |
//ParseMail(); |
} |
} |
void MailBoxLoop() { |
int id; |
int panels_drag=0, clicked_list=0; |
dword line_col, text_col; |
mail_list.h = Form.cheight/4; |
mail_list.ClearList(); |
SetMailBoxStatus( NULL , NULL); |
cur_charset = 0; |
aim = SEND_NSTAT; |
goto _MB_DRAW; |
loop() |
{ |
WaitEventTimeout(2); |
switch(EAX & 0xFF) |
{ |
case evMouse: |
mouse.get(); |
if (!mouse.lkm) panels_drag=0; |
if (mouse.lkm) && (mouse.y>mail_list.y+mail_list.h-1) && (mouse.y<mail_list.y+mail_list.h+6) |
&& (!scroll1.delta2) && (!scroll_wv.delta2) panels_drag = 1; |
if (panels_drag) |
{ |
if (mouse.y<mail_list.y+60) || (mouse.y>Form.cheight-60-status_bar_h-LIST_INFO_H) break; |
mail_list.h = mouse.y - mail_list.y-2; |
DrawMailBox(); |
break; |
} |
//links.hover(mouse.x, mouse.y); |
if (!mail_list.count) break; |
if (!panels_drag) { scrollbar_v_mouse (#scroll1); scrollbar_v_mouse (#scroll_wv); } |
if (mail_list.first <> scroll1.position) |
{ |
mail_list.first = scroll1.position; |
DrawMailList(); |
break; |
}; |
if (list.first <> scroll_wv.position) |
{ |
list.first = scroll_wv.position; |
DrawLetter(); |
break; |
}; |
if (mail_list.y+mail_list.h + 10 > mouse.y) |
{ |
if (mail_list.MouseScroll(mouse.vert)) DrawMailList(); |
} |
else |
{ |
if (list.MouseScroll(mouse.vert)) DrawLetter(); |
} |
if (mouse.lkm) && (mail_list.MouseOver(mouse.x, mouse.y)) && (!clicked_list) clicked_list=1; |
if (!mouse.lkm) && (clicked_list) if (mail_list.ProcessMouse(mouse.x, mouse.y)) |
{ |
clicked_list = 0; |
if (aim) break; |
DrawMailList(); |
aim = SEND_RETR; |
} |
break; |
case evButton: |
id = GetButtonID(); |
if (id==1) SaveAndExit(); |
if (id==GET_MAIL) aim = SEND_NSTAT; |
if (id==SAVE_LETTER) |
{ |
if (!mailstart) break; |
CreateFile(strlen(mailstart), mailstart, "mail.txt"); |
pause(10); |
RunProgram("/sys/tinypad", "mail.txt"); |
} |
if (id==STOP_LOADING) |
{ |
StopLoading(); |
DrawStatusBar(); |
DrawMailList(); |
} |
if (id==EXIT_MAIL) |
{ |
StopLoading(); |
Close(socketnum); |
LoginBoxLoop(); |
} |
if (id==CHANGE_CHARSET) |
{ |
DefineButton(0,0,Form.cwidth,Form.cheight, CLOSE_CHANGE_CHARSET+BT_HIDE+BT_NOFRAME); |
DrawRectangle(Form.cwidth-100, Form.cheight-status_bar_h- 70, 70, 82, sc.work_graph); |
DrawRectangle3D(Form.cwidth-99, Form.cheight-status_bar_h- 69, 68, 80, 0xFFFfff, sc.work); |
for (id=0; id<5; id++) |
{ |
if (cur_charset==id+1) { line_col=sc.button; text_col=sc.button_text; } |
else { line_col=sc.work; text_col=sc.work_text; } |
DrawBar(Form.cwidth-98, id*16+Form.cheight-status_bar_h- 68, 67, 16, line_col); |
DrawCaptButton(Form.cwidth-100, id*16+Form.cheight-status_bar_h- 68, 70,16, 10+id+BT_HIDE, |
0, text_col, charsets[id+1]); |
} |
} |
if (id==CLOSE_CHANGE_CHARSET) goto _MB_DRAW; |
break; |
case evKey: |
GetKeys(); |
if (!aim) && (mail_list.ProcessKey(key_scancode)) |
{ |
DrawMailList(); |
aim = SEND_RETR; |
} |
break; |
case evReDraw: _MB_DRAW: |
if !(DefineWindow(MAILBOX_HEADER)) break; |
scroll1.bckg_col = scroll_wv.bckg_col = 0xBBBbbb; |
scroll1.frnt_col = scroll_wv.frnt_col = sc.work; |
scroll1.line_col = scroll_wv.line_col = sc.work_graph; |
DrawToolbar(); |
DrawMailBox(); |
break; |
default: |
MailBoxNetworkProcess(); |
} |
} |
} |
void DrawMailBox() |
{ |
DrawMailList(); |
DrawLetterInfo(); |
DrawLetter(); |
DrawStatusBar(); |
} |
void DrawToolbar() { |
#define BUT_Y 7 |
#define BUT_H 22 |
#define BUT_W 74 |
int toolbar_w = BUT_Y + BUT_H + BUT_Y + 3; |
mail_list.SetSizes(0, toolbar_w, Form.cwidth - scroll1.size_x - 1, mail_list.h, 18); |
DrawBar(0,0, Form.cwidth,toolbar_w-3, sc.work); |
DrawCaptButton(10 , BUT_Y, BUT_W, BUT_H, GET_MAIL, sc.button, sc.button_text,"Get mail"); |
DrawCaptButton(BUT_W+ 20, BUT_Y, BUT_W+10, BUT_H, SAVE_LETTER, sc.button, sc.button_text,"Save letter"); |
DrawCaptButton(Form.cwidth-BUT_W - 10, BUT_Y, BUT_W, BUT_H, EXIT_MAIL, sc.button, sc.button_text,"< Exit"); |
DrawBar(0, mail_list.y-3, mail_list.w,1, sc.work_graph); |
DrawBar(0, mail_list.y-2, mail_list.w,1, 0xdfdfdf); |
DrawBar(0, mail_list.y-1, mail_list.w,1, 0xf0f0f0); |
} |
void DrawMailList() { |
int i, on_y, on_x, direction; |
dword sel_col; |
mail_list.visible = mail_list.h / mail_list.item_h; |
for (i=30; i<150; i++) DeleteButton(i); |
for (i=0; (i<mail_list.visible) && (i+mail_list.first<mail_list.count); i++) |
{ |
on_y = i*mail_list.item_h + mail_list.y; |
if (mail_list.cur_y==mail_list.first+i) sel_col=0xEEEeee; else sel_col=0xFFFfff; |
DrawBar(0, on_y, mail_list.w, mail_list.item_h-1, sel_col); |
direction = atr.GetDirection(i+mail_list.first+1); |
on_x = strlen(itoa(i+mail_list.first+1))*6; |
letter_icons_pal[0]=sel_col; |
PutPaletteImage(sizeof(letter_icons)/3*direction + #letter_icons, 18,12, on_x+18, |
mail_list.item_h-12/2+ on_y, 8, #letter_icons_pal); |
WriteText(on_x + 42, on_y+5, 0x80, 0, atr.GetSubject(i+mail_list.first+1)); |
DrawBar(0, on_y + mail_list.item_h-1, mail_list.w, 1, 0xCCCccc); |
WriteText(10, on_y+5, 0x80, 0, itoa(i+mail_list.first+1)); |
WriteText(mail_list.w - 40, on_y+5, 0x80, 0, ConvertSize(atr.GetSize(i+mail_list.first+1))); |
} |
DrawBar(0, i*mail_list.item_h + mail_list.y, mail_list.w, -i*mail_list.item_h+mail_list.h, 0xFFFfff); |
DrawScroller1(); |
} |
void DrawLetterInfo() { |
int lt_y = mail_list.y+mail_list.h; |
DrawBar(0, lt_y, mail_list.w, 1, sc.work_graph); |
DrawBar(0, lt_y+1, Form.cwidth, 1, LBUMP); |
DrawBar(0, lt_y+2, Form.cwidth, LIST_INFO_H-4, sc.work); |
WriteText(mail_list.w-30/2, lt_y, 0x80, 0x888888, "= = ="); |
WriteText(mail_list.w-30/2, lt_y+1, 0x80, 0xEeeeee, "= = ="); |
DrawBar(0, lt_y+LIST_INFO_H-2, Form.cwidth, 1, sc.work_graph); //bottom |
DrawBar(0, lt_y+LIST_INFO_H-1, Form.cwidth, 1, 0xdfdfdf); |
DrawBar(0, lt_y+LIST_INFO_H , Form.cwidth, 1, 0xf0f0f0); |
WriteTextB(10, lt_y+8 , 0x80, sc.work_text, "From:"); |
WriteText (45, lt_y+8 , 0x80, sc.work_text, #from); |
WriteTextB(10, lt_y+20, 0x80, sc.work_text, "To:"); |
WriteText (45, lt_y+20, 0x80, sc.work_text, #to); |
WriteTextB(10, lt_y+32, 0x80, sc.work_text, "Date:"); |
WriteText (45, lt_y+32, 0x80, sc.work_text, #date); |
WriteTextB(10, lt_y+44, 0x80, sc.work_text, "Subj:"); |
WriteText (45, lt_y+44, 0x80, sc.work_text, #subj); |
} |
void DrawLetter() { |
//DrawTextLines(); |
DrawRectangle(scroll_wv.start_x, scroll_wv.start_y, scroll_wv.size_x, scroll_wv.size_y-1, 0xFFFfff); |
} |
void DrawScroller1() { |
scroll1.max_area = mail_list.count; |
scroll1.cur_area = mail_list.visible; |
scroll1.position = mail_list.first; |
scroll1.all_redraw=1; |
scroll1.start_x = mail_list.x + mail_list.w; |
scroll1.start_y = mail_list.y - 3; |
scroll1.size_y = mail_list.h + 4; |
scrollbar_v_draw(#scroll1); |
} |
void DrawStatusBar() { |
int st_y = Form.cheight -status_bar_h; |
DrawBar(0, st_y, Form.cwidth, status_bar_h, sc.work); |
if (aim) { |
SetMailBoxStatus(cur_st_percent, cur_st_text); |
DrawCaptButton(240, st_y+1, 36, status_bar_h-3, STOP_LOADING, sc.button, sc.button_text,"Stop"); |
} |
DrawCaptButton(Form.cwidth - 100, st_y+1, 70, status_bar_h-2, CHANGE_CHARSET+BT_HIDE, |
sc.work, sc.work_text,cur_charset*10+#charsets); |
} |
void SetMailBoxStatus(dword percent1, text1) { |
DrawProgressBar(3, Form.cheight -status_bar_h + 1, 220, 12, sc.work, 0xC3C3C3, 0x54B1D6, sc.work_text, percent1); |
WriteText(3, Form.cheight -status_bar_h + 1, 0x80, sc.work_text, text1); |
cur_st_percent = percent1; |
cur_st_text = text1; |
} |
void StopLoading() { |
aim = NULL; |
mailstart = free(mailstart); |
to = from = date = subj = cur_charset = NULL; |
} |
int GetLetterSize_(int number) { |
char search_num[24]; |
char mailsize1[24]; |
strcpy(#search_num, "\x0a"); // 0x0d, 0x0a |
itoa_(#search_num+1, number); |
chrcat(#search_num, ' '); |
strcpyb(listbuffer, #mailsize1, #search_num, "\x0d"); |
return atoi(#mailsize1); |
} |
/* |
void EventClickLink() { |
RunProgram("/sys/network/WebView", links.active_url); |
} |
*/ |
/programs/cmm/experimental/liza/liza.c |
---|
0,0 → 1,190 |
//Leency & SoUrcerer, LGPL |
//libraries |
#define MEMSIZE 0x100000 |
#include "../lib/kolibri.h" |
#include "../lib/strings.h" |
#include "../lib/mem.h" |
#include "../lib/dll.h" |
#include "../lib/gui.h" |
#include "../lib/fs.h" |
#include "../lib/list_box.h" |
#include "../lib/socket.h" |
#include "../lib/draw_buf.h" |
#include "../lib/cursor.h" |
#include "../lib/collection.h" |
//*.obj libraries |
#include "../lib/obj/box_lib.h" |
#include "../lib/obj/network.h" |
#include "../lib/obj/http.h" |
#include "../lib/obj/libimg.h" |
#include "../lib/obj/netcode.h" |
#include "../lib/obj/iconv.h" |
//images |
byte letter_icons[sizeof(file "img/letter_icons.raw")] = FROM "img/letter_icons.raw"; |
#include "img/letter_icons.h" |
_http http = {0}; |
bool debug_mode = false; |
char accept_language[]= "Accept-Language: ru\n"; |
//connection algorithm |
enum { |
STOP, |
RESOLVE, |
OPEN_CONNECTION, |
GET_ANSWER_CONNECT, |
SEND_USER, |
GET_ANSWER_USER, |
SEND_PASS, |
GET_ANSWER_PASS, |
SEND_NLIST, |
GET_ANSWER_NLIST, |
SEND_NSTAT, |
GET_ANSWER_NSTAT, |
SEND_RETR, |
GET_ANSWER_RETR |
}; |
//WindowDefinitions |
#define WIN_W 600 |
#define WIN_H 440 |
#define WIN_MIN_W 500 |
#define WIN_MIN_H 380 |
#define LOGIN_HEADER "Login - Email client Liza 0.9.4" |
#define OPTIONS_HEADER "Options - Email client Liza 0.9.4" |
#define MAILBOX_HEADER "Mail Box - Email client Liza 0.9.4" |
#define BUFFERSIZE 512 |
proc_info Form; |
#define LBUMP 0xFFFfff |
//progress_bar definitions |
char cur_st_percent; |
dword cur_st_text; |
//connection data |
#define DEFAULT_POP_PORT 110; |
char POP_server_path[128]; |
dword POP_server_port; |
char login[128]; |
char request[256+22]; |
int request_len; |
char connection_status; |
dword socketnum; |
sockaddr_in sockaddr; |
int aim; |
int ticks; |
char immbuffer[BUFFERSIZE]; |
llist mail_list; |
llist letter_view; |
dword TAB_H = false; //19; |
dword TAB_W = 150; |
dword TOOLBAR_H = 31; //50; |
dword STATUSBAR_H =15; |
dword col_bg; |
dword panel_color; |
dword border_color; |
bool open_in_a_new_window = false; |
progress_bar wv_progress_bar = {0, 10, 83, 150, 12, 0, 0, 100, 0xeeeEEE, 8072B7EBh, 0x9F9F9F}; |
#define URL_SIZE 4000; |
int http_transfer; |
char version[]=" WebView 0.1"; |
#include "..\TWB\TWB.c" |
#include "settings.c" |
#include "login.c" |
#include "letter_attr.c" |
#include "mail_box.c" |
#include "parselist.c" |
void main() { |
CursorPointer.Load(#CursorFile); |
load_dll(boxlib, #box_lib_init,0); |
load_dll(network_lib, #network_lib_init,0); |
load_dll(netcode_lib, #base64_encode,0); |
load_dll(libimg, #libimg_init,1); |
load_dll(iconv_lib, #iconv_open,0); |
OpenMailDat(); |
SetEventMask(EVM_REDRAW + EVM_KEY + EVM_BUTTON + EVM_MOUSE + EVM_MOUSE_FILTER + EVM_STACK); |
LoginBoxLoop(); |
} |
int DefineWindow(dword wtitle) { |
sc.get(); |
DefineAndDrawWindow(GetScreenWidth()-WIN_W/2,GetScreenHeight()-WIN_H/2, WIN_W, WIN_H, 0x73,sc.work, 0,0); |
DrawTitle(wtitle); |
GetProcessInfo(#Form, SelfInfo); |
if (Form.status_window&ROLLED_UP) return 0; //rolled_up |
if (Form.width < WIN_MIN_W) MoveSize(OLD,OLD,WIN_MIN_W,OLD); |
if (Form.height < WIN_MIN_H) MoveSize(OLD,OLD,OLD,WIN_MIN_H); |
return 1; |
} |
void OpenMailDat() { |
char read_data[512], pass_b64[256]; |
ReadFile(0, 512, #read_data, "/sys/network/mail.dat"); |
if (!read_data) |
{ |
strcpy(#email_text, "testliza@ya.ru"); |
strcpy(#pass_text, "kolibri"); |
} |
else |
{ |
strcpy(#pass_b64, strchr(#read_data, '\n')); |
base64_decode stdcall (#pass_b64, #pass_text, strlen(#pass_b64)); |
ESBYTE[strchr(#read_data, '\n')] = NULL; |
strcpy(#email_text, #read_data); |
} |
pass_box.size = pass_box.pos = strlen(#pass_text); |
login_box.size = login_box.pos = strlen(#email_text); |
} |
void SaveAndExit() { |
char write_data[512], pass_b64[256]; |
Close(socketnum); |
strcpy(#write_data, #email_text); |
chrcat(#write_data, '\n'); |
base64_encode stdcall (#pass_text, #pass_b64, strlen(#pass_text)); |
strcat(#write_data, #pass_b64); |
CreateFile(strlen(#write_data)+1, #write_data, "/sys/network/mail.dat"); |
ExitProcess(); |
} |
int GetRequest(dword command, text) { |
strcpy(#request, command); |
if (text) |
{ |
chrcat(#request, ' '); |
strcat(#request, text); |
} |
strcat(#request, "\n"); |
return strlen(#request); |
} |
void StopConnect(dword message) { |
if (message) notify(message); |
aim = STOP; |
Close(socketnum); |
} |
void EventShowLinkMenu(dword _left, _top) |
{ |
//do nothing, stub |
return; |
} |
stop: |
/programs/cmm/experimental/liza/login.c |
---|
0,0 → 1,222 |
//Leency & SoUrcerer, LGPL |
//LoginPanel |
#define PANEL_W 220 |
#define PANEL_H 140 |
int panel_x, panel_y; |
//edit_boxes at LoginPanel |
int mouse_dd; |
unsigned char email_text[128]; |
unsigned char pass_text[32]; |
edit_box login_box= {PANEL_W-6,207,16,0xffffff,0x94AECE,0xffffff,0xffffff,0x10000000,sizeof(email_text)+2,#email_text,#mouse_dd,0b10}; |
edit_box pass_box= {PANEL_W-6,207,16,0xffffff,0x94AECE,0xffffff,0xffffff,0x10000000,sizeof(pass_text)+2,#pass_text,#mouse_dd,0b1}; |
void LoginNetworkProcess() |
{ |
if (aim) switch(aim) |
{ |
case RESOLVE: |
if (!email_text) StopConnect("Enter email!"); |
if (!pass_text) StopConnect("Enter password!"); |
if ((!login) || (!POP_server_path)) StopConnect("Email should be such as username@somesite.com"); |
if (!aim) return; |
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) { StopConnect("Can't obtain server IP."); break;} |
else aim = OPEN_CONNECTION; |
break; |
case OPEN_CONNECTION: |
socketnum = Socket(AF_INET4, SOCK_STREAM, 0); |
if (socketnum == 0xffffffff) { StopConnect("Cannot open socket."); break;} |
Connect(socketnum, #sockaddr, 16); |
aim = GET_ANSWER_CONNECT; |
break; |
case GET_ANSWER_CONNECT: |
ticks = Receive(socketnum, #immbuffer, BUFFERSIZE, 0); |
if ((ticks == 0xffffff) || (ticks < 2)) { StopConnect("Connection failed"); break;} |
immbuffer[ticks]='\0'; |
if (immbuffer[ticks-2]=='\n') |
{ |
if (strstr(#immbuffer,"+OK")) |
aim = SEND_USER; |
else |
StopConnect("Failed to connect to server. Retry..."); |
} |
break; |
case SEND_USER: |
request_len = GetRequest("USER", #login); |
if (Send(socketnum, #request, request_len, 0) == 0xffffffff) |
{ |
SetLoginStatus("Failed to send USER. Retry..."); |
break; |
} |
else aim = GET_ANSWER_USER; |
break; |
case GET_ANSWER_USER: |
ticks = Receive(socketnum, #immbuffer, BUFFERSIZE, 0); |
if ((ticks == 0xffffffff) || (ticks < 2)) { SetLoginStatus("Connection failed"); break;} |
immbuffer[ticks]='\0'; |
if (immbuffer[ticks-2]=='\n') |
{ |
if (strstr(#immbuffer,"+OK")) |
aim = SEND_PASS; |
else |
{ |
debug(#immbuffer); |
StopConnect("Wrong username"); |
} |
} |
else |
{ |
StopConnect("Connection failed"); |
} |
break; |
case SEND_PASS: |
request_len = GetRequest("PASS", #pass_text); |
if (Send(socketnum, #request, request_len, 0) == 0xffffffff) |
{ |
SetLoginStatus("Failed to send PASS. Retry..."); |
break; |
} |
else aim = GET_ANSWER_PASS; |
break; |
case GET_ANSWER_PASS: |
ticks = Receive(socketnum, #immbuffer, BUFFERSIZE, 0); |
if ((ticks == 0xffffff) || (ticks < 2)) { SetLoginStatus("Server disconnected"); break;} |
immbuffer[ticks]='\0'; |
if (immbuffer[ticks-2]=='\n') |
{ |
if (strstr(#immbuffer,"+OK")) MailBoxLoop(); |
else |
{ |
StopConnect("Wrong password or POP3 disabled"); |
debug(#immbuffer); |
} |
} |
else |
{ |
StopConnect("Connection failed"); |
} |
} |
} |
void LoginBoxLoop() |
{ |
int id; |
SetLoginStatus(NULL); |
goto _LB_DRAW; |
loop() |
{ |
WaitEventTimeout(2); |
switch(EAX & 0xFF) |
{ |
case evMouse: |
edit_box_mouse stdcall (#login_box); |
edit_box_mouse stdcall (#pass_box); |
break; |
case evButton: |
id = GetButtonID(); |
if (id==1) SaveAndExit(); |
if (id==11) SettingsDialog(); |
if (id==12) |
{ |
if (!aim) aim=RESOLVE; else aim=NULL; |
GetSettings(); |
DrawLoginScreen(); |
} |
break; |
case evKey: |
GetKeys(); |
if (key_scancode==SCAN_CODE_TAB) |
{ |
if (login_box.flags & 0b10) |
{ pass_box.flags = 0b11; login_box.flags = 0; } |
else |
{ pass_box.flags = 0b1; login_box.flags = 0b10; } |
edit_box_draw stdcall(#login_box); |
edit_box_draw stdcall(#pass_box); |
break; |
} |
if (key_scancode==SCAN_CODE_ENTER) && (!aim) |
{ |
aim=RESOLVE; |
GetSettings(); |
DrawLoginScreen(); |
} |
EAX = key_editbox; |
edit_box_key stdcall(#login_box); |
edit_box_key stdcall(#pass_box); |
break; |
case evReDraw: _LB_DRAW: |
if !(DefineWindow(LOGIN_HEADER)) break; |
DrawLoginScreen(); |
break; |
default: |
LoginNetworkProcess(); |
} |
} |
} |
void DrawLoginScreen() |
{ |
panel_x = Form.cwidth - PANEL_W /2; |
panel_y = Form.cheight - PANEL_H /2 - 5; |
DrawBar(0,0, Form.cwidth, Form.cheight, sc.work); |
WriteText(panel_x,panel_y-3,0x80,sc.work_text,"Your Email:"); |
DrawEditBoxPos(panel_x+3, panel_y+12, #login_box); |
WriteText(panel_x,panel_y+45,0x80,sc.work_text,"Password:"); |
DrawEditBoxPos(panel_x+3, panel_y+60, #pass_box); |
if (!aim) |
{ |
DrawCaptButton(panel_x,panel_y+100,100,26,11,sc.button, sc.button_text,"Settings"); |
DrawCaptButton(panel_x+120,panel_y+100,100,26,12,sc.button, sc.button_text,"Enter >"); |
} |
else DrawCaptButton(panel_x+120,panel_y+100,100,26,12,sc.button, sc.button_text,"Stop"); |
SetLoginStatus(cur_st_text); |
} |
void GetSettings() |
{ |
strcpy(#login, #email_text); |
ESBYTE[strchr(#login,'@')] = NULL; |
if (automatic.checked) |
{ |
strcpy(#POP_server_path, "pop."); |
strcat(#POP_server_path, strchr(#email_text,'@')+1); |
POP_server_port = DEFAULT_POP_PORT; |
} |
else |
{ |
strcpy(#POP_server_path, #POP_server1); |
POP_server_port = atoi(#POP_server_port1); |
} |
if (!strcmp(#POP_server_path, "pop.gmail.com")) StopConnect("Can't connect GMAIL servers. Not support SSL/TLS encryption"); |
} |
void SetLoginStatus(dword text1) |
{ |
if (text1) WriteText(10, Form.cheight-22, 0x80, sc.work_text, text1); |
cur_st_text = text1; |
} |
/programs/cmm/experimental/liza/settings.c |
---|
0,0 → 1,107 |
//Leency & SoUrcerer, LGPL |
char *text1[] = {"POP server adress:", "POP server port:", "SMTP server adress:", "SMTP server port:", '\0'}; |
unsigned char POP_server1[128]="pop.server.com"; |
unsigned char POP_server_port1[7]="110"; |
unsigned char SMTP_server1[128]="smtp.server.com"; |
unsigned char SMTP_server_port1[7]="25"; |
edit_box POP_server_box = {210,230,125,0xffffff,0x94AECE,0xffc90E,0xCACACA,0x10000000,sizeof(POP_server1)-2,#POP_server1,0,0}; |
edit_box POP_server_port_box = {210,230,160,0xffffff,0x94AECE,0xffc90E,0xCACACA,0x10000000,sizeof(POP_server_port1)-2,#POP_server_port1,0,0}; |
edit_box SMTP_server_box = {210,230,195,0xffffff,0x94AECE,0xffc90E,0xCACACA,0x10000000,sizeof(SMTP_server1)-2,#SMTP_server1,0,0}; |
edit_box SMTP_server_port_box = {210,230,230,0xffffff,0x94AECE,0xffc90E,0xCACACA,0x10000000,sizeof(SMTP_server_port1)-2,#SMTP_server_port1,0,0}; |
checkbox automatic = { "Automatic configuration", true }; |
void UpdateEditboxFlags(dword additional_flag) |
{ |
EditBox_UpdateText(#POP_server_box, additional_flag + 0); |
EditBox_UpdateText(#POP_server_port_box, additional_flag + ed_figure_only + 0); |
EditBox_UpdateText(#SMTP_server_box, additional_flag + 0); |
EditBox_UpdateText(#SMTP_server_port_box, additional_flag + ed_figure_only + 0); |
} |
void SettingsDialog() |
{ |
int id; |
UpdateEditboxFlags(ed_disabled); |
goto _OPT_WIN; |
loop() switch(WaitEvent()) |
{ |
case evMouse: |
edit_box_mouse stdcall(#POP_server_box); |
edit_box_mouse stdcall(#POP_server_port_box); |
edit_box_mouse stdcall(#SMTP_server_box); |
edit_box_mouse stdcall(#SMTP_server_port_box); |
break; |
case evButton: |
id = GetButtonID(); |
if (id==1) SaveAndExit(); |
if (id==19) LoginBoxLoop(); |
if (automatic.click(id)) |
{ |
if (automatic.checked) { |
UpdateEditboxFlags(ed_disabled); |
POP_server_box.blur_border_color = POP_server_port_box.blur_border_color = |
SMTP_server_box.blur_border_color = SMTP_server_port_box.blur_border_color = 0xCACACA; |
} |
else { |
UpdateEditboxFlags(0); |
POP_server_box.flags = 0b10; |
POP_server_box.blur_border_color = POP_server_port_box.blur_border_color = |
SMTP_server_box.blur_border_color = SMTP_server_port_box.blur_border_color = 0xFFFfff; |
} |
DrawOptionsWindow(); |
} |
break; |
case evKey: |
GetKeys();; |
if (automatic.checked==true) break; |
if (key_scancode==SCAN_CODE_TAB) |
{ |
if (POP_server_box.flags & ed_focus) { UpdateEditboxFlags(0); POP_server_port_box.flags += ed_focus; } else |
if (POP_server_port_box.flags & ed_focus) { UpdateEditboxFlags(0); SMTP_server_box.flags += ed_focus; } else |
if (SMTP_server_box.flags & ed_focus) { UpdateEditboxFlags(0); SMTP_server_port_box.flags += ed_focus; } else |
if (SMTP_server_port_box.flags & ed_focus) { UpdateEditboxFlags(0); POP_server_box.flags += ed_focus; } else |
{ UpdateEditboxFlags(0); POP_server_box.flags = 0b10; } |
DrawOptionsWindow(); |
} |
EAX=key_ascii<<8; |
edit_box_key stdcall(#POP_server_box); |
edit_box_key stdcall(#POP_server_port_box); |
edit_box_key stdcall(#SMTP_server_box); |
edit_box_key stdcall(#SMTP_server_port_box); |
break; |
case evReDraw: _OPT_WIN: |
if !(DefineWindow(OPTIONS_HEADER)) break; |
DrawBar(0,0, Form.cwidth, Form.cheight, sc.work); |
DrawOptionsWindow(); |
break; |
} |
} |
void DrawOptionsWindow() |
{ |
#define ELEM_X 25 |
int i; |
incn y; |
y.n=0; |
DrawBar(0, Form.cheight - 40, Form.cwidth, 1, sc.work_graph); |
DrawBar(0, Form.cheight - 40+1, Form.cwidth, 1, LBUMP); |
DrawCaptButton(Form.cwidth-79, Form.cheight-32, 70, 25, 19, sc.button, sc.button_text,"Apply"); |
WriteText(ELEM_X, y.inc(20), 0x81, sc.work_text, "Network settings"); |
automatic.draw(ELEM_X, y.inc(65)); |
for (i=0; i<4; i++) { |
WriteTextWithBg(ELEM_X+40, i*35+POP_server_box.top + 3, 0xD0, sc.work_text, text1[i], sc.work); |
} |
DrawEditBox(#POP_server_box); |
DrawEditBox(#POP_server_port_box); |
DrawEditBox(#SMTP_server_box); |
DrawEditBox(#SMTP_server_port_box); |
} |
/programs/cmm/experimental/liza/parselist.c |
---|
0,0 → 1,155 |
//Leency & SoUrcerer, LGPL |
void ParseMail() |
{ |
dword line_off, new_buf; |
char tline[256]; |
if ( mailend-mailstart > 9) if (strncmp(mailend-5,"\n.\n",5)==0) // note that c-- assembles "\n.\n" to 0x0d, 0x0a, 0x2e, 0x0d, 0x0a |
{ |
aim = STOP; |
mailend -= 5; |
DSBYTE[mailend] = '\0'; |
if (strstr(mailstart, "+OK")!=mailstart) |
{ |
aim = GET_ANSWER_RETR; |
mailend = mailstart; |
debug("GET_ANSWER_RETR != +OK, retry GET_ANSWER_RETR"); |
return; |
} |
mailsize = mailend - mailstart; |
debug("Getting QP"); |
if (strstri(mailstart, "quoted-printable")!=0) |
{ |
new_buf = malloc(mailsize); |
qp_decode stdcall (mailstart, new_buf, mailsize); |
if (EAX==-1) debug("Too small buffer to convert QUOTED-PRINTABLE"); |
else |
{ |
free(mailstart); |
mailstart = new_buf; |
mailsize = strlen(mailstart); |
mailend = mailsize + mailstart; |
} |
} |
debug("ProcessBase64"); |
ProcessBase64(); |
debug("GetHeaders: From, To, Date, Subject"); |
GetHeader(#from, "\nFrom:"); |
GetHeader(#to, "\nTo:"); |
GetHeader(#date, "\nDate:"); |
GetHeader(#subj, "\nSubject:"); |
debug("Get mdata"); |
mdata = strstr(mailstart, "\x0a\x0d") + 3; |
debug("ConvertToDOS"); |
ConvertToDOS(mdata, mailstart); |
debug("SetAtrFromCurr"); |
atr.SetAtrFromCurr(mail_list.cur_y+1); |
DrawMailBox(); |
} |
} |
void ConvertToDOS(dword inbuf, searchin) |
{ |
dword dos_buf=0; |
cur_charset = CH_CP866; |
if (strstri(searchin, "windows-1251")!=0) || (strstri(searchin, "windows1251")!=0) |
{ dos_buf = ChangeCharset("CP1251", "CP866", inbuf); cur_charset = CH_CP1251;} |
else if (strstri(searchin, "koi8-")!=0) |
{ dos_buf = ChangeCharset("KOI8-RU", "CP866", inbuf); cur_charset = CH_KOI8;} |
else if (strstri(searchin, "utf-8")!=0) || (strstri(searchin, "utf8")!=0) |
{ dos_buf = ChangeCharset("UTF-8", "CP866", inbuf); cur_charset = CH_UTF8;} |
else if (strstri(searchin, "iso8859-5")!=0) || (strstri(searchin, "iso-8859-5")!=0) |
{ dos_buf = ChangeCharset("ISO8859-5", "CP866", inbuf); cur_charset = CH_ISO8859_5;} |
else if (strstri(searchin, "windows-1252")!=0) || (strstri(searchin, "windows1252")!=0) |
{ dos_buf = ChangeCharset("CP1252", "CP866", inbuf); cur_charset = CH_CP1252;} |
} |
dword CopyBetweenOffsets(dword start, end) //do not forget to free(line) after use |
{ |
dword line, new_line; |
if (end <= start) return 0; |
line = new_line = malloc(end - start + 3); |
while (end > start) |
{ |
DSBYTE[new_line] = DSBYTE[start]; |
start++; |
new_line++; |
} |
DSBYTE[new_line] = '\0'; |
return line; |
} |
void GetHeader(dword workstr, searchstr) |
{ |
char tmpbuf[512]; |
dword Qoff; |
int q_start, b_start; |
strcpyb(mailstart, workstr, searchstr, "\n"); |
/* |
debug(searchstr); |
debug(workstr); |
if (strlen(workstr)<8) return; |
q_start = strstri(workstr, "?Q?"); |
b_start = strstri(workstr, "?B?"); |
if (q_start) |
{ |
qp_decode stdcall (workstr, #tmpbuf, strlen(workstr)); |
ConvertToDOS(#tmpbuf, workstr); |
strcpy(workstr, #tmpbuf); |
Qoff = strstri(workstr, "?Q?"); |
strcpy(workstr, Qoff); |
} |
//any text that goes after "?=" deletes now |
if (b_start) |
{ |
base64_decode stdcall (b_start, #tmpbuf, strlen(b_start)-5); |
ConvertToDOS(#tmpbuf, workstr); |
strcpy(workstr, #tmpbuf); |
} |
if (strlen(workstr)+10*6-Form.cwidth>0) { workstr=Form.cwidth/6+workstr-12; DSBYTE[workstr]='\0';} |
*/ |
} |
void ProcessBase64() |
{ |
int b_start, b_end, b_size, b_buf; |
int clean_mailstart; |
b_start = strstr(mailstart, "?B?"); |
debugval("b_size", b_start); |
if (b_start) |
{ |
b_end = strstr(b_start, "?="); |
debugval("b_end", b_end); |
b_size = b_end - b_start; |
debugval("b_size", b_size); |
b_buf = malloc(b_size); |
strcpyb(mailstart, b_buf, "?B?", "?="); |
debugval("b_buf", b_buf); |
base64_decode stdcall (b_buf, b_buf, b_size-3); |
ConvertToDOS(b_buf, mailstart); |
if (b_size<strlen(b_buf)) notify("base64 overflow"); |
clean_mailstart = malloc(strlen(mailstart)); |
strlcpy(clean_mailstart, mailstart, b_start-mailstart); |
strcat(clean_mailstart, b_buf); |
strcat(clean_mailstart, b_end+2); |
free(b_buf); |
free(mailstart); |
mailsize = strlen(clean_mailstart); |
mailstart = clean_mailstart; |
mailend = mailstart + mailsize; |
ProcessBase64(); |
} |
} |
// |
/programs/cmm/experimental/liza/compile_en.bat |
---|
0,0 → 1,5 |
@C-- liza.c |
@del liza |
@rename liza.com liza |
@del warning.txt |
@pause |
/programs/cmm/experimental/liza/letter_attr.c |
---|
0,0 → 1,63 |
char from[256]; |
char to[256]; |
char date[256]; |
char subj[256]; |
dword mdata; |
struct letter_attr |
{ |
char adress[sizeof(to)]; |
char subject[sizeof(subj)]; |
byte direction; |
int size; |
void CreateArray(); |
void SetSizes(); |
void SetAtrFromCurr(int N); |
int GetSize(int N); |
char GetDirection(int N); |
dword GetSubject(int N); |
dword GetAdress(int N); |
}; |
letter_attr atr; |
dword mails_db; |
void letter_attr::CreateArray() |
{ |
free(mails_db); |
mails_db = malloc( mail_list.count * sizeof(atr) ); |
} |
void letter_attr::SetSizes() |
{ |
int i; |
for (i=1; i < mail_list.count; i++) |
{ |
ESDWORD[sizeof(atr)*i+#mails_db+#atr.size-#atr] = GetLetterSize_(i); |
ESDWORD[sizeof(atr)*i+#mails_db+#atr.subject-#atr] = ' '; |
ESDWORD[sizeof(atr)*i+#mails_db+#atr.subject-#atr+1] = '\0'; |
} |
} |
void letter_attr::SetAtrFromCurr(int N) |
{ |
byte mail_direction=0; |
if (strstri(#to, #email_text)) |
{ |
mail_direction = 1; |
strcpy(sizeof(atr)*N+#mails_db+#atr.adress-#atr, #from); |
} |
if (strstri(#from, #email_text)) |
{ |
mail_direction = 2; |
strcpy(sizeof(atr)*N+#mails_db+#atr.adress-#atr, #to); |
} |
ESBYTE[sizeof(atr)*N+#mails_db+#atr.direction-#atr] = mail_direction; |
strcpy(sizeof(atr)*N+#mails_db+#atr.subject-#atr, #subj); |
} |
int letter_attr::GetSize(int N) { return ESDWORD[sizeof(atr)*N+#mails_db+#atr.size-#atr]; } |
char letter_attr::GetDirection(int N) { return ESBYTE[sizeof(atr)*N+#mails_db+#atr.direction-#atr]; } |
dword letter_attr::GetSubject(int N) { return sizeof(atr)*N+#mails_db+#atr.subject-#atr; } |
dword letter_attr::GetAdress(int N) { return sizeof(atr)*N+#mails_db+#atr.adress-#atr; } |
/programs/cmm/experimental/liza/img/letter_icons.h |
---|
0,0 → 1,0 |
dword letter_icons_pal[]= {0x008080C0,0x00ADADAD,0x00ABABAB,0x00A9A9A9,0x00A8A8A8,0x00B2B2B2,0x00F0F0F0,0x00FFFFFF,0x00F1F1F1,0x00B0B0B0,0x00D1D1D1,0x00DEDEDE,0x00FCFCFC,0x00F6F6F6,0x00F4F4F4,0x00F5F5F5,0x00DFDFDF,0x00CECECE,0x00ACACAC,0x00F8F8F8,0x00BEBEBE,0x00D8D8D8,0x00F3F3F3,0x00ECECEC,0x00DCDCDC,0x00BBBBBB,0x00A5A5A5,0x00EEEEEE,0x00B5B5B5,0x00D6D6D6,0x00EDEDED,0x00E6E6E6,0x00DADADA,0x009F9F9F,0x00E3E3E3,0x00AEAEAE,0x00E9E9E9,0x00D7D7D7,0x00E4E4E4,0x00E5E5E5,0x00989898,0x00CFCFCF,0x007C7C7C,0x00787878,0x00E0E0E0,0x00919191,0x00D2D2D2,0x009D9D9D,0x00F2F2F2,0x00999999,0x009B9B9B,0x00A7A7A7,0x00A2A2A2,0x00D4D4D4,0x008B8B8B,0x00CDCDCD,0x00A1A1A1,0x00858585,0x00EBEBEB,0x00E7E7E7,0x009A9A9A,0x00818181,0x00D9D9D9,0x00EAEAEA,0x00828282,0x00606060,0x00848484,0x00838383,0x00179C15,0x00F7F7CD,0x008FF778,0x00E4F7C0,0x00C2F7A6,0x00F3F6C2,0x00EBF7BF,0x00ADF791,0x0095F77E,0x002CF21F,0x0038E82A,0x0026DC17,0x0025CC1D,0x0020E915,0x00179714,0x00169C13,0x0026E21D,0x0029EC1D,0x0015909B,0x00B7F7FA,0x0078F6EC,0x00C3F9FB,0x00A6F6E3,0x0091F6E5,0x007DF7EC,0x001FE9F2,0x0029E2E8,0x0021CFDB,0x001DC2CB,0x0015DEE9,0x0012818B,0x001DD7E2,0x001DE3EC} |
/programs/cmm/experimental/liza/img/letter_icons.png |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/programs/cmm/experimental/liza/img/letter_icons.raw |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/programs/cmm/experimental/liza/img |
---|
Property changes: |
Added: tsvn:logminsize |
+5 |
\ No newline at end of property |
/programs/cmm/experimental/liza |
---|
Property changes: |
Added: tsvn:logminsize |
+5 |
\ No newline at end of property |