Search in sources :

Example 11 with Instance

use of com.zimbra.cs.mailbox.CalendarItem.Instance in project zm-mailbox by Zimbra.

the class Recurrence method expandInstances.

public static List<Instance> expandInstances(IRecurrence recur, int calItemId, long start, long end) throws ServiceException {
    List<Instance> list = recur.expandInstances(calItemId, start, end);
    // Eliminate duplicate instances.  For example, an instance may be mentioned both as
    // a RDATE and an exception VEVENT.  Outlook seems to generate this type of data upon
    // update of series.  Always prefer exception VEVENT over RDATE.
    List<Instance> toRet = new ArrayList<Instance>(list.size());
    Instance prev = null;
    for (Instance inst : list) {
        if (prev == null) {
            prev = inst;
        } else if (inst != null) {
            if (inst.sameTime(prev)) {
                // take the one that wasn't generated from RDATE.
                if (!inst.fromRdate())
                    prev = inst;
            // Else ignore current instance.
            } else {
                // If prev and this have different time, prev was a good instance.  Add it.
                toRet.add(prev);
                prev = inst;
            }
        }
    }
    if (prev != null)
        toRet.add(prev);
    return toRet;
}
Also used : Instance(com.zimbra.cs.mailbox.CalendarItem.Instance) ArrayList(java.util.ArrayList)

Example 12 with Instance

use of com.zimbra.cs.mailbox.CalendarItem.Instance in project zm-mailbox by Zimbra.

the class AtomFormatter method addCalendarItem.

private void addCalendarItem(CalendarItem calItem, Element feed, UserServletContext context) throws ServiceException {
    Collection<Instance> instances = calItem.expandInstances(context.getStartTime(), context.getEndTime(), false);
    for (Iterator<Instance> instIt = instances.iterator(); instIt.hasNext(); ) {
        CalendarItem.Instance inst = instIt.next();
        InviteInfo invId = inst.getInviteInfo();
        Invite inv = calItem.getInvite(invId.getMsgId(), invId.getComponentId());
        Element entry = feed.addElement("entry");
        entry.addElement("title").setText(inv.getName());
        entry.addElement("updated").setText(DateUtil.toISO8601(new Date(inst.getStart())));
        entry.addElement("summary").setText(inv.getFragment());
        // TODO: only personal part in name
        if (inv.hasOrganizer()) {
            Element author = entry.addElement("author");
            author.addElement("name").setText(inv.getOrganizer().getCn());
            author.addElement("email").setText(inv.getOrganizer().getAddress());
        }
    }
}
Also used : CalendarItem(com.zimbra.cs.mailbox.CalendarItem) InviteInfo(com.zimbra.cs.mailbox.calendar.InviteInfo) Instance(com.zimbra.cs.mailbox.CalendarItem.Instance) Instance(com.zimbra.cs.mailbox.CalendarItem.Instance) Element(com.zimbra.common.soap.Element) Invite(com.zimbra.cs.mailbox.calendar.Invite) Date(java.util.Date)

Example 13 with Instance

use of com.zimbra.cs.mailbox.CalendarItem.Instance in project zm-mailbox by Zimbra.

the class IcsFormatter method formatCallback.

