예제 #1
0
        private icm.XmlApi.scheduleReportType changeMail(QueuedMessageEventSource source, QueuedMessageEventArgs args, SchedulingInfo schedulingInfo, long now)
        {
            icm.XmlApi.scheduleReportType result = null;
            icm.XmlApi.userType userInfo = null;
            string dialingInfoStr = null;
            bool isCreate = isCreateMeetingRequest(schedulingInfo);
            webServiceData.ExchangeService service = null;

            try
            {
                userInfo = getUserInfo(schedulingInfo.delegatorEmailAddr);
                if (null == userInfo)
                    throw new ScopiaMeetingAddInException(ScopiaMeetingAddInException.ERROR_MESSAGE_USER_NOT_FOUND);
                else if (!userInfo.Schedulable)
                    throw new ScopiaMeetingAddInException(ScopiaMeetingAddInException.ERROR_MESSAGE_HAVE_NO_PERMISSION);
                else if (isCreate)
                {
                    service = getWebService(schedulingInfo);
                    if(null == service)
                        throw new ScopiaMeetingAddInException(ScopiaMeetingAddInException.ERROR_MESSAGE_INCORRECT_EWS_CONFIGURATION);
                }
            }
            catch (Exception ex) {
                sendBackAMail(source, schedulingInfo, ex.Message);
                if (IS_DELETE_ERROR) {
                    if (null == service)
                        service = getWebService(schedulingInfo);
                    if (null == service)
                        return result;
                    result = new icm.XmlApi.scheduleReportType();
                    result.Success = false;
                    result.Detail = "";
                    //Do not add a cancel request into the task list,
                    if (schedulingInfo.requestType == RequestType.CreateMeeting)
                    {
                        object[] parameters = new object[5];
                        parameters[0] = schedulingInfo;
                        parameters[1] = null;
                        parameters[2] = result;
                        parameters[3] = now;
                        parameters[4] = service;
                        lock (ewsTasks)
                        {
                            RvLogger.DebugWrite("add the task in=============" + schedulingInfo.subject);
                            ewsTasks.AddLast(parameters);
                        }
                    }
                }
                return result;
            }

            bool successfullyRescheduled = false;
            if (schedulingInfo.requestType == RequestType.CreateMeeting)
            {
                try {
                    icm.XmlApi.virtualRoomType[] virtualRooms = this.getVirtualRoom(userInfo);
                    if (null == virtualRooms && isCreate)
                        throw new ScopiaMeetingAddInException(ScopiaMeetingAddInException.ERROR_MESSAGE_NO_VIRTUALROOM);
                    if (isCreate) {
                        icm.XmlApi.virtualRoomType defaultVirtualRoom = null;
                        foreach (icm.XmlApi.virtualRoomType virtualRoom in virtualRooms) {
                            if (virtualRoom.Default) {
                                defaultVirtualRoom = virtualRoom;
                                break;
                            }
                        }
                        if (null == defaultVirtualRoom)
                            defaultVirtualRoom = virtualRooms[0];

                        if (defaultVirtualRoom.OneTimePINRequired) {
                            if (string.IsNullOrEmpty(schedulingInfo.meetingPin))
                                schedulingInfo.meetingPin = CreateRandomPWD(6);
                        }

                        icm.XmlApi.dialingInfoType dialingInfo = this.getDialingInfo(schedulingInfo, userInfo, defaultVirtualRoom);
                        if (USE_HTML)
                            dialingInfoStr = dialingInfo.DescriptionOfHTML;
                        else
                            dialingInfoStr = dialingInfo.Description;

                        if (!USE_HTML && null != dialingInfoStr)
                        {
                            dialingInfoStr = dialingInfoStr.Replace("\n", "<br>");
                            dialingInfoStr = dialingInfoStr.Replace("\r", "");
                            dialingInfoStr = dialingInfoStr.Replace("\t", "&nbsp;&nbsp;&nbsp;&nbsp;");
                        }
                        schedulingInfo.dialingInfo = dialingInfoStr;
                    }
                    result = this.scheduleMeeting(schedulingInfo, schedulingInfo.subject, false);
                    if (!result.Success && IS_RESCHEDULE && !notResourceProblem(string.IsNullOrEmpty(result.ErrorCode) ? (result.Detail == null ? "" : result.Detail) : result.ErrorCode))
                    {
                        result = this.scheduleMeeting(schedulingInfo, schedulingInfo.subject, true);
                        if (result.Success)
                        {
                            successfullyRescheduled = true;
                        } 
                    }
                } catch (Exception ex) {
                    result = new icm.XmlApi.scheduleReportType();
                    result.Success = false;
                    result.ErrorCode = ex.Message;
                    result.Detail = ex.Message;
                }

                result.Detail = result.Detail == null ? "" : result.Detail;

                if ((isCreate && result.Success) || (!result.Success && IS_DELETE_ERROR))
                {
                    if (null == service)
                        service = getWebService(schedulingInfo);
                    if (null == service)
                        return result;

                    object[] parameters = new object[5];
                    parameters[0] = schedulingInfo;
                    parameters[1] = dialingInfoStr;
                    parameters[2] = result;
                    parameters[3] = now;
                    parameters[4] = service;
                    lock (ewsTasks)
                    {
                        RvLogger.DebugWrite("add the task in=============" + schedulingInfo.subject);
                        ewsTasks.AddLast(parameters);
                    }
                }
            }
            else
            {
                result = this.deleteMeeting(schedulingInfo, true);
                result.Detail = result.Detail == null ? "" : result.Detail;
            }

            if (false == result.Success && ("CONF_NOT_FOUND".Equals(result.Detail) || "CANCELLED".Equals(result.Detail)))
                result.Success = true;

            if (false == result.Success)
            {
                sendBackAMail(source, schedulingInfo, string.IsNullOrEmpty(result.ErrorCode) ? result.Detail : result.ErrorCode);
            }
            else if (successfullyRescheduled)
                sendBackAMail(source, schedulingInfo, "RESOURCE_SHORTAGE");
            else if (IS_SEND_SUCCESS_MAIL)
            {
                sendBackAMail(source, schedulingInfo, "SUCCESS_NOTIFICATION");
            }

            return result;
        }
