private void processNewInviteReply(ParsedMessage pm, Invite reply, boolean force)
void processNewInviteReply(Invite reply, boolean force)
    private void processNewInviteReply(ParsedMessage pm, Invite reply, boolean force)    throws ServiceException {        if (!canAccess(ACL.RIGHT_ACTION))            throw ServiceException.PERM_DENIED("you do not have sufficient permissions to change this appointment's state");        boolean dirty = false;        // unique ID: UID+RECURRENCE_ID        for (int i = 0; i < numInvites(); i++) {            Invite cur = getInvite(i);            // UID already matches...next check if RecurId matches            // if so, then seqNo is next            // finally use DTStamp            //            // See RFC2446: 2.1.5 Message Sequencing            //                        // If any of the existing Invites have recurIDs which exactly match the reply,            // then we should do a sequence-check against them before deciding to accept            // this reply            // FIXME should check for cur.recurID WITHIN_RANGE (THISANDFUTURE-type support)            if ((cur.getRecurId() != null && cur.getRecurId().equals(reply.getRecurId())) ||                    (cur.getRecurId() == null && reply.getRecurId() == null)) {                                // they're replying to this invite!                                if (cur.getSeqNo() >= reply.getSeqNo()                        && cur.getDTStamp() > reply.getDTStamp())                 {                                        sLog.info("Invite-Reply "+reply.toString()+" is outdated, ignoring!");                    // this reply is OLD, ignore it                    return;                }                                // update the ATTENDEE record in the invite                cur.updateMatchingAttendees(reply);                dirty = true;                                break; // found a match, fall through to below and process it!            }        }                    // if we got here then we have validated the sequencing against all of our Invites,         // OR alternatively we looked and couldn't find one with a matching RecurID (therefore         // they must be replying to a arbitrary instance)        List attendees = reply.getAttendees();        for (Iterator iter = attendees.iterator(); iter.hasNext();) {            ZAttendee at = (ZAttendee)iter.next();            if (mReplyList.maybeStoreNewReply(reply, at)) {                dirty = true;            }        }                if (dirty) {            saveMetadata();            getMailbox().markItemModified(this, Change.MODIFIED_INVITE);        }    }