diff --git a/calendar/base/Makefile.in b/calendar/base/Makefile.in index 38429f55c45..76530c3bbe9 100644 --- a/calendar/base/Makefile.in +++ b/calendar/base/Makefile.in @@ -45,6 +45,6 @@ include $(DEPTH)/config/autoconf.mk MODULE = calbase MODULE_NAME = calBaseModule -SUBDIRS = public src +SUBDIRS = public src build include $(topsrcdir)/config/rules.mk diff --git a/calendar/base/build/Makefile.in b/calendar/base/build/Makefile.in new file mode 100644 index 00000000000..99d7f7e76e6 --- /dev/null +++ b/calendar/base/build/Makefile.in @@ -0,0 +1,67 @@ +# +# ***** BEGIN LICENSE BLOCK ***** +# Version: MPL 1.1/GPL 2.0/LGPL 2.1 +# +# The contents of this file are subject to the Mozilla Public License Version +# 1.1 (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. +# +# The Original Code is Oracle Corporation code. +# +# The Initial Developer of the Original Code is +# Oracle Corporation +# Portions created by the Initial Developer are Copyright (C) 2004 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Vladimir Vukicevic +# +# Alternatively, the contents of this file may be used under the terms of +# either of the GNU General Public License Version 2 or later (the "GPL"), +# or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), +# in which case the provisions of the GPL or the LGPL are applicable instead +# of those above. If you wish to allow use of your version of this file only +# under the terms of either the GPL or the LGPL, and not to allow others to +# use your version of this file under the terms of the MPL, indicate your +# decision by deleting the provisions above and replace them with the notice +# and other provisions required by the GPL or the LGPL. If you do not delete +# the provisions above, a recipient may use your version of this file under +# the terms of any one of the MPL, the GPL or the LGPL. +# +# ***** END LICENSE BLOCK ***** + +DEPTH = ../../.. +topsrcdir = @top_srcdir@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +include $(DEPTH)/config/autoconf.mk + +MODULE = calbasecomps +LIBRARY_NAME = calbasecomps +SHORT_LIBNAME = calbscmp +EXPORT_LIBRARY = 1 +IS_COMPONENT = 1 +MODULE_NAME = calBaseModule + +REQUIRES = \ + xpcom \ + string \ + ical \ + calbase + +EXPORTS = calBaseCID.h + +CPPSRCS = calBaseModule.cpp \ + $(NULL) + +LOCAL_INCLUDES = \ + -I$(srcdir)/../src + +include $(topsrcdir)/config/rules.mk diff --git a/calendar/base/build/calBaseCID.h b/calendar/base/build/calBaseCID.h new file mode 100644 index 00000000000..70cbff41b3a --- /dev/null +++ b/calendar/base/build/calBaseCID.h @@ -0,0 +1,59 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Oracle Corporation code. + * + * The Initial Developer of the Original Code is + * Oracle Corporation + * Portions created by the Initial Developer are Copyright (C) 2004 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Vladimir Vukicevic + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef CALBASECID_H_ +#define CALBASECID_H_ + +/* C++ */ +#define CAL_DATETIME_CID \ + { 0x85475b45, 0x110a, 0x443c, { 0xaf, 0x3f, 0xb6, 0x63, 0x98, 0xa5, 0xa7, 0xcd } } +#define CAL_DATETIME_CONTRACTID \ + "@mozilla.org/calendar/datetime;1" + +/* JS -- Update these from calItemModule.js */ +#define CAL_EVENT_CID \ + { 0x974339d5, 0xab86, 0x4491, { 0xaa, 0xaf, 0x2b, 0x2c, 0xa1, 0x77, 0xc1, 0x2b } } +#define CAL_EVENT_CONTRACTID \ + "@mozilla.org/calendar/event;1" + +#define CAL_TODO_CID \ + { 0x7af51168, 0x6abe, 0x4a31, { 0x98, 0x4d, 0x6f, 0x8a, 0x39, 0x89, 0x21, 0x2d } } +#define CAL_TODO_CONTRACTID \ + "@mozilla.org/calendar/todo;1" + +#endif /* CALBASECID_H_ */ diff --git a/calendar/base/build/calBaseModule.cpp b/calendar/base/build/calBaseModule.cpp new file mode 100644 index 00000000000..1ee9e638c9e --- /dev/null +++ b/calendar/base/build/calBaseModule.cpp @@ -0,0 +1,55 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Oracle Corporation code. + * + * The Initial Developer of the Original Code is + * Oracle Corporation + * Portions created by the Initial Developer are Copyright (C) 2004 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Vladimir Vukicevic + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include "nsIGenericFactory.h" + +#include "calDateTime.h" + +#include "calBaseCID.h" + +NS_GENERIC_FACTORY_CONSTRUCTOR(calDateTime) + +static const nsModuleComponentInfo components[] = +{ + { "Calendar DateTime Object", + CAL_DATETIME_CID, + CAL_DATETIME_CONTRACTID, + calDateTimeConstructor } +}; + +NS_IMPL_NSGETMODULE(calBaseModule, components) diff --git a/calendar/base/public/calIDateTime.idl b/calendar/base/public/calIDateTime.idl index f7f6ec35037..d34d75c04b5 100644 --- a/calendar/base/public/calIDateTime.idl +++ b/calendar/base/public/calIDateTime.idl @@ -41,91 +41,29 @@ [scriptable, uuid(5678d4a3-2543-4ece-afbb-079292f2866e)] interface calIDateTime : nsISupports { - // this thing's base PRTime value, in UTC - readonly attribute PRTime utcTime; + // returns true if this thing is able to be modified; + // if the item is not mutable, attempts to modify + // any data will throw CAL_ERROR_ITEM_IS_IMMUTABLE + readonly attribute boolean isMutable; - // - // These are all in the currently-specified - // timezone - // + // makes this item immutable + void makeImmutable(); - // Year, fully exploded (e.g. "1989", "2004") - readonly attribute short year; - - // Month, 0-11 - readonly attribute short month; - - // Day, 1 through whatever - readonly attribute short day; - - // Hour, 0-23 - readonly attribute short hour; - - // Minute, 0-59 - readonly attribute short minute; - - // Second, 0-59 - readonly attribute short second; - - // Microsecond, 0-99999 - readonly attribute long microsecond; - - // Day of the week, 0-6, Sunday = 0 - readonly attribute short weekday; - - // Day of the year, 0-365/366 - readonly attribute short yearday; - - // timezone; if null, it is GMT/UTC - // setting this changes the value of the year/month/day/etc. fields - // to be the new value of utcTime in that timezone - readonly attribute string timezone; - - // this thing's PRTime value in the local timezone - readonly attribute PRTime localTime; + // clone always returns a mutable event + calIDateTime clone(); // true if this thing is set/valid readonly attribute boolean valid; - // - // Methods - // - - // return a string representation of this date/time - // in the current locale - AUTF8String toString(); + // this thing's base PRTime value, either + // as UTC or as local. Setting this + // will explode the PRTime value to + // year/etc. + attribute PRTime nativeTime; // - // Some helper getters for calculating useful ranges - // - - // the start/end of the current object's week - readonly attribute calIDateTime startOfWeek; - readonly attribute calIDateTime endOfWeek; - - // the start/end of the current object's month - readonly attribute calIDateTime startOfMonth; - readonly attribute calIDateTime endOfMonth; - - // the start/end of the current object's year - readonly attribute calIDateTime startOfYear; - readonly attribute calIDateTime endOfYear; -}; - - -// -// mutable version of the above -// - -[scriptable, uuid(188729d7-77a3-43c9-b878-e268c786a3c4)] -interface calIMutableDateTime : nsISupports -{ - // this thing's base PRTime value, in UTC - attribute PRTime utcTime; - - // - // These are all in the currently-specified - // timezone + // Date/Time components. Setting any of these causes the DateTime + // to become invalid, until normalize() is called. // // Year, fully exploded (e.g. "1989", "2004") @@ -134,7 +72,7 @@ interface calIMutableDateTime : nsISupports // Month, 0-11 attribute short month; - // Day, 1 through whatever + // Day, 1 through whatever XXX - does libical want 1.. or 0..? attribute short day; // Hour, 0-23 @@ -146,8 +84,18 @@ interface calIMutableDateTime : nsISupports // Second, 0-59 attribute short second; - // Microsecond, 0-99999 - attribute long microsecond; + // whether this thing indicates a time in UTC, or in the local time + // zone + attribute PRBool isUtc; + + // an associated timezone that's the preferred way of representing + // this object. If this is null, then there is no preferred + // timezone, and UTC or localtime is assumed (based on isUtc). + attribute string timezone; + + // + // computed values + // // Day of the week, 0-6, Sunday = 0 readonly attribute short weekday; @@ -155,35 +103,24 @@ interface calIMutableDateTime : nsISupports // Day of the year, 0-365/366 readonly attribute short yearday; - // timezone; if null, it is GMT/UTC - // setting this changes the value of the year/month/day/etc. fields - // to be the new value of utcTime in that timezone - attribute string timezone; - - // this thing's PRTime value in the local timezone - attribute PRTime localTime; - - // true if this thing is set/valid - readonly attribute boolean valid; - // // Methods // - // reset this thing (set valid to false, everything else to 0) - void clear(); - - // adjust this time to be + the specified values (may be negative) - void modifyTime(in short years, - in short months, - in short days, - in short hours, - in short minutes); - // return a string representation of this date/time // in the current locale AUTF8String toString(); + // normalize and validate the expanded-out values + void normalize(); + + // sets this thing to a time in the given timezone + void setTimeInTimezone (in PRTime aTime, in string aTimezone); + + // gets a new calIDateTime object representing this + // item in the given timezone + calIDateTime getInTimezone (in string aTimezone); + // // Some helper getters for calculating useful ranges // diff --git a/calendar/base/public/calIEvent.idl b/calendar/base/public/calIEvent.idl index e35784359fa..502fe8ac13e 100644 --- a/calendar/base/public/calIEvent.idl +++ b/calendar/base/public/calIEvent.idl @@ -53,24 +53,10 @@ interface calIEvent : calIItemBase // these attributes are marked readonly, as the calIDates are owned // by the event; however, the actual caIDate objects are not read // only and are intended to be manipulated to adjust dates. - readonly attribute calIDateTime startDate; - readonly attribute calIDateTime endDate; - readonly attribute calIDateTime stampDate; // ?? + attribute calIDateTime startDate; + attribute calIDateTime endDate; + attribute calIDateTime stampDate; // ?? // all day event? - readonly attribute boolean isAllDay; -}; - -// -// calIMutableEvent -// - -[scriptable, uuid(383973d2-88c5-4bf1-a5ff-2d879a1b8675)] -interface calIMutableEvent : calIItemBase -{ - readonly attribute calIMutableDateTime startDate; - readonly attribute calIMutableDateTime endDate; - readonly attribute calIMutableDateTime stampDate; - attribute boolean isAllDay; }; diff --git a/calendar/base/public/calIItemBase.idl b/calendar/base/public/calIItemBase.idl index 0f9e9a3489f..8a7bd3776c4 100644 --- a/calendar/base/public/calIItemBase.idl +++ b/calendar/base/public/calIItemBase.idl @@ -63,10 +63,16 @@ interface calIMutableRecurrenceInfo; [scriptable, uuid(096b8cc5-113c-40fb-bc52-d64e3992980c)] interface calIItemBase : nsISupports { - // - // Return a mutable version of this item - // - calIMutableItemBase getMutable(); + // returns true if this thing is able to be modified; + // if the item is not mutable, attempts to modify + // any data will throw CAL_ERROR_ITEM_IS_IMMUTABLE + readonly attribute boolean isMutable; + + // makes this item immutable + void makeImmutable(); + + // clone always returns a mutable event + calIItemBase clone(); // // the generation number of this item; 0 means @@ -87,85 +93,7 @@ interface calIItemBase : nsISupports readonly attribute calIDateTime creationDate; // last time any attribute was modified on this item, in UTC - readonly attribute PRTime lastModifiedTime; - - // the calICalendar to which this event belongs - readonly attribute calICalendar parent; - - // the ID of this event - readonly attribute AUTF8String id; - - // event title - readonly attribute AUTF8String title; - - // event priority - readonly attribute short priority; - readonly attribute boolean isPrivate; - - // event/status of the event (see consts above) - readonly attribute long method; - readonly attribute long status; - - // ical interop; writing this means parsing - // the ical string into this event - readonly attribute AUTF8String icalString; - - // - // alarms - // - readonly attribute boolean hasAlarm; - readonly attribute calIDateTime alarmTime; - - // - // recurrence - // - readonly attribute calIRecurrenceInfo recurrenceInfo; - - // attachments - // array of nsIMsgAttachment - readonly attribute nsIArray attachments; - - // contacts - // array of nsIAbCard - readonly attribute nsIArray contacts; - - // - // other properties come in through a property bag - // - - // 'description' - description (string) - // 'location' - location (string) - // 'categories' - categories (string) - // 'syncId' - sync id (string) - // 'inviteEmailAddress' - string - // alarmLength/alarmUnits/alarmEmailAddress/lastAlarmAck - // recurInterval/recurCount/recurWeekdays/recurWeeknumber - - // Ideally, /all/ of the properties on the event should - // be available via the property bag. (And maybe the - // nsIItemBase impl should be QI'able to - // nsIWritablePropertyBag also) - - readonly attribute nsIPropertyBag properties; -}; - -// -// calIMutableItemBase -// -// Mutable version of the above -// -[scriptable, uuid(56ca7d46-2412-466f-9dea-fb141ae95de0)] -interface calIMutableItemBase : nsISupports -{ - // the base item that this is a mutable item of - readonly attribute calIItemBase baseItem; - readonly attribute long generation; - - // the time when this item was created - attribute calIMutableDateTime creationDate; - - // last time any attribute was modified on this item, in UTC - readonly attribute PRTime lastModifiedTime; + attribute PRTime lastModifiedTime; // the calICalendar to which this event belongs attribute calICalendar parent; @@ -192,20 +120,22 @@ interface calIMutableItemBase : nsISupports // alarms // attribute boolean hasAlarm; - attribute calIMutableDateTime alarmTime; + attribute calIDateTime alarmTime; // // recurrence // - readonly attribute calIMutableRecurrenceInfo recurrenceInfo; + readonly attribute calIRecurrenceInfo recurrenceInfo; // attachments // array of nsIMsgAttachment - readonly attribute nsIMutableArray attachments; + // if this item is mutable, the returned array will be a nsIMutableArray + readonly attribute nsIArray attachments; // contacts // array of nsIAbCard - readonly attribute nsIMutableArray contacts; + // if this item is mutable, the returned array will be a nsIMutableArray + readonly attribute nsIArray contacts; // // other properties come in through a property bag @@ -224,7 +154,8 @@ interface calIMutableItemBase : nsISupports // nsIItemBase impl should be QI'able to // nsIWritablePropertyBag also) - readonly attribute nsIWritablePropertyBag properties; + // if this item is mutable, the returned bag will be a nsIWritablePropertyBag + readonly attribute nsIPropertyBag properties; }; // diff --git a/calendar/base/public/calIRecurrenceInfo.idl b/calendar/base/public/calIRecurrenceInfo.idl index 2512c128a40..03a723659d1 100644 --- a/calendar/base/public/calIRecurrenceInfo.idl +++ b/calendar/base/public/calIRecurrenceInfo.idl @@ -47,6 +47,18 @@ interface calIItemOccurrence; [scriptable, uuid(a6a458cf-052c-45d1-bee7-b700ad21109a)] interface calIRecurrenceInfo : nsISupports { + // returns true if this thing is able to be modified; + // if the item is not mutable, attempts to modify + // any data will throw CAL_ERROR_ITEM_IS_IMMUTABLE + readonly attribute boolean isMutable; + + // makes this item immutable + void makeImmutable(); + + // clone always returns a mutable event + calIItemBase clone(); + + // // // recurrence // @@ -57,10 +69,10 @@ interface calIRecurrenceInfo : nsISupports const long CAL_ITEM_RECUR_TYPE_MONTHLY = 4; const long CAL_ITEM_RECUR_TYPE_YEARLY = 5; - readonly attribute long recurType; - readonly attribute calIDateTime recurEnd; // if null, then forever + attribute long recurType; + attribute calIDateTime recurEnd; // if null, then forever // array of calIDateTime - readonly attribute nsIArray recurrenceExceptions; + attribute nsIArray recurrenceExceptions; // rest of recurrence in properties (?) // return the next display item for this event, @@ -77,26 +89,3 @@ interface calIRecurrenceInfo : nsISupports in calIDateTime aEndTime); }; - -[scriptable, uuid(ee300ea5-9bfa-4566-9ae1-23adf79088a8)] -interface calIMutableRecurrenceInfo : nsISupports -{ - attribute long recurType; - attribute calIDateTime recurEnd; // if null, then forever - // array of calIDateTime - readonly attribute nsIMutableArray recurrenceExceptions; - // rest of recurrence in properties (?) - - // return the next display item for this event, - // where the start time is >= aStartTime - calIItemOccurrence getNextOccurrence (in calIDateTime aStartTime); - - // return the previous display item for this event, - // where the start time is < aStartTime - calIItemOccurrence getPreviousOccurrence (in calIDateTime aStartTime); - - // return array of calIDisplayItems, representing all - // occurances of this event between start and end. - nsIArray getAllOccurrences (in calIDateTime aStartTime, - in calIDateTime aEndTime); -}; diff --git a/calendar/base/public/calITodo.idl b/calendar/base/public/calITodo.idl index 21f5c37d98b..eec17a057c3 100644 --- a/calendar/base/public/calITodo.idl +++ b/calendar/base/public/calITodo.idl @@ -54,18 +54,6 @@ interface calITodo : calIItemBase readonly attribute calIDateTime entryTime; readonly attribute calIDateTime dueDate; readonly attribute calIDateTime completedDate; - readonly attribute short percentComplete; -}; - -// -// calIMutableTodo -// - -[scriptable, uuid(d4e00ebe-e9cd-41ee-bd4f-8015071adb97)] -interface calIMutableTodo : calIItemBase -{ - readonly attribute calIMutableDateTime entryTime; - readonly attribute calIMutableDateTime dueDate; - readonly attribute calIMutableDateTime completedDate; attribute short percentComplete; }; + diff --git a/calendar/base/src/Makefile.in b/calendar/base/src/Makefile.in index 1354bcfeb89..26b0393ca3a 100644 --- a/calendar/base/src/Makefile.in +++ b/calendar/base/src/Makefile.in @@ -49,12 +49,18 @@ MODULE_NAME = calBaseModule FORCE_STATIC_LIB = 1 GRE_MODULE = 1 -#REQUIRES = xpcom \ -# string \ +REQUIRES = xpcom \ + string \ + ical \ + $(NULL) + # storage \ # sqlite3 \ # $(NULL) +CPPSRCS = \ + calDateTime.cpp + #CPPSRCS = \ # calItemBase.cpp \ # calEvent.cpp \ diff --git a/calendar/base/src/calAttributeHelpers.h b/calendar/base/src/calAttributeHelpers.h index 27ba404169f..14959b53d04 100644 --- a/calendar/base/src/calAttributeHelpers.h +++ b/calendar/base/src/calAttributeHelpers.h @@ -39,6 +39,10 @@ #ifndef CALATTRIBUTEHELPERS_H_ #define CALATTRIBUTEHELPERS_H_ +#ifndef UPDATE_LAST_MODIFIED +#define UPDATE_LAST_MODIFIED /**/ +#endif + /** ** A few helpers for declaring simple attribute getters and setters in ** calItemBase derivatives @@ -55,7 +59,9 @@ cname::Get##name (mtype &_retval) { \ #define CAL_STRINGTYPE_ATTR_SETTER(cname,mtype,name) \ NS_IMETHODIMP \ cname::Set##name (const mtype &aValue) { \ + if (mImmutable) return NS_ERROR_FAILURE; \ m##name.Assign(aValue); \ + UPDATE_LAST_MODIFIED; \ return NS_OK; \ } @@ -74,9 +80,10 @@ cname::Get##name (mtype *_retval) { \ #define CAL_VALUETYPE_ATTR_SETTER(cname,mtype,name) \ NS_IMETHODIMP \ cname::Set##name (mtype aValue) { \ + if (mImmutable) return NS_ERROR_FAILURE; \ if (m##name != aValue) { \ m##name = aValue; \ - mLastModifiedTime = PR_Now(); \ + UPDATE_LAST_MODIFIED; \ } \ return NS_OK; \ } @@ -96,9 +103,10 @@ cname::Get##name (mtype **_retval) { \ #define CAL_ISUPPORTS_ATTR_SETTER(cname,mtype,name) \ NS_IMETHODIMP \ cname::Set##name (mtype *aValue) { \ + if (mImmutable) return NS_ERROR_FAILURE; \ if (m##name != aValue) { \ m##name = aValue; \ - mLastModifiedTime = PR_Now(); \ + UPDATE_LAST_MODIFIED; \ } \ return NS_OK; \ } diff --git a/calendar/base/src/calDateTime.cpp b/calendar/base/src/calDateTime.cpp new file mode 100644 index 00000000000..40fd76b5ac5 --- /dev/null +++ b/calendar/base/src/calDateTime.cpp @@ -0,0 +1,266 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Oracle Corporation code. + * + * The Initial Developer of the Original Code is + * Oracle Corporation + * Portions created by the Initial Developer are Copyright (C) 2004 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Vladimir Vukicevic + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include "calDateTime.h" + +#include "calAttributeHelpers.h" + +extern "C" { + #include "ical.h" +} + +NS_IMPL_ISUPPORTS1(calDateTime, calIDateTime) + +calDateTime::calDateTime() + : mValid(PR_FALSE) +{ + +} + +calDateTime::calDateTime(struct icaltimetype *atimeptr) +{ + fromIcalTime(atimeptr); + mValid = PR_TRUE; +} + +NS_IMETHODIMP +calDateTime::GetIsMutable(PRBool *aResult) +{ + NS_ENSURE_ARG_POINTER(aResult); + + *aResult = !mImmutable; + return NS_OK; +} + +NS_IMETHODIMP +calDateTime::MakeImmutable() +{ + if (mImmutable) + return NS_ERROR_FAILURE; // XXX another error code + + mImmutable = PR_TRUE; + return NS_OK; +} + +NS_IMETHODIMP +calDateTime::Clone(calIDateTime **aResult) +{ + calDateTime *cdt = new calDateTime(); + if (!cdt) + return NS_ERROR_OUT_OF_MEMORY; + + // bitwise copy everything + cdt->mValid = mValid; + cdt->mNativeTime = mNativeTime; + cdt->mYear = mYear; + cdt->mMonth = mMonth; + cdt->mDay = mDay; + cdt->mHour = mHour; + cdt->mMinute = mMinute; + cdt->mSecond = mSecond; + cdt->mIsUtc = mIsUtc; + cdt->mWeekday = mWeekday; + cdt->mYearday = mYearday; + + cdt->mLastModified = PR_Now(); + + // copies are always mutable + cdt->mImmutable = PR_FALSE; + + NS_ADDREF(*aResult = cdt); + return NS_OK; +} + +CAL_VALUETYPE_ATTR_GETTER(calDateTime, PRBool, Valid) + +CAL_VALUETYPE_ATTR(calDateTime, PRTime, NativeTime) +CAL_VALUETYPE_ATTR(calDateTime, PRInt16, Year) +CAL_VALUETYPE_ATTR(calDateTime, PRInt16, Month) +CAL_VALUETYPE_ATTR(calDateTime, PRInt16, Day) +CAL_VALUETYPE_ATTR(calDateTime, PRInt16, Hour) +CAL_VALUETYPE_ATTR(calDateTime, PRInt16, Minute) +CAL_VALUETYPE_ATTR(calDateTime, PRInt16, Second) +CAL_VALUETYPE_ATTR(calDateTime, PRBool, IsUtc) + +CAL_VALUETYPE_ATTR_GETTER(calDateTime, PRInt16, Weekday) +CAL_VALUETYPE_ATTR_GETTER(calDateTime, PRInt16, Yearday) + +NS_IMETHODIMP +calDateTime::Normalize() +{ + struct icaltimetype icalt; + + toIcalTime(&icalt); + + icalt = icaltime_normalize(icalt); + + fromIcalTime(&icalt); + + mValid = PR_TRUE; + + return NS_OK; +} + +NS_IMETHODIMP +calDateTime::ToString(nsACString& aResult) +{ + aResult.Assign("FOO"); + return NS_OK; +} + +NS_IMETHODIMP +calDateTime::SetTimeInTimezone(PRTime aTime, const char *aTimezone) +{ + struct icaltimetype icalt; + time_t tt; + + PRInt64 temp, million; + LL_I2L(million, PR_USEC_PER_SEC); + LL_DIV(temp, aTime, million); + PRInt32 sectime; + LL_L2I(sectime, temp); + + tt = sectime; + icalt = icaltime_from_timet(tt, 0); + icalt = icaltime_as_utc(icalt, aTimezone); + + fromIcalTime(&icalt); + + return NS_OK; +} + +NS_IMETHODIMP +calDateTime::GetInTimezone(const char *aTimezone, calIDateTime **aResult) +{ + struct icaltimetype icalt; + toIcalTime(&icalt); + + icalt = icaltime_as_zone(icalt, aTimezone); + calDateTime *cdt = new calDateTime(&icalt); + if (!cdt) + return NS_ERROR_OUT_OF_MEMORY; + + NS_ADDREF (*aResult = cdt); + return NS_OK; +} + +NS_IMETHODIMP +calDateTime::GetStartOfWeek(calIDateTime **aResult) +{ + return NS_ERROR_NOT_IMPLEMENTED; +} + +NS_IMETHODIMP +calDateTime::GetEndOfWeek(calIDateTime **aResult) +{ + return NS_ERROR_NOT_IMPLEMENTED; +} + +NS_IMETHODIMP +calDateTime::GetStartOfMonth(calIDateTime **aResult) +{ + return NS_ERROR_NOT_IMPLEMENTED; +} + +NS_IMETHODIMP +calDateTime::GetEndOfMonth(calIDateTime **aResult) +{ + return NS_ERROR_NOT_IMPLEMENTED; +} + +NS_IMETHODIMP +calDateTime::GetStartOfYear(calIDateTime **aResult) +{ + return NS_ERROR_NOT_IMPLEMENTED; +} + +NS_IMETHODIMP +calDateTime::GetEndOfYear(calIDateTime **aResult) +{ + return NS_ERROR_NOT_IMPLEMENTED; +} + + +/** + ** utility/protected methods + **/ + +void +calDateTime::toIcalTime(icaltimetype *icalt) +{ + icalt->year = mYear; + icalt->month = mMonth; + icalt->day = mDay; + icalt->hour = mHour; + icalt->minute = mMinute; + icalt->second = mSecond; + + if (mIsUtc) + icalt->is_utc = 1; + else + icalt->is_utc = 0; +} + +void +calDateTime::fromIcalTime(icaltimetype *icalt) +{ + mYear = icalt->year; + mMonth = icalt->month; + mDay = icalt->day; + mHour = icalt->hour; + mMinute = icalt->minute; + mSecond = icalt->second; + + if (icalt->is_utc) + mIsUtc = PR_TRUE; + else + mIsUtc = PR_FALSE; + + // reconstruct nativetime + time_t tt = icaltime_as_timet(*icalt); + PRInt64 temp, million; + LL_I2L(million, PR_USEC_PER_SEC); + LL_I2L(temp, tt); + LL_MUL(temp, temp, million); + mNativeTime = temp; + + // reconstruct weekday/yearday + mWeekday = icaltime_day_of_week(*icalt); + mYearday = icaltime_day_of_year(*icalt); +} + diff --git a/calendar/base/src/calDateTime.h b/calendar/base/src/calDateTime.h new file mode 100644 index 00000000000..c459282fff2 --- /dev/null +++ b/calendar/base/src/calDateTime.h @@ -0,0 +1,86 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Oracle Corporation code. + * + * The Initial Developer of the Original Code is + * Oracle Corporation + * Portions created by the Initial Developer are Copyright (C) 2004 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Vladimir Vukicevic + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef CALDATETIME_H_ +#define CALDATETIME_H_ + +#include "nsString.h" + +#include "calIDateTime.h" + +struct icaltimetype; + +class calDateTime : public calIDateTime +{ +public: + calDateTime (); + calDateTime (struct icaltimetype *timeptr); + + // nsISupports interface + NS_DECL_ISUPPORTS + + // calIDateTime interface + NS_DECL_CALIDATETIME + +protected: + PRBool mImmutable; + + PRBool mValid; + + PRTime mNativeTime; + + PRInt16 mYear; + PRInt16 mMonth; + PRInt16 mDay; + PRInt16 mHour; + PRInt16 mMinute; + PRInt16 mSecond; + + PRBool mIsUtc; + + PRInt16 mWeekday; + PRInt16 mYearday; + + void toIcalTime(icaltimetype *icalt); + void fromIcalTime(icaltimetype *icalt); + + PRTime mLastModified; +}; + +#endif /* CALDATETIME_H_ */ + diff --git a/calendar/base/src/calEvent.cpp b/calendar/base/src/calEvent.cpp deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/calendar/base/src/calEvent.h b/calendar/base/src/calEvent.h deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/calendar/base/src/calEvent.js.pre b/calendar/base/src/calEvent.js.pre index 5397d005bd0..df696f82692 100644 --- a/calendar/base/src/calEvent.js.pre +++ b/calendar/base/src/calEvent.js.pre @@ -61,9 +61,20 @@ calEvent.prototype = { return this; }, + clone: function () { + var m = new calEvent(); + this.cloneItemBaseInto(m); + m.mStartDate = this.mStartDate.clone(); + m.mEndDate = this.mEndDate.clone(); + m.mStampDate = this.mStampDate.clone(); + + return m; + }, + #define MEMBER_ATTR(varname, initvalue, attrname) \ - varname: initvalue, \ - get attrname() { return this.varname; } + varname: initvalue, \ + get attrname() { return this.varname; } \ + set attrname(v) { if (this.mImmutable) throw Components.results.NS_ERROR_FAILURE; else this.varname = v; } MEMBER_ATTR(mStartDate, null, startDate), MEMBER_ATTR(mEndDate, null, endDate), diff --git a/calendar/base/src/calItemBase.cpp b/calendar/base/src/calItemBase.cpp deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/calendar/base/src/calItemBase.h b/calendar/base/src/calItemBase.h deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/calendar/base/src/calItemBase.js b/calendar/base/src/calItemBase.js index f58e3ada0b4..8c47282077e 100644 --- a/calendar/base/src/calItemBase.js +++ b/calendar/base/src/calItemBase.js @@ -44,7 +44,7 @@ calItemBase.prototype = { mLastModifiedTime: 0, get lastModifiedTime() { return this.mLastModifiedTime; }, mParent: null, get parent() { return this.mParent; }, mId: null, get id() { return this.mId; }, - mTitle: null, get title() { return this.mTitle; }, + mTitle: "", get title() { return this.mTitle; }, mPriority: 0, get priority() { return this.mPriority; }, mIsPrivate: 0, get isPrivate() { return this.mIsPrivate; }, mMethod: 0, get method() { return this.mMethod; }, diff --git a/calendar/base/src/calItemBase.js.pre b/calendar/base/src/calItemBase.js.pre index 3033451f781..d4e5a7959f6 100644 --- a/calendar/base/src/calItemBase.js.pre +++ b/calendar/base/src/calItemBase.js.pre @@ -53,10 +53,25 @@ calItemBase.prototype = { return this; }, - getMutable: function () { - var m = new calMutableItemBase(); + mImmutable: false, + get isMutable() { return this. mImmutable; }, + makeImmutable: function() { + if (this.mImmutable) + throw Components.results.NS_ERROR_FAILURE; + + // make all our components immutable + this.mCreationDate.makeImmutable(); + this.mRecurrenceInfo.makeImmutable(); + this.mAlarmTime.makeImmutable(); + + this.mImmutable = true; + } + + // for subclasses to use; copies the ItemBase's values + // into m + cloneItemBaseInto: function (m) { + m.mImmutable = false; m.mGeneration = this.mGeneration; - m.mCreationDate = this.mCreationDate.getMutable(); m.mLastModifiedTime = this.mLastModifiedTime; m.mParent = this.mParent; m.mId = this.mId; @@ -66,8 +81,10 @@ calItemBase.prototype = { m.mMethod = this.mMethod; m.mStatus = this.mStatus; m.mHasAlarm = this.mHasAlarm; - m.mAlarmTime = this.mAlarmTime.getMutable(); - m.mRecurrenceInfo = this.mRecurrenceInfo.getMutable(); + m.mRecurrenceInfo = this.mRecurrenceInfo.clone(); + + m.mCreationDate = this.mCreationDate.clone(); + m.mAlarmTime = this.mAlarmTime.clone(); // these need fixing m.mAttachments = this.mAttachments; @@ -79,7 +96,8 @@ calItemBase.prototype = { #define MEMBER_ATTR(varname, initvalue, attrname) \ varname: initvalue, \ - get attrname() { return this.varname; } + get attrname() { return this.varname; } \ + set attrname(v) { if (this.mImmutable) throw Components.results.NS_ERROR_FAILURE; else this.varname = v; } MEMBER_ATTR(mGeneration, 0, generation), MEMBER_ATTR(mCreationDate, null, creationDate), @@ -102,12 +120,14 @@ calItemBase.prototype = { #undef MEMBER_ATTR }; -function calMutableItemBase() { } +function calItemOccurrence () { + this.wrappedJSObject = this; +} -calMutableItemBase.prototype = { +calItemOccurrence.prototype = { QueryInterface: function (aIID) { if (!aIID.equals(Components.interfaces.nsISupports) && - !aIID.equals(Components.interfaces.calIMutableItemBase)) + !aIID.equals(Components.interfaces.calIItemOccurrence)) { throw Components.results.NS_ERROR_NO_INTERFACE; } @@ -115,28 +135,10 @@ calMutableItemBase.prototype = { return this; }, -#define MEMBER_ATTR(varname, initvalue, attrname) \ - varname: initvalue, \ - get attrname() { return this.varname; }, \ - set attrname(v) { this.varname = v; } + item: null, + occurrenceStartDate: null, + occurrenceEndDate: null, - MEMBER_ATTR(mGeneration, 0, generation), - MEMBER_ATTR(mCreationDate, null, creationDate), - MEMBER_ATTR(mLastModifiedTime, 0, lastModifiedTime), - MEMBER_ATTR(mParent, null, parent), - MEMBER_ATTR(mId, null, id), - MEMBER_ATTR(mTitle, null, title), - MEMBER_ATTR(mPriority, 0, priority), - MEMBER_ATTR(mIsPrivate, 0, isPrivate), - MEMBER_ATTR(mMethod, 0, method), - MEMBER_ATTR(mStatus, 0, status), - MEMBER_ATTR(mIcalString, "", icalString), - MEMBER_ATTR(mHasAlarm, false, hasAlarm), - MEMBER_ATTR(mAlarmTime, null, alarmTime), - MEMBER_ATTR(mRecurrenceInfo, null, recurrenceInfo), - MEMBER_ATTR(mAttachments, null, attachments), - MEMBER_ATTR(mContacts, null, contacts), - MEMBER_ATTR(mProperties, null, properties) - -#undef MEMBER_ATTR + next: null, + previous: null }; diff --git a/calendar/base/src/calItemModule.js b/calendar/base/src/calItemModule.js index b92dbe0f405..8e036f2bbde 100644 --- a/calendar/base/src/calItemModule.js +++ b/calendar/base/src/calItemModule.js @@ -37,18 +37,13 @@ * ***** END LICENSE BLOCK ***** */ var calItemModule = { + /* Update these in calBaseCID.h */ mEventCID: Components.ID("{974339d5-ab86-4491-aaaf-2b2ca177c12b}"), mEventContractId: "@mozilla.org/calendar/event;1", - mMutableEventCID: Components.ID("{943c81f5-da08-441e-918e-266f17866180}"), - mMutableEventContractId: "@mozilla.org/calendar/mutableevent;1", - mTodoCID: Components.ID("{7af51168-6abe-4a31-984d-6f8a3989212d}"), mTodoContractId: "@mozilla.org/calendar/todo;1", - mMutableTodoCID: Components.ID("{46f8bfd1-84e9-4c57-9c5c-e8c2a8386e73}"), - mMutableTodoContractId: "@mozilla.org/calendar/mutabletodo;1", - mScriptsLoaded: false, loadScripts: function () { if (this.mScriptsLoaded) @@ -85,8 +80,8 @@ var calItemModule = { registerSelf: function (compMgr, fileSpec, location, type) { compMgr = compMgr.QueryInterface(Components.interfaces.nsIComponentRegistrar); - var cids = [ this.mEventCID, this.mMutableEventCID, this.mTodoCID, this.mMutableTodoCID ]; - var contractids = [ this.mEventContractId, this.mMutableEventContractId, this.mTodoContractId, this.mMutableTodoContractId ]; + var cids = [ this.mEventCID, this.mTodoCID ]; + var contractids = [ this.mEventContractId, this.mTodoContractId ]; for (var i = 0; i < cids.length; i++) { dump ("calItemModule: registering " + contractids[i] + "\n"); @@ -109,15 +104,9 @@ var calItemModule = { if (cid.equals(this.mEventCID)) return this.mEventFactory; - if (cid.equals(this.mMutableEventCID)) - return this.mMutableEventFactory; - if (cid.equals(this.mTodoCID)) return this.mTodoFactory; - if (cid.equals(this.mMutableTodoCID)) - return this.mMutableTodoFactory; - throw Components.results.NS_ERROR_NO_INTERFACE; }, @@ -136,21 +125,6 @@ var calItemModule = { } }, - mMutableEventFactory: { - QueryInterface: function (aIID) { - if (!aIID.equals(Components.interfaces.nsISupports) && - !aIID.equals(Components.interfaces.nsIFactory)) - throw Components.results.NS_ERROR_NO_INTERFACE; - return this; - }, - - createInstance: function (outer, iid) { - if (outer != null) - throw Components.results.NS_ERROR_NO_AGGREGATION; - return (new calMutableEvent()).QueryInterface(iid); - } - }, - mTodoFactory: { QueryInterface: function (aIID) { if (!aIID.equals(Components.interfaces.nsISupports) && @@ -166,21 +140,6 @@ var calItemModule = { } }, - mMutableTodoFactory: { - QueryInterface: function (aIID) { - if (!aIID.equals(Components.interfaces.nsISupports) && - !aIID.equals(Components.interfaces.nsIFactory)) - throw Components.results.NS_ERROR_NO_INTERFACE; - return this; - }, - - createInstance: function (outer, iid) { - if (outer != null) - throw Components.results.NS_ERROR_NO_AGGREGATION; - return (new calMutableTodo()).QueryInterface(iid); - } - }, - canUnload: function(compMgr) { return true; } diff --git a/calendar/base/src/calTodo.cpp b/calendar/base/src/calTodo.cpp deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/calendar/base/src/calTodo.h b/calendar/base/src/calTodo.h deleted file mode 100644 index e69de29bb2d..00000000000