예제 #2
0
        private void sendBackAMail(QueuedMessageEventSource source, SchedulingInfo schedulingInfo, string baseFailCode)
        {
            try
            {
                RvLogger.DebugWrite("Send back a mail to the sender.");
                RvLogger.DebugWrite("Notification mail code: " + baseFailCode);
                DirectoryInfo directoryInfo = new DirectoryInfo(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
                string PickupPath = directoryInfo.Parent.Parent.FullName + @"\Pickup\";
                if (settingsInfo["ExchangeServer.PickupDirectoryPath"] != null)
                {
                    PickupPath = settingsInfo["ExchangeServer.PickupDirectoryPath"];
                    if(!PickupPath.EndsWith(@"\"))
                         PickupPath = PickupPath + @"\";
                }
                

                if (!Directory.Exists(PickupPath))
                {
                    Directory.CreateDirectory(PickupPath);
                }
                EmailMessage origMsg = this.emailMessage;

                EmailMessage newMsg = EmailMessage.Create();
                //newMsg.MessageId = "11111111112222222222";
 
                string subjectFailCode = getFailCode(schedulingInfo, "subject.fail");

                if ("SUCCESS_NOTIFICATION".Equals(baseFailCode))
                    subjectFailCode = getFailCode(schedulingInfo, "subject.success");
                else if ("RESOURCE_SHORTAGE".Equals(baseFailCode))
                    subjectFailCode = getFailCode(schedulingInfo, "subject.resource.shortage");
                else if (!notResourceProblem(baseFailCode))
                    baseFailCode = "ERROR_RESOURCE_SHORTAGE";

                string failCode = getFailCode(schedulingInfo, baseFailCode);

                newMsg.Subject = messages[subjectFailCode];
                newMsg.To.Clear();
                newMsg.To.Add(new EmailRecipient(
                    origMsg.Sender.DisplayName,
                    origMsg.Sender.SmtpAddress));

                newMsg.From = new EmailRecipient("Service Account",
                    SERVER_ACCOUNT);
                Stream writer = newMsg.Body.GetContentWriteStream();
                StreamWriter sw = new StreamWriter(writer, Encoding.Unicode);
                if (schedulingInfo != null)
                {
                    sw.WriteLine("Subject : " + schedulingInfo.subject);
                    sw.WriteLine();
                }
                string message = messages.ContainsKey(failCode) ? messages[failCode] : null;
                if (string.IsNullOrEmpty(message))
                    message = messages["common.message"];

                RvLogger.DebugWrite("Notification mail message: " + message);
                sw.WriteLine(message);
                sw.Close();
                writer.Close();
                SaveMessage(newMsg, String.Concat(PickupPath, schedulingInfo.delegatorEmailAddr + "-" + DateTime.UtcNow.ToString("yyyy-MM-dd-HH-mm-ss-ms") + ".eml"));
                RvLogger.DebugWrite("Notification mail is sent.");
                // Cancel the original message
                if (!"SUCCESS_NOTIFICATION".Equals(baseFailCode) && !"RESOURCE_SHORTAGE".Equals(baseFailCode)) 
                    source.Delete();
            }
            catch (Exception ex)
            {
                RvLogger.DebugWrite(ex.StackTrace);
                RvLogger.DebugWrite(ex.Message);
            }
            RvLogger.DebugWrite("Send back a mail to the sender completed.");
        }