⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 email_database.cxx

📁 LINUX下的收发E-MAIL的程序
💻 CXX
📖 第 1 页 / 共 2 页
字号:

int add_numchr2db(Number * chr, int db_id)
{
    if (db_add_record(db_id, chr, MAXCHRNUM) == 0) {
	printf("add record(numchr) to database error!\n");
	return -1;
    }
    return 0;
}


int add_oldmail2db(RCV * oldmail, int db_id)
{
    if (db_add_record(db_id, oldmail, MAXRCVMAIL) == 0) {
	printf("add record(oldmail) to database error!\n");
	return -1;
    }
    return 0;
}


int add_newmail2db(NEW * newmail, int db_id)
{
    if (db_add_record(db_id, newmail, MAXNEWMAIL) == 0) {
	printf("add record(newmail) to database error!\n");
	return -1;
    }
    return 0;
}


int number_manage(int number, int del, int db_id)
{
    char *buf = NULL;
    char temp[80];
    int i, db_num, tmp, current;
    if (number == -1 || del == DELRECORD) {
	if (del == DELRECORD) {
	    if ((db_num = db_get_record_number(db_id)) == -1) {
		printf("get record number error!\n");
		return -1;
	    }

	    else if (db_num == 0) {
		printf("there are no record!\n");
		return 0;
	    }

	    buf = (char *) malloc(MAXCHRNUM);

	    sort_setnum_database(db_id);

	    for (i = 0, current = 0; i < db_num; i++) {
		if ((tmp =
		     db_search_key(db_id, &i, buf, sizeof(int))) == 0) {
		    printf
			("return %d, mean that can not search the record!\n",
			 tmp);
		    return -1;
		}

		if (!strcmp(USERNAME, ((Number *) buf)->user))
		    current++;

		if (current == number) {
		    db_change_current_pos(db_id, i);
		    if ((tmp = db_delete_current_record(db_id)) >= 0) {
			printf("tmp=%d,delete succeed!\n", tmp);
			user_account--;
		    } else if (tmp == -1)
			printf("There is no record remained.\n");
		    else if (tmp == -2) {
			printf("Delete current record error!\n");
			return -1;
		    }
		    break;
		}
	    }

	    Mnb_browser->remove(number);
	    Mnb_browser->redraw();

	    if ((i + 1) != db_num) {
		for (;;) {
		    ((Number *) buf)->chr_num--;
		    db_modify_current(db_id, buf, MAXCHRNUM);
		    if (db_get_next(db_id, buf) == -1) {
			printf("search db over!\n");
			break;
		    }
		}
	    }
	    free(buf);
	    goto doit;
	}

	if ((db_num = db_get_record_number(db_id)) == -1) {
	    printf("get record number error!\n");
	    return -1;
	} else if (db_num == 0) {
	    printf("The setnum db is empty!\n");
	    return 0;
	}

	buf = (char *) malloc(MAXCHRNUM);
	for (i = 0, current = 0; i < db_num; i++) {
	    memset(buf, '\0', MAXCHRNUM);
	    sort_setnum_database(db_id);
	    if ((tmp = db_search_key(db_id, &i, buf, sizeof(int))) == 0) {
		printf
		    ("Return %d, mean that can not search record %d!\n",
		     tmp, i);
		return -1;
	    }
	    if (!strcmp(USERNAME, ((Number *) buf)->user)) {
		current++;
		sprintf(temp, "%s\t%s\t", ((Number *) buf)->user,
			((Number *) buf)->maddr);
		Mnb_browser->insert(current, temp);
		Mnb_browser->redraw();
	    }
	}
	free(buf);
    } else {

	if (db_get_record_number(db_id) == 0) {
	    printf("db is empty!\n");
	    return 0;
	}

	buf = (char *) malloc(MAXCHRNUM);
	if (sort_setnum_database(db_id) == -1) {
	    printf("Sort db %d error!\n", db_id);
	    return -1;
	};

	db_num = get_the_datanum(db_id);

	if (db_num == 0)
	    return 0;

	for (i = 0, current = 0; i < db_num; i++) {
	    tmp = db_search_key(db_id, &i, buf, sizeof(int));
	    if (tmp == 0) {
		printf
		    ("Return %d , mean that can not search record %d!\n",
		     tmp, i);
		return -1;
	    }

	    if (!strcmp(USERNAME, ((Number *) buf)->user))
		current++;

	    if (current == number) {
		strcpy(numset.user, ((Number *) buf)->user);
		strcpy(numset.maddr, ((Number *) buf)->maddr);
		strcpy(numset.pop3, ((Number *) buf)->pop3);
		strcpy(numset.smtp, ((Number *) buf)->smtp);
		strcpy(numset.mnum, ((Number *) buf)->mnum);
		strcpy(numset.passwd, ((Number *) buf)->passwd);
		strcpy(numset.pop3port, ((Number *) buf)->pop3port);
		strcpy(numset.smtpport, ((Number *) buf)->smtpport);
		numset.ifrempass = ((Number *) buf)->ifrempass;
		numset.ifemptyserver = ((Number *) buf)->ifemptyserver;
		free(buf);
		return 1;
	    }
	}
	free(buf);
    }

  doit:
    return 0;
}


