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

📄 calender-loadsave.c

📁 一个功能全面的电子邮件客户端
💻 C
字号:
/* TradeClient <http://tradeclient.sourceforge.net> * $Id: calender-loadsave.c,v 1.12 2001/03/20 22:19:33 ttabner Exp $ * * Copyright (C) 1999-2000 Bynari Inc. * Copyright (C) 2001 Project TradeClient * * LGPL * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Library General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program 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 Library * General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */#include "puma.h"ssize_t readtill (int fd, char *buf, ssize_t maxlen, char delim) {	unsigned long i;	char *tmp=(char *)calloc (2, sizeof(char));	if (!buf) {		free (tmp);		return -1;	}	for (i=0; i<maxlen; i++) {		if (read (fd, tmp, 1)==-1) {			free (tmp);			return -1;		}		if (tmp[0]!=EOF && tmp[0]!=delim)			buf[i]=tmp[0];		else			break;	}	free (tmp);	return i;}void calendar_load () {  CalendarEvent *event;  EventAttendee *attendee;  Llist *seek=NULL;  int LDone=FALSE;  Todo *todo;  char *dir;  char tmp[4096] ;  char sig[5] ;  int error,fd, lbreak=FALSE, btversion;  dir=(char *)calloc(1024, sizeof(char));  snprintf (dir, 1023, "$(HOME)/.tradeclient");  env_srch_rep (dir);  snprintf (tmp, 4095, "%s/.calendar", dir);  free (dir);  fd=open (tmp, O_RDONLY);  if (!fd) {    return;  }  /* Magic Read sig */  read (fd, sig, 4);  /* Read version */  read (fd, tmp, 4);  btversion=atoi (tmp);#if DEBUG > 4  printf( "Version %d of a calendar file is being read.\n", btversion ) ;#endif  /* Used for TradeClient */  if( ((strncmp( sig, "BTCC", 4 ) == 0) && (btversion < 4) ) ||      ((strncmp( sig, "BTMC", 4 ) == 0) && (btversion > 3)) ){    close (fd);    return;  }  while (LDone==FALSE) {    error=read (fd, tmp, 1);    if (tmp[0]=='\07' && error>0) {      LDone=TRUE;      goto bot;    } else {      lseek (fd, -1, SEEK_CUR);    }    error=read (fd, tmp, 4);    if (error<=0) {      LDone=TRUE;      goto bot;    }    event=(CalendarEvent *)calloc (1, sizeof (CalendarEvent));    event->flags=assemble_long(tmp);    lbreak=FALSE;    while (error>0 && lbreak==FALSE) {      memset (tmp, 0, 1024);      error=read (fd, tmp, 1);      if (tmp[0]=='\06' || error<=0) {	lbreak=TRUE;	goto eadone;      }      attendee=(EventAttendee *)calloc (1, sizeof (EventAttendee));      attendee->priority=(int)tmp[0];      error=readtill (fd, tmp, 1022, '\05');      attendee->name=strdup (tmp);      //			attendee->entry=abook_entry_seek_by_name (attendee->name);      if (seek) {	llist_append (seek, attendee);      } else {	seek=llist_append (NULL, attendee);      }    eadone:    }    if (error<=0) {      LDone=TRUE;      free (event);      goto bot;    }    event->attendees=seek;    seek=NULL;    lbreak=FALSE;    while (error>0 && lbreak==FALSE) {      error=read (fd, tmp, 1);      if (tmp[0]=='\06' || error<=0) {	lbreak=TRUE;	goto cdone;      } else {	lseek (fd, -1, SEEK_CUR);      }      memset (tmp, 0, 4096);      error=readtill (fd, tmp, 4094, '\05');      if (seek) {	llist_append (seek, strdup (tmp));      } else {	seek=llist_append (NULL, strdup (tmp));      }    cdone:    }    if (error<=0) {      LDone=TRUE;      free (event);      goto bot;    }    memset (tmp, 0, 4096);    read (fd, tmp, 1);    event->status=(int)tmp[0];    read (fd, tmp, 4);    event->start=time_t_to_event_time (assemble_long (tmp));    read (fd, tmp, 4);    event->stop=time_t_to_event_time (assemble_long (tmp));    read (fd, tmp, 4);    event->sequence=assemble_long (tmp);    read (fd, tmp, 4);    event->created=time_t_to_event_time (assemble_long (tmp));    read (fd, tmp, 4);    event->reminder=(int)assemble_long (tmp);    if (event->reminder!=-1) {      event->flags |= EVENT_REMINDER;    }    if (btversion == 4) {        readtill (fd, tmp, 4094, '\05');        event->program=strdup (tmp);        memset (tmp, 0, 4096);    } else {	event->program=strdup ("");    }    readtill (fd, tmp, 4094, '\05');    event->subject=strdup (tmp);    memset (tmp, 0, 4096);    readtill (fd, tmp, 4094, '\05');    event->location=strdup (tmp);    memset (tmp, 0, 4096);    readtill (fd, tmp, 4094, '\05');    event->information=strdup (tmp);    memset (tmp, 0, 4096);    readtill (fd, tmp, 4094, '\05');    event->uid=strdup (tmp);    memset (tmp, 0, 4096);    event->categories=seek;    event_add (event);  bot:  }  if( btversion >= 2) {    LDone=FALSE;    while (LDone==FALSE) {      error=read (fd, tmp, 1);      if (tmp[0]=='\07' && error>0) {	LDone=TRUE;	goto bot2;      } else {	lseek (fd, -1, SEEK_CUR);      }      read (fd, tmp, 1);	      if (error<=0) {	LDone=TRUE;	goto bot2;      }      todo=todo_new ();      todo->complete=*tmp;      memset (tmp, 0, 1024);      readtill (fd, tmp, 1022, '\05');      todo->text=strdup (tmp);      memset (tmp, 0, 1024);      readtill (fd, tmp, 1022, '\05');      todo->due=strdup (tmp);      memset (tmp, 0, 1024);    bot2:    }  }  calendar_dump ();  close (fd);  event_store_rehash ();}void calendar_save () {	Llist *seek, *seek2;	CalendarEvent *event;	EventAttendee *attendee;	GList *gseek;	Todo *todo;	int fd;	char *dir;	char *tmp;	dir=(char *)calloc(1024, sizeof(char));	snprintf (dir, 1024, "$(HOME)/.tradeclient");	env_srch_rep (dir);	tmp=(char *)calloc(strlen (dir)+20, sizeof(char));	snprintf (tmp, strlen (dir)+20, "%s/.calendar", dir);	fd=open (tmp, O_CREAT | O_WRONLY | O_TRUNC, S_IRUSR | S_IWUSR);	free (tmp);	/* Write magic sig and version */	/* Used by TradeClient */	write (fd, "BTCC", 4);	write (fd, "0004", 4);	for (seek=event_first ();seek;seek=seek->next) {		event=(CalendarEvent *)seek->data;		if (event_validate (event)) {			tmp=disassemble_long (event->flags);			write (fd, tmp, 4);			free (tmp);				tmp=(char *)calloc (2, sizeof(char));				for (seek2=event->attendees;seek2;seek2=seek2->next) {				attendee=(EventAttendee *)seek2->data;				tmp[0]=((char)attendee->priority);				write (fd, tmp, 1);				write (fd, attendee->name, strlen (attendee->name));				write (fd, "\05", 1);			}			write (fd, "\06", 1);				for (seek2=event->categories;seek2;seek2=seek2->next) {				write (fd, seek2->data, strlen (seek2->data));				write (fd, "\05", 1);			}			write (fd, "\06", 1);				tmp[0]=((char)event->status);			write (fd, tmp, 1);			free (tmp);	  			tmp=disassemble_long (event->start->time);			write (fd, tmp, 4);			free (tmp);				tmp=disassemble_long (event->stop->time);			write (fd, tmp, 4);			free (tmp);				tmp=disassemble_long (event->created->time);			write (fd, tmp, 4);			free (tmp);				tmp=disassemble_long (event->sequence);			write (fd, tmp, 4);			free (tmp);				tmp=disassemble_long ((unsigned long)event->reminder);			write (fd, tmp, 4);			free (tmp);			if(!event->program) event->program=strdup("");			write(fd,event->program,strlen(event->program));			write (fd, "\05", 1);			if (event->subject) write (fd, event->subject, strlen (event->subject));			write (fd, "\05", 1);			write (fd, event->location, strlen (event->location));			write (fd, "\05", 1);			write (fd, event->information, strlen (event->information));			write (fd, "\05", 1);			if (event->uid) write (fd, event->uid, strlen (event->uid));			write (fd, "\05", 1);		}	}	write (fd, "\07", 1);	for (gseek=todo_first ();gseek;gseek=gseek->next) {		todo=gseek->data;		write (fd, (char *)&todo->complete, 1);		if (todo->text) write (fd, todo->text, strlen (todo->text));		write (fd, "\05", 1);		if (todo->due) write (fd, todo->due, strlen (todo->due));		write (fd, "\05", 1);	}	write (fd, "\07", 1);	free (dir);	close (fd);}

⌨️ 快捷键说明

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