diff --git a/calendar/base/build/calBaseModule.cpp b/calendar/base/build/calBaseModule.cpp index 23c7a2b73120..2f3d549e07b0 100644 --- a/calendar/base/build/calBaseModule.cpp +++ b/calendar/base/build/calBaseModule.cpp @@ -44,6 +44,7 @@ #include "calDateTime.h" #include "calDuration.h" +#include "calPeriod.h" #include "calICSService.h" #include "calRecurrenceRule.h" #include "calRecurrenceDate.h" @@ -53,6 +54,7 @@ NS_GENERIC_FACTORY_CONSTRUCTOR(calDateTime) NS_GENERIC_FACTORY_CONSTRUCTOR(calDuration) +NS_GENERIC_FACTORY_CONSTRUCTOR(calPeriod) NS_GENERIC_FACTORY_CONSTRUCTOR(calICSService) NS_GENERIC_FACTORY_CONSTRUCTOR(calRecurrenceRule) NS_GENERIC_FACTORY_CONSTRUCTOR(calRecurrenceDate) @@ -60,6 +62,7 @@ NS_GENERIC_FACTORY_CONSTRUCTOR(calRecurrenceDateSet) NS_DECL_CLASSINFO(calDateTime) NS_DECL_CLASSINFO(calDuration) +NS_DECL_CLASSINFO(calPeriod) NS_DECL_CLASSINFO(calICSService) NS_DECL_CLASSINFO(calRecurrenceRule) NS_DECL_CLASSINFO(calRecurrenceDate) @@ -89,6 +92,17 @@ static const nsModuleComponentInfo components[] = NULL, &NS_CLASSINFO_NAME(calDuration) }, + { "Calendar Period Object", + CAL_PERIOD_CID, + CAL_PERIOD_CONTRACTID, + calPeriodConstructor, + NULL, + NULL, + NULL, + NS_CI_INTERFACE_GETTER_NAME(calPeriod), + NULL, + &NS_CLASSINFO_NAME(calPeriod) + }, { "ICS parser/serializer", CAL_ICSSERVICE_CID, CAL_ICSSERVICE_CONTRACTID, diff --git a/calendar/base/public/Makefile.in b/calendar/base/public/Makefile.in index bbb100957133..a686940989a4 100644 --- a/calendar/base/public/Makefile.in +++ b/calendar/base/public/Makefile.in @@ -55,6 +55,7 @@ XPIDLSRCS = calIAlarmService.idl \ calICalendarView.idl \ calICalendarViewController.idl \ calIDateTime.idl \ + calIPeriod.idl \ calIDecoratedView.idl \ calIDuration.idl \ calIErrors.idl \ diff --git a/calendar/base/public/calBaseCID.h b/calendar/base/public/calBaseCID.h index e7bb7f5abfe5..84f6158e6fb1 100644 --- a/calendar/base/public/calBaseCID.h +++ b/calendar/base/public/calBaseCID.h @@ -51,6 +51,11 @@ #define CAL_DURATION_CONTRACTID \ "@mozilla.org/calendar/duration;1" +#define CAL_PERIOD_CID \ + { 0x12fdd72b, 0xc5b6, 0x4720, { 0x81, 0x66, 0x2d, 0xec, 0xa1, 0x33, 0x82, 0xf5 } } +#define CAL_PERIOD_CONTRACTID \ + "@mozilla.org/calendar/period;1" + #define CAL_ICSSERVICE_CID \ { 0xf2f65cf2, 0x880e, 0x4960, { 0xb3, 0x7b, 0xae, 0x02, 0x05, 0xb6, 0xe3, 0x42 } } #define CAL_ICSSERVICE_CONTRACTID \ diff --git a/calendar/base/public/calIPeriod.idl b/calendar/base/public/calIPeriod.idl new file mode 100644 index 000000000000..bfa8352f1dff --- /dev/null +++ b/calendar/base/public/calIPeriod.idl @@ -0,0 +1,93 @@ +/* -*- Mode: idl; 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 mozilla calendar code. + * + * The Initial Developer of the Original Code is + * Michiel van Leeuwen + * Portions created by the Initial Developer are Copyright (C) 2006 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * 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 "nsISupports.idl" + +interface calIDateTime; +interface calIDuration; + +[ptr] native icalperiodtypeptr(struct icalperiodtype); + +[scriptable,uuid(03cde9c7-c864-4109-8bea-ebbff01cbab9)] +interface calIPeriod : nsISupports +{ + /** + * isMutable is true if this instance is modifiable. + * If isMutable is false, any attempts to modify + * the object will throw CAL_ERROR_ITEM_IS_MUTABLE. + */ + readonly attribute boolean isMutable; + + /** + * Make this calIPeriod instance immutable. + */ + void makeImmutable(); + + /** + * Clone this calIPeriod instance into a new + * mutable object. + */ + calIPeriod clone(); + + /** + * The start datetime of this period + */ + attribute calIDateTime start; + + /** + * The end datetime of this period + */ + attribute calIDateTime end; + + /** + * The duration, equal to end-start + */ + readonly attribute calIDuration duration; + + + /** + * Return a string representation of this instance. + */ + AUTF8String toString(); + + [noscript,notxpcom] void toIcalPeriod(in icalperiodtypeptr idt); + + /** + * This object as an iCalendar DURATION string + */ + attribute ACString icalString; +}; diff --git a/calendar/base/src/Makefile.in b/calendar/base/src/Makefile.in index 17d53ac3100f..7703a8e8d307 100644 --- a/calendar/base/src/Makefile.in +++ b/calendar/base/src/Makefile.in @@ -64,6 +64,7 @@ XPIDLSRCS = \ CPPSRCS = calDateTime.cpp \ calDuration.cpp \ + calPeriod.cpp \ calICSService.cpp \ calRecurrenceRule.cpp \ calRecurrenceDate.cpp \ diff --git a/calendar/base/src/calPeriod.cpp b/calendar/base/src/calPeriod.cpp new file mode 100644 index 000000000000..97ddb3ed85cf --- /dev/null +++ b/calendar/base/src/calPeriod.cpp @@ -0,0 +1,196 @@ +/* -*- Mode: C++; tab-width: 20; 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 mozilla calendar code. + * + * The Initial Developer of the Original Code is + * Michiel van Leeuwen + * Portions created by the Initial Developer are Copyright (C) 2006 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * 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 "calPeriod.h" +#include "calBaseCID.h" +#include "nsIClassInfoImpl.h" + +NS_IMPL_ISUPPORTS1_CI(calPeriod, calIPeriod) + +calPeriod::calPeriod() + : mImmutable(PR_FALSE) +{ +} + +calPeriod::calPeriod(const calPeriod& cpt) + : mImmutable(PR_FALSE) +{ + if (cpt.mStart) + cpt.mStart->Clone(getter_AddRefs(mStart)); + if (cpt.mEnd) + cpt.mEnd->Clone(getter_AddRefs(mEnd)); +} + +calPeriod::calPeriod(struct icalperiodtype *aPeriodPtr) + : mImmutable(PR_FALSE) +{ + FromIcalPeriod(aPeriodPtr); +} + +NS_IMETHODIMP +calPeriod::GetIsMutable(PRBool *aResult) +{ + NS_ENSURE_ARG_POINTER(aResult); + + *aResult = !mImmutable; + return NS_OK; +} + +NS_IMETHODIMP +calPeriod::MakeImmutable() +{ + if (mImmutable) + return NS_ERROR_OBJECT_IS_IMMUTABLE; + + mImmutable = PR_TRUE; + return NS_OK; +} + +NS_IMETHODIMP +calPeriod::Clone(calIPeriod **aResult) +{ + calPeriod *cpt = new calPeriod(*this); + if (!cpt) + return NS_ERROR_OUT_OF_MEMORY; + + NS_ADDREF(*aResult = cpt); + return NS_OK; +} + + +NS_IMETHODIMP calPeriod::GetStart(calIDateTime **_retval) +{ + *_retval = mStart; + NS_IF_ADDREF(*_retval); + return NS_OK; +} +NS_IMETHODIMP calPeriod::SetStart(calIDateTime *aValue) +{ + NS_ENSURE_ARG_POINTER(aValue); + if (mImmutable) + return NS_ERROR_CALENDAR_IMMUTABLE; + // rfc2445 says that periods are always in utc. libical ignore that, + // so we need the conversion here. + aValue->GetInTimezone(NS_LITERAL_CSTRING("UTC"), getter_AddRefs(mStart)); + return mStart->MakeImmutable(); +} + +NS_IMETHODIMP calPeriod::GetEnd(calIDateTime **_retval) +{ + //XXX clone? + *_retval = mEnd; + NS_IF_ADDREF(*_retval); + return NS_OK; +} +NS_IMETHODIMP calPeriod::SetEnd(calIDateTime *aValue) +{ + NS_ENSURE_ARG_POINTER(aValue); + if (mImmutable) + return NS_ERROR_CALENDAR_IMMUTABLE; + aValue->GetInTimezone(NS_LITERAL_CSTRING("UTC"), getter_AddRefs(mEnd)); + return mEnd->MakeImmutable(); +} + +NS_IMETHODIMP calPeriod::GetDuration(calIDuration **_retval) +{ + if (!mStart || !mEnd) + return NS_ERROR_FAILURE; + + nsCOMPtr duration; + mEnd->SubtractDate(mStart, getter_AddRefs(duration)); + *_retval = duration; + NS_IF_ADDREF(*_retval); + return NS_OK; +} + +NS_IMETHODIMP +calPeriod::ToString(nsACString& aResult) +{ + return GetIcalString(aResult); +} + +NS_IMETHODIMP_(void) +calPeriod::ToIcalPeriod(struct icalperiodtype *icalp) +{ + // makes no sense to create a duration without bath a start and end + if (!mStart || !mEnd) { + *icalp = icalperiodtype_null_period(); + return; + } + + mStart->ToIcalTime(&icalp->start); + mEnd->ToIcalTime(&icalp->end); +} + +void +calPeriod::FromIcalPeriod(struct icalperiodtype *icalp) +{ + mStart = new calDateTime(&(icalp->start)); + mStart->MakeImmutable(); + mEnd = new calDateTime(&(icalp->end)); + mEnd->MakeImmutable(); + return; +} + +NS_IMETHODIMP +calPeriod::GetIcalString(nsACString& aResult) +{ + struct icalperiodtype ip; + ToIcalPeriod(&ip); + + // note that ics is owned by libical, so we don't need to free + const char *ics = icalperiodtype_as_ical_string(ip); + + if (ics) { + aResult.Assign(ics); + return NS_OK; + } + + return NS_ERROR_OUT_OF_MEMORY; +} + +NS_IMETHODIMP +calPeriod::SetIcalString(const nsACString& aIcalString) +{ + struct icalperiodtype ip; + ip = icalperiodtype_from_string(nsPromiseFlatCString(aIcalString).get()); + //XXX Shortcut. Assumes nobody tried to overrule our impl. of calIDateTime + // Should use NS_NEWXPCOM() + mStart = new calDateTime(&ip.start); + mEnd = new calDateTime(&ip.end); + return NS_OK; +} diff --git a/calendar/base/src/calPeriod.h b/calendar/base/src/calPeriod.h new file mode 100644 index 000000000000..115248df7a06 --- /dev/null +++ b/calendar/base/src/calPeriod.h @@ -0,0 +1,76 @@ +/* -*- 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 mozilla calendar code. + * + * The Initial Developer of the Original Code is + * Michiel van Leeuwen + * Portions created by the Initial Developer are Copyright (C) 2006 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * 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 CALPERIOD_H_ +#define CALPERIOD_H_ + +#include "nsString.h" +#include "nsCOMPtr.h" + +#include "calIPeriod.h" +#include "calDateTime.h" +#include "calIDuration.h" + +extern "C" { + #include "ical.h" +} + +class calPeriod : public calIPeriod +{ +public: + calPeriod (); + explicit calPeriod (const calPeriod& cpt); + explicit calPeriod (struct icalperiodtype *aPeriodPtr); + + // nsISupports interface + NS_DECL_ISUPPORTS + + // calIPeriod interface + NS_DECL_CALIPERIOD + +protected: + PRBool mImmutable; + + //struct icaldurationtype mPeriod; + nsCOMPtr mStart; + nsCOMPtr mEnd; + + void FromIcalPeriod(struct icalperiodtype *icalp); +}; + +#endif /* CALPERIOD_H_ */ +