@Override
public void formatCallback(UserServletContext context) throws IOException, ServiceException {
    Iterator<? extends MailItem> iterator = null;
    List<CalendarItem> calItems = new ArrayList<CalendarItem>();
    // ZimbraLog.mailbox.info("end = "+new Date(context.getEndTime()));
    try {
        long start = context.getStartTime();
        long end = context.getEndTime();
        boolean hasTimeRange = start != TIME_UNSPECIFIED && end != TIME_UNSPECIFIED;
        iterator = getMailItems(context, start, end, Integer.MAX_VALUE);
        // this is lame
        while (iterator.hasNext()) {
            MailItem item = iterator.next();
            if (item instanceof CalendarItem) {
                CalendarItem calItem = (CalendarItem) item;
                if (hasTimeRange) {
                    Collection<Instance> instances = calItem.expandInstances(start, end, false);
                    if (!instances.isEmpty())
                        calItems.add(calItem);
                } else {
                    calItems.add(calItem);
                }
            }
        }
    } finally {
        if (iterator instanceof QueryResultIterator)
            ((QueryResultIterator) iterator).finished();
    }
    // todo: get from folder name
    String filename = context.itemPath;
    if (mayAttach(context)) {
        if (filename == null || filename.length() == 0)
            filename = "contacts";
        // Let the client specify the filename to save as
        String requestFilename = context.req.getParameter("filename");
        if (requestFilename != null)
            filename = requestFilename;
        else
            // Trim off leading non-word characters (e.g. forward slash)
            filename = filename.replaceAll("^\\W", "");
        if (filename.toLowerCase().endsWith(".ics") == false)
            filename = filename + ".ics";
        String cd = HttpUtil.createContentDisposition(context.req, Part.ATTACHMENT, filename);
        context.resp.addHeader("Content-Disposition", cd);
    }
    Browser browser = HttpUtil.guessBrowser(context.req);
    boolean useOutlookCompatMode = Browser.IE.equals(browser);
    // bug 15549
    boolean needAppleICalHacks = Browser.APPLE_ICAL.equals(browser);
    // Use only htmlFormat when the file isn't supposed to be downloaded (ie. it's supposed to be shown in the browser). Mangles the code so it can be displayed correctly, especially by IE
    boolean htmlFormat = !mayAttach(context) && Browser.IE.equals(browser);
    context.resp.setCharacterEncoding(MimeConstants.P_CHARSET_UTF8);
    String contentType;
    if (htmlFormat) {
        contentType = MimeConstants.CT_TEXT_HTML;
    } else if (mayAttach(context)) {
        contentType = MimeConstants.CT_TEXT_CALENDAR;
    } else {
        contentType = MimeConstants.CT_TEXT_PLAIN;
    }
    context.resp.setContentType(contentType);
    OperationContext octxt = new OperationContext(context.getAuthAccount(), context.isUsingAdminPrivileges());
    FileBufferedWriter fileBufferedWriter = new FileBufferedWriter(context.resp.getWriter(), LC.calendar_ics_export_buffer_size.intValueWithinRange(0, FileBufferedWriter.MAX_BUFFER_SIZE));
    try {
        if (htmlFormat)
            fileBufferedWriter.write("<html><body><pre>");
        context.targetMailbox.writeICalendarForCalendarItems(fileBufferedWriter, octxt, calItems, (context.target != null && context.target instanceof Folder) ? (Folder) context.target : null, useOutlookCompatMode, true, needAppleICalHacks, true, htmlFormat, includeInlineAttaches(context));
        if (htmlFormat)
            fileBufferedWriter.write("</pre></body></html>");
    } finally {
        fileBufferedWriter.finish();
    }
}
Also used : OperationContext(com.zimbra.cs.mailbox.OperationContext) Instance(com.zimbra.cs.mailbox.CalendarItem.Instance) ArrayList(java.util.ArrayList) FileBufferedWriter(com.zimbra.common.util.FileBufferedWriter) Folder(com.zimbra.cs.mailbox.Folder) CalendarItem(com.zimbra.cs.mailbox.CalendarItem) MailItem(com.zimbra.cs.mailbox.MailItem) Browser(com.zimbra.common.util.HttpUtil.Browser)

Example 14 with Instance

use of com.zimbra.cs.mailbox.CalendarItem.Instance in project zm-mailbox by Zimbra.

the class RssFormatter method addCalendarItem.

private void addCalendarItem(CalendarItem calItem, Element channel, UserServletContext context) throws ServiceException {
    Collection<Instance> instances = calItem.expandInstances(context.getStartTime(), context.getEndTime(), false);
    for (Iterator<Instance> instIt = instances.iterator(); instIt.hasNext(); ) {
        CalendarItem.Instance inst = instIt.next();
        InviteInfo invId = inst.getInviteInfo();
        Invite inv = calItem.getInvite(invId.getMsgId(), invId.getComponentId());
        Element rssItem = channel.addElement("item");
        rssItem.addElement("title").setText(inv.getName());
        rssItem.addElement("pubDate").setText(mDateFormat.format(new Date(inst.getStart())));
        /*
            StringBuffer desc = new StringBuffer();
            sb.append("Start: ").append(sdf.format(new Date(inst.getStart()))).append("\n");
            sb.append("End: ").append(sdf.format(new Date(inst.getEnd()))).append("\n");
            sb.append("Location: ").append(inv.getLocation()).append("\n");
            sb.append("Notes: ").append(inv.getFragment()).append("\n");
            item.addElement("description").setText(sb.toString());
            */
        rssItem.addElement("description").setText(inv.getFragment());
        if (inv.hasOrganizer())
            rssItem.addElement("author").setText(inv.getOrganizer().getAddress());
    }
}
Also used : CalendarItem(com.zimbra.cs.mailbox.CalendarItem) InviteInfo(com.zimbra.cs.mailbox.calendar.InviteInfo) Instance(com.zimbra.cs.mailbox.CalendarItem.Instance) Instance(com.zimbra.cs.mailbox.CalendarItem.Instance) Element(com.zimbra.common.soap.Element) Invite(com.zimbra.cs.mailbox.calendar.Invite) Date(java.util.Date)

