// internal Normalize(): void calDateTime::Normalize() { icaltimetype icalt; ensureTimezone(); ToIcalTime(&icalt); FromIcalTime(&icalt, mTimezone); }
NS_IMETHODIMP calDateTime::GetTimezone(calITimezone **aResult) { NS_ENSURE_ARG_POINTER(aResult); ensureTimezone(); NS_IF_ADDREF(*aResult = mTimezone); return NS_OK; }
NS_IMETHODIMP calDateTime::GetEndOfMonth(calIDateTime ** aResult) { NS_ENSURE_ARG_POINTER(aResult); ensureTimezone(); icaltimetype icalt; ToIcalTime(&icalt); icalt.day = icaltime_days_in_month(icalt.month, icalt.year); icalt.is_date = 1; calDateTime * const cdt = new calDateTime(&icalt, mTimezone); CAL_ENSURE_MEMORY(cdt); NS_ADDREF(*aResult = cdt); return NS_OK; }
NS_IMETHODIMP calDateTime::GetJsDate(JSContext* aCx, JS::Value* aResult) { double msec = double(mNativeTime / 1000); ensureTimezone(); JSObject* obj; bool b; if (NS_SUCCEEDED(mTimezone->GetIsFloating(&b)) && b) { obj = JS_NewDateObject(aCx, mYear, mMonth, mDay, mHour, mMinute, mSecond); } else { obj = JS_NewDateObjectMsec(aCx, msec); } *aResult = JS::ObjectOrNullValue(obj); return NS_OK; }
NS_IMETHODIMP calDateTime::GetStartOfYear(calIDateTime ** aResult) { NS_ENSURE_ARG_POINTER(aResult); ensureTimezone(); icaltimetype icalt; ToIcalTime(&icalt); icalt.month = 1; icalt.day = 1; icalt.is_date = 1; calDateTime * const cdt = new calDateTime(&icalt, mTimezone); CAL_ENSURE_MEMORY(cdt); NS_ADDREF(*aResult = cdt); return NS_OK; }
NS_IMETHODIMP calDateTime::ToString(nsACString & aResult) { nsAutoCString tzid; char buffer[256]; ensureTimezone(); mTimezone->GetTzid(tzid); uint32_t const length = PR_snprintf( buffer, sizeof(buffer), "%04hd/%02hd/%02hd %02hd:%02hd:%02hd %s isDate=%01hd nativeTime=%lld", mYear, mMonth + 1, mDay, mHour, mMinute, mSecond, tzid.get(), static_cast<int16_t>(mIsDate), mNativeTime); if (length != static_cast<uint32_t>(-1)) aResult.Assign(buffer, length); return NS_OK; }
NS_IMETHODIMP calDateTime::GetEndOfWeek(calIDateTime ** aResult) { NS_ENSURE_ARG_POINTER(aResult); ensureTimezone(); icaltimetype icalt; ToIcalTime(&icalt); int day_of_week = icaltime_day_of_week(icalt); if (day_of_week < 7) icaltime_adjust(&icalt, 7 - day_of_week, 0, 0, 0); icalt.is_date = 1; calDateTime * const cdt = new calDateTime(&icalt, mTimezone); CAL_ENSURE_MEMORY(cdt); NS_ADDREF(*aResult = cdt); return NS_OK; }
NS_IMETHODIMP calDateTime::AddDuration(calIDuration *aDuration) { NS_ENSURE_FALSE(mImmutable, NS_ERROR_OBJECT_IS_IMMUTABLE); NS_ENSURE_ARG_POINTER(aDuration); ensureTimezone(); icaldurationtype idt; aDuration->ToIcalDuration(&idt); icaltimetype itt; ToIcalTime(&itt); icaltimetype const newitt = icaltime_add(itt, idt); FromIcalTime(&newitt, mTimezone); return NS_OK; }
NS_IMETHODIMP calDateTime::AddDuration(calIDuration *aDuration) { NS_ENSURE_FALSE(mImmutable, NS_ERROR_OBJECT_IS_IMMUTABLE); NS_ENSURE_ARG_POINTER(aDuration); ensureTimezone(); nsresult rv; nsCOMPtr<calIDurationLibical> icaldur = do_QueryInterface(aDuration, &rv); NS_ENSURE_SUCCESS(rv, rv); icaldurationtype idt; icaldur->ToIcalDuration(&idt); icaltimetype itt; ToIcalTime(&itt); icaltimetype const newitt = icaltime_add(itt, idt); FromIcalTime(&newitt, mTimezone); return NS_OK; }
/* bool getProperty (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in jsid id, in JSValPtr vp); */ NS_IMETHODIMP calDateTime::GetProperty(nsIXPConnectWrappedNative *wrapper, JSContext * cx, JSObject * obj_, jsid id, jsval * vp, bool *_retval) { NS_ENSURE_ARG_POINTER(vp); NS_ENSURE_ARG_POINTER(_retval); if (JSID_IS_STRING(id)) { size_t length; JSString *idString = JSID_TO_STRING(id); const jschar *str = JS_GetStringCharsAndLength(cx, idString, &length); nsDependentString const val(reinterpret_cast<PRUnichar const*>(str), length); if (val.EqualsLiteral("jsDate")) { PRTime tmp, thousand; jsdouble msec; LL_I2L(thousand, 1000); LL_DIV(tmp, mNativeTime, thousand); LL_L2D(msec, tmp); ensureTimezone(); JSObject *obj; bool b; if (NS_SUCCEEDED(mTimezone->GetIsFloating(&b)) && b) { obj = js_NewDateObject(cx, mYear, mMonth, mDay, mHour, mMinute, mSecond); } else { obj = js_NewDateObjectMsec(cx, msec); } *vp = OBJECT_TO_JSVAL(obj); *_retval = PR_TRUE; return NS_SUCCESS_I_DID_SOMETHING; } } *_retval = PR_TRUE; return NS_OK; }
calDateTime::ToIcalTime(struct icaltimetype * icalt) { ensureTimezone(); icalt->year = mYear; icalt->month = mMonth + 1; icalt->day = mDay; icalt->hour = mHour; icalt->minute = mMinute; icalt->second = mSecond; icalt->is_date = mIsDate ? 1 : 0; icalt->is_daylight = 0; icaltimezone * tz = cal::getIcalTimezone(mTimezone); icalt->zone = tz; icalt->is_utc = (tz && tz == icaltimezone_get_utc_timezone()); icalt->is_daylight = 0; // xxx todo: discuss/investigate is_daylight // if (tz) { // icaltimezone_get_utc_offset(tz, icalt, &icalt->is_daylight); // } }