📄 calender-loadsave.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 + -