Example 15 with Instance

use of com.zimbra.cs.mailbox.CalendarItem.Instance in project zm-mailbox by Zimbra.

the class WorkingHours method getWorkingHours.

public static FreeBusy getWorkingHours(Account authAcct, boolean asAdmin, Account account, String name, long start, long end) throws ServiceException {
    // If free/busy viewing is blocked, so is viewing working hours.
    AccessManager accessMgr = AccessManager.getInstance();
    boolean accountAceAllowed = accessMgr.canDo(authAcct, account, User.R_viewFreeBusy, asAdmin);
    if (!accountAceAllowed)
        return FreeBusy.nodataFreeBusy(account.getName(), start, end);
    // Get the working hours preference and parse it.
    String workingHoursPref = account.getPrefCalendarWorkingHours();
    HoursByDay workingHoursByDay = new HoursByDay(workingHoursPref);
    // Build a recurrence rule for each day of the week and expand over the time range.
    IntervalList intervals = new IntervalList(start, end);
    ICalTimeZone tz = Util.getAccountTimeZone(account);
    TimeZoneMap tzmap = new TimeZoneMap(tz);
    StartSpec startSpec = new StartSpec(start, tz);
    for (int day = 1; day <= 7; ++day) {
        TimeRange timeRange = workingHoursByDay.getHoursForDay(day);
        if (timeRange.enabled) {
            IRecurrence rrule = getRecurrenceForDay(day, startSpec, timeRange, tz, tzmap);
            List<Instance> instances = rrule.expandInstances(0, start, end);
            for (Instance inst : instances) {
                Interval ival = new Interval(inst.getStart(), inst.getEnd(), IcalXmlStrMap.FBTYPE_BUSY_UNAVAILABLE);
                intervals.addInterval(ival);
            }
        }
    }
    // hours are shown as out-of-office.
    for (Iterator<Interval> iter = intervals.iterator(); iter.hasNext(); ) {
        Interval interval = iter.next();
        String status = interval.getStatus();
        interval.setStatus(invertStatus(status));
    }
    return new FreeBusy(name, intervals, start, end);
}
Also used : AccessManager(com.zimbra.cs.account.AccessManager) Instance(com.zimbra.cs.mailbox.CalendarItem.Instance) IRecurrence(com.zimbra.cs.mailbox.calendar.Recurrence.IRecurrence) IntervalList(com.zimbra.cs.fb.FreeBusy.IntervalList) TimeZoneMap(com.zimbra.common.calendar.TimeZoneMap) ICalTimeZone(com.zimbra.common.calendar.ICalTimeZone) Interval(com.zimbra.cs.fb.FreeBusy.Interval)

Aggregations

Instance (com.zimbra.cs.mailbox.CalendarItem.Instance)15 Element (com.zimbra.common.soap.Element)7 CalendarItem (com.zimbra.cs.mailbox.CalendarItem)6 TimeZoneMap (com.zimbra.common.calendar.TimeZoneMap)5 ArrayList (java.util.ArrayList)5 ICalTimeZone (com.zimbra.common.calendar.ICalTimeZone)3 ParsedDateTime (com.zimbra.common.calendar.ParsedDateTime)3 ParsedDuration (com.zimbra.common.calendar.ParsedDuration)3 MailItem (com.zimbra.cs.mailbox.MailItem)3 OperationContext (com.zimbra.cs.mailbox.OperationContext)3 Invite (com.zimbra.cs.mailbox.calendar.Invite)3 IRecurrence (com.zimbra.cs.mailbox.calendar.Recurrence.IRecurrence)3 ItemId (com.zimbra.cs.service.util.ItemId)3 ZimbraSoapContext (com.zimbra.soap.ZimbraSoapContext)3 Browser (com.zimbra.common.util.HttpUtil.Browser)2 Account (com.zimbra.cs.account.Account)2 Interval (com.zimbra.cs.fb.FreeBusy.Interval)2 Appointment (com.zimbra.cs.mailbox.Appointment)2 Folder (com.zimbra.cs.mailbox.Folder)2 Task (com.zimbra.cs.mailbox.Task)2