int delete_mail(int new_id, int old_id, int dbnumber, int type)
{
    int i,j, tmp, db_num, logdb_num, current, flag = 0;
    char *buf = NULL;
    struct loginfo *logbuf = NULL;

    switch (type) {

    case OLD_MAIL_READ:
	if ((db_num = db_get_record_number(old_id)) == -1) {
	    printf("get record number error!\n");
	    return -1;
	} else if (db_num == 0) {
	    printf("there are no record!\n");
	    return 0;
	}

	buf = (char *) malloc(MAXRCVMAIL);

	sort_oldmail_database(old_id);

	printf("mail number = %d\n", db_num);

	for (i = 0, current = 0; i < db_num; i++) {
	    if ((tmp = db_search_key(old_id, &i, buf, sizeof(int))) == 0) {
		printf
		    ("return %d, mean that can not search the record %d!\n",
		     tmp, i);
		return -1;
	    }

	    if (!strcmp(USERNAME, ((RCV *) buf)->user))
		current++;

	    printf("current = %d dbnumber = %d\n", current, dbnumber);

	    if (current == dbnumber) {
		db_change_current_pos(old_id, i);
		if ((tmp = db_delete_current_record(old_id)) >= 0) {
		    printf("tmp=%d,delete succeed!\n", tmp);

		} else if (tmp == -1)
		    printf("There is no record remained.\n");
		else if (tmp == -2) {
		    printf("Delete current record error!\n");
		    return -1;
		}
		user_oldmail--;
		break;
	    }
	}

	Rm_browser->remove(dbnumber);
	Rm_browser->redraw();

//      operate on change log database

	logdb_num = db_get_record_number(changelog_id);
	printf("logdb number: %d\n", logdb_num);
	logbuf = (struct loginfo *) malloc(MAXCHLOG);
	sort_changelog_database(changelog_id);
	for (j = 0; j < logdb_num; j++) {
	    db_change_current_pos(changelog_id, j);
	    db_get_current_pos(changelog_id, logbuf);
	    printf("buf->order: %d; buf->mailid: %d; buf->opid: %d\n",
		   logbuf->order, logbuf->mailid, logbuf->opid);
	    if (logbuf->mailid == ((RCV *) buf)->mailid) {
		flag = 1;
		break;
	    }
	}

	if (flag)
	    del_chlog(changelog_id, j);
	else {
	    logbuf->order = logdb_num;
	    logbuf->mailid = ((RCV *) buf)->mailid;
	    logbuf->opid = 2;
	    strncpy(logbuf->user, USERNAME, 20);
	    add_changelog2db(logbuf, changelog_id);

	}

	printf("modify chlog_db succeed.\n");
	free(logbuf);

	if ((i + 1) != db_num) {
	    db_get_current_pos(old_id, buf);

	    for (;;) {
		((RCV *) buf)->mail_line--;
		db_modify_current(old_id, buf, MAXRCVMAIL);
		if (db_get_next(old_id, buf) == -1) {
		    printf("search db over!\n");
		    break;
		}
	    }
	}

	printf("delete mails  successfully. \n");

	break;

    case NEW_MAIL_READ:
	if ((db_num = db_get_record_number(new_id)) == -1) {
	    printf("get record number error!\n");
	    return -1;
	}

	else if (db_num == 0) {
	    printf("there are no record!\n");
	    return 0;
	}

	buf = (char *) malloc(MAXNEWMAIL);

	sort_newmail_database(new_id);

	printf("mail number = %d\n", db_num);

	for (i = 0, current = 0; i < db_num; i++) {
	    if ((tmp = db_search_key(new_id, &i, buf, sizeof(int))) == 0) {
		printf
		    ("return %d, mean that can not search the record!\n",
		     tmp);
		return -1;
	    }

	    if (!strcmp(USERNAME, ((NEW *) buf)->user))
		current++;

	    printf("current = %d dbnumber = %d\n", current, dbnumber);

	    if (current == dbnumber) {
		db_change_current_pos(new_id, i);
		if ((tmp = db_delete_current_record(new_id)) >= 0) {
		    printf("tmp=%d,delete succeed!\n", tmp);
		    user_newmail--;
		} else if (tmp == -1)
		    printf("There is no record remained.\n");
		else if (tmp == -2) {
		    printf("Delete current record error!\n");
		    return -1;
		}
		break;
	    }
	}

	Sm_browser->remove(dbnumber);
	Sm_browser->redraw();

//      operate on change log database          

	logdb_num = db_get_record_number(changelog_id);
	logbuf = (struct loginfo *) malloc(MAXCHLOG);
	sort_changelog_database(changelog_id);
	for (j = 0; j < logdb_num; j++) {
	    db_change_current_pos(changelog_id, j);
	    db_get_current_pos(changelog_id, logbuf);
	    if (logbuf->mailid == ((NEW *) buf)->mailid) {
		flag = 1;
		break;
	    }
	}

	if (flag)
	    del_chlog(changelog_id, j);
	else {
	    logbuf->order = logdb_num;
	    logbuf->mailid = ((NEW *) buf)->mailid;
	    logbuf->opid = 2;
	    strncpy(logbuf->user, USERNAME, 20);
	    add_changelog2db(logbuf, changelog_id);
	}

	printf("modify chlog_db succeed.\n");
	free(logbuf);

	if ((i + 1) != db_num) {
	    db_get_current_pos(new_id, buf);
	    for (;;) {
		((NEW *) buf)->mail_line--;
		db_modify_current(new_id, buf, MAXNEWMAIL);
		if (db_get_next(new_id, buf) == -1) {
		    printf("search db over!\n");
		    break;
		}
	    }
	}

	printf("delete mails  successfully. \n");

	break;

    default:
	break;
    }
    free(buf);
    return 0;
}


int ifreceive(char *messageid)
{
    int i, db_num, flag;
    char *buf;

    db_num = user_oldmail;

    buf = (char *) malloc(MAXRCVMAIL);

    for (i = 1; i <= db_num; i++) {
	read_fromdatabase(buf, i, RECEIVE, newmail_id, oldmail_id);

	printf("old messageid %d : %s\n", i,
	       ((struct new_rvmail *) buf)->messageid);

	if (((struct new_rvmail *) buf)->messageid == NULL
	    || messageid == NULL) {
	    free(buf);
	    return 0;
	}

	flag =
	    strncmp(messageid, ((struct new_rvmail *) buf)->messageid,
		    128);

	if (!flag) {
	    free(buf);
	    return 1;
	}
    }
    free(buf);
    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -